structra-ui 0.2.46 → 0.2.47

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.
@@ -1 +1 @@
1
- {"version":3,"file":"structra-ui.mjs","sources":["../../../src/structra-version.ts","../../../src/app/alert/alert.component.ts","../../../src/app/alert/alert.component.html","../../../src/app/buttons/base-button/base-button.component.ts","../../../src/app/buttons/base-button/base-button.component.html","../../../src/app/buttons/button/button.component.ts","../../../src/app/shared/id/auto-id.ts","../../../src/app/fields/input-fields/_base/base-field.directive.ts","../../../src/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.ts","../../../src/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.html","../../../src/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.ts","../../../src/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.html","../../../src/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.ts","../../../src/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.html","../../../src/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.ts","../../../src/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.html","../../../src/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.ts","../../../src/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.html","../../../src/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.ts","../../../src/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.html","../../../src/app/theme/theme.types.ts","../../../src/app/theme/theme-class.helpers.ts","../../../src/app/theme/app-theme.service.ts","../../../src/app/theme/theme.directive.ts","../../../src/app/theme/theme-effective-id.ts","../../../src/app/theme/theme-host-apply.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.html","../../../src/app/menus/_models/menu-dropdown-placement.model.ts","../../../src/app/menus/_utils/menu-connected-positions.util.ts","../../../src/app/menus/menu-divider/menu-divider.component.ts","../../../src/app/menus/menu-group/menu-group.component.ts","../../../src/app/menus/_utils/menu-rows.util.ts","../../../src/app/menus/_utils/submenu-connected-positions.util.ts","../../../src/app/menus/menu-list/menu-list-body.component.ts","../../../src/app/menus/menu-list/menu-list-body.component.html","../../../src/app/menus/dropdown-menu/dropdown-menu.component.ts","../../../src/app/menus/dropdown-menu/dropdown-menu.component.html","../../../src/app/fields/input-fields/_base/base-field.component.ts","../../../src/app/fields/input-fields/_base/base-field.component.html","../../../src/app/fields/input-fields/_base/ng-control-field.directive.ts","../../../src/app/fields/input-fields/text-field/text-field.component.ts","../../../src/app/fields/input-fields/text-field/text-field.component.html","../../../src/app/fields/input-fields/password-field/password-field.component.ts","../../../src/app/fields/input-fields/password-field/password-field.component.html","../../../src/app/fields/input-fields/textarea-field/textarea-field.component.ts","../../../src/app/fields/input-fields/textarea-field/textarea-field.component.html","../../../src/app/_utils/integer-value.utils.ts","../../../src/app/_utils/integer-br.utils.ts","../../../src/app/fields/input-fields/integer-field/integer-field.component.ts","../../../src/app/fields/input-fields/integer-field/integer-field.component.html","../../../src/app/_utils/decimal-br.utils.ts","../../../src/app/fields/input-fields/decimal-field/decimal-field.component.ts","../../../src/app/fields/input-fields/decimal-field/decimal-field.component.html","../../../src/app/_utils/date-pt-br.utils.ts","../../../src/app/fields/input-fields/date-field/date-field.component.ts","../../../src/app/fields/input-fields/date-field/date-field.component.html","../../../src/app/fields/input-fields/_utils/mask-format.utils.ts","../../../src/app/fields/input-fields/_base/masked-text-field.base.ts","../../../src/app/fields/input-fields/input-mask-field/input-mask-field.component.ts","../../../src/app/fields/input-fields/input-mask-field/input-mask-field.component.html","../../../src/app/fields/input-fields/cep-field/cep-field.component.ts","../../../src/app/fields/input-fields/cep-field/cep-field.component.html","../../../src/app/fields/input-fields/phone-field/phone-field.component.ts","../../../src/app/fields/input-fields/phone-field/phone-field.component.html","../../../src/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.ts","../../../src/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.html","../../../src/app/fields/input-fields/_utils/mask-complete.validators.ts","../../../src/app/_utils/estados-br.data.ts","../../../src/app/fields/checkbox-fields/_base/boolean-field.directive.ts","../../../src/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.ts","../../../src/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.html","../../../src/app/fields/checkbox-fields/switch-field/switch-field.component.ts","../../../src/app/fields/checkbox-fields/switch-field/switch-field.component.html","../../../src/app/fields/dropdown-fields/_base/dropdown-option-field.base.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.ts","../../../src/app/fields/dropdown-fields/select-field/select-field.component.ts","../../../src/app/fields/dropdown-fields/select-field/select-field.component.html","../../../src/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.ts","../../../src/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.html","../../../src/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.ts","../../../src/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.html","../../../src/app/_utils/scroll/body-scroll-lock.util.ts","../../../src/app/dialogs/_models/lib-dialog-size.model.ts","../../../src/app/dialogs/app-dialog/app-dialog.component.ts","../../../src/app/dialogs/app-dialog/app-dialog.component.html","../../../src/app/dialogs/app-dialog/dialog-footer.directive.ts","../../../src/app/dialogs/confirm-dialog/confirm-dialog.component.ts","../../../src/app/dialogs/confirm-dialog/confirm-dialog.component.html","../../../src/app/dialogs/_utils/app-lib-light-block-scroll-strategy.ts","../../../src/app/dialogs/_utils/lib-dialog-panel-classes.ts","../../../src/app/dialogs/confirm-dialog/confirm-dialog.service.ts","../../../src/app/dialogs/toast/toast.service.ts","../../../src/app/dialogs/toast/toast-host.component.ts","../../../src/app/dialogs/toast/toast-host.component.html","../../../src/app/dialogs/loading-dialog/loading-dialog.component.ts","../../../src/app/dialogs/loading-dialog/loading-dialog.component.html","../../../src/app/dialogs/loading-dialog/loading-dialog.service.ts","../../../src/app/fields/file-upload-fields/_utils/file-accept.util.ts","../../../src/app/fields/file-upload-fields/file-upload-field/file-upload-field.component.ts","../../../src/app/fields/file-upload-fields/file-upload-field/file-upload-field.component.html","../../../src/app/fields/file-upload-fields/image-preview-panel/image-preview-panel.component.ts","../../../src/app/fields/file-upload-fields/image-preview-panel/image-preview-panel.component.html","../../../src/app/form-layout/_models/form-layout.model.ts","../../../src/app/form-layout/divider/divider.component.ts","../../../src/app/form-layout/divider/divider.component.html","../../../src/app/form-layout/layout-stack/layout-stack.component.ts","../../../src/app/form-layout/layout-stack/layout-stack.component.html","../../../src/app/form-layout/form-actions/form-actions.component.ts","../../../src/app/form-layout/form-actions/form-actions.component.html","../../../src/app/form-layout/form-col/form-col.component.ts","../../../src/app/form-layout/form-col/form-col.component.html","../../../src/app/form-layout/form-group/form-root-invalid-ui-refresh.util.ts","../../../src/app/form-layout/form-group/form-path.utils.ts","../../../src/app/form-layout/form-group/form-group.component.ts","../../../src/app/form-layout/form-group/form-group.component.html","../../../src/app/form-layout/form-row/form-row.component.ts","../../../src/app/form-layout/form-row/form-row.component.html","../../../src/app/form-layout/form-section/form-section.component.ts","../../../src/app/form-layout/form-section/form-section.component.html","../../../src/app/form-layout/validation-summary/validation-summary.component.ts","../../../src/app/form-layout/validation-summary/validation-summary.component.html","../../../src/app/form-layout/form-tab/form-tab.component.ts","../../../src/app/form-layout/form-tab/form-tab.component.html","../../../src/app/form-layout/form-tabs/form-tabs.component.ts","../../../src/app/form-layout/form-tabs/form-tabs.component.html","../../../src/app/data-display/empty-state/empty-state-overlay.util.ts","../../../src/app/data-display/data-grid/data-grid-actions-cell-renderer.component.ts","../../../src/app/data-display/data-grid/data-grid-actions-cell-renderer.component.html","../../../src/app/data-display/data-grid/data-grid.component.ts","../../../src/app/data-display/data-grid/data-grid.component.html","../../../src/app/data-display/data-toolbar/data-toolbar.component.ts","../../../src/app/data-display/data-toolbar/data-toolbar.component.html","../../../src/app/data-display/data-card/data-card.component.ts","../../../src/app/data-display/data-card/data-card.component.html","../../../src/app/data-display/empty-state/empty-state.component.ts","../../../src/app/data-display/empty-state/empty-state.component.html","../../../src/app/data-display/card-list/card-list.component.ts","../../../src/app/data-display/card-list/card-list.component.html","../../../src/app/data-display/adaptive-data-view/adaptive-data-view.component.ts","../../../src/app/data-display/adaptive-data-view/adaptive-data-view.component.html","../../../src/app/data-display/status-badge/status-badge.component.ts","../../../src/app/data-display/status-badge/status-badge.component.html","../../../src/app/data-display/details-view/details-view.component.ts","../../../src/app/data-display/details-view/details-view.component.html","../../../src/app/data-display/details-field/details-field.component.ts","../../../src/app/data-display/details-field/details-field.component.html","../../../src/app/data-display/stat-card/stat-card.component.ts","../../../src/app/data-display/stat-card/stat-card.component.html","../../../src/app/data-display/list-item/list-item.component.ts","../../../src/app/data-display/list-item/list-item.component.html","../../../src/app/data-display/data-list/data-list.component.ts","../../../src/app/data-display/data-list/data-list.component.html","../../../src/app/data-display/dashboard-section/dashboard-section.component.ts","../../../src/app/data-display/dashboard-section/dashboard-section.component.html","../../../src/app/data-display/table-toolbar/table-toolbar.component.ts","../../../src/app/data-display/table-toolbar/table-toolbar.component.html","../../../src/app/data-display/table-empty-state/table-empty-state.component.ts","../../../src/app/data-display/table-empty-state/table-empty-state.component.html","../../../src/app/menus/_utils/filter-menu-nodes.util.ts","../../../src/app/menus/menu-list/menu-list.component.ts","../../../src/app/menus/menu-list/menu-list.component.html","../../../src/app/menus/context-menu/context-menu.component.ts","../../../src/app/menus/context-menu/context-menu.component.html","../../../src/app/menus/_models/drawer-side.model.ts","../../../src/app/menus/_models/drawer-size.model.ts","../../../src/app/menus/drawer/drawer.component.ts","../../../src/app/menus/drawer/drawer.component.html","../../../src/app/menus/action-menu/action-menu.component.ts","../../../src/app/menus/action-menu/action-menu.component.html","../../../src/app/overlay/anchored-overlay/anchored-overlay.component.ts","../../../src/app/overlay/anchored-overlay/anchored-overlay.component.html","../../../src/app/overlay/_models/overlay-placement.model.ts","../../../src/app/overlay/_utils/anchored-overlay-positions.util.ts","../../../src/app/overlay/tooltip/tooltip-panel-template.directive.ts","../../../src/app/overlay/tooltip/tooltip.component.ts","../../../src/app/overlay/tooltip/tooltip.component.html","../../../src/app/overlay/popover/popover-body-template.directive.ts","../../../src/app/overlay/popover/popover-footer-template.directive.ts","../../../src/app/overlay/popover/popover.component.ts","../../../src/app/overlay/popover/popover.component.html","../../../src/app/overlay/popover/popover-trigger.directive.ts","../../../src/app/overlay/index.ts","../../../src/app/app-shell/sidebar-reveal.constants.ts","../../../src/app/app-shell/app-shell-sidebar-template.directive.ts","../../../src/app/app-shell/app-shell.component.ts","../../../src/app/app-shell/app-shell.component.html","../../../src/app/app-shell/sidebar/sidebar.component.ts","../../../src/app/app-shell/sidebar/sidebar.component.html","../../../src/app/app-shell/sidebar/app-sidebar-toolbar.directive.ts","../../../src/app/app-shell/sidebar/app-sidebar-brand.directive.ts","../../../src/app/app-shell/sidebar/shell-sidebar-toggle.component.ts","../../../src/app/app-shell/sidebar/shell-sidebar-toggle.component.html","../../../src/app/app-shell/topbar/topbar.component.ts","../../../src/app/app-shell/topbar/topbar.component.html","../../../src/app/app-shell/user-menu/user-menu.component.ts","../../../src/app/app-shell/user-menu/user-menu.component.html","../../../src/app/app-shell/breadcrumb/breadcrumb.component.ts","../../../src/app/app-shell/breadcrumb/breadcrumb.component.html","../../../src/app/app-shell/index.ts","../../../src/structra-public-api.ts","../../../src/structra-ui.ts"],"sourcesContent":["/** Marcador de pacote publicado como `structra-ui`. */\r\nexport const STRUCTRA_UI = 'structra-ui' as const;\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n signal,\r\n} from '@angular/core';\r\n\r\nexport type AlertType = 'error' | 'success' | 'warning' | 'info';\r\n\r\n/**\r\n * Feedback visual inline (erro, sucesso, aviso, informação). Reutiliza tokens semânticos da lib.\r\n */\r\n@Component({\r\n selector: 'app-alert',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './alert.component.html',\r\n styleUrl: './alert.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AlertComponent {\r\n /** Remove o host do fluxo ao fechar (evita faixa em branco com `display: block` vazio). */\r\n @HostBinding('hidden')\r\n protected get hostHidden(): boolean {\r\n return !this.visible();\r\n }\r\n\r\n @Input() type: AlertType = 'info';\r\n\r\n @Input() message = '';\r\n\r\n @Input({ transform: booleanAttribute }) closable = false;\r\n\r\n /** Quando `closable`, o alerta deixa de renderizar após fechar. */\r\n protected readonly visible = signal(true);\r\n\r\n protected get hasMessage(): boolean {\r\n return this.message != null && String(this.message).trim().length > 0;\r\n }\r\n\r\n private readonly modifierByType: Record<AlertType, string> = {\r\n error: 'alert--error',\r\n success: 'alert--success',\r\n warning: 'alert--warning',\r\n info: 'alert--info',\r\n };\r\n\r\n protected get alertHostClass(): string {\r\n return `alert ${this.modifierByType[this.type]}`;\r\n }\r\n\r\n protected onClose(): void {\r\n this.visible.set(false);\r\n }\r\n}\r\n","@if (visible()) {\r\n <div [class]=\"alertHostClass\" role=\"alert\">\r\n <div class=\"alert__content\">\r\n @if (hasMessage) {\r\n <span class=\"alert__text\">{{ message }}</span>\r\n } @else {\r\n <span class=\"alert__text\"><ng-content /></span>\r\n }\r\n </div>\r\n\r\n @if (closable) {\r\n <button type=\"button\" class=\"alert__close\" aria-label=\"Fechar alerta\" (click)=\"onClose()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n ViewChild,\n booleanAttribute,\n} from '@angular/core';\nexport const ButtonVariant = {\n Primary: 'primary',\n Secondary: 'secondary',\n /** Texto/ícone sem caixa — navegação secundária, “link” com aparência de botão acessível. */\n Ghost: 'ghost',\n /**\n * Hiperligação em estilo `<a>`: só texto sublinhado, fundo transparente; hover altera só a cor do texto.\n */\n Link: 'link',\n /**\n * Ação destrutiva / apagar: tokens de erro do tema\n * (`--app-color-error*`), mesmo padrão em toda a lib.\n */\n Danger: 'danger',\n /** Estado de alerta: amarelo escuro, com contraste adequado para texto/ícone. */\n Warning: 'warning',\n /** Estado positivo: verde de sucesso, no mesmo padrão de hover e active. */\n Success: 'success',\n} as const;\nexport type ButtonVariant = (typeof ButtonVariant)[keyof typeof ButtonVariant];\n\nexport const ButtonType = {\n Button: 'button',\n Submit: 'submit',\n Reset: 'reset',\n} as const;\nexport type ButtonType = (typeof ButtonType)[keyof typeof ButtonType];\n\n/** Tamanhos do design system: `md` coincide com os valores que o botão já usava antes desta propriedade. */\nexport const ButtonSize = {\n Sm: 'sm',\n Md: 'md',\n Lg: 'lg',\n /** Maior que `lg` — ênfase / touch targets amplos (CTAs hero). */\n Xl: 'xl',\n /** Escala extra para CTAs de maior destaque. */\n Xxl: 'xxl',\n} as const;\nexport type ButtonSize = (typeof ButtonSize)[keyof typeof ButtonSize];\n\n/** Radius semântico do design system (sem valores numéricos livres no template). */\nexport const ButtonRadius = {\n None: 'none',\n Sm: 'sm',\n Md: 'md',\n Lg: 'lg',\n Pill: 'pill',\n} as const;\nexport type ButtonRadius = (typeof ButtonRadius)[keyof typeof ButtonRadius];\n\n/**\n * Base do botão; **não** exposta no barrel público `buttons`. Use `ButtonComponent` (`app-button`).\n */\n@Component({\n selector: 'app-base-button',\n standalone: true,\n imports: [],\n templateUrl: './base-button.component.html',\n styleUrl: './base-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseButtonComponent {\n @ViewChild('nativeBtn', { read: ElementRef })\n private nativeBtn?: ElementRef<HTMLButtonElement>;\n\n /** `submit` envia o `<form>` ancestral; use `button` para ações sem submit. */\n @Input() type: ButtonType = 'button';\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n /**\n * Não interage (como `disabled`), mas com aparência em cinza (tema somente leitura),\n * distinta do estado desabilitado genérico.\n */\n @Input({ transform: booleanAttribute }) readonly = false;\n\n /**\n * `true` (por defeito): estica à largura do contentor (útil em `app-layout-stack` com `fill`).\n * `false`: largura só ao conteúdo (texto + padding).\n */\n @Input({ transform: booleanAttribute }) fullWidth = true;\n\n /** Escala tipográfica e de paddings/`min-height` do design system. `md` = aparência legada do botão. */\n @Input() size: ButtonSize = 'md';\n\n /** Arredondamento semântico do botão (design system). */\n @Input() radius: ButtonRadius = 'md';\n\n /** Carregamento: spinner + `disabled` nativo + `aria-busy`; o rótulo projectado mantém-se visível. */\n @Input({ transform: booleanAttribute }) loading = false;\n\n /** `disabled` efectivo do `<button>` (inclui `readonly` e `loading`). */\n get isDisabled(): boolean {\n return this.disabled || this.readonly || this.loading;\n }\n\n /** Estilo visual base; pode ser estendido no SCSS do projeto. */\n @Input() variant: ButtonVariant = 'primary';\n\n /** Alias de {@link variant} (nome comum em design systems). */\n @Input('appearance')\n set appearance(value: ButtonVariant) {\n if (\n value === ButtonVariant.Primary ||\n value === ButtonVariant.Secondary ||\n value === ButtonVariant.Ghost ||\n value === ButtonVariant.Link ||\n value === ButtonVariant.Danger ||\n value === ButtonVariant.Warning ||\n value === ButtonVariant.Success\n ) {\n this.variant = value;\n }\n }\n\n @HostBinding('class')\n get hostClasses(): string {\n const parts = [\n 'base-button',\n `base-button--${this.variant}`,\n `base-button--size-${this.size}`,\n `base-button--radius-${this.radius}`,\n ];\n if (this.disabled) {\n parts.push('base-button--disabled');\n }\n if (this.readonly) {\n parts.push('base-button--readonly');\n }\n if (this.fullWidth) {\n parts.push('base-button--full-width');\n }\n if (this.loading) {\n parts.push('base-button--loading');\n }\n return parts.join(' ');\n }\n\n /** Foca o `<button>` nativo (o host do componente não é focável). */\n focusNative(options?: FocusOptions): void {\n this.nativeBtn?.nativeElement?.focus(options);\n }\n}\n","<button\n #nativeBtn\n class=\"base-button__native\"\n [class.base-button__native--loading]=\"loading\"\n [attr.type]=\"type\"\n [disabled]=\"isDisabled\"\n [attr.aria-readonly]=\"readonly ? true : null\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n>\n @if (loading) {\n <span class=\"base-button__spinner\" aria-hidden=\"true\"></span>\n } @else {\n <ng-content />\n }\n</button>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { BaseButtonComponent } from '../base-button/base-button.component';\n\n/**\n * Botão público da library (`app-button`). Comportamento e API iguais a {@link BaseButtonComponent};\n * use sempre este componente em templates — a base permanece interna ao pacote.\n */\n@Component({\n selector: 'app-button',\n standalone: true,\n imports: [],\n templateUrl: '../base-button/base-button.component.html',\n styleUrl: '../base-button/base-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonComponent extends BaseButtonComponent {}\n","const counters = new Map<string, number>();\r\n\r\nexport function createAutoId(prefix: string): string {\r\n const next = (counters.get(prefix) ?? 0) + 1;\r\n counters.set(prefix, next);\r\n return `${prefix}-${next}`;\r\n}\r\n","import {\n ChangeDetectorRef,\n DestroyRef,\n Directive,\n EventEmitter,\n HostBinding,\n Injector,\n Input,\n Output,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { ElementRef } from '@angular/core';\nimport type { MenuNodeItem } from '../../../menus/_models/menu-item.model';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { createAutoId } from '../../../shared/id/auto-id';\nimport type { FieldSize } from '../_models/field-size.model';\n\n/**\n * Diretiva base abstrata: CVA, valor interno, disabled, touched e inputs comuns.\n * Sem UI; os campos concretos envolvem o input com `BaseFieldComponent`.\n */\n@Directive()\nexport abstract class BaseFieldDirective<T> implements ControlValueAccessor {\n protected readonly cdr = inject(ChangeDetectorRef);\n protected readonly injector = inject(Injector);\n protected readonly destroyRef = inject(DestroyRef);\n private readonly hostElementRef = inject(ElementRef<HTMLElement>);\n\n private formGroupDir: FormGroupDirective | null | undefined = undefined;\n private ngFormDir: NgForm | null | undefined = undefined;\n\n /** Identificador estável para a11y quando `id` não é informado */\n protected readonly autoId = createAutoId(this.autoIdPrefix);\n\n @Input() id = '';\n @Input() name = '';\n @Input() label = '';\n @Input() placeholder = '';\n /**\n * Escala visual: `sm` (compacto), `md` (padrão), `lg` (maior).\n */\n @Input() size: FieldSize = 'md';\n @Input() errorMessage = '';\n /** Se `true`, exibe o parágrafo de erro; por defeito `false` (só estado inválido na borda/label). */\n @Input() showErrorMessage = false;\n /**\n * Com campo inválido, aplica fundo semântico de erro (`--ui-field-invalid-input-bg`).\n * Por defeito `false`: fundo igual ao válido (normal ou só leitura); só borda/foco/prefixo denunciam erro.\n */\n @Input({ transform: booleanAttribute }) invalidThemed = false;\n @Input() required = false;\n /** Se `true` e `required`, exibe o asterisco no label (`BaseFieldComponent`); por defeito `false`. */\n @Input() showRequiredMark = false;\n @Input() readonly = false;\n /** Exibe ícone à esquerda (classes Font Awesome, ex.: `fa-solid fa-user`). */\n @Input() showPrefixIcon = true;\n @Input() prefixIcon = '';\n\n /** Alias de {@link prefixIcon} (API alinhada a “ícone à esquerda”). */\n @Input('iconLeft')\n set iconLeft(value: string) {\n this.prefixIcon = value ?? '';\n }\n /** Exibe botão à direita para limpar o valor quando houver texto. */\n @Input() clearable = false;\n @Input() clearAriaLabel = 'Limpar campo';\n /**\n * Se `true`, o atributo HTML fica `autocomplete=\"on\"` (sugestões do browser).\n * `false` → `autocomplete=\"off\"`. Padrão `true`.\n */\n @Input({ transform: booleanAttribute }) autocomplete = true;\n\n /** Placeholder de carregamento no `app-base-field` (skeleton). */\n @Input({ transform: booleanAttribute }) loading = false;\n\n /**\n * Se `true`, foca o controlo nativo após a vista estar montada (ignora se `disabled`, `readonly` ou `loading`).\n * Por defeito `false`.\n */\n @Input({ transform: booleanAttribute }) autofocus = false;\n\n /**\n * Mostra botão «…» no sufixo que abre menu de ações (dropdown com os itens em {@link contextMenuItems}).\n * Por defeito `false`.\n */\n @Input({ transform: booleanAttribute }) mostrarMenuContexto = false;\n\n /** Itens do menu de contexto (rótulos, divisores, grupos); só o botão é mostrado se a lista não for vazia. */\n @Input() contextMenuItems: readonly MenuNodeItem<string>[] = [];\n\n /** `id` do menu (acessibilidade); por defeito `{id do campo}-ctx`. */\n @Input() contextMenuId = '';\n\n @Output() readonly contextMenuSelect = new EventEmitter<string>();\n\n protected internalValue: T | null = null;\n protected disabled = false;\n\n private onChange: (value: T | null) => void = () => { };\n private onTouched: () => void = () => { };\n\n get controlId(): string {\n return this.id || this.autoId;\n }\n\n /** Útil para inspeção no DOM sem colidir com `id` do input interno. */\n @HostBinding('attr.data-control-id')\n get hostDataControlId(): string {\n return this.controlId;\n }\n\n protected get autoIdPrefix(): string {\n const tag = this.hostElementRef.nativeElement.tagName\n .toLowerCase()\n .replace(/^app-/, '');\n return `str-${tag || 'field'}`;\n }\n\n /** Valor do atributo HTML `autocomplete` derivado de {@link autocomplete}. */\n get autocompleteAttr(): 'on' | 'off' {\n return this.autocomplete ? 'on' : 'off';\n }\n\n /**\n * Mensagem exibida quando inválido: `errorMessage` se preenchido;\n * senão, se obrigatório, o padrão \"Campo obrigatório\".\n * Campos não obrigatórios não exibem mensagem de erro da lib.\n */\n getErrorMessage(): string {\n if (!this.showErrorMessage || !this.isEffectiveRequired(this.resolveControlForRequired())) {\n return '';\n }\n const custom = this.errorMessage.trim();\n if (custom.length > 0) {\n return custom;\n }\n return 'Campo obrigatório';\n }\n\n /**\n * Obrigatório efetivo para UI: {@link required} ou `Validators.required` no `FormControl`.\n * Usado no asterisco do label e no atributo HTML `required`.\n */\n get requiredEffective(): boolean {\n return this.isEffectiveRequired(this.resolveControlForRequired());\n }\n\n /**\n * `true` se `[required]=\"true\"` **ou** o control tiver `Validators.required`.\n */\n protected isEffectiveRequired(control: AbstractControl | null | undefined): boolean {\n if (this.required) {\n return true;\n }\n if (!control) {\n return false;\n }\n return (\n control.hasValidator(Validators.required) ||\n control.hasValidator(Validators.requiredTrue)\n );\n }\n\n /** Sobrescrito em campos com `NgControl` para ler o `FormControl`. */\n protected resolveControlForRequired(): AbstractControl | null | undefined {\n return undefined;\n }\n\n /**\n * Estado visual de erro (borda/label): obrigatório efetivo + control inválido +\n * só após interação com o valor (`dirty`) ou envio do formulário (`submitted`).\n * Não usar `touched` sozinho: blur/tab marca touched sem alterar o valor e não deve mostrar erro.\n */\n protected controlInvalidUi(control: AbstractControl | null | undefined): boolean {\n if (!this.isEffectiveRequired(control)) {\n return false;\n }\n return (\n !!control &&\n control.invalid &&\n (control.dirty || this.isParentFormSubmitted())\n );\n }\n\n /** Reactive: `FormGroupDirective` no `<form [formGroup]>`; template-driven: `NgForm`. */\n protected isParentFormSubmitted(): boolean {\n if (this.formGroupDir === undefined) {\n this.formGroupDir =\n this.injector.get(FormGroupDirective, null, { optional: true }) ?? null;\n }\n if (this.ngFormDir === undefined) {\n this.ngFormDir = this.injector.get(NgForm, null, { optional: true }) ?? null;\n }\n return !!(this.formGroupDir?.submitted || this.ngFormDir?.submitted);\n }\n\n /**\n * Campos OnPush precisam reavaliar `baseInvalid` após o submit do form\n * (mudança de `submitted` não passa por `statusChanges`).\n */\n protected registerFormSubmitRecheck(): void {\n const fg = this.injector.get(FormGroupDirective, null, { optional: true });\n const nf = this.injector.get(NgForm, null, { optional: true });\n const mark = (): void => this.cdr.markForCheck();\n fg?.ngSubmit\n ?.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(mark);\n nf?.ngSubmit\n ?.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(mark);\n }\n\n writeValue(value: T | null): void {\n this.internalValue = value;\n this.afterWriteValue(value);\n this.cdr.markForCheck();\n }\n\n /** Sincroniza exibição/DOM após writeValue ou reset do form. */\n protected afterWriteValue(_value: T | null): void { }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n\n protected emitModelValue(value: T | null): void {\n if (this.disabled) {\n return;\n }\n this.internalValue = value;\n this.onChange(value);\n }\n\n protected notifyTouched(): void {\n this.onTouched();\n this.cdr.markForCheck();\n }\n\n /**\n * Chamado em `ngAfterViewInit` dos campos concretos com o elemento focável (input, textarea, combobox, etc.).\n */\n protected applyAutofocusIfNeeded(\n resolve: () => HTMLElement | null | undefined,\n ): void {\n if (!this.autofocus || this.disabled || this.readonly || this.loading) {\n return;\n }\n queueMicrotask(() => {\n const el = resolve();\n el?.focus({ preventScroll: false });\n });\n }\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/** Bloco genérico de skeleton (linhas, caixas, células). */\r\n@Component({\r\n selector: 'app-skeleton-block',\r\n standalone: true,\r\n templateUrl: './skeleton-block.component.html',\r\n styleUrl: './skeleton-block.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SkeletonBlockComponent {\r\n /** Largura CSS (ex.: `100%`, `6rem`, `40%`). */\r\n @Input() width = '100%';\r\n /** Altura CSS. */\r\n @Input() height = '0.75rem';\r\n /** Raio de canto. */\r\n @Input() radius = '8px';\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = ['skeleton-block'];\r\n if (this.animate) {\r\n parts.push('skeleton-block--animate');\r\n } else {\r\n parts.push('skeleton-block--static');\r\n }\r\n return parts.join(' ');\r\n }\r\n}\r\n","<span class=\"skeleton-block__inner\" aria-hidden=\"true\" [style.width]=\"width\" [style.height]=\"height\"\r\n [style.border-radius]=\"radius\"></span>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Várias linhas de texto placeholder. */\r\n@Component({\n selector: 'app-skeleton-text',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-text.component.html',\n styleUrl: './skeleton-text.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonTextComponent {\r\n @Input({ transform: numberAttribute }) lines = 3;\r\n /** Largura da última linha em % (1–100). */\r\n @Input({ transform: numberAttribute }) lastLineWidthPct = 62;\r\n @Input() lineHeight = '0.7rem';\r\n @Input() gap = '0.45rem';\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n lineIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.lines) }, (_, i) => i);\r\n }\r\n\r\n widthForLine(i: number): string {\r\n const n = Math.max(1, this.lines);\r\n if (i === n - 1) {\r\n const p = Math.min(100, Math.max(20, this.lastLineWidthPct));\r\n return `${p}%`;\r\n }\r\n return '100%';\r\n }\r\n}\r\n","<div class=\"skeleton-text\" [style.gap]=\"gap\">\r\n @for (i of lineIndexes(); track i) {\r\n <app-skeleton-block [width]=\"widthForLine(i)\" [height]=\"lineHeight\" [animate]=\"animate\" />\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Lista vertical de linhas (ex.: opções de dropdown). */\r\n@Component({\n selector: 'app-skeleton-list',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-list.component.html',\n styleUrl: './skeleton-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonListComponent {\r\n @Input({ transform: numberAttribute }) rows = 6;\r\n /** Mostra um “leading” à esquerda (círculo pequeno). */\r\n @Input({ transform: booleanAttribute }) leading = true;\r\n @Input() rowGap = '0.25rem';\r\n /** Altura da barra por linha (alinhada às opções de select ~0,95rem / lh 1,35). */\r\n @Input() lineHeight = '1.05rem';\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n rowIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.rows) }, (_, i) => i);\r\n }\r\n}\r\n","<div class=\"skeleton-list\" [style.gap]=\"rowGap\">\r\n @for (i of rowIndexes(); track i) {\r\n <div class=\"skeleton-list__row\">\r\n @if (leading) {\r\n <app-skeleton-block class=\"skeleton-list__dot\" width=\"1.5rem\" height=\"1.5rem\" radius=\"999px\"\r\n [animate]=\"animate\" />\r\n }\r\n <app-skeleton-block class=\"skeleton-list__line\" width=\"100%\" [height]=\"lineHeight\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Placeholder de cartão (avatar + texto + ações). */\r\n@Component({\n selector: 'app-skeleton-card',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-card.component.html',\n styleUrl: './skeleton-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonCardComponent {\r\n @Input({ transform: booleanAttribute }) showActions = true;\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n}\r\n","<div class=\"skeleton-card\" aria-hidden=\"true\">\r\n <div class=\"skeleton-card__row\">\r\n <div class=\"skeleton-card__main\">\r\n <app-skeleton-block class=\"skeleton-card__avatar\" width=\"2.35rem\" height=\"2.35rem\" radius=\"999px\"\r\n [animate]=\"animate\" />\r\n <div class=\"skeleton-card__text\">\r\n <app-skeleton-block width=\"72%\" height=\"0.72rem\" radius=\"6px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"48%\" height=\"0.62rem\" radius=\"6px\" [animate]=\"animate\" />\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"skeleton-card__actions\">\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Placeholder tabular (cabeçalho + linhas + faixa de paginação). */\r\n@Component({\n selector: 'app-skeleton-table',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-table.component.html',\n styleUrl: './skeleton-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonTableComponent {\r\n @Input({ transform: numberAttribute }) columnCount = 4;\r\n @Input({ transform: numberAttribute }) rowCount = 8;\r\n @Input({ transform: booleanAttribute }) showPager = true;\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n colIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.columnCount) }, (_, i) => i);\r\n }\r\n\r\n rowIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.rowCount) }, (_, i) => i);\r\n }\r\n}\r\n","<div class=\"skeleton-table\" aria-hidden=\"true\">\r\n <div class=\"skeleton-table__header\">\r\n @for (c of colIndexes(); track c) {\r\n <app-skeleton-block class=\"skeleton-table__cell\" width=\"100%\" height=\"0.65rem\" radius=\"6px\" [animate]=\"animate\" />\r\n }\r\n </div>\r\n <div class=\"skeleton-table__body\">\r\n @for (r of rowIndexes(); track r) {\r\n <div class=\"skeleton-table__row\">\r\n @for (c of colIndexes(); track c) {\r\n <app-skeleton-block class=\"skeleton-table__cell\" width=\"100%\" height=\"0.55rem\" radius=\"5px\" [animate]=\"animate\" />\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if (showPager) {\r\n <div class=\"skeleton-table__pager\">\r\n <app-skeleton-block width=\"40%\" height=\"0.55rem\" radius=\"6px\" [animate]=\"animate\" />\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Layout do placeholder no `app-base-field` quando `loading` é `true`. */\r\nexport type SkeletonFieldShellVariant = 'text' | 'select' | 'textarea';\r\n\r\n/**\r\n * Placeholder de campo: barra de valor e, opcionalmente, quadrado à esquerda quando não há\r\n * ícone Font Awesome na coluna de prefixo do `app-base-field`.\r\n */\r\n@Component({\r\n selector: 'app-skeleton-field-shell',\r\n imports: [SkeletonBlockComponent],\r\n templateUrl: './skeleton-field-shell.component.html',\r\n styleUrl: './skeleton-field-shell.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SkeletonFieldShellComponent {\r\n /** `textarea`: várias barras (multilinha); restantes: uma barra estreita ao estilo «valor». */\r\n @Input() variant: SkeletonFieldShellVariant = 'text';\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n /**\r\n * Quando `false`, não renderiza o quadrado à esquerda (o `app-base-field` já mostra o ícone\r\n * de prefixo inerte na coluna correcta durante `loading`).\r\n */\r\n @Input({ transform: booleanAttribute }) showLeadingIcon = true;\r\n}\r\n","<div\r\n class=\"skeleton-field-shell\"\r\n [class.skeleton-field-shell--bar-only]=\"!showLeadingIcon\"\r\n [class.skeleton-field-shell--textarea]=\"variant === 'textarea'\"\r\n aria-hidden=\"true\"\r\n>\r\n @if (showLeadingIcon) {\r\n <app-skeleton-block class=\"skeleton-field-shell__prefix\" width=\"1.35em\" height=\"1.35em\" radius=\"8px\"\r\n [animate]=\"animate\" />\r\n }\r\n @if (variant === 'textarea') {\r\n <div class=\"skeleton-field-shell__lines\">\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"72%\" height=\"1.05em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"92%\" height=\"1.05em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"58%\" height=\"1.05em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n </div>\r\n } @else {\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"72%\" height=\"1.35em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n }\r\n</div>\r\n","export const STRUCTRA_THEME_IDS = [\r\n 'blue',\r\n 'green',\r\n 'purple',\r\n 'orange',\r\n 'white',\r\n 'gray',\r\n 'sepia',\r\n 'black',\r\n] as const;\r\n\r\nexport type StructraTheme = (typeof STRUCTRA_THEME_IDS)[number];\r\n","import { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\r\n\r\nexport const APP_THEME_BASE_CLASS = 'app-library-theme';\r\n\r\nexport function normalizeStructraTheme(theme: StructraTheme | string): StructraTheme {\r\n const candidate = String(theme) as StructraTheme;\r\n if ((STRUCTRA_THEME_IDS as readonly string[]).includes(candidate)) {\r\n return candidate;\r\n }\r\n return 'black';\r\n}\r\n\r\nexport function getThemeTokenClass(theme: StructraTheme | string): string {\r\n return `theme-${normalizeStructraTheme(theme)}`;\r\n}\r\n\r\nexport function getThemeClassList(theme: StructraTheme | string): readonly [string, string] {\r\n return [APP_THEME_BASE_CLASS, getThemeTokenClass(theme)];\r\n}\r\n\r\nexport function getThemeClass(theme: StructraTheme | string): string {\r\n return getThemeClassList(theme).join(' ');\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\nimport { getThemeClass, getThemeClassList } from './theme-class.helpers';\nimport { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\n\n/** Identificadores de paleta suportados pela library (uso em `AppThemeService.setTheme`). */\nexport enum AppTheme {\n Blue = 'blue',\n Green = 'green',\n Purple = 'purple',\n Orange = 'orange',\n White = 'white',\n Gray = 'gray',\n Sepia = 'sepia',\n Black = 'black',\n}\n\nexport const APP_THEME_IDS = [\n ...STRUCTRA_THEME_IDS,\n] as const;\n\nexport type AppThemeId = StructraTheme;\n\n/** Opção de tema para UI (selector, documentação). */\nexport interface AppThemeOption {\n readonly id: AppThemeId;\n readonly label: string;\n}\n\n/**\n * Estado global do tema da library: **sempre** `.app-library-theme` + `theme-*` juntos.\n * Os tokens de paleta em `_theme-palettes.scss` usam o selector `.app-library-theme.theme-*`.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppThemeService {\n private readonly activeId = signal<AppThemeId>(AppTheme.Black);\n\n /** Identificador do tema activo (`blue`, `green`, …). */\n readonly activeThemeId = this.activeId.asReadonly();\n\n /**\n * Classes separadas (ex.: CDK `panelClass` — uma string com espaço quebra `classList.add`).\n */\n readonly themeClassList = computed(\n (): readonly [string, string] => getThemeClassList(this.activeId()),\n );\n\n /**\n * As duas classes numa string — útil para `[class]`, `[ngClass]` com string, ou hosts HTML.\n * Ex.: `<div [ngClass]=\"libTheme.getTheme()\">` aplica paleta completa no consumidor.\n */\n readonly getTheme = computed(() => getThemeClass(this.activeId()));\n\n /** Mapa para `[ngClass]` com chaves dinâmicas (painéis overlay). */\n readonly themeClassMap = computed(() => {\n const [base, token] = this.themeClassList();\n return { [base]: true, [token]: true };\n });\n\n /** Lista fixa de temas suportados pela library. */\n readonly themeOptions: readonly AppThemeOption[] = [\n { id: AppTheme.Blue, label: 'Azul' },\n { id: AppTheme.Green, label: 'Verde' },\n { id: AppTheme.Purple, label: 'Roxo' },\n { id: AppTheme.Orange, label: 'Laranja' },\n { id: AppTheme.White, label: 'Branco' },\n { id: AppTheme.Gray, label: 'Cinza' },\n { id: AppTheme.Sepia, label: 'Sépia' },\n { id: AppTheme.Black, label: 'Preto' },\n ] as const;\n\n setTheme(id: AppThemeId): void {\n this.activeId.set(id);\n }\n\n isActive(id: AppThemeId): boolean {\n return this.activeId() === id;\n }\n}\n","import { Directive, ElementRef, Input, OnChanges, Renderer2 } from '@angular/core';\r\nimport { AppTheme, AppThemeService } from './app-theme.service';\r\nimport {\r\n APP_THEME_BASE_CLASS,\r\n getThemeTokenClass,\r\n normalizeStructraTheme,\r\n} from './theme-class.helpers';\r\nimport { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\r\n\r\n@Directive({\r\n selector: '[appTheme]',\r\n standalone: true,\r\n})\r\nexport class ThemeDirective implements OnChanges {\r\n @Input('appTheme') theme: StructraTheme | AppTheme = 'black';\r\n\r\n private readonly themeTokenClasses = STRUCTRA_THEME_IDS.map((themeId) => `theme-${themeId}`);\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef<HTMLElement>,\r\n private readonly renderer: Renderer2,\r\n private readonly themeService: AppThemeService,\r\n ) {}\r\n\r\n ngOnChanges(): void {\r\n const element = this.elementRef.nativeElement;\r\n this.renderer.addClass(element, APP_THEME_BASE_CLASS);\r\n for (const themeClass of this.themeTokenClasses) {\r\n this.renderer.removeClass(element, themeClass);\r\n }\r\n this.renderer.addClass(element, getThemeTokenClass(this.theme));\r\n /** Overlays / hosts que leem {@link AppThemeService} alinham com o mesmo tema do wrapper. */\r\n this.themeService.setTheme(normalizeStructraTheme(this.theme as string));\r\n }\r\n}\r\n","import { Signal, computed, inject } from '@angular/core';\r\nimport { AppThemeService, type AppThemeId, type AppTheme } from './app-theme.service';\r\nimport { normalizeStructraTheme } from './theme-class.helpers';\r\nimport type { StructraTheme } from './theme.types';\r\n\r\n/**\r\n * Tema efectivo para hosts/overlays: valor de `[appTheme]` quando definido; caso contrário\r\n * {@link AppThemeService.activeThemeId} (mesmo comportamento que antes sem input).\r\n */\r\nexport function injectEffectiveThemeId(\r\n appTheme: Signal<StructraTheme | AppTheme | undefined | null>,\r\n): Signal<AppThemeId> {\r\n const svc = inject(AppThemeService);\r\n return computed(() => {\r\n const v = appTheme();\r\n if (v !== undefined && v !== null && String(v).trim() !== '') {\r\n return normalizeStructraTheme(v as string);\r\n }\r\n return svc.activeThemeId();\r\n });\r\n}\r\n","import { Renderer2 } from '@angular/core';\r\nimport type { AppTheme } from './app-theme.service';\r\nimport {\r\n APP_THEME_BASE_CLASS,\r\n getThemeTokenClass,\r\n normalizeStructraTheme,\r\n} from './theme-class.helpers';\r\nimport { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\r\n\r\n/**\r\n * Remove classes de tema do host e, se `explicitTheme` estiver definido, aplica `.app-library-theme`\r\n * + `theme-*`. Caso contrário deixa o host sem paleta própria (herda do ancestral / wrapper).\r\n */\r\nexport function applyOptionalThemeHostClasses(\r\n renderer: Renderer2,\r\n element: HTMLElement,\r\n explicitTheme: StructraTheme | AppTheme | string | undefined | null,\r\n): void {\r\n renderer.removeClass(element, APP_THEME_BASE_CLASS);\r\n for (const themeId of STRUCTRA_THEME_IDS) {\r\n renderer.removeClass(element, `theme-${themeId}`);\r\n }\r\n if (\r\n explicitTheme !== undefined &&\r\n explicitTheme !== null &&\r\n String(explicitTheme).trim() !== ''\r\n ) {\r\n const id = normalizeStructraTheme(explicitTheme as string);\r\n renderer.addClass(element, APP_THEME_BASE_CLASS);\r\n renderer.addClass(element, getThemeTokenClass(id));\r\n }\r\n}\r\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n CdkConnectedOverlay,\r\n CdkOverlayOrigin,\r\n Overlay,\r\n type ConnectedPosition,\r\n type ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { AppThemeService } from '../../../../theme';\r\n\r\n/** Posição por omissão do CDK (equivalente ao comportamento anterior sem `positions` explícitas). */\r\nconst DEFAULT_CONNECTED_POSITIONS: ConnectedPosition[] = [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n];\r\n\r\n/**\r\n * Base de overlay para **listas ligadas a campos** (select, dropdown-menu, etc.).\r\n * Para tooltips/popovers genéricos ver `AnchoredOverlayComponent` em `overlay/` — mesma stack CDK e tema,\r\n * API de fecho semelhante (`open`/`openChange`, Escape), mas defaults diferentes (ex.: backdrop em dropdowns).\r\n */\r\n@Component({\r\n selector: 'app-dropdown-base',\r\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgClass, NgTemplateOutlet],\r\n templateUrl: './dropdown-base.component.html',\r\n styleUrl: './dropdown-base.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DropdownBaseComponent {\r\n private readonly appTheme = inject(AppThemeService);\r\n private readonly overlay = inject(Overlay);\r\n\r\n /**\r\n * O overlay do CDK fica sob `body`; sem estas classes, `var(--app-color-*)` cai no `:root`.\r\n * Tem de ser **array**: uma única string com espaço quebra `classList.add` e as classes não aplicam.\r\n */\r\n readonly overlayPanelClasses = computed((): string[] => [\r\n ...this.appTheme.themeClassList(),\r\n ]);\r\n\r\n /**\r\n * O CDK não reaplica `cdkConnectedOverlayPanelClass` quando o overlay já existe.\r\n * As classes de tema no painel interno seguem o tema activo sempre.\r\n */\r\n readonly panelThemeNgClass = computed(() => this.appTheme.themeClassMap());\r\n\r\n @Input({ transform: booleanAttribute }) open = false;\r\n @Output() readonly openChange = new EventEmitter<boolean>();\r\n\r\n /** Conteúdo do painel (lista, etc.) renderizado no overlay. */\r\n @Input({ required: true }) panelTemplate!: TemplateRef<unknown>;\r\n\r\n /** Largura do painel em px (ex.: largura total do campo). */\r\n @Input() panelWidthPx: number | null = null;\r\n\r\n @Input({ transform: booleanAttribute }) closeOnEscape = true;\r\n @Input({ transform: booleanAttribute }) hasBackdrop = true;\r\n\r\n /**\r\n * Posições do overlay ligadas ao trigger (ex.: menu com flip vertical).\r\n * Por omissão mantém o alinhamento clássico «por baixo» dos campos.\r\n */\r\n @Input() connectedPositions: ConnectedPosition[] | undefined;\r\n\r\n /** Empurra o overlay para caber no viewport quando há espaço insuficiente. */\r\n @Input({ transform: booleanAttribute }) pushConnectedOverlay = false;\r\n\r\n /**\r\n * Por omissão **reposiciona** o painel quando o viewport ou contentores com scroll se movem\r\n * (mesma ideia que submenus em `app-menu-list`). Sobrescrever só em casos especiais (ex.: fechar ao scroll).\r\n */\r\n @Input() scrollStrategy: ScrollStrategy | null = null;\r\n\r\n readonly defaultScrollStrategy = this.overlay.scrollStrategies.reposition();\r\n\r\n get effectiveScrollStrategy(): ScrollStrategy {\r\n return this.scrollStrategy ?? this.defaultScrollStrategy;\r\n }\r\n\r\n /**\r\n * `true`: painel sem fundo/borda/sombra próprios — o conteúdo (ex.: `app-menu-list`) define o chrome.\r\n * Evita dupla moldura com `menu-surface-shell` nos menus de acção.\r\n */\r\n @Input({ transform: booleanAttribute }) bareOverlayPanel = false;\r\n\r\n get overlayWidthPx(): number {\r\n const w = this.panelWidthPx;\r\n return w != null && w > 0 ? w : 0;\r\n }\r\n\r\n get effectiveConnectedPositions(): ConnectedPosition[] {\r\n return this.connectedPositions ?? DEFAULT_CONNECTED_POSITIONS;\r\n }\r\n\r\n onBackdropClick(): void {\r\n this.setOpen(false);\r\n }\r\n\r\n /**\r\n * Cliques noutros controlos (fora do painel e fora do trigger) nem sempre passam pelo backdrop;\r\n * o CDK expõe `overlayOutsideClick` para o mesmo efeito de fechar.\r\n */\r\n onOverlayOutsideClick(): void {\r\n this.setOpen(false);\r\n }\r\n\r\n onOverlayKeydown(ev: KeyboardEvent): void {\r\n if (this.closeOnEscape && ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.setOpen(false);\r\n }\r\n }\r\n\r\n setOpen(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.open = next;\r\n this.openChange.emit(next);\r\n }\r\n\r\n toggle(): void {\r\n this.setOpen(!this.open);\r\n }\r\n}\r\n","<div class=\"dropdown-base\">\r\n <span class=\"dropdown-base__origin\" cdkOverlayOrigin #dropdownOrigin=\"cdkOverlayOrigin\">\r\n <ng-content select=\"[appDropdownTrigger]\" />\r\n </span>\r\n\r\n <ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayPositions]=\"effectiveConnectedPositions\"\r\n [cdkConnectedOverlayPush]=\"pushConnectedOverlay\"\r\n [cdkConnectedOverlayScrollStrategy]=\"effectiveScrollStrategy\"\r\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\r\n [cdkConnectedOverlayOrigin]=\"dropdownOrigin\"\r\n [cdkConnectedOverlayOpen]=\"open\"\r\n [cdkConnectedOverlayWidth]=\"$any(overlayWidthPx > 0 ? overlayWidthPx : undefined)\"\r\n [cdkConnectedOverlayMinWidth]=\"$any(overlayWidthPx > 0 ? overlayWidthPx : undefined)\"\r\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\r\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\r\n [cdkConnectedOverlayDisableClose]=\"false\"\r\n (backdropClick)=\"onBackdropClick()\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\r\n (overlayKeydown)=\"onOverlayKeydown($event)\"\r\n (detach)=\"setOpen(false)\"\r\n >\r\n <div\r\n class=\"dropdown-base__panel\"\r\n [class.dropdown-base__panel--bare]=\"bareOverlayPanel\"\r\n [ngClass]=\"panelThemeNgClass()\"\r\n role=\"presentation\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"panelTemplate\" />\r\n </div>\r\n </ng-template>\r\n</div>\r\n","/**\r\n * Posicionamento vertical preferido do dropdown em relação ao trigger.\r\n * O CDK faz flip automático se não couber no viewport quando configurado com posições múltiplas.\r\n */\r\nexport enum MenuDropdownPlacement {\r\n /** Abre por baixo do trigger (preferencial). */\r\n Below = 'below',\r\n /** Abre por cima do trigger. */\r\n Above = 'above',\r\n}\r\n","import type { ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\r\n\r\n/** Espaço entre trigger e painel (listas alinhadas ao `start`); mais apertado que `anchoredOverlayPositions` (8px). */\r\nconst GAP = 4;\r\n\r\n/** Posições com flip vertical (preferência em baixo ou em cima). */\r\nexport function menuConnectedPositions(\r\n placement: MenuDropdownPlacement,\r\n): ConnectedPosition[] {\r\n if (placement === MenuDropdownPlacement.Above) {\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetY: -GAP,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: GAP,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: GAP,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetY: -GAP,\r\n },\r\n ];\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n/**\r\n * Separador semântico reutilizável — mesma apresentação que o divisor do modelo de dados (`kind: 'divider'`).\r\n */\r\n@Component({\r\n selector: 'app-menu-divider',\r\n standalone: true,\r\n template: `<div class=\"menu-list__separator\" role=\"separator\" aria-hidden=\"true\"></div>`,\r\n styleUrl: './menu-divider.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MenuDividerComponent {}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\n\n/**\n * Cabeçalho opcional de grupo — alinhado a `MenuItemGroup` (`kind: 'group'`):\n * `alwaysExpanded` = sempre aberto sem toggle; caso contrário `expanded` no modelo define o estado inicial.\n */\n@Component({\n selector: 'app-menu-group',\n standalone: true,\n template: `\n @if (label?.trim() && !hideLabel) {\n @if (collapsible) {\n <button\n type=\"button\"\n class=\"menu-list__group-toggle\"\n [attr.aria-expanded]=\"expanded\"\n (click)=\"toggleExpand.emit()\"\n >\n <span class=\"menu-list__group-toggle-label\">{{ label }}</span>\n <span class=\"menu-list__group-toggle-icon\" aria-hidden=\"true\">\n @if (expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </span>\n </button>\n } @else {\n <div class=\"menu-list__group-label\" role=\"presentation\">{{ label }}</div>\n }\n }\n `,\n styleUrl: './menu-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuGroupComponent {\n @Input() label?: string;\n\n /** Quando `true`, não mostra o título (ex.: sidebar colapsada só com ícones). */\n @Input({ transform: booleanAttribute }) hideLabel = false;\n\n /** Quando `true`, mostra seta e permite expandir/recolher (controlado pelo `menu-list`). */\n @Input({ transform: booleanAttribute }) collapsible = false;\n\n @Input({ transform: booleanAttribute }) expanded = true;\n\n @Output() readonly toggleExpand = new EventEmitter<void>();\n}\n","import type {\n MenuItemAction,\n MenuItemSubmenu,\n MenuLeafItem,\n MenuNodeItem,\n} from '../_models/menu-item.model';\n\nexport interface MenuRowAction<T = string> {\n kind: 'action';\n item: MenuItemAction<T>;\n /** Índice na navegação por teclado; `null` se desabilitado. */\n focusIndex: number | null;\n /** `null` = fora de grupo; caso contrário, pertence a este grupo (oculto se o grupo estiver fechado). */\n containingGroupId?: number | null;\n}\n\nexport interface MenuRowDivider {\n kind: 'divider';\n containingGroupId?: number | null;\n}\n\nexport interface MenuRowGroup {\n kind: 'group';\n label?: string;\n groupId: number;\n /** Eco de {@link MenuItemGroup.alwaysExpanded}. */\n alwaysExpanded?: boolean;\n /** Eco de {@link MenuItemGroup.expanded} (nome interno para não confundir com UI `expanded`). */\n initialExpanded?: boolean;\n}\n\nexport interface MenuRowSubmenu<T = string> {\n kind: 'submenu';\n item: MenuItemSubmenu<T>;\n focusIndex: number | null;\n containingGroupId?: number | null;\n}\n\nexport type MenuRow<T = string> =\n | MenuRowAction<T>\n | MenuRowDivider\n | MenuRowGroup\n | MenuRowSubmenu<T>;\n\nexport function buildMenuRows<T = string>(\n nodes: readonly MenuNodeItem<T>[],\n): MenuRow<T>[] {\n const rows: MenuRow<T>[] = [];\n let focusCounter = 0;\n let nextGroupId = 0;\n\n const addLeaf = (leaf: MenuLeafItem<T>, parentGroupId: number | null): void => {\n if (leaf.kind === 'divider') {\n rows.push({ kind: 'divider', containingGroupId: parentGroupId });\n return;\n }\n const focusIndex = leaf.disabled ? null : focusCounter++;\n rows.push({\n kind: 'action',\n item: leaf,\n focusIndex,\n containingGroupId: parentGroupId,\n });\n };\n\n const addNode = (n: MenuNodeItem<T>, parentGroupId: number | null): void => {\n if (n.kind === 'divider') {\n rows.push({ kind: 'divider', containingGroupId: parentGroupId });\n return;\n }\n if (n.kind === 'submenu') {\n const focusIndex = n.disabled ? null : focusCounter++;\n rows.push({\n kind: 'submenu',\n item: n,\n focusIndex,\n containingGroupId: parentGroupId,\n });\n return;\n }\n if (n.kind === 'group') {\n const gid = nextGroupId++;\n rows.push({\n kind: 'group',\n label: n.label,\n groupId: gid,\n alwaysExpanded: n.alwaysExpanded === true,\n initialExpanded:\n n.expanded === true ? true : n.expanded === false ? false : undefined,\n });\n for (const child of n.items) {\n addNode(child, gid);\n }\n return;\n }\n addLeaf(n, parentGroupId);\n };\n\n for (const n of nodes) {\n addNode(n, null);\n }\n return rows;\n}\n\nexport function focusableActionCount<T>(rows: readonly MenuRow<T>[]): number {\n return rows.filter(\n (r): r is MenuRowAction<T> | MenuRowSubmenu<T> =>\n (r.kind === 'action' || r.kind === 'submenu') && r.focusIndex !== null,\n ).length;\n}\n\n/**\n * `true` se `selectedId` for id de um item de acção (folha) em qualquer profundidade.\n * Usado para marcar o gatilho de submenu como selected quando a selecção actual é um filho.\n */\nexport function menuNodeTreeContainsId<T>(\n items: readonly MenuNodeItem<T>[],\n selectedId: T,\n): boolean {\n for (const node of items) {\n if (node.kind === 'divider') {\n continue;\n }\n if (node.kind === 'item') {\n if (node.id === selectedId) {\n return true;\n }\n } else {\n if (menuNodeTreeContainsId(node.items, selectedId)) {\n return true;\n }\n }\n }\n return false;\n}\n","import type { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\n/**\r\n * Ligeira sobreposição (offsetX) para o rato nunca\r\n * percorrer “vácuo” entre a linha do `cdkOverlayOrigin` e o painel: nesse\r\n * vão, `mouseleave` do trigger dispara sem `mouseenter` no subpainel, e o\r\n * submenu de nível profundo fecha (comportamento típico de menus de SO).\r\n */\r\nconst SUBMENU_OVERLAP_PX = 4;\r\n\r\n/**\r\n * Submenu ao lado do item (preferência à direita); o CDK `push` inverte se não couber.\r\n */\r\nexport function submenuConnectedPositions(): ConnectedPosition[] {\r\n return [\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetX: -SUBMENU_OVERLAP_PX,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n offsetX: SUBMENU_OVERLAP_PX,\r\n },\r\n ];\r\n}\r\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n Output,\n QueryList,\n Signal,\n SimpleChanges,\n ViewChildren,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n} from '@angular/core';\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport type { MenuItemAction, MenuNodeItem } from '../_models/menu-item.model';\nimport {\n getThemeClassList,\n injectEffectiveThemeId,\n type AppTheme,\n type AppThemeId,\n type StructraTheme,\n} from '../../theme';\nimport { MenuDividerComponent } from '../menu-divider/menu-divider.component';\nimport { MenuGroupComponent } from '../menu-group/menu-group.component';\nimport {\n type MenuRow,\n type MenuRowGroup,\n buildMenuRows,\n menuNodeTreeContainsId,\n} from '../_utils/menu-rows.util';\nimport { submenuConnectedPositions } from '../_utils/submenu-connected-positions.util';\n\nconst SUBMENU_OPEN_MS = 200;\n/**\n * Margem para o cursor atravessar a zona entre a linha e o painel (o overlay\n * não fica no DOM do trigger) sem fechar; emparelha com a sobreposição de posição.\n */\nconst SUBMENU_CLOSE_MS = 1200;\n\n@Component({\n selector: 'app-menu-list-body',\n templateUrl: './menu-list-body.component.html',\n styleUrl: './menu-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n /**\n * Host + `.menu-list` interior registados no `ScrollDispatcher`:\n * os eventos `scroll` não propagam — quando só o interior tem `overflow:auto`\n * (dropdown / mixin `menu-surface-shell`), o host não recebe scroll; na sidebar\n * (`overflow-y:visible` em `.app-nav-surface`) quem rola é o host `app-menu-list`.\n * Ambos garantem que `RepositionScrollStrategy` volta a posicionar o submenu.\n */\n hostDirectives: [CdkScrollable],\n imports: [\n NgClass,\n forwardRef(() => MenuListBodyComponent),\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n CdkScrollable,\n MenuDividerComponent,\n MenuGroupComponent,\n ]\n})\nexport class MenuListBodyComponent<T = string> implements OnChanges {\n private readonly cdr: ChangeDetectorRef;\n readonly hostRef: ElementRef<HTMLElement>;\n\n /** Igual a `[appTheme]` na lib; omitir = tema global (ex.: propagado por `app-sidebar`). */\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n readonly effectiveThemeId: Signal<AppThemeId>;\n\n constructor(\n cdr: ChangeDetectorRef,\n hostRef: ElementRef<HTMLElement>,\n ) {\n this.cdr = cdr;\n this.hostRef = hostRef;\n this.effectiveThemeId = injectEffectiveThemeId(this.appTheme);\n }\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n /** Prefixo dos `id` das opções focáveis (`${menuId}-opt-${focusIndex}`). */\n @Input() menuId = 'app-menu';\n\n @Input({ transform: booleanAttribute }) dense = false;\n\n /** Quando `true`, o menu está dentro de um submenu — seta ← regressa um nível. */\n @Input({ transform: booleanAttribute }) nested = false;\n\n /**\n * Destaca visualmente o item cuja `id` coincide (navegação actual / rota activa).\n * Só aplica a linhas `kind: 'item'` neste nível.\n */\n @Input() selectedItemId: T | null = null;\n\n /**\n * Oculta rótulos e descrições (ex.: sidebar colapsada), mantendo ícones; define `title` nativo para hover.\n */\n @Input({ transform: booleanAttribute }) compressText = false;\n\n /**\n * Submenus (`kind: 'submenu'`):\n * - **`true` (omissão)** — abre/fecha **por clique** (e teclado); **não** abre ao passar o rato.\n * - **`false`** — igual ao comportamento anterior: abre **só com hover** (com atraso), sem alternar ao clicar na linha.\n */\n @Input() clickToOpen = true;\n\n /**\n * Grupos (`kind: 'group'`): quando `false`, cabeçalhos sem seta e itens sempre visíveis (não recolhe).\n */\n @Input({ transform: booleanAttribute }) groupCollapsible = true;\n\n /**\n * Com {@link groupCollapsible}: estado inicial ao receber `items` para grupos **sem** `expanded`\n * explícito no modelo.\n * - `'all'` — todos os grupos colapsáveis começam abertos.\n * - `'first'` — só o primeiro grupo da lista (se não for `alwaysExpanded`) começa aberto.\n */\n @Input() groupDefaultExpansion: 'all' | 'first' = 'all';\n\n /**\n * Quando `true`, expande todos os grupos colapsáveis (ex.: pesquisa activa na lista raiz).\n */\n @Input({ transform: booleanAttribute }) expandAllGroupsInitially = false;\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly closeRequest = new EventEmitter<void>();\n @Output() readonly submenuBack = new EventEmitter<void>();\n\n @ViewChildren(MenuListBodyComponent)\n private nestedLists?: QueryList<MenuListBodyComponent<T>>;\n\n rows: MenuRow<T>[] = [];\n\n /** Filtrado + índices de foco coerentes com grupos recolhidos. */\n displayRows: MenuRow<T>[] = [];\n\n /** Ids de grupo expandidos; ao mudar `items`, todos voltam a abertos. */\n private readonly expandedGroupIds = new Set<number>();\n\n private focusableCount = 0;\n\n /** Índice entre `0` e `focusableCount - 1`, ou `-1` = nenhum realce. */\n activeIndex = -1;\n\n /** Painel de submenu aberto (um por instância de lista). */\n openSubmenuKey: string | null = null;\n\n private submenuOpenTimer: ReturnType<typeof setTimeout> | null = null;\n private submenuCloseTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly submenuPositions = submenuConnectedPositions();\n\n readonly panelThemeNgClass = computed(() => {\n const [base, token] = getThemeClassList(this.effectiveThemeId());\n return { [base]: true, [token]: true };\n });\n\n overlayPanelClasses(): string[] {\n return [...getThemeClassList(this.effectiveThemeId()), 'menu-submenu__cdk-panel'];\n }\n\n onNestedItemSelect(id: T): void {\n this.closeOpenSubmenu();\n this.itemSelect.emit(id);\n }\n\n /** Identidade estável para `@for` — `track $index` quebra quando linhas são omitidas por grupo recolhido. */\n trackDisplayRow(index: number, row: MenuRow<T>): string {\n switch (row.kind) {\n case 'group':\n return `g-${String(row.groupId)}`;\n case 'divider':\n return `d-${String(row.containingGroupId ?? 'x')}-${index}`;\n case 'action':\n return `a-${String(row.item.id)}-${index}`;\n case 'submenu':\n return `s-${String(row.item.id)}-${index}`;\n default:\n return `r-${index}`;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['items'] || changes['expandAllGroupsInitially']) {\n this.rebuildRowsFromItems();\n } else if (\n changes['groupCollapsible'] ||\n changes['compressText'] ||\n changes['groupDefaultExpansion']\n ) {\n if (changes['compressText']) {\n this.rebuildRowsFromItems();\n } else {\n if (changes['groupDefaultExpansion'] && !changes['items']) {\n this.applyInitialExpandedGroups();\n }\n this.syncDisplayRows();\n }\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = this.focusableCount - 1;\n }\n }\n if (\n changes['selectedItemId'] ||\n changes['items'] ||\n changes['expandAllGroupsInitially'] ||\n changes['compressText'] ||\n changes['dense'] ||\n changes['menuId'] ||\n changes['clickToOpen'] ||\n changes['groupCollapsible'] ||\n changes['groupDefaultExpansion']\n ) {\n this.cdr.markForCheck();\n }\n }\n\n private getRowsSourceItems(): MenuNodeItem<T>[] {\n return [...(this.items ?? [])];\n }\n\n private rebuildRowsFromItems(): void {\n this.rows = buildMenuRows(this.getRowsSourceItems());\n if (this.expandAllGroupsInitially) {\n this.expandAllVisibleGroupsWhenSearching();\n } else {\n this.applyInitialExpandedGroups();\n }\n this.syncDisplayRows();\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = -1;\n }\n this.applySearchSubmenuAutoOpen();\n }\n\n /**\n * Com pesquisa activa (lista filtrada), abre o primeiro submenu deste nível que\n * ainda tenha itens visíveis — para o utilizador ver logo o resultado sem hover/clique.\n */\n private applySearchSubmenuAutoOpen(): void {\n if (!this.expandAllGroupsInitially) {\n return;\n }\n for (let i = 0; i < this.displayRows.length; i++) {\n const row = this.displayRows[i];\n if (row.kind !== 'submenu' || row.item.disabled) {\n continue;\n }\n if (row.item.items?.length) {\n this.openSubmenuKey = this.submenuRowKey(row, i);\n this.cdr.markForCheck();\n return;\n }\n }\n }\n\n private expandAllVisibleGroupsWhenSearching(): void {\n this.expandedGroupIds.clear();\n for (const r of this.rows) {\n if (r.kind === 'group' && !r.alwaysExpanded) {\n this.expandedGroupIds.add(r.groupId);\n }\n }\n }\n\n /** Estado inicial de grupos expandidos (`expanded` / `alwaysExpanded` / `groupDefaultExpansion`). */\n private applyInitialExpandedGroups(): void {\n this.expandedGroupIds.clear();\n const groupRows = this.rows.filter((r): r is MenuRowGroup => r.kind === 'group');\n const mode =\n String(this.groupDefaultExpansion ?? 'all').trim() === 'first' ? 'first' : 'all';\n\n for (const r of groupRows) {\n if (r.alwaysExpanded) {\n continue;\n }\n let open: boolean;\n if (r.initialExpanded === true) {\n open = true;\n } else if (r.initialExpanded === false) {\n open = false;\n } else if (mode === 'all') {\n open = true;\n } else {\n const idx = groupRows.indexOf(r);\n const firstPinned = groupRows[0]?.alwaysExpanded === true;\n open = firstPinned ? false : idx === 0;\n }\n if (open) {\n this.expandedGroupIds.add(r.groupId);\n }\n }\n }\n\n private syncDisplayRows(): void {\n const visible = this.rows.filter((r) => this.isRowVisible(r));\n let fi = 0;\n this.displayRows = visible.map((row) => {\n if (row.kind === 'action') {\n const nf = row.focusIndex === null ? null : fi++;\n return { ...row, focusIndex: nf };\n }\n if (row.kind === 'submenu') {\n const nf = row.focusIndex === null ? null : fi++;\n return { ...row, focusIndex: nf };\n }\n return row;\n });\n this.focusableCount = fi;\n }\n\n isGroupExpanded(groupId: number): boolean {\n if (!this.groupCollapsible || this.compressText) {\n return true;\n }\n if (this.isGroupAlwaysExpanded(groupId)) {\n return true;\n }\n return this.expandedGroupIds.has(groupId);\n }\n\n /** Eco de `MenuItemGroup.alwaysExpanded` para este `groupId`. */\n private isGroupAlwaysExpanded(groupId: number): boolean {\n const r = this.rows.find(\n (x): x is MenuRowGroup => x.kind === 'group' && x.groupId === groupId,\n );\n return r?.alwaysExpanded === true;\n }\n\n private isRowVisible(row: MenuRow<T>): boolean {\n if (row.kind === 'group') {\n return true;\n }\n let gid: number | null | undefined;\n if (row.kind === 'divider') {\n gid = row.containingGroupId;\n } else if (row.kind === 'action' || row.kind === 'submenu') {\n gid = row.containingGroupId;\n } else {\n return true;\n }\n if (gid == null) {\n return true;\n }\n return this.isGroupExpanded(gid);\n }\n\n toggleGroup(groupId: number): void {\n if (!this.groupCollapsible || this.compressText) {\n return;\n }\n if (this.isGroupAlwaysExpanded(groupId)) {\n return;\n }\n if (this.expandedGroupIds.has(groupId)) {\n this.expandedGroupIds.delete(groupId);\n } else {\n this.expandedGroupIds.add(groupId);\n }\n this.syncDisplayRows();\n this.closeOpenSubmenu();\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = this.focusableCount - 1;\n }\n this.cdr.markForCheck();\n }\n\n submenuRowKey(row: MenuRow<T>, index: number): string {\n return row.kind === 'submenu' ? `sm-${String(row.item.id)}-${index}` : '';\n }\n\n isSubmenuOpen(row: MenuRow<T>, index: number): boolean {\n return (\n row.kind === 'submenu' && this.openSubmenuKey === this.submenuRowKey(row, index)\n );\n }\n\n submenuMenuId(row: MenuRow<T>): string {\n if (row.kind !== 'submenu') {\n return this.menuId;\n }\n return `${this.menuId}-sub-${String(row.item.id)}`;\n }\n\n onRowMouseEnter(row: MenuRow<T>): void {\n if (row.kind !== 'action' && row.kind !== 'submenu') {\n return;\n }\n if (row.focusIndex === null) {\n return;\n }\n this.activeIndex = row.focusIndex;\n this.cdr.markForCheck();\n }\n\n /**\n * Grupo / divisor não são `menuitem` com foco-mãe — ao passar o rato para o cabeçalho do grupo,\n * limpa o realce da opção anterior (`.menu-list__option--active`).\n */\n onNonOptionSurfaceEnter(): void {\n this.activeIndex = -1;\n this.cdr.markForCheck();\n }\n\n onSubmenuTriggerEnter(row: MenuRow<T>, index: number): void {\n if (row.kind !== 'submenu' || row.item.disabled) {\n return;\n }\n /** Sempre: ao entrar noutra linha, cancela fecho pendente (ex.: mover entre submenus). */\n this.cancelSubmenuCloseTimer();\n if (row.focusIndex !== null) {\n this.activeIndex = row.focusIndex;\n }\n /** Modo clique: não abrir por hover — só realça o item. */\n if (this.clickToOpen) {\n this.cancelSubmenuOpenTimer();\n this.cdr.markForCheck();\n return;\n }\n this.cancelSubmenuOpenTimer();\n const key = this.submenuRowKey(row, index);\n this.submenuOpenTimer = setTimeout(() => {\n this.submenuOpenTimer = null;\n this.openSubmenuKey = key;\n this.queueFocusNestedFirst();\n this.cdr.markForCheck();\n }, SUBMENU_OPEN_MS);\n this.cdr.markForCheck();\n }\n\n onSubmenuTriggerLeave(_row: MenuRow<T>, index: number): void {\n this.cancelSubmenuOpenTimer();\n /** Com `clickToOpen`, não há timer de abertura por hover; o fecho ao sair mantém-se para painéis já abertos. */\n this.scheduleSubmenuClose(index);\n }\n\n onSubmenuPanelEnter(): void {\n this.cancelSubmenuCloseTimer();\n }\n\n onSubmenuPanelLeave(row: MenuRow<T>, index: number): void {\n this.scheduleSubmenuClose(index);\n }\n\n private scheduleSubmenuClose(index: number): void {\n this.cancelSubmenuCloseTimer();\n this.submenuCloseTimer = setTimeout(() => {\n this.submenuCloseTimer = null;\n const row = this.displayRows[index];\n if (row?.kind === 'submenu') {\n const key = this.submenuRowKey(row, index);\n if (this.openSubmenuKey === key) {\n this.openSubmenuKey = null;\n this.cdr.markForCheck();\n }\n }\n }, SUBMENU_CLOSE_MS);\n }\n\n private cancelSubmenuOpenTimer(): void {\n if (this.submenuOpenTimer) {\n clearTimeout(this.submenuOpenTimer);\n this.submenuOpenTimer = null;\n }\n }\n\n private cancelSubmenuCloseTimer(): void {\n if (this.submenuCloseTimer) {\n clearTimeout(this.submenuCloseTimer);\n this.submenuCloseTimer = null;\n }\n }\n\n /** Fecha o submenu deste nível (seta ← no filho ou fecho de irmão). */\n closeOpenSubmenu(): void {\n this.cancelSubmenuOpenTimer();\n this.cancelSubmenuCloseTimer();\n this.openSubmenuKey = null;\n this.cdr.markForCheck();\n }\n\n onSubmenuRowClick(ev: MouseEvent, row: MenuRow<T>, index: number): void {\n if (row.kind !== 'submenu') {\n return;\n }\n if (row.item.disabled) {\n ev.preventDefault();\n ev.stopPropagation();\n return;\n }\n /** Modo só-hover: o clique não alterna o painel (abre por `mouseenter`). */\n if (!this.clickToOpen) {\n ev.preventDefault();\n return;\n }\n ev.preventDefault();\n const key = this.submenuRowKey(row, index);\n if (this.openSubmenuKey === key) {\n this.closeOpenSubmenu();\n } else {\n this.openSubmenuKey = key;\n this.queueFocusNestedFirst();\n this.cdr.markForCheck();\n }\n }\n\n onSubmenuOutsideClick(row: MenuRow<T>, index: number): void {\n if (row.kind === 'submenu' && this.isSubmenuOpen(row, index)) {\n this.closeOpenSubmenu();\n }\n }\n\n private openSubmenuForRowAt(index: number): void {\n const row = this.displayRows[index];\n if (row?.kind !== 'submenu' || row.item.disabled) {\n return;\n }\n this.openSubmenuKey = this.submenuRowKey(row, index);\n this.queueFocusNestedFirst();\n this.cdr.markForCheck();\n }\n\n private queueFocusNestedFirst(): void {\n queueMicrotask(() => {\n const nested = this.nestedLists?.last;\n nested?.focusFirstOption();\n });\n }\n\n /** Primeira opção focável (abertura por teclado). */\n focusFirstOption(): void {\n if (this.focusableCount === 0) {\n return;\n }\n this.activeIndex = 0;\n this.focusActiveDom();\n this.cdr.markForCheck();\n }\n\n onItemClick(ev: MouseEvent, item: MenuItemAction<T>): void {\n if (item.disabled || item.loading) {\n ev.preventDefault();\n ev.stopPropagation();\n return;\n }\n ev.preventDefault();\n this.closeOpenSubmenu();\n this.itemSelect.emit(item.id);\n }\n\n optionId(focusIndex: number): string {\n return `${this.menuId}-opt-${focusIndex}`;\n }\n\n isActiveRow(row: MenuRow<T>): boolean {\n if (this.activeIndex < 0) {\n return false;\n }\n if (row.kind === 'action' || row.kind === 'submenu') {\n return row.focusIndex !== null && row.focusIndex === this.activeIndex;\n }\n return false;\n }\n\n /** Realce de selecção persistente (ex.: item de navegação activo). */\n isRowSelected(row: MenuRow<T>): boolean {\n if (this.selectedItemId == null) {\n return false;\n }\n if (row.kind === 'action') {\n return row.item.id === this.selectedItemId;\n }\n if (row.kind === 'submenu') {\n return (\n row.item.id === this.selectedItemId ||\n menuNodeTreeContainsId(row.item.items, this.selectedItemId)\n );\n }\n return false;\n }\n\n resetHighlight(): void {\n this.activeIndex = -1;\n this.cdr.markForCheck();\n }\n\n onMenuSurfaceLeave(): void {\n if (this.openSubmenuKey !== null) {\n return;\n }\n this.activeIndex = -1;\n this.cdr.markForCheck();\n }\n\n private focusActiveDom(): void {\n if (this.activeIndex < 0) {\n return;\n }\n const id = this.optionId(this.activeIndex);\n const el = this.hostRef.nativeElement.querySelector(`#${CSS.escape(id)}`) as\n | HTMLElement\n | null;\n el?.focus({ preventScroll: true });\n }\n\n /**\n * O campo de pesquisa (e outros controlos) projectam-se dentro deste host; os eventos\n * sobem em bubble e activavam Space/Enter como se fossem opções do menu.\n */\n private eventTargetIsInsideEditableOrControl(ev: Event): boolean {\n const path =\n typeof ev.composedPath === 'function' ? ev.composedPath() : [ev.target];\n for (const node of path) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (\n node.tagName === 'INPUT' ||\n node.tagName === 'TEXTAREA' ||\n node.tagName === 'SELECT' ||\n node.tagName === 'BUTTON'\n ) {\n return true;\n }\n if (node.isContentEditable) {\n return true;\n }\n }\n return false;\n }\n\n @HostListener('focusin', ['$event'])\n onFocusIn(ev: FocusEvent): void {\n if (this.eventTargetIsInsideEditableOrControl(ev)) {\n this.resetHighlight();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(ev: KeyboardEvent): void {\n if (this.eventTargetIsInsideEditableOrControl(ev)) {\n return;\n }\n\n if (ev.key === 'ArrowLeft' && this.nested) {\n ev.preventDefault();\n this.submenuBack.emit();\n return;\n }\n\n if (this.focusableCount === 0) {\n return;\n }\n const n = this.focusableCount;\n\n switch (ev.key) {\n case 'ArrowDown':\n ev.preventDefault();\n if (this.activeIndex < 0) {\n this.activeIndex = 0;\n } else {\n this.activeIndex = (this.activeIndex + 1) % n;\n }\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'ArrowUp':\n ev.preventDefault();\n if (this.activeIndex < 0) {\n this.activeIndex = n - 1;\n } else {\n this.activeIndex = (this.activeIndex - 1 + n) % n;\n }\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'Home':\n ev.preventDefault();\n this.activeIndex = 0;\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'End':\n ev.preventDefault();\n this.activeIndex = n - 1;\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'ArrowRight': {\n if (this.activeIndex < 0) {\n break;\n }\n let handled = false;\n for (let i = 0; i < this.displayRows.length; i++) {\n const r = this.displayRows[i];\n if (\n r.kind === 'submenu' &&\n r.focusIndex === this.activeIndex &&\n !r.item.disabled\n ) {\n ev.preventDefault();\n this.openSubmenuForRowAt(i);\n handled = true;\n break;\n }\n }\n if (!handled) {\n /* deixar propagar para o campo, se necessário */\n }\n break;\n }\n case 'Enter':\n case ' ': {\n ev.preventDefault();\n for (let i = 0; i < this.displayRows.length; i++) {\n const r = this.displayRows[i];\n if (r.kind !== 'action' && r.kind !== 'submenu') {\n continue;\n }\n if (r.focusIndex !== this.activeIndex || r.focusIndex === null) {\n continue;\n }\n if (r.kind === 'action') {\n if (r.item.disabled || r.item.loading) {\n break;\n }\n this.itemSelect.emit(r.item.id);\n break;\n }\n if (r.item.disabled) {\n break;\n }\n this.openSubmenuForRowAt(i);\n break;\n }\n break;\n }\n case 'Escape':\n ev.preventDefault();\n this.closeRequest.emit();\n break;\n default:\n break;\n }\n }\n}\n","<div class=\"menu-list\" [class.menu-list--nested]=\"nested\" [class.menu-list--dense]=\"dense\"\n [class.menu-list--compress-text]=\"compressText\" cdkScrollable tabindex=\"-1\" (mouseleave)=\"onMenuSurfaceLeave()\">\n <ng-content />\n <div class=\"menu-list__items\" role=\"menu\" [attr.aria-labelledby]=\"null\" tabindex=\"-1\">\n @for (row of displayRows; track trackDisplayRow($index, row); let idx = $index) {\n @switch (row.kind) {\n @case ('divider') {\n <app-menu-divider (mouseenter)=\"onNonOptionSurfaceEnter()\" />\n }\n @case ('group') {\n <div class=\"menu-list__group-row\" [class.menu-list__group-row--pinned]=\"row.alwaysExpanded\"\n (mouseenter)=\"onNonOptionSurfaceEnter()\">\n <app-menu-group [label]=\"row.label\" [hideLabel]=\"compressText\"\n [collapsible]=\"groupCollapsible && !compressText && !row.alwaysExpanded\"\n [expanded]=\"isGroupExpanded(row.groupId)\" (toggleExpand)=\"toggleGroup(row.groupId)\" />\n </div>\n }\n @case ('submenu') {\n <div class=\"menu-list__submenu-wrap\" cdkOverlayOrigin #subOrigin=\"cdkOverlayOrigin\"\n (mouseenter)=\"onSubmenuTriggerEnter(row, idx)\" (mouseleave)=\"onSubmenuTriggerLeave(row, idx)\">\n <div class=\"menu-list__option menu-list__option--submenu\" role=\"menuitem\" [attr.aria-haspopup]=\"'true'\"\n [attr.aria-expanded]=\"isSubmenuOpen(row, idx)\" [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\" [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\" [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--active]=\"isActiveRow(row)\" [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onSubmenuRowClick($event, row, idx)\" (mouseenter)=\"onRowMouseEnter(row)\">\n @if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n <span class=\"menu-list__submenu-chevron\" aria-hidden=\"true\">\n @if (isSubmenuOpen(row, idx)) {\n <i class=\"fa-solid fa-chevron-right\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </span>\n </div>\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"subOrigin\"\n [cdkConnectedOverlayOpen]=\"isSubmenuOpen(row, idx)\" [cdkConnectedOverlayPositions]=\"submenuPositions\"\n [cdkConnectedOverlayPush]=\"true\" [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayMinWidth]=\"200\" (overlayOutsideClick)=\"onSubmenuOutsideClick(row, idx)\">\n <div class=\"menu-submenu__panel\" [ngClass]=\"panelThemeNgClass()\" (mouseenter)=\"onSubmenuPanelEnter()\"\n (mouseleave)=\"onSubmenuPanelLeave(row, idx)\" (click)=\"$event.stopPropagation()\">\n <app-menu-list-body [items]=\"row.item.items\" [menuId]=\"submenuMenuId(row)\" [nested]=\"true\" [dense]=\"dense\"\n [compressText]=\"compressText\" [groupCollapsible]=\"groupCollapsible\"\n [groupDefaultExpansion]=\"groupDefaultExpansion\" [expandAllGroupsInitially]=\"expandAllGroupsInitially\"\n [clickToOpen]=\"clickToOpen\" [selectedItemId]=\"selectedItemId\" [appTheme]=\"appTheme()\"\n (itemSelect)=\"onNestedItemSelect($event)\" (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"closeOpenSubmenu()\" />\n </div>\n </ng-template>\n </div>\n }\n @case ('action') {\n <div class=\"menu-list__option\" role=\"menuitem\" [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\" [attr.aria-busy]=\"row.item.loading ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\" [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\" [class.menu-list__option--loading]=\"row.item.loading\"\n [class.menu-list__option--danger]=\"row.item.danger\" [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\" (click)=\"onItemClick($event, row.item)\"\n (mouseenter)=\"onRowMouseEnter(row)\">\n @if (row.item.loading) {\n <span class=\"menu-list__icon menu-list__icon--spin\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-spinner\"></i>\n </span>\n } @else if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n </div>\n }\n }\n }\n </div>\n</div>","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { DropdownBaseComponent } from '../../fields/dropdown-fields/_base/dropdown-base/dropdown-base.component';\r\nimport type { MenuNodeItem } from '../_models/menu-item.model';\r\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\r\nimport { menuConnectedPositions } from '../_utils/menu-connected-positions.util';\r\nimport { MenuListBodyComponent } from '../menu-list/menu-list-body.component';\r\n\r\n@Component({\r\n selector: 'app-dropdown-menu',\r\n imports: [DropdownBaseComponent, MenuListBodyComponent],\r\n templateUrl: './dropdown-menu.component.html',\r\n styleUrl: './dropdown-menu.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DropdownMenuComponent<T = string> {\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n\r\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\r\n\r\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\r\n\r\n /** Largura mínima do painel em px (o painel pode alargar ao conteúdo). */\r\n @Input() minWidthPx = 200;\r\n\r\n /** Se `true`, a largura do painel segue a do trigger. */\r\n @Input({ transform: booleanAttribute }) matchTriggerWidth = true;\r\n\r\n @Input() menuId = '';\r\n\r\n @Output() readonly itemSelect = new EventEmitter<T>();\r\n @Output() readonly openChange = new EventEmitter<boolean>();\r\n\r\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\r\n @ViewChild(MenuListBodyComponent) private menuList?: MenuListBodyComponent<T>;\r\n\r\n open = false;\r\n\r\n private readonly generatedId = `app-dd-${Math.random().toString(36).slice(2, 9)}`;\r\n\r\n get resolvedMenuId(): string {\r\n return this.menuId.trim() || this.generatedId;\r\n }\r\n\r\n /** Largura do painel no overlay (mínimo garantido; pode igualar ao trigger). */\r\n get effectivePanelWidth(): number {\r\n if (this.matchTriggerWidth) {\r\n const w = this.host.nativeElement.getBoundingClientRect().width;\r\n return Math.max(this.minWidthPx, Math.ceil(w));\r\n }\r\n return this.minWidthPx;\r\n }\r\n\r\n get connectedPositions() {\r\n return menuConnectedPositions(this.placement);\r\n }\r\n\r\n onTriggerClick(ev: Event): void {\r\n ev.preventDefault();\r\n this.toggle();\r\n }\r\n\r\n toggle(): void {\r\n this.setOpen(!this.open);\r\n }\r\n\r\n setOpen(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.open = next;\r\n this.openChange.emit(next);\r\n if (next) {\r\n queueMicrotask(() => this.menuList?.resetHighlight());\r\n }\r\n }\r\n\r\n onBaseOpenChange(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.open = next;\r\n this.openChange.emit(next);\r\n if (next) {\r\n queueMicrotask(() => this.menuList?.resetHighlight());\r\n }\r\n }\r\n\r\n onItemSelect(id: T): void {\r\n this.itemSelect.emit(id);\r\n this.setOpen(false);\r\n }\r\n\r\n onCloseRequest(): void {\r\n this.setOpen(false);\r\n }\r\n}\r\n","<app-dropdown-base\r\n class=\"dropdown-menu\"\r\n [open]=\"open\"\r\n (openChange)=\"onBaseOpenChange($event)\"\r\n [panelTemplate]=\"panelTpl\"\r\n [panelWidthPx]=\"effectivePanelWidth\"\r\n [connectedPositions]=\"connectedPositions\"\r\n [pushConnectedOverlay]=\"true\"\r\n [hasBackdrop]=\"true\"\r\n [closeOnEscape]=\"true\"\r\n [bareOverlayPanel]=\"true\"\r\n>\r\n <span\r\n class=\"dropdown-menu__trigger-slot\"\r\n appDropdownTrigger\r\n (click)=\"onTriggerClick($event)\"\r\n [attr.aria-expanded]=\"open\"\r\n aria-haspopup=\"menu\"\r\n >\r\n <ng-content />\r\n </span>\r\n</app-dropdown-base>\r\n\r\n<ng-template #panelTpl>\r\n <div class=\"dropdown-menu__panel-inner\">\r\n <app-menu-list-body\r\n [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\r\n [clickToOpen]=\"false\"\r\n (itemSelect)=\"onItemSelect($event)\"\r\n (closeRequest)=\"onCloseRequest()\"\r\n />\r\n </div>\r\n</ng-template>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n booleanAttribute,\n} from '@angular/core';\nimport {\n SkeletonFieldShellComponent,\n type SkeletonFieldShellVariant,\n} from '../../../loading/skeleton-loading';\nimport { DropdownMenuComponent } from '../../../menus/dropdown-menu/dropdown-menu.component';\nimport type { MenuNodeItem } from '../../../menus/_models/menu-item.model';\nimport type { FieldSize } from '../_models/field-size.model';\n\n/**\n * Base visual do campo: caixa com label flutuante, prefixo opcional e erro.\n * Usada dentro dos componentes de campo (texto, inteiro, decimal).\n */\n@Component({\n selector: 'app-base-field',\n imports: [SkeletonFieldShellComponent, DropdownMenuComponent],\n templateUrl: './base-field.component.html',\n styleUrl: './base-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class BaseFieldComponent implements OnChanges, OnInit {\n @Input() label = '';\n @Input() errorMessage = '';\n @Input() required = false;\n /** Asterisco visual do obrigatório no label (validação HTML `required` inalterada); por defeito `false`. */\n @Input() showRequiredMark = false;\n @Input() invalid = false;\n /** Fundo semântico de erro no involúcro; só com `invalid` + este `true`. */\n @Input({ transform: booleanAttribute }) invalidThemed = false;\n @Input() filled = false;\n @Input() disabled = false;\n @Input() readonly = false;\n /** Igual a {@link BaseFieldDirective.size}: `sm` | `md` | `lg`. */\n @Input() size: FieldSize = 'md';\n @Input() inputId = '';\n @Input() errorId = '';\n\n @Input() showPrefixIcon = false;\n /** Classes Font Awesome (ex.: `fa-solid fa-user`). Usado com `showPrefixIcon`. */\n @Input() prefixIcon = '';\n @Input() clearable = true;\n @Input() clearAriaLabel = 'Limpar campo';\n /**\n * Quando `true`, renderiza `ng-content` com `[appFieldSuffix]` à direita do input\n * (antes do botão limpar, se houver).\n */\n @Input() showSuffixSlot = false;\n /** Alinha o texto do valor à direita no input projetado. */\n @Input() valueAlignEnd = false;\n\n @Input({ transform: booleanAttribute }) loading = false;\n /** Variante do skeleton quando {@link loading} é `true`. */\n @Input() skeletonVariant: SkeletonFieldShellVariant = 'text';\n\n @Input({ transform: booleanAttribute }) mostrarMenuContexto = false;\n @Input() contextMenuItems: readonly MenuNodeItem<string>[] = [];\n /** Sufixo do `id` do menu (ex.: `meuCampo-ctx`); por defeito deriva-se de {@link inputId}. */\n @Input() contextMenuId = '';\n\n @Output() clear = new EventEmitter<void>();\n @Output() contextMenuSelect = new EventEmitter<string>();\n\n /** Derivados do template (actualizados em `ngOnChanges`, não getters por CD). */\n showErrorTpl = false;\n showFloatTpl = false;\n showFaTpl = false;\n prefixIconClassTpl = '';\n showClearTpl = false;\n showCtxMenuTpl = false;\n showSuffixTpl = false;\n\n get resolvedContextMenuId(): string {\n const t = this.contextMenuId.trim();\n if (t.length > 0) {\n return t;\n }\n const base = this.inputId.trim();\n return base.length > 0 ? `${base}-ctx` : 'app-field-ctx-menu';\n }\n\n ngOnInit(): void {\n this.refreshTplFlags();\n }\n\n ngOnChanges(_changes: SimpleChanges): void {\n this.refreshTplFlags();\n }\n\n private refreshTplFlags(): void {\n const labelTrim = this.label.trim();\n this.showFloatTpl = labelTrim.length > 0;\n this.showErrorTpl = this.invalid && !!this.errorMessage;\n const iconTrim = this.prefixIcon.trim();\n this.showFaTpl = this.showPrefixIcon && iconTrim.length > 0;\n this.prefixIconClassTpl = `base-field__prefix-icon ${iconTrim}`.trim();\n this.showClearTpl =\n !this.loading &&\n this.clearable &&\n this.filled &&\n !this.disabled &&\n !this.readonly;\n this.showCtxMenuTpl =\n !this.loading &&\n !this.disabled &&\n !this.readonly &&\n this.mostrarMenuContexto &&\n (this.contextMenuItems?.length ?? 0) > 0;\n /* Com `loading`, mantém coluna de sufixo (ex.: toggle senha) para não encolher a caixa. */\n this.showSuffixTpl = this.loading\n ? this.showSuffixSlot\n : this.showSuffixSlot || this.showClearTpl || this.showCtxMenuTpl;\n }\n\n onClearClick(): void {\n this.clear.emit();\n }\n\n onContextMenuItemSelect(id: string): void {\n this.contextMenuSelect.emit(id);\n }\n}\n","<div class=\"base-field\" [class.base-field--size-sm]=\"size === 'sm'\"\n [class.base-field--size-lg]=\"size === 'lg'\"\n [class.base-field--invalid]=\"invalid\"\n [class.base-field--invalid-themed]=\"invalid && invalidThemed\" [class.base-field--filled]=\"filled\"\n [class.base-field--disabled]=\"disabled\" [class.base-field--readonly]=\"readonly\"\n [class.base-field--loading]=\"loading\" [attr.aria-busy]=\"loading ? true : null\"\n [attr.aria-label]=\"loading && showFloatTpl ? label : null\">\n <div class=\"base-field__box\">\n <div class=\"base-field__prefix\">\n @if (!loading) {\n <ng-content select=\"[appFieldPrefix]\" />\n }\n @if (showFaTpl) {\n <i [attr.class]=\"prefixIconClassTpl + (loading ? ' base-field__prefix-icon--loading-dim' : '')\"\n aria-hidden=\"true\"></i>\n }\n </div>\n\n <div class=\"base-field__field\">\n @if (showFloatTpl && !loading) {\n <label class=\"base-field__float-label\" [attr.for]=\"inputId || null\">\n {{ label }}\n @if (required && showRequiredMark) {\n <span class=\"base-field__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n <div class=\"base-field__control\" [class.base-field__control--value-end]=\"valueAlignEnd\"\n [class.base-field__control--textarea-skeleton]=\"loading && skeletonVariant === 'textarea'\">\n @if (!loading) {\n <ng-content />\n } @else {\n <app-skeleton-field-shell [variant]=\"skeletonVariant\" [showLeadingIcon]=\"!showFaTpl\" />\n }\n </div>\n </div>\n\n @if (showSuffixTpl) {\n <div class=\"base-field__suffix\" [class.base-field__suffix--loading]=\"loading\">\n @if (!loading) {\n @if (showCtxMenuTpl) {\n <app-dropdown-menu\n class=\"base-field__ctx-dropdown\"\n [items]=\"contextMenuItems\"\n [minWidthPx]=\"200\"\n [matchTriggerWidth]=\"false\"\n [menuId]=\"resolvedContextMenuId\"\n (itemSelect)=\"onContextMenuItemSelect($event)\"\n >\n <button type=\"button\" class=\"base-field__ctx-trigger\" aria-label=\"Mais opções\" tabindex=\"-1\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n </app-dropdown-menu>\n }\n @if (showSuffixSlot) {\n <ng-content select=\"[appFieldSuffix]\" />\n }\n @if (showClearTpl) {\n <button type=\"button\" class=\"base-field__clear\" tabindex=\"-1\" [attr.aria-label]=\"clearAriaLabel\"\n (click)=\"onClearClick()\">\n <span class=\"base-field__clear-x\" aria-hidden=\"true\">&times;</span>\n </button>\n }\n } @else if (loading && showSuffixSlot) {\n <span class=\"base-field__suffix-reserve\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n </div>\n\n @if (!loading && showErrorTpl) {\n <p class=\"base-field__error\" [id]=\"errorId || null\" role=\"alert\">\n {{ errorMessage }}\n </p>\n }\n</div>\n","import { Directive, DoCheck, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n AbstractControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport { distinctUntilChanged, merge } from 'rxjs';\r\nimport { BaseFieldDirective } from './base-field.directive';\r\n\r\n/**\r\n * Campos com `NgControl` + CVA: injeta o control e expõe estado de erro/a11y comuns.\r\n */\r\n@Directive()\r\nexport abstract class NgControlFieldDirective<T>\r\n extends BaseFieldDirective<T>\r\n implements OnInit, OnChanges, DoCheck\r\n{\r\n protected ngControl: NgControl | null = null;\r\n\r\n /** `FormGroupDirective.submitted` muda com `resetForm()` sem `ngSubmit` — OnPush precisa disto para a borda/erro. */\r\n private lastParentSubmitted: boolean | undefined;\r\n\r\n /**\r\n * Texto do label flutuante em `app-base-field` (`label` ou `placeholder`).\r\n * Mantido em campo (não getter) para reduzir trabalho por ciclo de deteção.\r\n */\r\n floatLabelCaption = '';\r\n\r\n /** Cache para o template (evita `getErrorMessage()` / getters a cada CD). */\r\n uiErrorMessage = '';\r\n uiRequiredEffective = false;\r\n uiInvalid = false;\r\n uiAriaDescribedBy: string | null = null;\r\n\r\n protected override resolveControlForRequired(): AbstractControl | null | undefined {\r\n return this.ngControl?.control ?? undefined;\r\n }\r\n\r\n ngOnChanges(_changes: SimpleChanges): void {\r\n this.refreshFloatLabelCaption();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n private refreshFloatLabelCaption(): void {\r\n this.floatLabelCaption = (this.label || this.placeholder).trim();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.refreshFloatLabelCaption();\r\n this.ngControl = this.injector.get(NgControl, null, {\r\n optional: true,\r\n self: true,\r\n });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n const c = this.ngControl?.control;\r\n if (c) {\r\n merge(\r\n c.statusChanges,\r\n c.valueChanges.pipe(\r\n distinctUntilChanged((a, b) => Object.is(a, b)),\r\n ),\r\n )\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncControlUi());\r\n this.syncControlUi();\r\n }\r\n this.registerFormSubmitRecheck();\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (!this.ngControl?.control) {\r\n return;\r\n }\r\n const sub = this.isParentFormSubmitted();\r\n if (this.lastParentSubmitted === undefined) {\r\n this.lastParentSubmitted = sub;\r\n return;\r\n }\r\n if (this.lastParentSubmitted !== sub) {\r\n this.lastParentSubmitted = sub;\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n override writeValue(value: T | null): void {\r\n super.writeValue(value);\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n /**\r\n * Após propagar o valor ao `FormControl`, reavalia já `uiInvalid` / a11y.\r\n * Só confiar em `valueChanges` pode deixar o estado visual desfasado (ex.: select após escolha).\r\n */\r\n protected override emitModelValue(value: T | null): void {\r\n super.emitModelValue(value);\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n protected override registerFormSubmitRecheck(): void {\r\n const fg = this.injector.get(FormGroupDirective, null, { optional: true });\r\n const nf = this.injector.get(NgForm, null, { optional: true });\r\n const recheck = (): void => {\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n };\r\n fg?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n nf?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n }\r\n\r\n /**\r\n * Actualiza caches usados no template após mudança de valor/estado do control\r\n * ou de inputs que afectam mensagem / obrigatório.\r\n */\r\n protected syncControlUi(): void {\r\n this.uiInvalid = this.baseInvalid;\r\n this.uiRequiredEffective = this.requiredEffective;\r\n this.uiErrorMessage = this.getErrorMessage();\r\n this.uiAriaDescribedBy =\r\n this.uiInvalid && this.uiErrorMessage ? this.errorElementId : null;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get baseInvalid(): boolean {\r\n return this.controlInvalidUi(this.ngControl?.control);\r\n }\r\n\r\n get errorElementId(): string {\r\n return `${this.controlId}-error`;\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\n\r\n@Component({\r\n selector: 'app-text-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './text-field.component.html',\r\n styleUrl: './text-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class TextFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Limite de caracteres no valor do campo. */\r\n @Input({ transform: numberAttribute }) maxLength = 500;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.trim().length > 0;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const s = value ?? '';\r\n const clipped = this.maxLength > 0 ? s.slice(0, this.maxLength) : s;\r\n this.inputText = clipped;\r\n if (clipped !== s) {\r\n queueMicrotask(() =>\r\n this.emitModelValue(clipped === '' ? null : clipped),\r\n );\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLInputElement;\r\n const raw = el.value;\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? raw.slice(0, cap) : raw;\r\n if (raw !== clipped) {\r\n el.value = clipped;\r\n }\r\n this.inputText = clipped;\r\n this.emitModelValue(clipped === '' ? null : clipped);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"text-field__input\" type=\"text\" [id]=\"controlId\" [attr.name]=\"name || null\" [attr.placeholder]=\"''\"\n [attr.autocomplete]=\"autocompleteAttr\" [attr.maxlength]=\"maxLength > 0 ? maxLength : null\" [disabled]=\"disabled\"\n [readonly]=\"readonly\" [required]=\"uiRequiredEffective\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\"\n (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostBinding,\r\n Input,\r\n OnInit,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\n\r\n@Component({\r\n selector: 'app-password-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './password-field.component.html',\r\n styleUrl: './password-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PasswordFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class PasswordFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit, OnInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Password já nasce com ícone de chave no prefixo; pode ser sobrescrito via `prefixIcon`. */\r\n @Input({ transform: booleanAttribute }) override showPrefixIcon = true;\r\n @Input() override prefixIcon = 'fa-solid fa-key';\r\n\r\n @HostBinding('class.password-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Por defeito `false`: o botão de limpar compete com o toggle de visibilidade. */\r\n @Input({ transform: booleanAttribute }) override clearable = false;\r\n\r\n @Input({ transform: numberAttribute }) maxLength = 500;\r\n /**\r\n * Com o input `autocomplete` da base a `true`, define o atributo HTML\r\n * (`current-password` / `new-password`). Com `autocomplete` a `false`, aplica-se `off`.\r\n */\r\n @Input() autoComplete: 'off' | 'current-password' | 'new-password' =\r\n 'current-password';\r\n\r\n /** `false` = caracteres ocultos (ícone olho aberto para revelar). */\r\n passwordVisible = false;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n inputTypeUi: 'password' | 'text' = 'password';\r\n toggleAriaLabelUi = 'Mostrar senha';\r\n toggleIconClassUi = 'fa-solid fa-eye';\r\n\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.refreshPasswordToggleUi();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.length > 0;\r\n }\r\n\r\n private refreshPasswordToggleUi(): void {\r\n this.inputTypeUi = this.passwordVisible ? 'text' : 'password';\r\n this.toggleAriaLabelUi = this.passwordVisible ? 'Ocultar senha' : 'Mostrar senha';\r\n this.toggleIconClassUi = this.passwordVisible\r\n ? 'fa-solid fa-eye-slash'\r\n : 'fa-solid fa-eye';\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const s = value ?? '';\r\n const clipped = this.maxLength > 0 ? s.slice(0, this.maxLength) : s;\r\n this.inputText = clipped;\r\n if (clipped !== s) {\r\n queueMicrotask(() =>\r\n this.emitModelValue(clipped === '' ? null : clipped),\r\n );\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLInputElement;\r\n const raw = el.value;\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? raw.slice(0, cap) : raw;\r\n if (raw !== clipped) {\r\n el.value = clipped;\r\n }\r\n this.inputText = clipped;\r\n this.emitModelValue(clipped === '' ? null : clipped);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n togglePasswordVisible(ev: Event): void {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.passwordVisible = !this.passwordVisible;\r\n this.refreshPasswordToggleUi();\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\" [showSuffixSlot]=\"true\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"password-field__input\" [type]=\"inputTypeUi\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocomplete ? autoComplete : 'off'\" [attr.maxlength]=\"maxLength > 0 ? maxLength : null\"\n [disabled]=\"disabled\" [readonly]=\"readonly\" [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\" (input)=\"onNativeInput($event)\"\n (blur)=\"onBlur()\" />\n <button type=\"button\" appFieldSuffix class=\"password-field__toggle\" tabindex=\"-1\"\n [disabled]=\"disabled || readonly\" [attr.aria-label]=\"toggleAriaLabelUi\" [attr.aria-pressed]=\"passwordVisible\"\n (click)=\"togglePasswordVisible($event)\">\n <i [class]=\"toggleIconClassUi\" aria-hidden=\"true\"></i>\n </button>\n</app-base-field>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n SimpleChanges,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\n\r\n@Component({\r\n selector: 'app-textarea-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './textarea-field.component.html',\r\n styleUrl: './textarea-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextareaFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class TextareaFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit, OnChanges, OnInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n @HostBinding('class.textarea-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Limite de caracteres no valor do campo. `0` = sem limite explícito no DOM. */\r\n @Input({ transform: numberAttribute }) maxLength = 0;\r\n\r\n @Input({ transform: numberAttribute }) rows = 3;\r\n\r\n /**\r\n * Limite de altura em linhas (mesma lógica de `rows`). Por omissão igual a {@link rows}.\r\n * O campo não é redimensionável pelo usuário (`resize: none`).\r\n */\r\n @Input({ transform: numberAttribute }) maxResizeRows = 0;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n /** Altura CSS (evita getter chamado a cada CD). */\r\n textareaMaxHeightCss = '';\r\n\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.updateTextareaHeight();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (changes['rows'] || changes['maxResizeRows']) {\r\n this.updateTextareaHeight();\r\n }\r\n }\r\n\r\n private updateTextareaHeight(): void {\r\n const lines = Math.max(\r\n 1,\r\n this.maxResizeRows > 0 ? this.maxResizeRows : this.rows,\r\n );\r\n this.textareaMaxHeightCss = `calc(1.35rem + 0.45rem + ${lines} * 1.35em)`;\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.trim().length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const s = value ?? '';\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? s.slice(0, cap) : s;\r\n this.inputText = clipped;\r\n if (clipped !== s) {\r\n queueMicrotask(() =>\r\n this.emitModelValue(clipped === '' ? null : clipped),\r\n );\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLTextAreaElement;\r\n const raw = el.value;\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? raw.slice(0, cap) : raw;\r\n if (raw !== clipped) {\r\n el.value = clipped;\r\n }\r\n this.inputText = clipped;\r\n this.emitModelValue(clipped === '' ? null : clipped);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\" skeletonVariant=\"textarea\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <textarea #nativeInput class=\"textarea-field__input\" [id]=\"controlId\" [attr.name]=\"name || null\" [attr.placeholder]=\"''\"\n [attr.rows]=\"rows\" [style.height]=\"textareaMaxHeightCss\" [style.min-height]=\"textareaMaxHeightCss\"\n [style.max-height]=\"textareaMaxHeightCss\" [attr.autocomplete]=\"autocompleteAttr\"\n [attr.maxlength]=\"maxLength > 0 ? maxLength : null\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\"></textarea>\n</app-base-field>\n","const DIGITS_ONLY = /^\\d*$/;\r\n\r\n/**\r\n * Mantém apenas dígitos (0–9). Primeira versão sem sinal negativo.\r\n */\r\nexport function sanitizeIntegerDigits(raw: string): string {\r\n return raw.replace(/\\D/g, '');\r\n}\r\n\r\nexport function parseIntegerString(digits: string): number | null {\r\n const t = digits.trim();\r\n if (t === '') {\r\n return null;\r\n }\r\n if (!DIGITS_ONLY.test(t)) {\r\n return null;\r\n }\r\n const n = Number.parseInt(t, 10);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n","/**\r\n * Formatação pt-BR para inteiros: apenas separador de milhar com ponto.\r\n * Usado pelo campo inteiro e pela parte inteira do decimal.\r\n */\r\n\r\n/**\r\n * Formata sequência de dígitos com pontos de milhar (ex.: 1234567 → 1.234.567).\r\n * Aceita string vazia; não normaliza zeros à esquerda.\r\n */\r\nexport function formatIntegerThousandsBr(intDigits: string): string {\r\n if (intDigits === '') {\r\n return '';\r\n }\r\n const reversed = intDigits.split('').reverse().join('');\r\n const groups = reversed.match(/.{1,3}/g) ?? [];\r\n return groups\r\n .map((g) => g.split('').reverse().join(''))\r\n .reverse()\r\n .join('.');\r\n}\r\n\r\n/**\r\n * Quantidade de dígitos à esquerda do caret na máscara (pontos ignorados).\r\n */\r\nexport function semanticIntegerDigitCountLeft(\r\n display: string,\r\n caret: number,\r\n): number {\r\n return display.slice(0, caret).replace(/\\D/g, '').length;\r\n}\r\n\r\n/**\r\n * Índice do caret após o enésimo dígito na string formatada (fim se não houver tantos).\r\n */\r\nexport function caretIndexFromIntegerDigitCount(\r\n display: string,\r\n digitCount: number,\r\n): number {\r\n if (digitCount <= 0) {\r\n return 0;\r\n }\r\n let seen = 0;\r\n for (let i = 0; i < display.length; i++) {\r\n const ch = display[i];\r\n if (ch === '.') {\r\n continue;\r\n }\r\n if (/\\d/.test(ch)) {\r\n seen++;\r\n if (seen === digitCount) {\r\n return i + 1;\r\n }\r\n }\r\n }\r\n return display.length;\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\nimport { parseIntegerString, sanitizeIntegerDigits } from '../../../_utils/integer-value.utils';\r\nimport {\r\n caretIndexFromIntegerDigitCount,\r\n formatIntegerThousandsBr,\r\n semanticIntegerDigitCountLeft,\r\n} from '../../../_utils/integer-br.utils';\r\n\r\n@Component({\r\n selector: 'app-integer-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './integer-field.component.html',\r\n styleUrl: './integer-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => IntegerFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class IntegerFieldComponent\r\n extends NgControlFieldDirective<number | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Valor máximo permitido (inclusive). */\r\n @Input({ transform: numberAttribute }) max = 999999;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: number | null): void {\r\n if (value == null) {\r\n this.inputText = '';\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n return;\r\n }\r\n const v = Math.min(Math.trunc(value), this.max);\r\n this.inputText = formatIntegerThousandsBr(String(v));\r\n if (v !== value) {\r\n queueMicrotask(() => this.emitModelValue(v));\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onBeforeInput(event: Event): void {\r\n const e = event as InputEvent;\r\n if (this.disabled || this.readonly || e.isComposing) {\r\n return;\r\n }\r\n if (e.inputType === 'insertText' || e.inputType === 'insertCompositionText') {\r\n const chunk = e.data ?? '';\r\n if (chunk.length === 1 && !/^\\d$/.test(chunk)) {\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value;\r\n const caret = input.selectionStart ?? raw.length;\r\n const digitsLeftOfCaret = semanticIntegerDigitCountLeft(raw, caret);\r\n\r\n let digits = sanitizeIntegerDigits(raw);\r\n let parsed = parseIntegerString(digits);\r\n let clampedByMax = false;\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n digits = String(this.max);\r\n clampedByMax = true;\r\n }\r\n\r\n const display = formatIntegerThousandsBr(digits);\r\n\r\n if (input.value !== display) {\r\n input.value = display;\r\n const next = clampedByMax\r\n ? display.length\r\n : caretIndexFromIntegerDigitCount(\r\n display,\r\n Math.min(digitsLeftOfCaret, digits.length),\r\n );\r\n input.setSelectionRange(next, next);\r\n }\r\n\r\n this.inputText = display;\r\n this.emitModelValue(parsed);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n const digits = sanitizeIntegerDigits(this.inputText);\r\n let parsed = parseIntegerString(digits);\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n }\r\n const display = parsed == null ? '' : formatIntegerThousandsBr(String(parsed));\r\n const ctrl = this.ngControl?.control;\r\n const current = ctrl?.value ?? null;\r\n if (parsed !== current) {\r\n this.emitModelValue(parsed);\r\n }\r\n this.inputText = display;\r\n this.refreshFilledUi();\r\n this.notifyTouched();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"integer-field__input\" type=\"text\" inputmode=\"numeric\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\" [required]=\"uiRequiredEffective\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\"\n (beforeinput)=\"onBeforeInput($event)\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","/**\r\n * Utilitários pt-BR fixo: vírgula decimal, ponto milhar, duas casas na formatação final.\r\n */\r\n\r\nimport { formatIntegerThousandsBr } from './integer-br.utils';\r\n\r\nexport { formatIntegerThousandsBr } from './integer-br.utils';\r\n\r\nexport function sanitizeDecimalBrInput(raw: string): string {\r\n return raw.replace(/[^\\d,.]/g, '');\r\n}\r\n\r\n/**\r\n * Remove pontos e interpreta a última vírgula como separador decimal.\r\n * Retorna apenas dígitos na parte inteira e até 2 na fracionária.\r\n */\r\nexport function extractDecimalBrParts(rawDisplay: string): {\r\n intDigits: string;\r\n fracDigits: string;\r\n hasComma: boolean;\r\n} {\r\n const noDots = rawDisplay.replace(/\\./g, '');\r\n const lastComma = noDots.lastIndexOf(',');\r\n if (lastComma === -1) {\r\n return {\r\n intDigits: noDots.replace(/\\D/g, ''),\r\n fracDigits: '',\r\n hasComma: false,\r\n };\r\n }\r\n const intDigits = noDots.slice(0, lastComma).replace(/\\D/g, '');\r\n const fracDigits = noDots\r\n .slice(lastComma + 1)\r\n .replace(/\\D/g, '')\r\n .slice(0, 2);\r\n return { intDigits, fracDigits, hasComma: true };\r\n}\r\n\r\n/**\r\n * Monta o texto exibido durante a digitação (milhares com ponto, vírgula decimal).\r\n */\r\nexport function buildDecimalBrDisplay(parts: {\r\n intDigits: string;\r\n fracDigits: string;\r\n hasComma: boolean;\r\n}): string {\r\n const { intDigits, fracDigits, hasComma } = parts;\r\n if (!hasComma) {\r\n return formatIntegerThousandsBr(intDigits);\r\n }\r\n const intDisplay =\r\n intDigits === '' ? '0' : formatIntegerThousandsBr(intDigits);\r\n return `${intDisplay},${fracDigits}`;\r\n}\r\n\r\n/**\r\n * Posição semântica do cursor para remapear após reformatar.\r\n */\r\nexport function semanticCaretAt(\r\n value: string,\r\n caret: number,\r\n): { intCount: number; afterComma: boolean; fracCount: number } {\r\n const left = value.slice(0, caret);\r\n const noDots = left.replace(/\\./g, '');\r\n const commaIdx = noDots.indexOf(',');\r\n if (commaIdx === -1) {\r\n return {\r\n intCount: noDots.replace(/\\D/g, '').length,\r\n afterComma: false,\r\n fracCount: 0,\r\n };\r\n }\r\n const before = noDots.slice(0, commaIdx).replace(/\\D/g, '');\r\n const after = noDots.slice(commaIdx + 1).replace(/\\D/g, '');\r\n return {\r\n intCount: before.length,\r\n afterComma: true,\r\n fracCount: after.length,\r\n };\r\n}\r\n\r\n/**\r\n * Índice do caret no texto formatado a partir da posição semântica.\r\n */\r\nexport function caretIndexFromSemantic(\r\n display: string,\r\n target: { intCount: number; afterComma: boolean; fracCount: number },\r\n): number {\r\n let intCount = 0;\r\n let afterComma = false;\r\n let fracCount = 0;\r\n\r\n for (let i = 0; i < display.length; i++) {\r\n const ch = display[i];\r\n if (ch === ',') {\r\n if (!afterComma) {\r\n afterComma = true;\r\n if (\r\n target.afterComma &&\r\n target.fracCount === 0 &&\r\n target.intCount === intCount\r\n ) {\r\n return i + 1;\r\n }\r\n }\r\n continue;\r\n }\r\n if (ch === '.') {\r\n continue;\r\n }\r\n if (/\\d/.test(ch)) {\r\n if (!afterComma) {\r\n intCount++;\r\n if (!target.afterComma && intCount === target.intCount) {\r\n return i + 1;\r\n }\r\n } else {\r\n fracCount++;\r\n if (\r\n target.afterComma &&\r\n fracCount === target.fracCount &&\r\n intCount === target.intCount\r\n ) {\r\n return i + 1;\r\n }\r\n }\r\n }\r\n }\r\n return display.length;\r\n}\r\n\r\n/**\r\n * String passível de parseDecimalBr a partir das partes editáveis.\r\n */\r\nexport function buildDecimalBrParseString(parts: {\r\n intDigits: string;\r\n fracDigits: string;\r\n hasComma: boolean;\r\n}): string {\r\n if (!parts.hasComma) {\r\n return parts.intDigits;\r\n }\r\n return `${parts.intDigits},${parts.fracDigits}`;\r\n}\r\n\r\n/**\r\n * Interpreta string já sanitizada e retorna número com até 2 casas decimais (arredondamento).\r\n * Vazio → null. Vírgula como separador decimal; pontos são removidos da parte inteira.\r\n */\r\nexport function parseDecimalBr(sanitized: string): number | null {\r\n const t = sanitized.trim();\r\n if (t === '') {\r\n return null;\r\n }\r\n\r\n const lastComma = t.lastIndexOf(',');\r\n let intRaw: string;\r\n let fracRaw: string;\r\n\r\n if (lastComma >= 0) {\r\n intRaw = t.slice(0, lastComma).replace(/\\./g, '');\r\n fracRaw = t.slice(lastComma + 1).replace(/\\./g, '');\r\n } else {\r\n intRaw = t.replace(/\\./g, '');\r\n fracRaw = '';\r\n }\r\n\r\n if (!/^\\d*$/.test(intRaw) || !/^\\d*$/.test(fracRaw)) {\r\n return null;\r\n }\r\n if (intRaw === '' && fracRaw === '') {\r\n return null;\r\n }\r\n\r\n const intPart = intRaw === '' ? '0' : intRaw;\r\n const fracPadded = (fracRaw + '00').slice(0, 2);\r\n const n = Number(`${intPart}.${fracPadded}`);\r\n if (!Number.isFinite(n)) {\r\n return null;\r\n }\r\n return Math.round(n * 100) / 100;\r\n}\r\n\r\nexport function formatDecimalBr(value: number): string {\r\n return new Intl.NumberFormat('pt-BR', {\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(value);\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\nimport {\r\n buildDecimalBrDisplay,\r\n buildDecimalBrParseString,\r\n caretIndexFromSemantic,\r\n extractDecimalBrParts,\r\n formatDecimalBr,\r\n parseDecimalBr,\r\n semanticCaretAt,\r\n} from '../../../_utils/decimal-br.utils';\r\n\r\n@Component({\r\n selector: 'app-decimal-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './decimal-field.component.html',\r\n styleUrl: './decimal-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DecimalFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class DecimalFieldComponent\r\n extends NgControlFieldDirective<number | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Valor máximo permitido (inclusive), com até 2 casas decimais. */\r\n @Input({ transform: numberAttribute }) max = 999999;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.trim().length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: number | null): void {\r\n if (value == null) {\r\n this.inputText = '';\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n return;\r\n }\r\n const v = Math.min(value, this.max);\r\n this.inputText = formatDecimalBr(v);\r\n if (v !== value) {\r\n queueMicrotask(() => this.emitModelValue(v));\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onBeforeInput(event: Event): void {\r\n const e = event as InputEvent;\r\n if (this.disabled || this.readonly || e.isComposing) {\r\n return;\r\n }\r\n if (e.inputType === 'insertText' || e.inputType === 'insertCompositionText') {\r\n const data = e.data ?? '';\r\n if (data.length !== 1) {\r\n return;\r\n }\r\n const input = e.target as HTMLInputElement;\r\n const { hasComma } = extractDecimalBrParts(input.value);\r\n if (data === ',') {\r\n if (hasComma) {\r\n e.preventDefault();\r\n }\r\n return;\r\n }\r\n if (/^\\d$/.test(data)) {\r\n return;\r\n }\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const input = event.target as HTMLInputElement;\r\n const caret = input.selectionStart ?? input.value.length;\r\n const semantic = semanticCaretAt(input.value, caret);\r\n\r\n const parts = extractDecimalBrParts(input.value);\r\n const display = buildDecimalBrDisplay(parts);\r\n const parseStr = buildDecimalBrParseString(parts);\r\n let parsed = parseDecimalBr(parseStr);\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n const capped = formatDecimalBr(parsed);\r\n input.value = capped;\r\n input.setSelectionRange(capped.length, capped.length);\r\n this.inputText = capped;\r\n this.emitModelValue(parsed);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n return;\r\n }\r\n\r\n if (input.value !== display) {\r\n input.value = display;\r\n const next = caretIndexFromSemantic(display, semantic);\r\n input.setSelectionRange(next, next);\r\n }\r\n\r\n this.inputText = display;\r\n this.emitModelValue(parsed);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n if (this.disabled) {\r\n this.notifyTouched();\r\n return;\r\n }\r\n const parts = extractDecimalBrParts(this.inputText);\r\n const parseStr = buildDecimalBrParseString(parts);\r\n let parsed = parseDecimalBr(parseStr);\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n }\r\n const ctrl = this.ngControl?.control;\r\n const current = ctrl?.value ?? null;\r\n if (parsed !== current) {\r\n this.emitModelValue(parsed);\r\n }\r\n this.inputText = parsed != null ? formatDecimalBr(parsed) : '';\r\n this.refreshFilledUi();\r\n this.notifyTouched();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"decimal-field__input\" type=\"text\" inputmode=\"decimal\" [attr.autocomplete]=\"autocompleteAttr\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\" [attr.placeholder]=\"''\" [disabled]=\"disabled\" [readonly]=\"readonly\" [required]=\"uiRequiredEffective\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\"\n (beforeinput)=\"onBeforeInput($event)\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","/**\r\n * Formatação e normalização de data/hora no padrão pt-BR (lib ui-fields).\r\n */\r\n\r\nfunction pad2(n: number): string {\r\n return n.toString().padStart(2, '0');\r\n}\r\n\r\n/**\r\n * Exibe data como dd/mm/aaaa; com `showTimeHours`, dd/mm/aaaa hh:mm:ss (24h).\r\n */\r\nexport function formatDateTimePtBr(date: Date, showTimeHours: boolean): string {\r\n const d = pad2(date.getDate());\r\n const m = pad2(date.getMonth() + 1);\r\n const y = date.getFullYear();\r\n if (!showTimeHours) {\r\n return `${d}/${m}/${y}`;\r\n }\r\n return `${d}/${m}/${y} ${pad2(date.getHours())}:${pad2(date.getMinutes())}:${pad2(date.getSeconds())}`;\r\n}\r\n\r\n/**\r\n * Interpreta valor vindo do formulário / API.\r\n * Aceita data local sem fuso (`YYYY-MM-DD` ou `YYYY-MM-DDTHH:mm:ss`), `Date`, número ou ISO com `Z`.\r\n */\r\nexport function parseUiFieldDateValue(value: unknown): Date | null {\r\n if (value == null || value === '') {\r\n return null;\r\n }\r\n if (value instanceof Date) {\r\n return Number.isNaN(value.getTime()) ? null : value;\r\n }\r\n if (typeof value === 'number') {\r\n const d = new Date(value);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n }\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n const s = value.trim();\r\n const localDateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\r\n if (localDateOnly) {\r\n const y = +localDateOnly[1];\r\n const m = +localDateOnly[2] - 1;\r\n const d = +localDateOnly[3];\r\n const out = new Date(y, m, d, 0, 0, 0, 0);\r\n return Number.isNaN(out.getTime()) ? null : out;\r\n }\r\n const localDt = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})$/.exec(s);\r\n if (localDt) {\r\n const out = new Date(\r\n +localDt[1],\r\n +localDt[2] - 1,\r\n +localDt[3],\r\n +localDt[4],\r\n +localDt[5],\r\n +localDt[6],\r\n 0,\r\n );\r\n return Number.isNaN(out.getTime()) ? null : out;\r\n }\r\n const d = new Date(s);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n}\r\n\r\n/**\r\n * Valor persistido no `FormControl`: horário de parede local, sem `Z`\r\n * (evita 14:59 no input virar 17:59 no `JSON.stringify` de `Date`).\r\n */\r\nexport function formatUiFieldDateValue(d: Date, showTimeHours: boolean): string {\r\n const y = d.getFullYear();\r\n const mo = pad2(d.getMonth() + 1);\r\n const day = pad2(d.getDate());\r\n if (!showTimeHours) {\r\n return `${y}-${mo}-${day}`;\r\n }\r\n return `${y}-${mo}-${day}T${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`;\r\n}\r\n\r\n/** @deprecated use {@link parseUiFieldDateValue} */\r\nexport function normalizeFormDateValue(value: unknown): Date | null {\r\n return parseUiFieldDateValue(value);\r\n}\r\n\r\n/**\r\n * Data escolhida no calendário: meia-noite local, ou com `showTimeHours` a hora completa\r\n * (h, min, s, ms) do instante da seleção.\r\n */\r\nexport function applyPickedCalendarDate(\r\n picked: Date,\r\n showTimeHours: boolean,\r\n): Date {\r\n if (!showTimeHours) {\r\n return new Date(\r\n picked.getFullYear(),\r\n picked.getMonth(),\r\n picked.getDate(),\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n );\r\n }\r\n const now = new Date();\r\n return new Date(\r\n picked.getFullYear(),\r\n picked.getMonth(),\r\n picked.getDate(),\r\n now.getHours(),\r\n now.getMinutes(),\r\n now.getSeconds(),\r\n now.getMilliseconds(),\r\n );\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { MatDatepicker, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\nimport {\r\n applyPickedCalendarDate,\r\n formatDateTimePtBr,\r\n formatUiFieldDateValue,\r\n parseUiFieldDateValue,\r\n} from '../../../_utils/date-pt-br.utils';\r\n\r\n@Component({\r\n selector: 'app-date-field',\r\n imports: [\r\n BaseFieldComponent,\r\n FormsModule,\r\n MatDatepickerModule,\r\n MatInputModule,\r\n MatNativeDateModule,\r\n ],\r\n templateUrl: './date-field.component.html',\r\n styleUrl: './date-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateFieldComponent),\r\n multi: true,\r\n },\r\n { provide: MAT_DATE_LOCALE, useValue: 'pt-BR' },\r\n ]\r\n})\r\nexport class DateFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit, OnChanges\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('picker') picker?: MatDatepicker<Date>;\r\n\r\n /**\r\n * Se `true`, a formatação inclui hh:mm (24h) e, ao escolher no calendário,\r\n * usa a hora actual local no momento da selecção.\r\n */\r\n @Input({ transform: booleanAttribute }) showTimeHours = false;\r\n\r\n @Input() minDate: Date | null = null;\r\n @Input() maxDate: Date | null = null;\r\n\r\n innerDate: Date | null = null;\r\n\r\n filledUi = false;\r\n\r\n /** Texto da data no span (evita getter no template). */\r\n displayTextUi = '';\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (changes['showTimeHours'] && this.innerDate) {\r\n this.refreshDateDisplay();\r\n }\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.innerDate != null;\r\n }\r\n\r\n private refreshDateDisplay(): void {\r\n if (!this.innerDate) {\r\n this.displayTextUi = '';\r\n return;\r\n }\r\n this.displayTextUi = formatDateTimePtBr(this.innerDate, this.showTimeHours);\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n this.innerDate = parseUiFieldDateValue(value);\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n openPicker(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.picker?.open();\r\n }\r\n\r\n onGhostInputKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.openPicker();\r\n }\r\n }\r\n\r\n onPickedDate(next: Date | null): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (next == null) {\r\n this.innerDate = null;\r\n this.emitModelValue(null);\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n return;\r\n }\r\n const merged = applyPickedCalendarDate(next, this.showTimeHours);\r\n this.innerDate = merged;\r\n this.emitModelValue(formatUiFieldDateValue(merged, this.showTimeHours));\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.innerDate = null;\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\" [valueAlignEnd]=\"false\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"date-field__date-wrap\">\n <span class=\"date-field__display\" aria-hidden=\"true\">{{ displayTextUi }}</span>\n <input #nativeInput matInput class=\"date-field__ghost-input\" [matDatepicker]=\"picker\" [(ngModel)]=\"innerDate\"\n [ngModelOptions]=\"{ standalone: true }\" (ngModelChange)=\"onPickedDate($event)\"\n [min]=\"minDate ?? undefined\" [max]=\"maxDate ?? undefined\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [id]=\"controlId\" [attr.name]=\"name || null\" [attr.autocomplete]=\"autocompleteAttr\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || 'Data'\" readonly (click)=\"openPicker()\"\n (keydown)=\"onGhostInputKeydown($event)\" (blur)=\"onBlur()\" />\n <mat-datepicker #picker panelClass=\"ui-field-datepicker-panel\" />\n </div>\n</app-base-field>\n","/**\r\n * Máscara com `#` como placeholder de um dígito (0–9); restantes caracteres são literais.\r\n * Ex.: `#####-###` (CEP), `(##) #####-####` (celular BR 11 dígitos).\r\n */\r\n\r\n/** Remove tudo que não é dígito. */\r\nexport function stripToDigits(s: string): string {\r\n return s.replace(/\\D/g, '');\r\n}\r\n\r\n/** Conta quantos `#` existem no padrão (= número máximo de dígitos). */\r\nexport function maskDigitCount(pattern: string): number {\r\n let n = 0;\r\n for (const c of pattern) {\r\n if (c === '#') {\r\n n++;\r\n }\r\n }\r\n return n;\r\n}\r\n\r\n/**\r\n * Formata apenas dígitos segundo o padrão. Não adiciona literais à direita sem dígitos\r\n * correspondentes (ex.: não fica \"12345-\" com 5 dígitos).\r\n */\r\nexport function formatMaskDigits(digitsOnly: string, pattern: string): string {\r\n const d = stripToDigits(digitsOnly);\r\n const max = maskDigitCount(pattern);\r\n const src = d.slice(0, max);\r\n let out = '';\r\n let j = 0;\r\n for (let i = 0; i < pattern.length && j < src.length; i++) {\r\n const c = pattern[i];\r\n if (c === '#') {\r\n out += src[j++];\r\n } else {\r\n out += c;\r\n }\r\n }\r\n return out;\r\n}\r\n","import {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { NgControlFieldDirective } from './ng-control-field.directive';\r\nimport {\r\n formatMaskDigits,\r\n maskDigitCount,\r\n stripToDigits,\r\n} from '../_utils/mask-format.utils';\r\n\r\n/**\r\n * Campo de texto com máscara visual; valor do modelo = **apenas dígitos** (string), sem máscara.\r\n */\r\n@Directive()\r\nexport abstract class MaskedTextFieldBase\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Padrão com `#` para cada dígito (ex.: `#####-###`). Subclasses podem sobrescrever {@link pattern}. */\r\n @Input() maskPattern = '#####-###';\r\n\r\n inputText = '';\r\n\r\n /** Preenchido (só dígitos) para o label flutuante; actualizado com o texto mascarado. */\r\n filledUi = false;\r\n\r\n /** Padrão efetivo (permite CEP/telefone fixarem máscaras em subclasses). */\r\n protected get pattern(): string {\r\n return this.maskPattern;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n /**\r\n * Padrão de formatação para o valor digitado (só dígitos).\r\n * Sobrescrever para máscara dinâmica (ex.: CPF até 11 dígitos, CNPJ depois).\r\n */\r\n protected maskPatternFromDigits(digitsOnly: string): string {\r\n return this.pattern;\r\n }\r\n\r\n protected refreshMaskFilledUi(): void {\r\n this.filledUi = stripToDigits(this.inputText).length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const incoming = stripToDigits(value ?? '');\r\n const pat = this.maskPatternFromDigits(incoming);\r\n const max = maskDigitCount(pat);\r\n const d = incoming.slice(0, max);\r\n this.inputText = formatMaskDigits(d, pat);\r\n if (incoming !== d) {\r\n queueMicrotask(() => this.emitModelValue(d.length ? d : null));\r\n }\r\n this.refreshMaskFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Dígitos abaixo do tamanho da máscara actual (fixa ou dinâmica, ex. CPF/CNPJ), com valor parcial.\r\n * Aplica-se também sem obrigatório: máscara incompleta deve mostrar erro na UI (alinhado a `maskIncomplete`).\r\n * Mesma regra temporal que {@link BaseFieldDirective.controlInvalidUi}: `dirty` ou submit (não só `touched`).\r\n */\r\n protected isMaskIncompleteForUi(): boolean {\r\n const control = this.ngControl?.control;\r\n if (\r\n !control ||\r\n !(control.dirty || this.isParentFormSubmitted())\r\n ) {\r\n return false;\r\n }\r\n const digits = stripToDigits(this.inputText);\r\n if (digits.length === 0) {\r\n return false;\r\n }\r\n const pat = this.maskPatternFromDigits(digits);\r\n const max = maskDigitCount(pat);\r\n return digits.length < max;\r\n }\r\n\r\n override get baseInvalid(): boolean {\r\n if (this.isMaskIncompleteForUi()) {\r\n return true;\r\n }\r\n return super.baseInvalid;\r\n }\r\n\r\n override getErrorMessage(): string {\r\n if (!this.showErrorMessage) {\r\n return '';\r\n }\r\n if (this.isMaskIncompleteForUi()) {\r\n const custom = this.errorMessage.trim();\r\n if (custom.length > 0) {\r\n return custom;\r\n }\r\n return 'Campo obrigatório';\r\n }\r\n return super.getErrorMessage();\r\n }\r\n\r\n protected onMaskedInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLInputElement;\r\n const incoming = stripToDigits(el.value);\r\n const pat = this.maskPatternFromDigits(incoming);\r\n const max = maskDigitCount(pat);\r\n const d = incoming.slice(0, max);\r\n const display = formatMaskDigits(d, pat);\r\n if (el.value !== display) {\r\n el.value = display;\r\n }\r\n this.inputText = display;\r\n this.emitModelValue(d.length ? d : null);\r\n this.refreshMaskFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n protected onMaskedBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n protected onMaskedClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshMaskFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\n\r\n/**\r\n * Campo de texto com máscara configurável (`#` = dígito).\r\n * Valor do formulário: apenas dígitos, sem máscara.\r\n */\r\n@Component({\n selector: 'app-input-mask-field',\n imports: [BaseFieldComponent],\n templateUrl: './input-mask-field.component.html',\n styleUrl: './input-mask-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputMaskFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class InputMaskFieldComponent extends MaskedTextFieldBase {\r\n @HostBinding('class.input-mask-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Ex.: `#####-###`, `(##) #####-####`. */\r\n @Input() override maskPattern = '#####-###';\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"input-mask-field__input\" type=\"text\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\"\n [readonly]=\"readonly\" [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\" (input)=\"onNativeInput($event)\"\n (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\n\r\n/** CEP brasileiro (8 dígitos). Valor do modelo: só dígitos, ex. `01310100`. */\r\n@Component({\n selector: 'app-cep-field',\n imports: [BaseFieldComponent],\n templateUrl: './cep-field.component.html',\n styleUrl: './cep-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CepFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class CepFieldComponent extends MaskedTextFieldBase {\r\n @HostBinding('class.cep-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n @Input() override maskPattern = '#####-###';\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"cep-field__input\" type=\"text\" inputmode=\"numeric\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\n\r\n/**\r\n * Telefone BR: celular 11 dígitos `(##) #####-####` ou fixo 10 `(##) ####-####`.\r\n * Valor do modelo: só dígitos (DDD + número), ex. `11999999999` ou `1133334444`.\r\n */\r\n@Component({\n selector: 'app-phone-field',\n imports: [BaseFieldComponent],\n templateUrl: './phone-field.component.html',\n styleUrl: './phone-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PhoneFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class PhoneFieldComponent extends MaskedTextFieldBase {\r\n @HostBinding('class.phone-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Se `true`, máscara de fixo (10 dígitos). Se `false`, celular (11). */\r\n @Input({ transform: booleanAttribute }) landline = false;\r\n\r\n /**\r\n * Máscara manual (com `#`). Se vazio, usa celular ou fixo conforme {@link landline}.\r\n */\r\n @Input() override maskPattern = '';\r\n\r\n protected override get pattern(): string {\r\n const custom = this.maskPattern?.trim();\r\n if (custom && custom.includes('#')) {\r\n return custom;\r\n }\r\n return this.landline ? '(##) ####-####' : '(##) #####-####';\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"phone-field__input\" type=\"text\" inputmode=\"tel\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\nimport { stripToDigits } from '../_utils/mask-format.utils';\r\n\r\n/**\r\n * CPF (11 dígitos) ou CNPJ (14 dígitos) no mesmo campo.\r\n * Até 11 dígitos: `###.###.###-##`; a partir do 12º: `##.###.###/####-##`.\r\n * Valor do modelo: só dígitos, ex. `12345678901` ou `12345678000190`.\r\n */\r\n@Component({\n selector: 'app-cpf-cnpj-field',\n imports: [BaseFieldComponent],\n templateUrl: './cpf-cnpj-field.component.html',\n styleUrl: './cpf-cnpj-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CpfCnpjFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class CpfCnpjFieldComponent extends MaskedTextFieldBase {\r\n private static readonly CPF_MASK = '###.###.###-##';\r\n private static readonly CNPJ_MASK = '##.###.###/####-##';\r\n\r\n @HostBinding('class.cpf-cnpj-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Ignorado: a máscara é definida dinamicamente por {@link maskPatternFromDigits}. */\r\n @Input() override maskPattern = CpfCnpjFieldComponent.CPF_MASK;\r\n\r\n protected override maskPatternFromDigits(digitsOnly: string): string {\r\n return stripToDigits(digitsOnly).length <= 11\r\n ? CpfCnpjFieldComponent.CPF_MASK\r\n : CpfCnpjFieldComponent.CNPJ_MASK;\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"cpf-cnpj-field__input\" type=\"text\" inputmode=\"numeric\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\nimport { stripToDigits } from './mask-format.utils';\r\n\r\n/**\r\n * Validação alinhada às máscaras dinâmicas CPF/CNPJ: só dígitos; 11 ou 14 completos.\r\n * Vazio fica para `Validators.required`; com dígitos a menos devolve `maskIncomplete`.\r\n */\r\nexport function cpfCnpjMaskCompleteValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const raw = control.value;\r\n if (raw == null || raw === '') {\r\n return null;\r\n }\r\n const digits = stripToDigits(String(raw));\r\n if (digits.length === 0) {\r\n return null;\r\n }\r\n if (digits.length <= 11) {\r\n return digits.length === 11 ? null : { maskIncomplete: true };\r\n }\r\n return digits.length === 14 ? null : { maskIncomplete: true };\r\n };\r\n}\r\n\r\n/**\r\n * Telefone BR só dígitos (DDD + número): 10 fixo ou 11 celular, conforme {@link landline}.\r\n * Usar com `app-phone-field` para que `FormControl.invalid` e ícones de grupo/aba coincidam com a UI.\r\n */\r\nexport function phoneBrMaskCompleteValidator(landline: boolean): ValidatorFn {\r\n const expected = landline ? 10 : 11;\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const raw = control.value;\r\n if (raw == null || raw === '') {\r\n return null;\r\n }\r\n const digits = stripToDigits(String(raw));\r\n if (digits.length === 0) {\r\n return null;\r\n }\r\n return digits.length === expected ? null : { maskIncomplete: true };\r\n };\r\n}\r\n\r\n/**\r\n * Máscara com número fixo de dígitos (valor do modelo só dígitos, como CEP/telefone).\r\n * Valor vazio: `null` (delega em `Validators.required`); com dígitos a menos: `maskIncomplete`.\r\n */\r\nexport function fixedDigitsMaskCompleteValidator(expectedDigits: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const raw = control.value;\r\n if (raw == null || raw === '') {\r\n return null;\r\n }\r\n const digits = stripToDigits(String(raw));\r\n if (digits.length === 0) {\r\n return null;\r\n }\r\n return digits.length === expectedDigits ? null : { maskIncomplete: true };\r\n };\r\n}\r\n\r\n/** CEP brasileiro (`app-cep-field`): 8 dígitos. Usar com `Validators.required`. */\r\nexport function cepMaskCompleteValidator(): ValidatorFn {\r\n return fixedDigitsMaskCompleteValidator(8);\r\n}\r\n","import type { UiSelectOption } from '../fields/dropdown-fields/_models/select-option.model';\r\n\r\n/** Unidades federativas do Brasil (nome + sigla). Ordem alfabética por nome. */\r\nexport const BR_ESTADOS_NOME_SIGLA: ReadonlyArray<{ nome: string; sigla: string }> = [\r\n { nome: 'Acre', sigla: 'AC' },\r\n { nome: 'Alagoas', sigla: 'AL' },\r\n { nome: 'Amapá', sigla: 'AP' },\r\n { nome: 'Amazonas', sigla: 'AM' },\r\n { nome: 'Bahia', sigla: 'BA' },\r\n { nome: 'Ceará', sigla: 'CE' },\r\n { nome: 'Distrito Federal', sigla: 'DF' },\r\n { nome: 'Espírito Santo', sigla: 'ES' },\r\n { nome: 'Goiás', sigla: 'GO' },\r\n { nome: 'Maranhão', sigla: 'MA' },\r\n { nome: 'Mato Grosso', sigla: 'MT' },\r\n { nome: 'Mato Grosso do Sul', sigla: 'MS' },\r\n { nome: 'Minas Gerais', sigla: 'MG' },\r\n { nome: 'Pará', sigla: 'PA' },\r\n { nome: 'Paraíba', sigla: 'PB' },\r\n { nome: 'Paraná', sigla: 'PR' },\r\n { nome: 'Pernambuco', sigla: 'PE' },\r\n { nome: 'Piauí', sigla: 'PI' },\r\n { nome: 'Rio de Janeiro', sigla: 'RJ' },\r\n { nome: 'Rio Grande do Norte', sigla: 'RN' },\r\n { nome: 'Rio Grande do Sul', sigla: 'RS' },\r\n { nome: 'Rondônia', sigla: 'RO' },\r\n { nome: 'Roraima', sigla: 'RR' },\r\n { nome: 'Santa Catarina', sigla: 'SC' },\r\n { nome: 'São Paulo', sigla: 'SP' },\r\n { nome: 'Sergipe', sigla: 'SE' },\r\n { nome: 'Tocantins', sigla: 'TO' },\r\n] as const;\r\n\r\nexport function mapEstadosToOptions(\r\n slice: ReadonlyArray<{ nome: string; sigla: string }>,\r\n): UiSelectOption<string>[] {\r\n return slice.map((e) => ({\r\n label: `${e.nome} (${e.sigla})`,\r\n value: e.sigla,\r\n }));\r\n}\r\n","import { Directive, DoCheck, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n AbstractControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { distinctUntilChanged, merge } from 'rxjs';\r\nimport { BaseFieldDirective } from '../../input-fields/_base/base-field.directive';\r\n\r\n@Directive()\r\nexport abstract class BooleanFieldDirective\r\n extends BaseFieldDirective<boolean | null>\r\n implements OnInit, OnChanges, DoCheck\r\n{\r\n protected ngControl: NgControl | null = null;\r\n\r\n /** Ver {@link NgControlFieldDirective.ngDoCheck} — `resetForm()` sem `ngSubmit`. */\r\n private lastParentSubmitted: boolean | undefined;\r\n\r\n checked = false;\r\n\r\n /** Cache para templates OnPush (evita getters a cada CD). */\r\n uiInvalid = false;\r\n uiErrorMessage = '';\r\n uiAriaDescribedBy: string | null = null;\r\n uiRequiredEffective = false;\r\n\r\n /** Por omissão não mostra o parágrafo de erro (checkbox/switch); alinhado à base dos campos. */\r\n @Input()\r\n override showErrorMessage = false;\r\n\r\n protected override resolveControlForRequired(): AbstractControl | null | undefined {\r\n return this.ngControl?.control ?? undefined;\r\n }\r\n\r\n ngOnChanges(_changes: SimpleChanges): void {\r\n if (this.ngControl?.control) {\r\n this.syncBoolUi();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.ngControl = this.injector.get(NgControl, null, {\r\n optional: true,\r\n self: true,\r\n });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n const c = this.ngControl?.control;\r\n if (c) {\r\n merge(\r\n c.statusChanges,\r\n c.valueChanges.pipe(\r\n distinctUntilChanged((a, b) => Object.is(a, b)),\r\n ),\r\n )\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncBoolUi());\r\n this.syncBoolUi();\r\n }\r\n this.registerFormSubmitRecheckBool();\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (!this.ngControl?.control) {\r\n return;\r\n }\r\n const sub = this.isParentFormSubmitted();\r\n if (this.lastParentSubmitted === undefined) {\r\n this.lastParentSubmitted = sub;\r\n return;\r\n }\r\n if (this.lastParentSubmitted !== sub) {\r\n this.lastParentSubmitted = sub;\r\n this.syncBoolUi();\r\n }\r\n }\r\n\r\n /**\r\n * Checkbox/switch: mostrar erro após alterar o valor (`dirty`), após foco (`touched`)\r\n * ou após envio do formulário — ao contrário dos inputs de texto, não há “valor intermédio”\r\n * e o utilizador espera feedback imediato ao marcar/desmarcar.\r\n */\r\n protected boolInvalidShownAfterInteraction(\r\n control: AbstractControl | null | undefined,\r\n ): boolean {\r\n return !!control && (control.dirty || control.touched || this.isParentFormSubmitted());\r\n }\r\n\r\n protected override controlInvalidUi(control: AbstractControl | null | undefined): boolean {\r\n if (!this.isEffectiveRequired(control)) {\r\n return false;\r\n }\r\n return (\r\n !!control &&\r\n control.invalid &&\r\n this.boolInvalidShownAfterInteraction(control)\r\n );\r\n }\r\n\r\n protected syncBoolUi(): void {\r\n this.uiInvalid = this.baseInvalid;\r\n this.uiRequiredEffective = this.requiredEffective;\r\n this.uiErrorMessage = this.getErrorMessage();\r\n this.uiAriaDescribedBy =\r\n this.uiInvalid && this.uiErrorMessage ? this.errorElementId : null;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private registerFormSubmitRecheckBool(): void {\r\n const fg = this.injector.get(FormGroupDirective, null, { optional: true });\r\n const nf = this.injector.get(NgForm, null, { optional: true });\r\n const recheck = (): void => this.syncBoolUi();\r\n fg?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n nf?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n }\r\n\r\n protected override afterWriteValue(value: boolean | null): void {\r\n this.checked = value === true;\r\n if (this.ngControl?.control) {\r\n this.syncBoolUi();\r\n }\r\n }\r\n\r\n protected setChecked(next: boolean): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.checked = next;\r\n this.emitModelValue(next);\r\n const c = this.ngControl?.control;\r\n if (c) {\r\n c.markAsDirty();\r\n this.syncBoolUi();\r\n return;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get baseInvalid(): boolean {\r\n return this.controlInvalidUi(this.ngControl?.control);\r\n }\r\n\r\n /**\r\n * A classe base só devolvia texto quando `isEffectiveRequired` batia com o mesmo instante\r\n * do `NgControl`; com `requiredTrue` + submit, o estado vermelho aparecia sem mensagem.\r\n */\r\n override getErrorMessage(): string {\r\n if (!this.showErrorMessage) {\r\n return '';\r\n }\r\n const c = this.ngControl?.control;\r\n if (!c?.invalid) {\r\n return super.getErrorMessage();\r\n }\r\n const showState = this.boolInvalidShownAfterInteraction(c);\r\n if (!showState) {\r\n return super.getErrorMessage();\r\n }\r\n if (c.hasError('required')) {\r\n const requiredField =\r\n this.required ||\r\n c.hasValidator(Validators.required) ||\r\n c.hasValidator(Validators.requiredTrue);\r\n if (requiredField) {\r\n const custom = this.errorMessage.trim();\r\n return custom.length > 0 ? custom : 'Campo obrigatório';\r\n }\r\n }\r\n return super.getErrorMessage();\r\n }\r\n\r\n get errorElementId(): string {\r\n return `${this.controlId}-error`;\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostBinding,\r\n Input,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { SkeletonBlockComponent } from '../../../loading/skeleton-loading';\r\nimport { BooleanFieldDirective } from '../_base/boolean-field.directive';\r\n\r\n@Component({\r\n selector: 'app-checkbox-field',\r\n imports: [SkeletonBlockComponent],\r\n templateUrl: './checkbox-field.component.html',\r\n styleUrl: './checkbox-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CheckboxFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class CheckboxFieldComponent\r\n extends BooleanFieldDirective\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** `false` (padrão): host usa largura intrínseca. Com `true`, ocupa 100%. */\r\n @Input({ transform: booleanAttribute }) fullWidth = false;\r\n\r\n @HostBinding('class.checkbox-field--full-width')\r\n get fullWidthClass(): boolean {\r\n return this.fullWidth;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n onCheckboxClick(ev: MouseEvent): void {\r\n if (this.readonly || this.loading) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n }\r\n\r\n onNativeChange(event: Event): void {\r\n const el = event.target as HTMLInputElement;\r\n this.setChecked(el.checked);\r\n }\r\n}\r\n","@if (!loading) {\r\n<div class=\"checkbox-field\" [class.checkbox-field--invalid]=\"uiInvalid\"\r\n [class.checkbox-field--readonly]=\"readonly\">\r\n <label class=\"checkbox-field__row\">\r\n <input\r\n #nativeInput\r\n type=\"checkbox\"\r\n class=\"checkbox-field__native\"\r\n [id]=\"controlId\"\r\n [attr.name]=\"name || null\"\r\n [attr.tabindex]=\"readonly ? -1 : null\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [required]=\"uiRequiredEffective\"\r\n [attr.aria-invalid]=\"uiInvalid\"\r\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\r\n [attr.aria-readonly]=\"readonly ? true : null\"\r\n [attr.aria-label]=\"label || placeholder || 'Opção'\"\r\n (click)=\"onCheckboxClick($event)\"\r\n (change)=\"onNativeChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (label) {\r\n <span class=\"checkbox-field__label\">{{ label }}</span>\r\n }\r\n </label>\r\n @if (showErrorMessage && uiInvalid && uiErrorMessage) {\r\n <p class=\"checkbox-field__error\" [id]=\"errorElementId\" role=\"alert\">{{ uiErrorMessage }}</p>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"checkbox-field checkbox-field--loading\" role=\"status\" aria-live=\"polite\" [attr.aria-busy]=\"true\"\r\n [attr.aria-label]=\"label || 'A carregar'\">\r\n <div class=\"checkbox-field__skeleton-row\" aria-hidden=\"true\">\r\n <app-skeleton-block width=\"1.1rem\" height=\"1.1rem\" radius=\"4px\" />\r\n <app-skeleton-block width=\"11rem\" height=\"0.72rem\" radius=\"6px\" />\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { SkeletonBlockComponent } from '../../../loading/skeleton-loading';\r\nimport { BooleanFieldDirective } from '../_base/boolean-field.directive';\r\n\r\n@Component({\r\n selector: 'app-switch-field',\r\n imports: [SkeletonBlockComponent],\r\n templateUrl: './switch-field.component.html',\r\n styleUrl: './switch-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SwitchFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class SwitchFieldComponent\r\n extends BooleanFieldDirective\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n get labelId(): string {\r\n return `${this.controlId}-switch-label`;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n toggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n this.setChecked(!this.checked);\r\n }\r\n}\r\n","@if (!loading) {\r\n<div class=\"switch-field\" [class.switch-field--invalid]=\"uiInvalid\"\r\n [class.switch-field--readonly]=\"readonly\">\r\n <label class=\"switch-field__row\">\r\n <button\r\n #nativeInput\r\n type=\"button\"\r\n class=\"switch-field__track\"\r\n role=\"switch\"\r\n [id]=\"controlId\"\r\n [attr.name]=\"name || null\"\r\n [attr.aria-checked]=\"checked\"\r\n [attr.aria-labelledby]=\"label ? labelId : null\"\r\n [attr.aria-invalid]=\"uiInvalid\"\r\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\r\n [attr.aria-readonly]=\"readonly ? true : null\"\r\n [disabled]=\"disabled || readonly\"\r\n (click)=\"toggle()\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <span class=\"switch-field__thumb\" aria-hidden=\"true\"></span>\r\n </button>\r\n @if (label) {\r\n <span class=\"switch-field__label\" [id]=\"labelId\">\r\n {{ label }}\r\n @if (uiRequiredEffective && showRequiredMark) {\r\n <span class=\"switch-field__required\" aria-hidden=\"true\">*</span>\r\n }\r\n </span>\r\n }\r\n </label>\r\n @if (showErrorMessage && uiInvalid && uiErrorMessage) {\r\n <p class=\"switch-field__error\" [id]=\"errorElementId\" role=\"alert\">{{ uiErrorMessage }}</p>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"switch-field switch-field--loading\" role=\"status\" aria-live=\"polite\" [attr.aria-busy]=\"true\"\r\n [attr.aria-label]=\"label || 'A carregar'\">\r\n <div class=\"switch-field__skeleton-row\" aria-hidden=\"true\">\r\n <app-skeleton-block width=\"2.75rem\" height=\"1.5rem\" radius=\"999px\" />\r\n <app-skeleton-block width=\"4.25rem\" height=\"0.72rem\" radius=\"6px\" />\r\n </div>\r\n</div>\r\n}\r\n","import { Directive, Input, booleanAttribute } from '@angular/core';\r\nimport { NgControlFieldDirective } from '../../input-fields/_base/ng-control-field.directive';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\n\r\n/**\r\n * Lógica comum de select / combobox: opções, índice ativo, comparação e\r\n * `notifyTouched` após seleção (evita flicker vermelho → válido no frame em que o valor ainda não atualizou o `FormControl`).\r\n */\r\n@Directive()\r\nexport abstract class DropdownOptionFieldBase extends NgControlFieldDirective<unknown | null> {\r\n /** Estado “tem valor” para o label flutuante (evita getter no template). */\r\n filledUi = false;\r\n\r\n private _options: ReadonlyArray<UiSelectOption<unknown>> = [];\r\n\r\n @Input()\r\n get options(): ReadonlyArray<UiSelectOption<unknown>> {\r\n return this._options;\r\n }\r\n set options(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n /** Alias de {@link options}. */\r\n @Input('items')\r\n set itemsInput(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n private _compareWith: (a: unknown, b: unknown) => boolean = Object.is;\r\n\r\n @Input()\r\n get compareWith(): (a: unknown, b: unknown) => boolean {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Alias de {@link compareWith}. */\r\n @Input('compareBy')\r\n set compareBy(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Lista de opções ainda a carregar (painel aberto ou primeiro fetch). */\r\n @Input({ transform: booleanAttribute }) optionsLoading = false;\r\n\r\n activeIndex = 0;\r\n\r\n protected refreshFilledUi(): void {\r\n const v = this.internalValue;\r\n this.filledUi = v != null && v !== '';\r\n }\r\n\r\n override writeValue(value: unknown | null): void {\r\n super.writeValue(value);\r\n this.refreshFilledUi();\r\n }\r\n\r\n protected override emitModelValue(value: unknown | null): void {\r\n super.emitModelValue(value);\r\n this.refreshFilledUi();\r\n }\r\n\r\n /**\r\n * Opções na ordem de exibição no painel: valor atual (se existir em `options`) em primeiro lugar.\r\n */\r\n get listOptions(): ReadonlyArray<UiSelectOption<unknown>> {\r\n const src = this._options;\r\n if (src.length === 0) {\r\n return src;\r\n }\r\n const iv = this.internalValue;\r\n if (iv == null || iv === '') {\r\n return src;\r\n }\r\n const idx = src.findIndex(\r\n (o) => !o.disabled && this.matches(o.value, iv),\r\n );\r\n if (idx <= 0) {\r\n return src;\r\n }\r\n const selected = src[idx];\r\n const rest = src.filter((_, i) => i !== idx);\r\n return [selected, ...rest];\r\n }\r\n\r\n /**\r\n * Chamar após `emitModelValue` + fechar painel ao **escolher** um item.\r\n * Adia `notifyTouched` para o próximo microtask para o validador já ver o valor novo.\r\n */\r\n protected finishSelectionTouch(): void {\r\n queueMicrotask(() => {\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n trackOption(_index: number, opt: UiSelectOption<unknown>): unknown {\r\n return opt.value;\r\n }\r\n\r\n isSelected(opt: UiSelectOption<unknown>): boolean {\r\n return this.matches(opt.value, this.internalValue);\r\n }\r\n\r\n protected findOptionByValue(\r\n value: unknown | null,\r\n ): UiSelectOption<unknown> | undefined {\r\n if (value == null) {\r\n return undefined;\r\n }\r\n return this._options.find(\r\n (o) => !o.disabled && this.matches(o.value, value),\r\n );\r\n }\r\n\r\n protected matches(a: unknown, b: unknown): boolean {\r\n return this._compareWith(a, b);\r\n }\r\n\r\n protected syncActiveIndexFromValue(value: unknown | null): void {\r\n const list = this.listOptions;\r\n const idx = list.findIndex(\r\n (o) => !o.disabled && this.matches(o.value, value),\r\n );\r\n this.activeIndex = idx >= 0 ? idx : this.firstEnabledIndex();\r\n }\r\n\r\n protected firstEnabledIndex(): number {\r\n const list = this.listOptions;\r\n const i = list.findIndex((o) => !o.disabled);\r\n return i >= 0 ? i : 0;\r\n }\r\n\r\n protected lastEnabledIndex(): number {\r\n const list = this.listOptions;\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n protected stepActive(delta: number): number {\r\n let i = this.activeIndex;\r\n const list = this.listOptions;\r\n const n = list.length;\r\n if (n === 0) {\r\n return 0;\r\n }\r\n for (let step = 0; step < n; step++) {\r\n i = (i + delta + n) % n;\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return this.activeIndex;\r\n }\r\n}\r\n","import { Directive, Input, booleanAttribute } from '@angular/core';\r\nimport { NgControlFieldDirective } from '../../input-fields/_base/ng-control-field.directive';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\n\r\n/**\r\n * Base para multiselect: valor `unknown[]`, opções, índice ativo (teclado) e comparação.\r\n */\r\n@Directive()\r\nexport abstract class DropdownMultiOptionFieldBase extends NgControlFieldDirective<\r\n unknown[]\r\n> {\r\n filledUi = false;\r\n\r\n private _options: ReadonlyArray<UiSelectOption<unknown>> = [];\r\n\r\n @Input()\r\n get options(): ReadonlyArray<UiSelectOption<unknown>> {\r\n return this._options;\r\n }\r\n set options(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n /** Alias de {@link options}. */\r\n @Input('items')\r\n set itemsInput(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n private _compareWith: (a: unknown, b: unknown) => boolean = Object.is;\r\n\r\n @Input()\r\n get compareWith(): (a: unknown, b: unknown) => boolean {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Alias de {@link compareWith}. */\r\n @Input('compareBy')\r\n set compareBy(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Lista de opções ainda a carregar. */\r\n @Input({ transform: booleanAttribute }) optionsLoading = false;\r\n\r\n activeIndex = 0;\r\n\r\n protected refreshMultiFilledUi(): void {\r\n const vals = this.internalValue;\r\n this.filledUi = Array.isArray(vals) && vals.length > 0;\r\n }\r\n\r\n protected override emitModelValue(value: unknown[] | null): void {\r\n super.emitModelValue(value);\r\n this.refreshMultiFilledUi();\r\n }\r\n\r\n /**\r\n * Opções com as selecionadas primeiro (mesma ordem relativa que em `options`).\r\n */\r\n get listOptions(): ReadonlyArray<UiSelectOption<unknown>> {\r\n const src = this._options;\r\n if (src.length === 0) {\r\n return src;\r\n }\r\n const vals = this.internalValue;\r\n if (!Array.isArray(vals) || vals.length === 0) {\r\n return src;\r\n }\r\n const picked: UiSelectOption<unknown>[] = [];\r\n const rest: UiSelectOption<unknown>[] = [];\r\n for (const o of src) {\r\n if (o.disabled) {\r\n rest.push(o);\r\n continue;\r\n }\r\n const sel = vals.some((v) => this.matches(o.value, v));\r\n if (sel) {\r\n picked.push(o);\r\n } else {\r\n rest.push(o);\r\n }\r\n }\r\n return [...picked, ...rest];\r\n }\r\n\r\n protected finishMultiTouch(): void {\r\n queueMicrotask(() => {\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n trackOption(_index: number, opt: UiSelectOption<unknown>): unknown {\r\n return opt.value;\r\n }\r\n\r\n isSelected(opt: UiSelectOption<unknown>): boolean {\r\n const vals = this.internalValue;\r\n if (!Array.isArray(vals) || vals.length === 0) {\r\n return false;\r\n }\r\n return vals.some((v) => this.matches(opt.value, v));\r\n }\r\n\r\n protected findOptionByValue(\r\n value: unknown | null,\r\n ): UiSelectOption<unknown> | undefined {\r\n if (value == null) {\r\n return undefined;\r\n }\r\n return this._options.find(\r\n (o) => !o.disabled && this.matches(o.value, value),\r\n );\r\n }\r\n\r\n protected matches(a: unknown, b: unknown): boolean {\r\n return this._compareWith(a, b);\r\n }\r\n\r\n protected syncActiveIndexToFirstEnabled(): void {\r\n const list = this.listOptions;\r\n const idx = list.findIndex((o) => !o.disabled);\r\n this.activeIndex = idx >= 0 ? idx : 0;\r\n }\r\n\r\n protected firstEnabledIndex(): number {\r\n const list = this.listOptions;\r\n const i = list.findIndex((o) => !o.disabled);\r\n return i >= 0 ? i : 0;\r\n }\r\n\r\n protected lastEnabledIndex(): number {\r\n const list = this.listOptions;\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n protected stepActive(delta: number): number {\r\n let i = this.activeIndex;\r\n const list = this.listOptions;\r\n const n = list.length;\r\n if (n === 0) {\r\n return 0;\r\n }\r\n for (let step = 0; step < n; step++) {\r\n i = (i + delta + n) % n;\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return this.activeIndex;\r\n }\r\n}\r\n","/**\r\n * Após `blur` no trigger ou na lista: se o painel está aberto e o foco não ficou\r\n * dentro da **origem do overlay** (valor + chevron / input; não o botão limpar do `base-field`)\r\n * nem no overlay CDK, fecha o painel.\r\n */\r\nexport function scheduleCloseDropdownPanelOnTriggerBlur(options: {\r\n triggerRoot: HTMLElement;\r\n isPanelOpen: () => boolean;\r\n closePanel: () => void;\r\n notifyTouched: () => void;\r\n /** Corre depois de fechar / `notifyTouched` (ex.: limpar texto órfão no combobox de pesquisa). */\r\n afterBlur?: () => void;\r\n /**\r\n * `FocusEvent.relatedTarget` do `blur` no trigger — quando o foco passa para a lista no overlay\r\n * (MultiSelect no toque), alguns browsers preenchem isto antes de `activeElement` actualizar.\r\n */\r\n blurRelatedTarget?: EventTarget | null;\r\n}): void {\r\n setTimeout(() => {\r\n const rt = options.blurRelatedTarget as HTMLElement | null | undefined;\r\n if (rt && typeof rt.closest === 'function') {\r\n if (options.triggerRoot.contains(rt) || rt.closest('.cdk-overlay-container')) {\r\n options.notifyTouched();\r\n options.afterBlur?.();\r\n return;\r\n }\r\n }\r\n const a = document.activeElement;\r\n if (a && options.triggerRoot.contains(a)) {\r\n return;\r\n }\r\n if (a && typeof (a as HTMLElement).closest === 'function') {\r\n if ((a as HTMLElement).closest('.cdk-overlay-container')) {\r\n return;\r\n }\r\n }\r\n if (options.isPanelOpen()) {\r\n options.closePanel();\r\n }\r\n options.notifyTouched();\r\n options.afterBlur?.();\r\n }, 0);\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n inject,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../../input-fields/_base/base-field.component';\r\nimport { DropdownOptionFieldBase } from '../_base/dropdown-option-field.base';\r\nimport type { SelectPageRequested } from '../_models/select-pagination.model';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\nimport { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';\r\nimport { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';\r\nimport { SkeletonListComponent } from '../../../loading/skeleton-loading';\r\n\r\n@Component({\r\n selector: 'app-select-field',\r\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\r\n templateUrl: './select-field.component.html',\r\n styleUrl: './select-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class SelectFieldComponent\r\n extends DropdownOptionFieldBase\r\n implements AfterViewInit, OnDestroy, OnChanges {\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n\r\n @HostBinding('class.select-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n @Input({ transform: booleanAttribute }) pagination = false;\r\n\r\n /** Alias de {@link pagination} (listas paginadas / infinitas). */\r\n @Input({ alias: 'pageable', transform: booleanAttribute })\r\n set pageableInput(value: boolean) {\r\n this.pagination = value;\r\n }\r\n\r\n @Input({ transform: numberAttribute }) pageSize = 10;\r\n @Input() hasMore = false;\r\n @Input() loadingMore = false;\r\n @Output() readonly pageRequested = new EventEmitter<SelectPageRequested>();\r\n\r\n @ViewChild('optionsPanelTpl', { static: true })\r\n optionsPanelTpl!: TemplateRef<unknown>;\r\n\r\n @ViewChild('dropdownFieldTriggerRoot', { read: ElementRef })\r\n private readonly dropdownTriggerRootRef!: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n protected override afterWriteValue(value: unknown | null): void {\r\n this.syncActiveIndexFromValue(value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get displayValue(): string {\r\n const opt = this.findOptionByValue(this.internalValue);\r\n return opt?.label ?? '';\r\n }\r\n\r\n get optionsListId(): string {\r\n return `${this.controlId}-list`;\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (!this.panelOpen || !this.pagination || this.loadingMore) {\r\n return;\r\n }\r\n if (changes['loadingMore'] || changes['options']) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n }\r\n\r\n onDropdownOpenChange(next: boolean): void {\r\n this.panelOpen = next;\r\n if (next) {\r\n this.syncActiveIndexFromValue(this.internalValue);\r\n if (this.pagination && !this.loadingMore) {\r\n this.pageRequested.emit({ page: 0, pageSize: this.pageSize });\r\n }\r\n } else {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n this.scrollLoadTimer = null;\r\n }\r\n setTimeout(() => this.focusValueButtonIfFocusLost(), 0);\r\n }\r\n if (next && this.pagination) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n setTimeout(() => this.tryEmitIfShortList(), 80);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Com painel aberto, o foco permanece no botão (como no combobox no input):\r\n * setas / Home / End / Enter / Espaço tratados aqui; Escape fecha.\r\n */\r\n onTriggerKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n if (this.readonly) {\r\n if (ev.key === ' ' || ev.key === 'Enter') {\r\n ev.preventDefault();\r\n }\r\n return;\r\n }\r\n\r\n if (this.panelOpen) {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n const n = this.listOptions.length;\r\n if (n > 0) {\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.commitActiveOption();\r\n return;\r\n default:\r\n break;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n (ev.key === 'Delete' || ev.key === 'Backspace') &&\r\n this.filledUi\r\n ) {\r\n ev.preventDefault();\r\n this.onClear();\r\n return;\r\n }\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault();\r\n this.openToggle();\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.openToggle();\r\n }\r\n }\r\n\r\n private focusValueButtonIfFocusLost(): void {\r\n const a = document.activeElement;\r\n if (a === document.body || a === document.documentElement || a == null) {\r\n document.getElementById(this.controlId)?.focus({ preventScroll: true });\r\n }\r\n }\r\n\r\n onOptionsListScroll(ev: Event): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement;\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.scrollLoadTimer = setTimeout(() => {\r\n this.scrollLoadTimer = null;\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n if (this.hasMore && !this.loadingMore && this.options.length > 0) {\r\n this.emitNextPageRequest();\r\n }\r\n return;\r\n }\r\n const nearBottom =\r\n el.scrollHeight - el.scrollTop - el.clientHeight <= 64;\r\n if (!nearBottom) {\r\n return;\r\n }\r\n this.emitNextPageRequest();\r\n }, 120);\r\n }\r\n\r\n private emitNextPageRequest(): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const nextPage = Math.floor(this.options.length / this.pageSize);\r\n this.pageRequested.emit({ page: nextPage, pageSize: this.pageSize });\r\n }\r\n\r\n private tryEmitIfShortList(): void {\r\n if (!this.panelOpen || !this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const el = document.getElementById(this.optionsListId) as HTMLElement | null;\r\n if (!el) {\r\n return;\r\n }\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n this.emitNextPageRequest();\r\n }\r\n }\r\n\r\n openToggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n const next = !this.panelOpen;\r\n if (next) {\r\n const w = this.hostRef.nativeElement.getBoundingClientRect().width;\r\n this.panelOverlayWidth = Math.max(0, Math.ceil(w));\r\n }\r\n this.onDropdownOpenChange(next);\r\n }\r\n\r\n /** Enter/Espaço com foco na linha da opção (tabindex). */\r\n onOptionRowKeydown(ev: KeyboardEvent, opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key !== 'Enter' && ev.key !== ' ') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.selectOption(opt);\r\n }\r\n\r\n onListKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\r\n if (!this.disabled && !this.readonly && this.filledUi) {\r\n ev.preventDefault();\r\n this.onClear();\r\n }\r\n return;\r\n }\r\n if (this.listOptions.length === 0) {\r\n return;\r\n }\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n break;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n break;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n break;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.commitActiveOption();\r\n break;\r\n default:\r\n return;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n selectOption(opt: UiSelectOption<unknown>): void {\r\n if (this.disabled || this.readonly || opt.disabled) {\r\n return;\r\n }\r\n this.emitModelValue(opt.value);\r\n this.onDropdownOpenChange(false);\r\n this.finishSelectionTouch();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.emitModelValue(null);\r\n this.onDropdownOpenChange(false);\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Blur no valor/chevron ou na lista: fecha o painel se o foco saiu do campo e do overlay CDK.\r\n */\r\n onDropdownBlur(ev?: FocusEvent): void {\r\n const triggerRoot =\r\n this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;\r\n scheduleCloseDropdownPanelOnTriggerBlur({\r\n triggerRoot,\r\n isPanelOpen: () => this.panelOpen,\r\n closePanel: () => this.onDropdownOpenChange(false),\r\n notifyTouched: () => this.notifyTouched(),\r\n blurRelatedTarget: ev?.relatedTarget ?? null,\r\n });\r\n }\r\n\r\n /** Escape com foco no limpar/prefixo do `base-field` (não passa pelo div da origem do overlay). */\r\n @HostListener('keydown', ['$event'])\r\n onDropdownHostEscape(ev: KeyboardEvent): void {\r\n if (!this.panelOpen || ev.key !== 'Escape') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n }\r\n\r\n private commitActiveOption(): void {\r\n const opt = this.listOptions[this.activeIndex];\r\n if (opt && !opt.disabled) {\r\n this.selectOption(opt);\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"select-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"select-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <!-- `div` em vez de `<button>`: o texto do valor fica selecionável (copiar), como no combobox. -->\n <div\n #nativeInput\n role=\"combobox\"\n class=\"select-field__value-btn\"\n [class.select-field__value-btn--is-disabled]=\"disabled\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n [attr.aria-readonly]=\"readonly && !disabled ? true : null\"\n [attr.aria-expanded]=\"panelOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\"\n [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || placeholder || 'Selecionar'\"\n (click)=\"openToggle()\"\n (blur)=\"onDropdownBlur($event)\"\n >\n <span class=\"select-field__value\">{{ displayValue }}</span>\n </div>\n <button type=\"button\" class=\"select-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista de opções\"\n (click)=\"openToggle()\" (blur)=\"onDropdownBlur($event)\">\n <i class=\"fa-solid fa-chevron-down select-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"select-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n (blur)=\"onDropdownBlur($event)\" (keydown)=\"onListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || (pagination && loadingMore))) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"select-field__option\" [class.select-field__option--disabled]=\"opt.disabled\"\n [class.select-field__option--selected]=\"isSelected(opt)\"\n [class.select-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && pagination && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n</ng-template>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n inject,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../../input-fields/_base/base-field.component';\r\nimport { DropdownMultiOptionFieldBase } from '../_base/dropdown-multi-option-field.base';\r\nimport type { SelectPageRequested } from '../_models/select-pagination.model';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\nimport { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';\r\nimport { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';\r\nimport { SkeletonListComponent } from '../../../loading/skeleton-loading';\r\n\r\n@Component({\r\n selector: 'app-multiselect-field',\r\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\r\n templateUrl: './multiselect-field.component.html',\r\n styleUrl: './multiselect-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiselectFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class MultiselectFieldComponent\r\n extends DropdownMultiOptionFieldBase\r\n implements AfterViewInit, OnDestroy, OnChanges\r\n{\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n\r\n @HostBinding('class.multiselect-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Por omissão `true`: mesmo padrão do select com lista longa (`pageRequested` + scroll). */\r\n @Input({ transform: booleanAttribute }) pagination = true;\r\n\r\n /** Alias de {@link pagination}. */\r\n @Input({ alias: 'pageable', transform: booleanAttribute })\r\n set pageableInput(value: boolean) {\r\n this.pagination = value;\r\n }\r\n\r\n @Input({ transform: numberAttribute }) pageSize = 10;\r\n @Input() hasMore = false;\r\n @Input() loadingMore = false;\r\n @Output() readonly pageRequested = new EventEmitter<SelectPageRequested>();\r\n\r\n @ViewChild('optionsPanelTpl', { static: true })\r\n optionsPanelTpl!: TemplateRef<unknown>;\r\n\r\n @ViewChild('dropdownFieldTriggerRoot', { read: ElementRef })\r\n private readonly dropdownTriggerRootRef!: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n override writeValue(value: unknown[] | null): void {\r\n // Normaliza: FormControl pode enviar null; valor interno é sempre array.\r\n const normalized =\r\n value == null ? [] : Array.isArray(value) ? [...value] : [];\r\n this.internalValue = normalized;\r\n this.afterWriteValue(normalized);\r\n this.refreshMultiFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n protected override afterWriteValue(_value: unknown[]): void {\r\n this.syncActiveIndexToFirstEnabled();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Texto numa linha: rótulos separados por vírgula + ellipsis no CSS. */\r\n get displaySummary(): string {\r\n const vals = this.internalValue;\r\n if (!Array.isArray(vals) || vals.length === 0) {\r\n return '';\r\n }\r\n return vals\r\n .map((v) => this.findOptionByValue(v)?.label ?? String(v))\r\n .join(', ');\r\n }\r\n\r\n get optionsListId(): string {\r\n return `${this.controlId}-multilist`;\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (!this.panelOpen || !this.pagination || this.loadingMore) {\r\n return;\r\n }\r\n if (changes['loadingMore'] || changes['options']) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n }\r\n\r\n onDropdownOpenChange(next: boolean): void {\r\n this.panelOpen = next;\r\n if (next) {\r\n this.syncActiveIndexToFirstEnabled();\r\n if (this.pagination && !this.loadingMore) {\r\n this.pageRequested.emit({ page: 0, pageSize: this.pageSize });\r\n }\r\n } else {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n this.scrollLoadTimer = null;\r\n }\r\n setTimeout(() => this.focusValueButtonIfFocusLost(), 0);\r\n }\r\n if (next && this.pagination) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n setTimeout(() => this.tryEmitIfShortList(), 80);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onTriggerKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n if (this.readonly) {\r\n if (ev.key === ' ' || ev.key === 'Enter') {\r\n ev.preventDefault();\r\n }\r\n return;\r\n }\r\n\r\n if (this.panelOpen) {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n const n = this.listOptions.length;\r\n if (n > 0) {\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.toggleActiveOption();\r\n return;\r\n default:\r\n break;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n (ev.key === 'Delete' || ev.key === 'Backspace') &&\r\n this.filledUi\r\n ) {\r\n ev.preventDefault();\r\n this.onClear();\r\n return;\r\n }\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault();\r\n this.openToggle();\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.openToggle();\r\n }\r\n }\r\n\r\n private focusValueButtonIfFocusLost(): void {\r\n const a = document.activeElement;\r\n if (a === document.body || a === document.documentElement || a == null) {\r\n document.getElementById(this.controlId)?.focus({ preventScroll: true });\r\n }\r\n }\r\n\r\n onOptionsListScroll(ev: Event): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement;\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.scrollLoadTimer = setTimeout(() => {\r\n this.scrollLoadTimer = null;\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n if (this.hasMore && !this.loadingMore && this.options.length > 0) {\r\n this.emitNextPageRequest();\r\n }\r\n return;\r\n }\r\n const nearBottom =\r\n el.scrollHeight - el.scrollTop - el.clientHeight <= 64;\r\n if (!nearBottom) {\r\n return;\r\n }\r\n this.emitNextPageRequest();\r\n }, 120);\r\n }\r\n\r\n private emitNextPageRequest(): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const nextPage = Math.floor(this.options.length / this.pageSize);\r\n this.pageRequested.emit({ page: nextPage, pageSize: this.pageSize });\r\n }\r\n\r\n private tryEmitIfShortList(): void {\r\n if (!this.panelOpen || !this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const el = document.getElementById(this.optionsListId) as HTMLElement | null;\r\n if (!el) {\r\n return;\r\n }\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n this.emitNextPageRequest();\r\n }\r\n }\r\n\r\n openToggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n const next = !this.panelOpen;\r\n if (next) {\r\n const w = this.hostRef.nativeElement.getBoundingClientRect().width;\r\n this.panelOverlayWidth = Math.max(0, Math.ceil(w));\r\n }\r\n this.onDropdownOpenChange(next);\r\n }\r\n\r\n toggleOption(opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n const cur = [...(Array.isArray(this.internalValue) ? this.internalValue : [])];\r\n const j = cur.findIndex((v) => this.matches(v, opt.value));\r\n if (j >= 0) {\r\n cur.splice(j, 1);\r\n } else {\r\n cur.push(opt.value);\r\n }\r\n this.emitModelValue(cur);\r\n this.finishMultiTouch();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private toggleActiveOption(): void {\r\n const opt = this.listOptions[this.activeIndex];\r\n if (opt && !opt.disabled) {\r\n this.toggleOption(opt);\r\n }\r\n }\r\n\r\n onOptionRowKeydown(ev: KeyboardEvent, opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key !== 'Enter' && ev.key !== ' ') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.toggleOption(opt);\r\n }\r\n\r\n onListKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\r\n if (!this.disabled && !this.readonly && this.filledUi) {\r\n ev.preventDefault();\r\n this.onClear();\r\n }\r\n return;\r\n }\r\n if (this.listOptions.length === 0) {\r\n return;\r\n }\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n break;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n break;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n break;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.toggleActiveOption();\r\n break;\r\n default:\r\n return;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.emitModelValue([]);\r\n this.onDropdownOpenChange(false);\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDropdownBlur(ev?: FocusEvent): void {\r\n const triggerRoot =\r\n this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;\r\n scheduleCloseDropdownPanelOnTriggerBlur({\r\n triggerRoot,\r\n isPanelOpen: () => this.panelOpen,\r\n closePanel: () => this.onDropdownOpenChange(false),\r\n notifyTouched: () => this.notifyTouched(),\r\n blurRelatedTarget: ev?.relatedTarget ?? null,\r\n });\r\n }\r\n\r\n /** Escape com foco no limpar/prefixo do `base-field` (não passa pelo div da origem do overlay). */\r\n @HostListener('keydown', ['$event'])\r\n onDropdownHostEscape(ev: KeyboardEvent): void {\r\n if (!this.panelOpen || ev.key !== 'Escape') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"multiselect-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"multiselect-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <div\n #nativeInput\n role=\"combobox\"\n class=\"multiselect-field__value-btn\"\n [class.multiselect-field__value-btn--is-disabled]=\"disabled\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n [attr.aria-readonly]=\"readonly && !disabled ? true : null\"\n [attr.aria-expanded]=\"panelOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\"\n [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || placeholder || 'Selecionar vários'\"\n (click)=\"openToggle()\"\n (blur)=\"onDropdownBlur($event)\"\n >\n <span class=\"multiselect-field__value\">{{ displaySummary }}</span>\n </div>\n <button type=\"button\" class=\"multiselect-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista de opções\"\n (click)=\"openToggle()\" (blur)=\"onDropdownBlur($event)\">\n <i class=\"fa-solid fa-chevron-down multiselect-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"multiselect-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\" aria-multiselectable=\"true\"\n (mousedown)=\"$event.preventDefault()\"\n (blur)=\"onDropdownBlur($event)\" (keydown)=\"onListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || (pagination && loadingMore))) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"multiselect-field__option\" [class.multiselect-field__option--disabled]=\"opt.disabled\"\n [class.multiselect-field__option--selected]=\"isSelected(opt)\"\n [class.multiselect-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"toggleOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n <span class=\"multiselect-field__check\" aria-hidden=\"true\">\n @if (isSelected(opt)) {\n <i class=\"fa-solid fa-check multiselect-field__check-icon\"></i>\n }\n </span>\n <span class=\"multiselect-field__option-label\">{{ opt.label }}</span>\n </div>\n }\n @if (options.length > 0 && pagination && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n</ng-template>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n forwardRef,\r\n inject,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../../input-fields/_base/base-field.component';\r\nimport { DropdownOptionFieldBase } from '../_base/dropdown-option-field.base';\r\nimport type { DropdownSearchPageRequested } from '../_models/dropdown-search-page-requested.model';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\nimport { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';\r\nimport { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';\r\nimport { SkeletonListComponent } from '../../../loading/skeleton-loading';\r\n\r\nenum DropdownSearchOpenMode {\r\n Default = 'default',\r\n KeepInput = 'keepInput',\r\n}\r\n\r\n@Component({\r\n selector: 'app-dropdown-search-field',\r\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\r\n templateUrl: './dropdown-search-field.component.html',\r\n styleUrl: './dropdown-search-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DropdownSearchFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class DropdownSearchFieldComponent\r\n extends DropdownOptionFieldBase\r\n implements OnDestroy, OnChanges\r\n{\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n\r\n @HostBinding('class.dropdown-search-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n @Input({ transform: numberAttribute }) pageSize = 5;\r\n @Input() hasMore = false;\r\n @Input() loadingMore = false;\r\n /**\r\n * Após parar de digitar, dispara a mesma pesquisa que Enter (`pageRequested` com `query`).\r\n * `0` desativa (só Enter pesquisa).\r\n */\r\n @Input({ transform: numberAttribute }) searchDebounceMs = 350;\r\n\r\n @Output() readonly pageRequested =\r\n new EventEmitter<DropdownSearchPageRequested>();\r\n\r\n @ViewChild('optionsPanelTpl', { static: true })\r\n optionsPanelTpl!: TemplateRef<unknown>;\r\n\r\n @ViewChild('dropdownFieldTriggerRoot', { read: ElementRef })\r\n private readonly dropdownTriggerRootRef!: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n searchQuery = '';\r\n committedQuery = '';\r\n\r\n panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\r\n private searchDebounceTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n protected override afterWriteValue(value: unknown | null): void {\r\n this.searchQuery =\r\n value == null ? '' : (this.findOptionByValue(value)?.label ?? '');\r\n this.committedQuery = '';\r\n this.syncActiveIndexFromValue(value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get displayValue(): string {\r\n const opt = this.findOptionByValue(this.internalValue);\r\n return opt?.label ?? '';\r\n }\r\n\r\n get optionsListId(): string {\r\n return `${this.controlId}-search-list`;\r\n }\r\n\r\n /**\r\n * Com valor selecionado e painel fechado, o texto é só exibição do rótulo;\r\n * edição só com o painel aberto (pesquisa).\r\n */\r\n get isLockedSelectionDisplay(): boolean {\r\n return (\r\n !this.disabled &&\r\n !this.readonly &&\r\n this.filledUi &&\r\n !this.panelOpen\r\n );\r\n }\r\n\r\n /** `readonly` nativo: prop do campo ou bloqueio de exibição da seleção. */\r\n get isNativeInputReadonly(): boolean {\r\n if (this.disabled) {\r\n return false;\r\n }\r\n return this.readonly || this.isLockedSelectionDisplay;\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (!this.panelOpen || this.loadingMore) {\r\n return;\r\n }\r\n if (changes['loadingMore'] || changes['options']) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.clearSearchDebounce();\r\n }\r\n\r\n onDropdownOpenChange(\r\n next: boolean,\r\n openMode: DropdownSearchOpenMode = DropdownSearchOpenMode.Default,\r\n ): void {\r\n if (!next) {\r\n if (!this.panelOpen) {\r\n return;\r\n }\r\n this.panelOpen = false;\r\n this.clearSearchDebounce();\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n this.scrollLoadTimer = null;\r\n }\r\n setTimeout(() => this.focusMainInputIfFocusLost(), 0);\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n if (openMode === DropdownSearchOpenMode.Default) {\r\n // Não limpar o texto quando já há seleção (comportamento alinhado ao select).\r\n this.committedQuery = '';\r\n if (this.filledUi) {\r\n const opt = this.findOptionByValue(this.internalValue);\r\n this.searchQuery = opt?.label ?? '';\r\n } else {\r\n this.searchQuery = '';\r\n }\r\n } else {\r\n this.committedQuery = this.searchQuery.trim();\r\n }\r\n this.panelOpen = true;\r\n this.syncActiveIndexFromValue(this.internalValue);\r\n const w = this.hostRef.nativeElement.getBoundingClientRect().width;\r\n this.panelOverlayWidth = Math.max(0, Math.ceil(w));\r\n if (!this.loadingMore) {\r\n this.pageRequested.emit({\r\n page: 0,\r\n pageSize: this.pageSize,\r\n query: this.committedQuery,\r\n });\r\n }\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n setTimeout(() => this.tryEmitIfShortList(), 80);\r\n setTimeout(() => {\r\n document.getElementById(this.controlId)?.focus();\r\n }, 0);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMainInput(ev: Event): void {\r\n if (this.isNativeInputReadonly) {\r\n return;\r\n }\r\n const el = ev.target as HTMLInputElement;\r\n this.searchQuery = el.value;\r\n this.scheduleDebouncedSearch();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMainKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n\r\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\r\n if (this.panelOpen) {\r\n return;\r\n }\r\n if (this.filledUi) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.onClear();\r\n }\r\n return;\r\n }\r\n\r\n if (ev.key === 'Escape' && this.panelOpen) {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n\r\n if (this.panelOpen && this.listOptions.length > 0) {\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n if (ev.key === 'Enter') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n if (!this.panelOpen) {\r\n if (\r\n this.searchQuery.trim() === '' ||\r\n this.isLockedSelectionDisplay\r\n ) {\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);\r\n } else {\r\n this.runSearch();\r\n }\r\n return;\r\n }\r\n const q = this.searchQuery.trim();\r\n const dirty = q !== this.committedQuery;\r\n if (dirty) {\r\n // Lista pedida com query vazia mas o input mostra o rótulo da seleção — não é pesquisa nova.\r\n if (this.isDisplayingSelectedLabelWithUnfilteredList()) {\r\n if (this.listOptions.length > 0) {\r\n this.commitActiveOption();\r\n }\r\n return;\r\n }\r\n this.runSearch();\r\n return;\r\n }\r\n if (this.listOptions.length > 0) {\r\n this.commitActiveOption();\r\n }\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Ao reabrir, `committedQuery` é '' (lista sem filtro) e o texto do input é o rótulo do valor —\r\n * `q !== committedQuery` seria true sem o usuário ter pesquisado; Enter deve confirmar opção.\r\n */\r\n private isDisplayingSelectedLabelWithUnfilteredList(): boolean {\r\n if (!this.filledUi || this.committedQuery !== '') {\r\n return false;\r\n }\r\n const label = this.findOptionByValue(this.internalValue)?.label?.trim();\r\n if (label == null || label.length === 0) {\r\n return false;\r\n }\r\n return this.searchQuery.trim() === label;\r\n }\r\n\r\n onMainBlur(ev?: FocusEvent): void {\r\n const triggerRoot =\r\n this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;\r\n scheduleCloseDropdownPanelOnTriggerBlur({\r\n triggerRoot,\r\n isPanelOpen: () => this.panelOpen,\r\n closePanel: () => this.onDropdownOpenChange(false),\r\n notifyTouched: () => this.notifyTouched(),\r\n blurRelatedTarget: ev?.relatedTarget ?? null,\r\n afterBlur: () => this.clearOrphanSearchTextAfterBlur(),\r\n });\r\n }\r\n\r\n /**\r\n * Sem valor no modelo: remove texto livre deixado no input (ex.: pesquisa sem escolha válida).\r\n * Não altera o `FormControl` — mantém-se `null`/vazio e o estado inválido (ex.: obrigatório) continua visível.\r\n */\r\n private clearOrphanSearchTextAfterBlur(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const v = this.internalValue;\r\n if (v != null && v !== '') {\r\n return;\r\n }\r\n if (this.searchQuery.trim() === '') {\r\n return;\r\n }\r\n this.searchQuery = '';\r\n this.committedQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Escape com foco no limpar/prefixo do `base-field` (fora do input da origem). */\r\n @HostListener('keydown', ['$event'])\r\n onDropdownHostEscape(ev: KeyboardEvent): void {\r\n if (!this.panelOpen || ev.key !== 'Escape') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n }\r\n\r\n onTriggerKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (\r\n (ev.key === 'Delete' || ev.key === 'Backspace') &&\r\n this.filledUi &&\r\n !this.panelOpen\r\n ) {\r\n ev.preventDefault();\r\n this.onClear();\r\n return;\r\n }\r\n if (this.panelOpen) {\r\n return;\r\n }\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);\r\n }\r\n }\r\n\r\n /** Enter/Espaço com foco na linha da opção (tabindex). */\r\n onOptionRowKeydown(ev: KeyboardEvent, opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key !== 'Enter' && ev.key !== ' ') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.selectOption(opt);\r\n }\r\n\r\n /** Foco na lista (ex.: Tab): Delete/Backspace limpam a seleção. */\r\n onSearchListKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n if (ev.key !== 'Delete' && ev.key !== 'Backspace') {\r\n return;\r\n }\r\n if (this.disabled || this.readonly || !this.filledUi) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.onClear();\r\n }\r\n\r\n private focusMainInputIfFocusLost(): void {\r\n const a = document.activeElement;\r\n if (a === document.body || a === document.documentElement || a == null) {\r\n document.getElementById(this.controlId)?.focus({ preventScroll: true });\r\n }\r\n }\r\n\r\n private scheduleDebouncedSearch(): void {\r\n if (this.searchDebounceMs <= 0) {\r\n return;\r\n }\r\n if (this.searchDebounceTimer != null) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n this.searchDebounceTimer = setTimeout(() => {\r\n this.searchDebounceTimer = null;\r\n this.applyDebouncedSearch();\r\n }, this.searchDebounceMs);\r\n }\r\n\r\n private clearSearchDebounce(): void {\r\n if (this.searchDebounceTimer != null) {\r\n clearTimeout(this.searchDebounceTimer);\r\n this.searchDebounceTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Alinha-se ao Enter: só dispara se `query` mudou em relação a `committedQuery`;\r\n * com painel fechado, só se houver texto pesquisável (como Enter sem abrir vazio).\r\n */\r\n private applyDebouncedSearch(): void {\r\n if (this.disabled || this.readonly || this.isNativeInputReadonly) {\r\n return;\r\n }\r\n const q = this.searchQuery.trim();\r\n if (q === this.committedQuery) {\r\n return;\r\n }\r\n if (!this.panelOpen) {\r\n if (q === '' || this.isLockedSelectionDisplay) {\r\n return;\r\n }\r\n this.runSearch();\r\n return;\r\n }\r\n if (this.isDisplayingSelectedLabelWithUnfilteredList()) {\r\n return;\r\n }\r\n this.runSearch();\r\n }\r\n\r\n runSearch(): void {\r\n this.clearSearchDebounce();\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (!this.panelOpen) {\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.KeepInput);\r\n return;\r\n }\r\n const q = this.searchQuery.trim();\r\n this.committedQuery = q;\r\n this.pageRequested.emit({\r\n page: 0,\r\n pageSize: this.pageSize,\r\n query: q,\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onOptionsListScroll(ev: Event): void {\r\n if (this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement;\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.scrollLoadTimer = setTimeout(() => {\r\n this.scrollLoadTimer = null;\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n if (this.hasMore && !this.loadingMore && this.options.length > 0) {\r\n this.emitNextPageRequest();\r\n }\r\n return;\r\n }\r\n const nearBottom =\r\n el.scrollHeight - el.scrollTop - el.clientHeight <= 64;\r\n if (!nearBottom) {\r\n return;\r\n }\r\n this.emitNextPageRequest();\r\n }, 120);\r\n }\r\n\r\n private emitNextPageRequest(): void {\r\n if (this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const nextPage = Math.floor(this.options.length / this.pageSize);\r\n this.pageRequested.emit({\r\n page: nextPage,\r\n pageSize: this.pageSize,\r\n query: this.committedQuery,\r\n });\r\n }\r\n\r\n private tryEmitIfShortList(): void {\r\n if (!this.panelOpen || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const el = document.getElementById(this.optionsListId) as HTMLElement | null;\r\n if (!el) {\r\n return;\r\n }\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n this.emitNextPageRequest();\r\n }\r\n }\r\n\r\n openToggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n if (this.panelOpen) {\r\n this.onDropdownOpenChange(false);\r\n } else {\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);\r\n }\r\n }\r\n\r\n private commitActiveOption(): void {\r\n const opt = this.listOptions[this.activeIndex];\r\n if (opt && !opt.disabled) {\r\n this.selectOption(opt);\r\n }\r\n }\r\n\r\n selectOption(opt: UiSelectOption<unknown>): void {\r\n if (this.disabled || this.readonly || opt.disabled) {\r\n return;\r\n }\r\n this.emitModelValue(opt.value);\r\n this.searchQuery = opt.label;\r\n this.committedQuery = '';\r\n this.onDropdownOpenChange(false);\r\n this.finishSelectionTouch();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.clearSearchDebounce();\r\n this.emitModelValue(null);\r\n this.searchQuery = '';\r\n this.committedQuery = '';\r\n this.onDropdownOpenChange(false);\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"dropdown-search-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"dropdown-search-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <input #nativeInput type=\"text\" class=\"dropdown-search-field__input\"\n [class.dropdown-search-field__input--locked]=\"isLockedSelectionDisplay\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [disabled]=\"disabled\" [readonly]=\"isNativeInputReadonly\" [attr.placeholder]=\"''\"\n autocomplete=\"off\" spellcheck=\"false\"\n [attr.aria-expanded]=\"panelOpen\" aria-autocomplete=\"list\" role=\"combobox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [attr.aria-label]=\"floatLabelCaption || placeholder || 'Buscar e selecionar'\"\n [value]=\"searchQuery\" (input)=\"onMainInput($event)\" (keydown)=\"onMainKeydown($event)\"\n (blur)=\"onMainBlur($event)\" />\n <button type=\"button\" class=\"dropdown-search-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista\" (click)=\"openToggle()\">\n <i class=\"fa-solid fa-chevron-down dropdown-search-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"dropdown-search-field__panel-inner\" (mousedown)=\"$event.preventDefault()\">\n <div class=\"dropdown-search-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n [attr.aria-label]=\"floatLabelCaption || 'Opções'\" (blur)=\"onMainBlur($event)\"\n (keydown)=\"onSearchListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || loadingMore)) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"dropdown-search-field__option\"\n [class.dropdown-search-field__option--disabled]=\"opt.disabled\"\n [class.dropdown-search-field__option--selected]=\"isSelected(opt)\"\n [class.dropdown-search-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n </div>\n</ng-template>\n","/**\r\n * Bloqueio de scroll global **alinhado ao CDK** (`BlockScrollStrategy`):\r\n * classe `cdk-global-scrollblock` no `documentElement` + deslocamento `left`/`top`\r\n * para congelar a posição de scroll.\r\n *\r\n * Também define `overflow: hidden` no `body` enquanto o lock está activo — o `html`\r\n * **não** usa `overflow-y: scroll` (isso forçava barra no viewport sem necessidade).\r\n *\r\n * Requer regras CSS em `styles.scss` para `.cdk-global-scrollblock` e\r\n * `[data-app-scroll-lock]`.\r\n */\r\n\r\nexport interface ScrollLockSnapshot {\r\n readonly htmlLeft: string;\r\n readonly htmlTop: string;\r\n readonly scrollX: number;\r\n readonly scrollY: number;\r\n readonly bodyOverflow: string;\r\n readonly bodyTouchAction: string;\r\n}\r\n\r\n/** Aplica o mesmo padrão visual do overlay CDK Dialog (confirm, etc.). */\r\nexport function lockPageScrollCdkStyle(): ScrollLockSnapshot {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n const scrollX = window.scrollX ?? html.scrollLeft;\r\n const scrollY = window.scrollY ?? html.scrollTop;\r\n const snapshot: ScrollLockSnapshot = {\r\n htmlLeft: html.style.left,\r\n htmlTop: html.style.top,\r\n scrollX,\r\n scrollY,\r\n bodyOverflow: body.style.overflow,\r\n bodyTouchAction: body.style.touchAction,\r\n };\r\n html.style.left = `${-scrollX}px`;\r\n html.style.top = `${-scrollY}px`;\r\n html.classList.add('cdk-global-scrollblock');\r\n body.style.overflow = 'hidden';\r\n body.style.touchAction = 'none';\r\n return snapshot;\r\n}\r\n\r\nexport function unlockPageScrollCdkStyle(s: ScrollLockSnapshot): void {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n html.classList.remove('cdk-global-scrollblock');\r\n html.style.left = s.htmlLeft;\r\n html.style.top = s.htmlTop;\r\n body.style.overflow = s.bodyOverflow;\r\n body.style.touchAction = s.bodyTouchAction;\r\n window.scroll(s.scrollX, s.scrollY);\r\n}\r\n\r\n/**\r\n * Bloqueio de scroll para o `app-dialog` declarativo: **sem** `position: fixed` nem `left`/`top`\r\n * negativos no `documentElement` (padrão CDK em {@link lockPageScrollCdkStyle}).\r\n *\r\n * Com esse padrão, em Chromium/WebKit o `position: fixed` do scrim deixa de ficar ancorado ao\r\n * `html` deslocado — evita faixa de conteúdo visível no topo e scrim branco/cinza errado em\r\n * apps onde o `body` faz scroll (ex.: site de documentação).\r\n */\r\nexport interface AppDialogScrollLockSnapshot {\r\n readonly scrollX: number;\r\n readonly scrollY: number;\r\n readonly htmlOverflow: string;\r\n readonly bodyOverflow: string;\r\n readonly bodyTouchAction: string;\r\n}\r\n\r\nlet appDialogLightLockDepth = 0;\r\nlet appDialogLightLockSnapshot: AppDialogScrollLockSnapshot | null = null;\r\n\r\nfunction applyAppDialogScrollLock(): AppDialogScrollLockSnapshot {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n const scrollX = window.scrollX ?? html.scrollLeft;\r\n const scrollY = window.scrollY ?? html.scrollTop;\r\n return {\r\n scrollX,\r\n scrollY,\r\n htmlOverflow: html.style.overflow,\r\n bodyOverflow: body.style.overflow,\r\n bodyTouchAction: body.style.touchAction,\r\n };\r\n}\r\n\r\nfunction installAppDialogScrollLockStyles(s: AppDialogScrollLockSnapshot): void {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n html.classList.add('app-dialog-scroll-lock');\r\n html.style.overflow = 'hidden';\r\n body.style.overflow = 'hidden';\r\n body.style.touchAction = 'none';\r\n}\r\n\r\nfunction restoreAppDialogScrollLock(s: AppDialogScrollLockSnapshot): void {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n html.classList.remove('app-dialog-scroll-lock');\r\n html.style.overflow = s.htmlOverflow;\r\n body.style.overflow = s.bodyOverflow;\r\n body.style.touchAction = s.bodyTouchAction;\r\n window.scroll(s.scrollX, s.scrollY);\r\n}\r\n\r\n/**\r\n * Incrementa um contador de aninhamento: o primeiro lock aplica o DOM; locks interiores\r\n * (ex.: `app-dialog` + CDK Dialog) só incrementam a profundidade.\r\n */\r\nexport function lockPageScrollAppDialog(): AppDialogScrollLockSnapshot {\r\n if (appDialogLightLockDepth === 0) {\r\n appDialogLightLockSnapshot = applyAppDialogScrollLock();\r\n installAppDialogScrollLockStyles(appDialogLightLockSnapshot);\r\n }\r\n appDialogLightLockDepth++;\r\n return appDialogLightLockSnapshot!;\r\n}\r\n\r\n/** Par com {@link lockPageScrollAppDialog}; o snapshot pode ser ignorado — usa-se a pilha interna. */\r\nexport function unlockPageScrollAppDialog(_s: AppDialogScrollLockSnapshot): void {\r\n if (appDialogLightLockDepth > 0) {\r\n appDialogLightLockDepth--;\r\n }\r\n if (appDialogLightLockDepth === 0 && appDialogLightLockSnapshot !== null) {\r\n restoreAppDialogScrollLock(appDialogLightLockSnapshot);\r\n appDialogLightLockSnapshot = null;\r\n }\r\n}\r\n","/** Largura máxima do painel `app-dialog` (conteúdo responsivo). */\r\nexport enum LibDialogSize {\r\n Sm = 'sm',\r\n Md = 'md',\r\n Lg = 'lg',\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n booleanAttribute,\n} from '@angular/core';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport {\n lockPageScrollAppDialog,\n unlockPageScrollAppDialog,\n type AppDialogScrollLockSnapshot,\n} from '../../_utils/scroll/body-scroll-lock.util';\nimport { LibDialogSize } from '../_models/lib-dialog-size.model';\nimport { AppThemeService } from '../../theme';\n\nlet appDialogSeq = 0;\n\n/**\n * Diálogo modal declarativo com `[(open)]`, projeção de corpo e rodapé opcional (`[appDialogFooter]`).\n * Bloqueio de scroll com {@link lockPageScrollAppDialog} (sem deslocar o `html` como o CDK),\n * para o scrim `position: fixed` alinhar ao viewport em páginas com scroll no `body`.\n */\n@Component({\n selector: 'app-dialog',\n imports: [CdkTrapFocus],\n templateUrl: './app-dialog.component.html',\n styleUrl: './app-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AppDialogComponent implements OnInit, OnChanges, OnDestroy {\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly appTheme = inject(AppThemeService);\n\n /**\n * Com o host em `document.body`, sem isto os `--app-color-*` / `--ui-field-*` ficam só com\n * valores de `:root` (azul); alinhamos ao CDK Dialog (`libDialogPanelClasses`).\n */\n @HostBinding('class')\n get hostThemeClasses(): string {\n return this.appTheme.getTheme();\n }\n\n /**\n * Impede o tooltip nativo do browser: o `@Input('title')` alimenta só `dialogHeading`, mas o\n * binding `title=\"…\"` no host ainda podia definir `HTMLElement.title` no `<app-dialog>`.\n */\n @HostBinding('attr.title')\n readonly hostTitleAttr: null = null;\n\n @Input({ transform: booleanAttribute }) open = false;\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n /**\n * Título do cabeçalho (`<app-dialog title=\"…\">`).\n * O nome da propriedade **não** pode ser `title`: no host DOM isso colide com\n * `HTMLElement.title` e o browser desenha o tooltip nativo por cima do overlay.\n */\n @Input('title') dialogHeading = '';\n\n /** Texto de apoio abaixo do título (opcional); liga `aria-describedby` no painel. */\n @Input() description = '';\n\n /**\n * Rótulo acessível quando não há título (evita diálogo sem nome).\n * Ignorado se `dialogHeading` tiver texto.\n */\n @Input() ariaLabel = 'Diálogo';\n\n @Input() size: LibDialogSize = LibDialogSize.Md;\n\n /**\n * Quando `false`, a tecla Escape e o clique no backdrop não fecham o diálogo\n * (botão ✕, `[(open)]` e `requestClose()` continuam disponíveis).\n * Omisso: `true`.\n */\n @Input({ transform: booleanAttribute }) allowOverlayDismiss = true;\n\n @Input({ transform: booleanAttribute }) showCloseButton = true;\n\n readonly LibDialogSize = LibDialogSize;\n\n readonly titleId = `app-dialog-title-${++appDialogSeq}`;\n readonly descriptionId = `app-dialog-desc-${appDialogSeq}`;\n\n /**\n * O modal fica no fim de `document.body` enquanto aberto, para o `backdrop-filter`\n * não ficar «preso» a ancestrais com `overflow: auto` (ex.: `app-shell__content`).\n */\n private bodyRestoreParent: HTMLElement | null = null;\n private bodyRestoreNext: ChildNode | null = null;\n\n private previousActive: HTMLElement | null = null;\n private scrollLock: AppDialogScrollLockSnapshot = {\n htmlOverflow: '',\n scrollX: 0,\n scrollY: 0,\n bodyOverflow: '',\n bodyTouchAction: '',\n };\n\n ngOnInit(): void {\n this.stripHostNativeTitle();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n this.stripHostNativeTitle();\n if (changes['open']) {\n if (this.open) {\n this.attachHostToBody();\n const a = document.activeElement;\n if (a instanceof HTMLElement && a !== document.body) {\n this.previousActive = a;\n }\n this.scrollLock = lockPageScrollAppDialog();\n } else {\n unlockPageScrollAppDialog(this.scrollLock);\n this.detachHostFromBody();\n this.restoreFocus();\n }\n }\n }\n\n ngOnDestroy(): void {\n if (this.open) {\n unlockPageScrollAppDialog(this.scrollLock);\n }\n this.detachHostFromBody();\n }\n\n private attachHostToBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement === document.body) {\n return;\n }\n this.bodyRestoreParent = el.parentElement;\n this.bodyRestoreNext = el.nextSibling;\n document.body.appendChild(el);\n this.stripHostNativeTitle();\n }\n\n private detachHostFromBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement !== document.body) {\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n return;\n }\n const parent = this.bodyRestoreParent;\n const next = this.bodyRestoreNext;\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n if (parent && document.body.contains(parent)) {\n if (next && next.parentNode === parent) {\n parent.insertBefore(el, next);\n return;\n }\n parent.appendChild(el);\n return;\n }\n const appRoot = document.querySelector('app-root');\n if (appRoot) {\n appRoot.appendChild(el);\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onDocumentKeydown(ev: KeyboardEvent): void {\n if (!this.open || ev.key !== 'Escape' || !this.allowOverlayDismiss) {\n return;\n }\n ev.preventDefault();\n this.requestClose();\n }\n\n onBackdropClick(): void {\n if (!this.allowOverlayDismiss) {\n return;\n }\n this.requestClose();\n }\n\n requestClose(): void {\n if (!this.open) {\n return;\n }\n this.open = false;\n this.openChange.emit(false);\n unlockPageScrollAppDialog(this.scrollLock);\n this.restoreFocus();\n }\n\n private restoreFocus(): void {\n if (this.previousActive && document.contains(this.previousActive)) {\n this.previousActive.focus({ preventScroll: true });\n }\n this.previousActive = null;\n }\n\n private stripHostNativeTitle(): void {\n const el = this.hostEl.nativeElement;\n el.removeAttribute('title');\n el.title = '';\n }\n}\n","@if (open) {\r\n <div\r\n class=\"app-dialog-backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n <div class=\"app-dialog-stage\" aria-hidden=\"false\">\r\n <div\r\n class=\"app-dialog-panel\"\r\n [class.app-dialog-panel--sm]=\"size === LibDialogSize.Sm\"\r\n [class.app-dialog-panel--md]=\"size === LibDialogSize.Md\"\r\n [class.app-dialog-panel--lg]=\"size === LibDialogSize.Lg\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"\r\n dialogHeading.trim() ? titleId : description.trim() ? descriptionId : null\r\n \"\r\n [attr.aria-label]=\"!dialogHeading.trim() && !description.trim() ? ariaLabel : null\"\r\n [attr.aria-describedby]=\"\r\n dialogHeading.trim() && description.trim() ? descriptionId : null\r\n \"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (dialogHeading.trim()) {\r\n <header class=\"app-dialog-header\">\r\n <h2 class=\"app-dialog-title\" [id]=\"titleId\">{{ dialogHeading }}</h2>\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-dialog-close\"\r\n aria-label=\"Fechar diálogo\"\r\n (click)=\"requestClose()\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n }\r\n @if (description.trim()) {\r\n <p class=\"app-dialog-description\" [id]=\"descriptionId\">{{ description }}</p>\r\n }\r\n <div class=\"app-dialog-body\">\r\n <ng-content />\r\n </div>\r\n <footer class=\"app-dialog-footer\">\r\n <ng-content select=\"[appDialogFooter]\" />\r\n </footer>\r\n </div>\r\n </div>\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\n/** Marca o conteúdo projectado no rodapé de `app-dialog`. */\r\n@Directive({\r\n selector: '[appDialogFooter]',\r\n standalone: true,\r\n})\r\nexport class DialogFooterDirective {}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\r\nimport { ButtonComponent, ButtonType, ButtonVariant } from '../../buttons';\r\nimport type { ConfirmDialogData } from './confirm-dialog-data.model';\r\n\r\n@Component({\n selector: 'app-confirm-dialog',\n imports: [ButtonComponent],\n templateUrl: './confirm-dialog.component.html',\n styleUrl: './confirm-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class ConfirmDialogComponent implements AfterViewInit {\r\n readonly ref = inject(DialogRef<boolean, ConfirmDialogComponent>);\r\n readonly data = inject<ConfirmDialogData>(DIALOG_DATA);\r\n readonly titleId = `app-confirm-dlg-title-${++ConfirmDialogComponent.seq}`;\r\n readonly descId = `app-confirm-dlg-desc-${ConfirmDialogComponent.seq}`;\r\n\r\n @ViewChild('cancelBtn') private cancelBtn?: ButtonComponent;\r\n\r\n private static seq = 0;\r\n\r\n ngAfterViewInit(): void {\r\n queueMicrotask(() => {\r\n this.cancelBtn?.focusNative({ preventScroll: true });\r\n });\r\n }\r\n\r\n onConfirm(): void {\r\n this.ref.close(true);\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<div\r\n class=\"confirm-dialog\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"titleId\"\r\n [attr.aria-describedby]=\"descId\"\r\n>\r\n <header class=\"confirm-dialog__header\">\r\n <h2 class=\"confirm-dialog__title\" [id]=\"titleId\">{{ data.title }}</h2>\r\n </header>\r\n\r\n <div class=\"confirm-dialog__body\">\r\n <p class=\"confirm-dialog__message\" [id]=\"descId\">{{ data.message }}</p>\r\n </div>\r\n\r\n <footer class=\"confirm-dialog__footer\">\r\n <app-button\r\n #cancelBtn\r\n type=\"button\"\r\n variant=\"secondary\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onCancel()\"\r\n >\r\n {{ data.cancelLabel ?? 'Cancelar' }}\r\n </app-button>\r\n <app-button\r\n type=\"button\"\r\n [variant]=\"data.variant === 'danger' ? 'danger' : 'primary'\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onConfirm()\"\r\n >\r\n {{ data.confirmLabel ?? 'Confirmar' }}\r\n </app-button>\r\n </footer>\r\n</div>\r\n","import type { OverlayRef, ScrollStrategy } from '@angular/cdk/overlay';\r\nimport {\r\n lockPageScrollAppDialog,\r\n unlockPageScrollAppDialog,\r\n type AppDialogScrollLockSnapshot,\r\n} from '../../_utils/scroll/body-scroll-lock.util';\r\n\r\n/**\r\n * Substituto do `BlockScrollStrategy` do CDK para modais Structra (Dialog de confirmação,\r\n * loading, etc.): activa {@link lockPageScrollAppDialog} em vez de `cdk-global-scrollblock`\r\n * com `html` deslocado — alinha o backdrop do overlay ao viewport real.\r\n */\r\nexport class AppLibLightBlockScrollStrategy implements ScrollStrategy {\r\n private snapshot: AppDialogScrollLockSnapshot | null = null;\r\n\r\n attach(_overlayRef: OverlayRef): void {}\r\n\r\n enable(): void {\r\n this.snapshot = lockPageScrollAppDialog();\r\n }\r\n\r\n disable(): void {\r\n if (this.snapshot !== null) {\r\n unlockPageScrollAppDialog(this.snapshot);\r\n this.snapshot = null;\r\n }\r\n }\r\n}\r\n","import { AppThemeService } from '../../theme';\r\n\r\n/** Classes aplicadas ao painel CDK Dialog + tema da app. */\r\nexport function libDialogPanelClasses(\r\n theme: AppThemeService,\r\n extra: string | string[] = [],\r\n): string[] {\r\n const rest = Array.isArray(extra) ? extra : [extra];\r\n return ['app-lib-dialog-panel', ...theme.themeClassList(), ...rest];\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { Dialog } from '@angular/cdk/dialog';\r\nimport { Observable, firstValueFrom } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { AppThemeService } from '../../theme';\r\nimport { AppLibLightBlockScrollStrategy } from '../_utils/app-lib-light-block-scroll-strategy';\r\nimport { libDialogPanelClasses } from '../_utils/lib-dialog-panel-classes';\r\nimport { ConfirmDialogComponent } from './confirm-dialog.component';\r\nimport type { ConfirmDialogData } from './confirm-dialog-data.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ConfirmDialogService {\r\n private readonly dialog = inject(Dialog);\r\n private readonly theme = inject(AppThemeService);\r\n\r\n /**\r\n * Abre o diálogo de confirmação (CDK Dialog + `ConfirmDialogComponent`).\r\n * Emite `true` se confirmar, `false` se cancelar, `undefined` se fechar sem resultado (Esc/backdrop, quando permitido).\r\n * Por defeito permite dispensar com Esc e clique fora; use `data.blockOverlayDismiss` para exigir só botões.\r\n */\r\n open(data: ConfirmDialogData): Observable<boolean | undefined> {\r\n return this.dialog\r\n .open(ConfirmDialogComponent, {\r\n data,\r\n width: 'min(26rem, 92vw)',\r\n maxWidth: '92vw',\r\n disableClose: data.blockOverlayDismiss === true,\r\n hasBackdrop: true,\r\n backdropClass: 'app-lib-dialog-backdrop',\r\n panelClass: libDialogPanelClasses(this.theme),\r\n autoFocus: false,\r\n ariaModal: true,\r\n scrollStrategy: new AppLibLightBlockScrollStrategy(),\r\n })\r\n .closed.pipe(map((r) => r as boolean | undefined));\r\n }\r\n\r\n /** Confirmação como Promise (adequado a `async`/`await`). */\r\n confirm(data: ConfirmDialogData): Promise<boolean> {\r\n return firstValueFrom(\r\n this.open(data).pipe(map((r) => r === true)),\r\n );\r\n }\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport type { ToastInstance, ToastShowOptions, ToastType } from './toast.models';\r\n\r\nconst DEFAULT_DURATION_MS = 5000;\r\n\r\nlet toastIdSeq = 0;\r\n\r\nfunction nextId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n return `toast-${++toastIdSeq}`;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToastService {\r\n private readonly items = signal<ToastInstance[]>([]);\r\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\r\n private readonly actionHandlers = new Map<string, () => void>();\r\n\r\n /** Lista actual (mais recente primeiro). */\r\n readonly toasts = computed(() => this.items());\r\n\r\n /** Mostra um toast; devolve o id (para `dismiss` manual). */\r\n show(options: ToastShowOptions): string {\r\n const id = nextId();\r\n const type: ToastType = options.type ?? 'info';\r\n const durationMs =\r\n options.durationMs === undefined ? DEFAULT_DURATION_MS : options.durationMs;\r\n\r\n const row: ToastInstance = {\r\n id,\r\n message: options.message,\r\n title: options.title?.trim() || undefined,\r\n type,\r\n durationMs,\r\n actionLabel: options.actionLabel?.trim() || undefined,\r\n position: options.position ?? 'top',\r\n };\r\n\r\n this.items.update((list) => [row, ...list]);\r\n\r\n if (options.onAction && row.actionLabel) {\r\n this.actionHandlers.set(id, options.onAction);\r\n }\r\n\r\n this.clearTimer(id);\r\n if (durationMs > 0) {\r\n this.timers.set(\r\n id,\r\n setTimeout(() => this.dismiss(id), durationMs),\r\n );\r\n }\r\n\r\n return id;\r\n }\r\n\r\n dismiss(id: string): void {\r\n this.clearTimer(id);\r\n this.actionHandlers.delete(id);\r\n this.items.update((list) => list.filter((t) => t.id !== id));\r\n }\r\n\r\n clear(): void {\r\n for (const id of this.timers.keys()) {\r\n this.clearTimer(id);\r\n }\r\n this.actionHandlers.clear();\r\n this.items.set([]);\r\n }\r\n\r\n runAction(id: string): void {\r\n const fn = this.actionHandlers.get(id);\r\n if (fn) {\r\n fn();\r\n }\r\n this.dismiss(id);\r\n }\r\n\r\n private clearTimer(id: string): void {\r\n const t = this.timers.get(id);\r\n if (t != null) {\r\n clearTimeout(t);\r\n }\r\n this.timers.delete(id);\r\n }\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n type Signal,\r\n} from '@angular/core';\r\nimport type { ToastInstance } from './toast.models';\r\nimport {\r\n animate,\r\n style,\r\n transition,\r\n trigger,\r\n} from '@angular/animations';\r\nimport { AppThemeService } from '../../theme';\r\nimport { ToastService } from './toast.service';\r\n\r\n@Component({\r\n selector: 'app-toast-host',\r\n imports: [NgClass],\r\n templateUrl: './toast-host.component.html',\r\n styleUrl: './toast-host.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('toastAnimTop', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateX(110%)' }),\r\n animate('240ms cubic-bezier(0.22, 1, 0.36, 1)', style({ opacity: 1, transform: 'translateX(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('180ms ease-in', style({ opacity: 0, transform: 'translateX(120%)' })),\r\n ]),\r\n ]),\r\n trigger('toastAnimBottom', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateY(110%)' }),\r\n animate('240ms cubic-bezier(0.22, 1, 0.36, 1)', style({ opacity: 1, transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('180ms ease-in', style({ opacity: 0, transform: 'translateY(120%)' })),\r\n ]),\r\n ]),\r\n ]\r\n})\r\nexport class ToastHostComponent {\r\n readonly toastService = inject(ToastService);\r\n readonly theme = inject(AppThemeService);\r\n\r\n readonly topToasts: Signal<ToastInstance[]> = computed(() =>\r\n this.toastService.toasts().filter((t) => t.position === 'top'),\r\n );\r\n\r\n readonly bottomToasts: Signal<ToastInstance[]> = computed(() =>\r\n this.toastService.toasts().filter((t) => t.position === 'bottom'),\r\n );\r\n\r\n dismiss(id: string): void {\r\n this.toastService.dismiss(id);\r\n }\r\n\r\n action(id: string): void {\r\n this.toastService.runAction(id);\r\n }\r\n}\r\n","@if (topToasts().length > 0) {\r\n <div\r\n class=\"toast-host toast-host--top app-library-theme\"\r\n [ngClass]=\"theme.getTheme()\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n >\r\n @for (t of topToasts(); track t.id) {\r\n <div\r\n [ngClass]=\"['toast-host__item', 'toast-host__item--' + t.type]\"\r\n @toastAnimTop\r\n role=\"status\"\r\n >\r\n <div class=\"toast-host__body\">\r\n @if (t.title) {\r\n <p class=\"toast-host__title\">{{ t.title }}</p>\r\n }\r\n <p class=\"toast-host__message\">{{ t.message }}</p>\r\n @if (t.actionLabel) {\r\n <button type=\"button\" class=\"toast-host__action\" (click)=\"action(t.id)\">\r\n {{ t.actionLabel }}\r\n </button>\r\n }\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"toast-host__close\"\r\n [attr.aria-label]=\"'Fechar notificação'\"\r\n (click)=\"dismiss(t.id)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n@if (bottomToasts().length > 0) {\r\n <div\r\n class=\"toast-host toast-host--bottom app-library-theme\"\r\n [ngClass]=\"theme.getTheme()\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n >\r\n @for (t of bottomToasts(); track t.id) {\r\n <div\r\n [ngClass]=\"['toast-host__item', 'toast-host__item--' + t.type]\"\r\n @toastAnimBottom\r\n role=\"status\"\r\n >\r\n <div class=\"toast-host__body\">\r\n @if (t.title) {\r\n <p class=\"toast-host__title\">{{ t.title }}</p>\r\n }\r\n <p class=\"toast-host__message\">{{ t.message }}</p>\r\n @if (t.actionLabel) {\r\n <button type=\"button\" class=\"toast-host__action\" (click)=\"action(t.id)\">\r\n {{ t.actionLabel }}\r\n </button>\r\n }\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"toast-host__close\"\r\n [attr.aria-label]=\"'Fechar notificação'\"\r\n (click)=\"dismiss(t.id)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { DIALOG_DATA } from '@angular/cdk/dialog';\r\nimport type { LoadingDialogData } from './loading-dialog-data.model';\r\n\r\nconst DEFAULT_MESSAGE = 'A carregar…';\r\n\r\n@Component({\r\n selector: 'app-loading-dialog',\r\n standalone: true,\r\n templateUrl: './loading-dialog.component.html',\r\n styleUrl: './loading-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LoadingDialogComponent {\r\n private readonly data = inject<LoadingDialogData>(DIALOG_DATA);\r\n\r\n readonly titleId = `app-loading-dlg-${++LoadingDialogComponent.seq}`;\r\n\r\n readonly message =\r\n this.data?.message?.trim() || DEFAULT_MESSAGE;\r\n\r\n private static seq = 0;\r\n}\r\n","<div\r\n class=\"loading-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"titleId\"\r\n [attr.aria-busy]=\"true\"\r\n>\r\n <div class=\"loading-dialog__content\">\r\n <div class=\"loading-dialog__spinner\" aria-hidden=\"true\"></div>\r\n <p class=\"loading-dialog__message\" [id]=\"titleId\">{{ message }}</p>\r\n </div>\r\n</div>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { Dialog, DialogRef } from '@angular/cdk/dialog';\r\nimport { AppThemeService } from '../../theme';\r\nimport { AppLibLightBlockScrollStrategy } from '../_utils/app-lib-light-block-scroll-strategy';\r\nimport { libDialogPanelClasses } from '../_utils/lib-dialog-panel-classes';\r\nimport { LoadingDialogComponent } from './loading-dialog.component';\r\nimport type { LoadingDialogData } from './loading-dialog-data.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LoadingDialogService {\r\n private readonly dialog = inject(Dialog);\r\n private readonly theme = inject(AppThemeService);\r\n\r\n /**\r\n * Abre o diálogo de carregamento.\r\n * `disableClose: true` — não fecha com Escape nem clique fora; use `ref.close()` quando terminar.\r\n */\r\n open(data?: LoadingDialogData): DialogRef<void, LoadingDialogComponent> {\r\n return this.dialog.open(LoadingDialogComponent, {\r\n data: data ?? {},\r\n width: 'min(22rem, 90vw)',\r\n maxWidth: '92vw',\r\n disableClose: true,\r\n hasBackdrop: true,\r\n backdropClass: 'app-lib-dialog-backdrop',\r\n panelClass: libDialogPanelClasses(this.theme),\r\n autoFocus: false,\r\n ariaModal: true,\r\n scrollStrategy: new AppLibLightBlockScrollStrategy(),\r\n });\r\n }\r\n}\r\n","/**\r\n * Valida se um arquivo corresponde a um atributo `accept` (HTML) simples.\r\n * Ex.: `image/*`, `image/png`, `.pdf`, `image/*,.pdf`\r\n */\r\nexport function fileMatchesAccept(file: File, accept: string | undefined | null): boolean {\r\n if (accept == null || accept.trim() === '') {\r\n return true;\r\n }\r\n const tokens = accept\r\n .split(',')\r\n .map((s) => s.trim())\r\n .filter((s) => s.length > 0);\r\n for (const t of tokens) {\r\n if (t.startsWith('.')) {\r\n const end = t.toLowerCase();\r\n if (file.name.toLowerCase().endsWith(end)) {\r\n return true;\r\n }\r\n continue;\r\n }\r\n if (t.includes('/')) {\r\n if (t.endsWith('/*')) {\r\n const prefix = t.slice(0, -1);\r\n if (file.type && file.type.toLowerCase().startsWith(prefix.toLowerCase())) {\r\n return true;\r\n }\r\n } else if (file.type && file.type.toLowerCase() === t.toLowerCase()) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Diz se o ficheiro deve ser tratado como imagem (miniatura no upload).\r\n * Usa `type` e, se vazio, a extensão (útil com MIME vazio nalguns browsers / SO).\r\n */\r\nexport function fileIsLikelyImage(file: File): boolean {\r\n const t = file.type?.toLowerCase() ?? '';\r\n if (t.length > 0) {\r\n return t.startsWith('image/');\r\n }\r\n return /\\.(jpe?g|pjpeg|png|gif|webp|bmp|svg|avif|heic|heif)$/i.test(\r\n file.name,\r\n );\r\n}\r\n\r\n/** Indica o tipo de pré-visualização possível no painel a partir de um `File` local. */\r\nexport type FilePreviewKind = 'image' | 'pdf' | 'unsupported';\r\n\r\nexport const FILE_PREVIEW_UNAVAILABLE_MESSAGE =\r\n 'Não foi possível abrir a pré-visualização.';\r\n\r\n/**\r\n * Fragmento URL para o leitor de PDF do browser em `<iframe>` (p.ex. blob:).\r\n * Esconde o painel lateral (miniaturas), mantém a barra de cima e ajusta a área principal à largura\r\n * (parâmetros de abertura alinhados ao leitor do Chromium; outros browsers podem interpretar de forma aproximada).\r\n */\r\nexport const PDF_IFRAME_VIEWER_HASH = 'navpanes=0&toolbar=1&view=FitH';\r\n\r\n/**\r\n * Anexa ao fim de uma URL de recurso PDF o fragmento que pedia pré-visualização só com a área principal\r\n * (sem barra lateral). Se já existir `#`, devolve a URL inalterada.\r\n */\r\nexport function appendPdfIframeViewerParams(resourceUrl: string): string {\r\n if (resourceUrl.includes('#')) {\r\n return resourceUrl;\r\n }\r\n return `${resourceUrl}#${PDF_IFRAME_VIEWER_HASH}`;\r\n}\r\n\r\nexport function getFilePreviewKind(file: File): FilePreviewKind {\r\n if (fileIsLikelyImage(file)) {\r\n return 'image';\r\n }\r\n const t = file.type.toLowerCase();\r\n const n = file.name.toLowerCase();\r\n if (t === 'application/pdf' || t === 'application/x-pdf' || n.endsWith('.pdf')) {\r\n return 'pdf';\r\n }\r\n return 'unsupported';\r\n}\r\n\r\nexport function formatFileSizeBytes(bytes: number): string {\r\n if (!Number.isFinite(bytes) || bytes < 0) {\r\n return '0 B';\r\n }\r\n if (bytes < 1024) {\r\n return `${bytes} B`;\r\n }\r\n if (bytes < 1024 * 1024) {\r\n return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;\r\n }\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\ntype AcceptDisplayCategory = 'imagens' | 'pdf' | 'word' | 'excel' | 'texto' | 'zip';\r\n\r\nconst ACCEPT_DISPLAY_ORDER: readonly AcceptDisplayCategory[] = [\r\n 'imagens',\r\n 'pdf',\r\n 'word',\r\n 'excel',\r\n 'texto',\r\n 'zip',\r\n];\r\n\r\nconst ACCEPT_LABEL: Readonly<Record<AcceptDisplayCategory, string>> = {\r\n imagens: 'Imagens',\r\n pdf: 'PDF',\r\n word: 'Word',\r\n excel: 'Excel',\r\n texto: 'Texto',\r\n zip: 'ZIP',\r\n};\r\n\r\nfunction acceptTokenToCategory(token: string): AcceptDisplayCategory | null {\r\n const t = token.trim().toLowerCase();\r\n if (t === 'image/*' || t.startsWith('image/')) {\r\n return 'imagens';\r\n }\r\n if (t === 'application/pdf' || t === '.pdf') {\r\n return 'pdf';\r\n }\r\n if (\r\n t === '.doc' ||\r\n t === '.docx' ||\r\n t === 'application/msword' ||\r\n (t.includes('wordprocessingml') && t.includes('document'))\r\n ) {\r\n return 'word';\r\n }\r\n if (\r\n t === '.xls' ||\r\n t === '.xlsx' ||\r\n t === 'application/vnd.ms-excel' ||\r\n (t.includes('spreadsheetml') && t.includes('sheet'))\r\n ) {\r\n return 'excel';\r\n }\r\n if (t === '.txt' || t === 'text/plain') {\r\n return 'texto';\r\n }\r\n if (\r\n t === '.zip' ||\r\n t === 'application/zip' ||\r\n t === 'application/x-zip-compressed'\r\n ) {\r\n return 'zip';\r\n }\r\n return null;\r\n}\r\n\r\nfunction acceptTokenFallbackLabel(token: string): string {\r\n const s = token.trim();\r\n if (s.length === 0) {\r\n return '';\r\n }\r\n if (s.startsWith('.')) {\r\n return s.length <= 8 ? s : `${s.slice(0, 6)}…`;\r\n }\r\n if (s.endsWith('/*')) {\r\n const prefix = s.slice(0, -2).toLowerCase();\r\n if (prefix === 'audio') {\r\n return 'Áudio';\r\n }\r\n if (prefix === 'video') {\r\n return 'Vídeo';\r\n }\r\n }\r\n return s.length > 36 ? `${s.slice(0, 33)}…` : s;\r\n}\r\n\r\n/**\r\n * Converte o valor do atributo `accept` (vírgulas, MIME, extensões) numa linha legível\r\n * (ex.: «Imagens · PDF · Word»), usada no rótulo de formatos do drop zone.\r\n */\r\nexport function formatAcceptForDisplay(accept: string | null | undefined): string {\r\n if (accept == null || accept.trim() === '') {\r\n return '';\r\n }\r\n const seen = new Set<AcceptDisplayCategory>();\r\n const extra: string[] = [];\r\n for (const token of accept.split(',').map((p) => p.trim()).filter((p) => p.length > 0)) {\r\n const category = acceptTokenToCategory(token);\r\n if (category) {\r\n seen.add(category);\r\n } else {\r\n const label = acceptTokenFallbackLabel(token);\r\n if (label && !extra.includes(label)) {\r\n extra.push(label);\r\n }\r\n }\r\n }\r\n const parts: string[] = [];\r\n for (const k of ACCEPT_DISPLAY_ORDER) {\r\n if (seen.has(k)) {\r\n parts.push(ACCEPT_LABEL[k]);\r\n }\r\n }\r\n for (const e of extra.sort((a, b) => a.localeCompare(b, 'pt'))) {\r\n parts.push(e);\r\n }\r\n if (parts.length === 0) {\r\n const t = accept.trim();\r\n return t.length > 80 ? `${t.slice(0, 77)}…` : t;\r\n }\r\n return parts.join(' · ');\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n numberAttribute,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { SkeletonFieldShellComponent } from '../../../loading/skeleton-loading';\r\nimport { ConfirmDialogService } from '../../../dialogs';\r\nimport { createAutoId } from '../../../shared/id/auto-id';\r\nimport {\r\n fileIsLikelyImage,\r\n fileMatchesAccept,\r\n formatAcceptForDisplay,\r\n formatFileSizeBytes,\r\n} from '../_utils/file-accept.util';\r\n\r\n@Component({\r\n selector: 'app-file-upload-field',\r\n standalone: true,\r\n imports: [SkeletonFieldShellComponent],\r\n templateUrl: './file-upload-field.component.html',\r\n styleUrl: './file-upload-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FileUploadFieldComponent implements AfterViewInit, OnChanges, OnDestroy {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly confirmDialog = inject(ConfirmDialogService);\r\n\r\n @Input() label? = '';\r\n @Input() id = '';\r\n @Input() hint? = '';\r\n @Input() accept? = '';\r\n /** Se definido, mostra-se no drop zone em vez do texto formatado a partir de `accept`. */\r\n @Input() acceptLabel? = '';\r\n @Input({ transform: numberAttribute }) maxSizeMb = 0;\r\n /**\r\n * Limite de arquivos no total (só aplica com `multiple`).\r\n * `0` = sem limite; ao exceder, o excedente é rejeitado e emite `fileRejected`.\r\n */\r\n @Input({ transform: numberAttribute }) maxFiles = 0;\r\n @Input({ transform: booleanAttribute }) disabled = false;\r\n /** Skeleton na zona de drop (sem interação até voltar a `false`). */\r\n @Input({ transform: booleanAttribute }) loading = false;\r\n /** Foca o `<input type=\"file\">` nativo quando a zona está visível (não em `loading`). */\r\n @Input({ transform: booleanAttribute }) autofocus = false;\r\n @Input({ transform: booleanAttribute }) multiple = false;\r\n @Input() value: File | File[] | null = null;\r\n /**\r\n * `false` desativa o `pointer` e a emissão de `fileItemClick` na linha, mesmo com o\r\n * evento ligado (ex. lista só com um ficheiro). Omissão = `true`.\r\n */\r\n @Input({ transform: booleanAttribute }) fileItemRowClickable = true;\r\n /**\r\n * Botão «Download» em cada linha. Omissão = `true`. Use `false` para esconder (ex.: anexos no form exemplo).\r\n */\r\n @Input() showFileDownload: boolean = true;\r\n\r\n @Output() readonly valueChange = new EventEmitter<File | File[] | null>();\r\n @Output() readonly fileRejected = new EventEmitter<{ file: File; reason: string }>();\r\n /**\r\n * Clique na linha da lista (ficheiro). Só aplica `cursor: pointer` com subscrição\r\n * a este evento e `fileItemRowClickable !== false`.\r\n */\r\n @Output() readonly fileItemClick = new EventEmitter<File>();\r\n\r\n @ViewChild('fileInput', { read: ElementRef })\r\n private fileInputRef?: ElementRef<HTMLInputElement>;\r\n\r\n private readonly autoId = createAutoId('str-file-upload-field');\r\n\r\n get fieldId(): string {\r\n const manual = this.id.trim();\r\n return manual.length > 0 ? manual : this.autoId;\r\n }\r\n\r\n get loadingAriaLabel(): string {\r\n const t = (this.label ?? '').trim();\r\n return t.length > 0 ? `A carregar ${t}` : 'A carregar área de arquivos';\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.autofocus || this.disabled || this.loading) {\r\n return;\r\n }\r\n queueMicrotask(() => {\r\n this.fileInputRef?.nativeElement?.focus({ preventScroll: false });\r\n });\r\n }\r\n\r\n @HostBinding('attr.data-control-id')\r\n get hostDataControlId(): string {\r\n return this.fieldId;\r\n }\r\n isDragging = false;\r\n hasHover = false;\r\n private internalError: string | null = null;\r\n /** `URL.createObjectURL` por `File` ativo; revogado ao trocar valor ou destruir. */\r\n private readonly filePreviewObjectUrls = new Map<File, string>();\r\n\r\n ngOnChanges(c: SimpleChanges): void {\r\n if (c['value']) {\r\n this.internalError = null;\r\n this.syncFilePreviewObjectUrls();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.releaseAllFilePreviewObjectUrls();\r\n }\r\n\r\n get errorMessage(): string | null {\r\n return this.internalError;\r\n }\r\n\r\n /** Texto de formatos na zona: `acceptLabel` (opcional) ou `formatAcceptForDisplay(accept)`. */\r\n get acceptDisplayText(): string {\r\n const a = this.accept?.trim() ?? '';\r\n if (a.length === 0) {\r\n return '';\r\n }\r\n const over = this.acceptLabel?.trim();\r\n if (over && over.length > 0) {\r\n return over;\r\n }\r\n return formatAcceptForDisplay(this.accept!);\r\n }\r\n\r\n /**\r\n * Linha clicável para o painel externo (ex. pré-visualização) quando a app liga\r\n * `(fileItemClick)`; desligado, sem apontador nem emissão.\r\n */\r\n get fileItemClickActive(): boolean {\r\n if (this.disabled || !this.fileItemRowClickable) {\r\n return false;\r\n }\r\n return this.hasFileItemClickListeners;\r\n }\r\n\r\n private get hasFileItemClickListeners(): boolean {\r\n const s = this.fileItemClick as unknown as { observed?: boolean; observers?: unknown[] };\r\n if (s.observed === true) {\r\n return true;\r\n }\r\n if (s.observed === false) {\r\n return false;\r\n }\r\n return (s.observers?.length ?? 0) > 0;\r\n }\r\n\r\n onFileItemRowClick(event: MouseEvent, file: File): void {\r\n if (!this.hasFileItemClickListeners || this.disabled || !this.fileItemRowClickable) {\r\n return;\r\n }\r\n const t = event.target as HTMLElement | null;\r\n if (t && t.closest('button')) {\r\n return;\r\n }\r\n this.fileItemClick.emit(file);\r\n }\r\n\r\n /** `src` da miniatura, ou `null` se não for imagem / ainda sem URL. */\r\n imageListPreviewUrl(file: File): string | null {\r\n if (!fileIsLikelyImage(file)) {\r\n return null;\r\n }\r\n return this.filePreviewObjectUrls.get(file) ?? null;\r\n }\r\n\r\n get filesList(): { file: File; name: string; sizeLabel: string; typeLabel: string }[] {\r\n if (this.value == null) {\r\n return [];\r\n }\r\n if (this.multiple) {\r\n const arr = Array.isArray(this.value) ? this.value : [this.value as File];\r\n return arr.map((f) => ({\r\n file: f,\r\n name: f.name,\r\n sizeLabel: formatFileSizeBytes(f.size),\r\n typeLabel: f.type && f.type.length > 0 ? f.type : '—',\r\n }));\r\n }\r\n if (this.value instanceof File) {\r\n const f = this.value;\r\n return [\r\n {\r\n file: f,\r\n name: f.name,\r\n sizeLabel: formatFileSizeBytes(f.size),\r\n typeLabel: f.type && f.type.length > 0 ? f.type : '—',\r\n },\r\n ];\r\n }\r\n return [];\r\n }\r\n\r\n get hasValue(): boolean {\r\n if (this.value == null) {\r\n return false;\r\n }\r\n if (this.multiple) {\r\n return (Array.isArray(this.value) ? this.value : []).length > 0;\r\n }\r\n return this.value instanceof File;\r\n }\r\n\r\n /**\r\n * «Limpar tudo» só com mais do que um ficheiro; com um só, basta «Remover» na linha.\r\n */\r\n get showClearAllButton(): boolean {\r\n return this.filesList.length > 1;\r\n }\r\n\r\n private get selectedFileCountForClearConfirm(): number {\r\n if (this.value == null) {\r\n return 0;\r\n }\r\n if (this.multiple) {\r\n if (Array.isArray(this.value)) {\r\n return this.value.length;\r\n }\r\n return this.value instanceof File ? 1 : 0;\r\n }\r\n return this.value instanceof File ? 1 : 0;\r\n }\r\n\r\n private resetInputValue(): void {\r\n const el = this.fileInputRef?.nativeElement;\r\n if (el) {\r\n el.value = '';\r\n }\r\n }\r\n\r\n openSelector(ev?: Event): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n ev?.stopPropagation();\r\n this.fileInputRef?.nativeElement?.click();\r\n }\r\n\r\n onZoneEnter(): void {\r\n this.hasHover = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onZoneLeave(): void {\r\n this.hasHover = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onZoneKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.openSelector();\r\n }\r\n }\r\n\r\n onDragOver(ev: DragEvent): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.isDragging = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDragLeave(ev: DragEvent): void {\r\n ev.preventDefault();\r\n this.isDragging = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDrop(ev: DragEvent): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.isDragging = false;\r\n const list = ev.dataTransfer?.files;\r\n if (list && list.length > 0) {\r\n this.processPickedArray(Array.from(list));\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onNativeChange(ev: Event): void {\r\n const el = ev.target as HTMLInputElement;\r\n if (el.files && el.files.length > 0) {\r\n this.processPickedArray(Array.from(el.files));\r\n } else {\r\n this.clearInternal();\r\n }\r\n this.resetInputValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onRemoveFile(index: number, ev: Event): void {\r\n ev.stopPropagation();\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.internalError = null;\r\n if (this.multiple) {\r\n const list = (Array.isArray(this.value) ? this.value : []).filter(\r\n (_, i) => i !== index,\r\n );\r\n this.valueChange.emit(list.length > 0 ? list : null);\r\n } else {\r\n this.valueChange.emit(null);\r\n }\r\n this.resetInputValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDownloadFile(file: File, event: Event): void {\r\n event.stopPropagation();\r\n if (this.disabled) {\r\n return;\r\n }\r\n const url = URL.createObjectURL(file);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = file.name;\r\n a.rel = 'noopener';\r\n a.setAttribute('aria-hidden', 'true');\r\n a.style.position = 'fixed';\r\n a.style.left = '-9999px';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n window.setTimeout(() => {\r\n URL.revokeObjectURL(url);\r\n }, 0);\r\n }\r\n\r\n async clearAll(ev: Event): Promise<void> {\r\n ev.stopPropagation();\r\n if (this.disabled) {\r\n return;\r\n }\r\n const n = this.selectedFileCountForClearConfirm;\r\n const message =\r\n n === 1\r\n ? 'Deseja remover o arquivo selecionado?'\r\n : `Deseja remover os ${String(n)} arquivos selecionados?`;\r\n const ok = await this.confirmDialog.confirm({\r\n title: 'Limpar tudo',\r\n message,\r\n confirmLabel: 'Sim, limpar',\r\n cancelLabel: 'Cancelar',\r\n variant: 'danger',\r\n });\r\n if (!ok) {\r\n return;\r\n }\r\n this.clearInternal();\r\n this.resetInputValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private clearInternal(): void {\r\n this.internalError = null;\r\n this.valueChange.emit(null);\r\n }\r\n\r\n private msgAfterRejections(fileCountReject: boolean): string {\r\n return fileCountReject\r\n ? `Máximo de ${String(this.maxFiles)} arquivos.`\r\n : 'Arquivo(s) rejeitado(s) — verifique o tipo e o tamanho.';\r\n }\r\n\r\n private processPickedArray(files: File[]): void {\r\n this.internalError = null;\r\n const accept = this.accept?.trim() ? this.accept : undefined;\r\n const maxMb = this.maxSizeMb > 0 ? this.maxSizeMb : 0;\r\n const take = this.multiple ? files : [files[0]!].filter(Boolean);\r\n let anyRejected = false;\r\n let fileCountReject = false;\r\n const accepted: File[] = [];\r\n for (const file of take) {\r\n if (accept && !fileMatchesAccept(file, accept)) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: 'O tipo do arquivo não corresponde ao `accept` definido.',\r\n });\r\n anyRejected = true;\r\n continue;\r\n }\r\n if (maxMb > 0 && file.size > maxMb * 1024 * 1024) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: `Arquivo acima do tamanho máximo (${String(maxMb)} MB).`,\r\n });\r\n anyRejected = true;\r\n continue;\r\n }\r\n accepted.push(file);\r\n }\r\n\r\n if (this.multiple && this.maxFiles > 0) {\r\n const previousList = Array.isArray(this.value)\r\n ? this.value\r\n : this.value instanceof File\r\n ? [this.value]\r\n : [];\r\n const room = this.maxFiles - previousList.length;\r\n if (room <= 0) {\r\n for (const file of accepted) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: `Máximo de ${String(this.maxFiles)} arquivos.`,\r\n });\r\n }\r\n if (accepted.length > 0) {\r\n anyRejected = true;\r\n fileCountReject = true;\r\n }\r\n accepted.length = 0;\r\n } else if (accepted.length > room) {\r\n const overflow = accepted.splice(room);\r\n for (const file of overflow) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: `Máximo de ${String(this.maxFiles)} arquivos.`,\r\n });\r\n }\r\n anyRejected = true;\r\n fileCountReject = true;\r\n }\r\n }\r\n\r\n if (accepted.length === 0) {\r\n if (anyRejected) {\r\n this.internalError = this.msgAfterRejections(fileCountReject);\r\n }\r\n return;\r\n }\r\n this.internalError = anyRejected ? this.msgAfterRejections(fileCountReject) : null;\r\n if (this.multiple) {\r\n const previous = Array.isArray(this.value)\r\n ? this.value\r\n : this.value instanceof File\r\n ? [this.value]\r\n : [];\r\n this.valueChange.emit([...previous, ...accepted]);\r\n } else {\r\n this.valueChange.emit(accepted[0]!);\r\n }\r\n }\r\n\r\n private allFilesInValue(): File[] {\r\n if (this.value == null) {\r\n return [];\r\n }\r\n if (this.multiple) {\r\n if (Array.isArray(this.value)) {\r\n return this.value;\r\n }\r\n return this.value instanceof File ? [this.value] : [];\r\n }\r\n return this.value instanceof File ? [this.value] : [];\r\n }\r\n\r\n private syncFilePreviewObjectUrls(): void {\r\n const files = this.allFilesInValue();\r\n for (const [f, url] of this.filePreviewObjectUrls) {\r\n if (!files.includes(f)) {\r\n URL.revokeObjectURL(url);\r\n this.filePreviewObjectUrls.delete(f);\r\n }\r\n }\r\n for (const file of files) {\r\n if (fileIsLikelyImage(file) && !this.filePreviewObjectUrls.has(file)) {\r\n this.filePreviewObjectUrls.set(file, URL.createObjectURL(file));\r\n }\r\n }\r\n }\r\n\r\n private releaseAllFilePreviewObjectUrls(): void {\r\n for (const url of this.filePreviewObjectUrls.values()) {\r\n URL.revokeObjectURL(url);\r\n }\r\n this.filePreviewObjectUrls.clear();\r\n }\r\n}\r\n","<div\r\n class=\"file-upload-field\"\r\n [class.file-upload-field--disabled]=\"disabled\"\r\n [class.file-upload-field--loading]=\"loading\"\r\n [class.file-upload-field--error]=\"errorMessage\"\r\n>\r\n @if (label && label.length > 0) {\r\n <label class=\"file-upload-field__label\" [attr.for]=\"fieldId\">\r\n {{ label }}\r\n </label>\r\n }\r\n @if (loading) {\r\n <div\r\n class=\"file-upload-field__zone file-upload-field__zone--loading\"\r\n aria-busy=\"true\"\r\n role=\"status\"\r\n [attr.aria-label]=\"loadingAriaLabel\"\r\n >\r\n <app-skeleton-field-shell [showLeadingIcon]=\"true\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"file-upload-field__zone\"\r\n (click)=\"openSelector($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (mouseenter)=\"onZoneEnter()\"\r\n (mouseleave)=\"onZoneLeave()\"\r\n [class.file-upload-field__zone--dragging]=\"isDragging\"\r\n [class.file-upload-field__zone--hover]=\"hasHover && !disabled\"\r\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\r\n role=\"button\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (keydown)=\"onZoneKeydown($event)\"\r\n >\r\n <input\r\n #fileInput\r\n [id]=\"fieldId\"\r\n type=\"file\"\r\n class=\"file-upload-field__native\"\r\n [attr.accept]=\"accept && accept.length ? accept : null\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onNativeChange($event)\"\r\n />\r\n <div class=\"file-upload-field__zone-inner\">\r\n <i class=\"fa-solid fa-cloud-arrow-up file-upload-field__icon\" aria-hidden=\"true\"></i>\r\n <span class=\"file-upload-field__hint-main\">\r\n Arraste arquivos ou\r\n <span class=\"file-upload-field__hint-cta\">clique para procurar</span>\r\n </span>\r\n @if (acceptDisplayText) {\r\n <span class=\"file-upload-field__hint-accept\">{{ acceptDisplayText }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (hint && hint.length > 0) {\r\n <p class=\"file-upload-field__hint\" [id]=\"fieldId + '-hint'\">{{ hint }}</p>\r\n }\r\n\r\n @if (errorMessage) {\r\n <p class=\"file-upload-field__error\" role=\"alert\" [id]=\"fieldId + '-err'\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n @if (hasValue) {\r\n <ul class=\"file-upload-field__list\" [attr.aria-label]=\"'Arquivos selecionados'\">\r\n @for (row of filesList; track row.file) {\r\n <li\r\n class=\"file-upload-field__item\"\r\n [class.file-upload-field__item--with-image]=\"imageListPreviewUrl(row.file)\"\r\n [class.file-upload-field__item--selectable]=\"fileItemClickActive\"\r\n (click)=\"onFileItemRowClick($event, row.file)\"\r\n >\r\n @if (imageListPreviewUrl(row.file); as thumbSrc) {\r\n <div class=\"file-upload-field__thumb\" aria-hidden=\"true\">\r\n <img\r\n class=\"file-upload-field__thumb-img\"\r\n [src]=\"thumbSrc\"\r\n [alt]=\"'Pré-visualização: ' + row.name\"\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n />\r\n </div>\r\n }\r\n <div class=\"file-upload-field__item-meta\">\r\n <span class=\"file-upload-field__name\">{{ row.name }}</span>\r\n <span class=\"file-upload-field__size\">{{ row.sizeLabel }}</span>\r\n <span class=\"file-upload-field__type\">{{ row.typeLabel }}</span>\r\n </div>\r\n <div class=\"file-upload-field__item-actions\">\r\n @if (showFileDownload) {\r\n <button\r\n type=\"button\"\r\n class=\"file-upload-field__download\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Download ' + row.name\"\r\n (click)=\"onDownloadFile(row.file, $event)\"\r\n >\r\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\r\n <span class=\"file-upload-field__download-text\">Download</span>\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"file-upload-field__remove\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Remover ' + row.name\"\r\n (click)=\"onRemoveFile($index, $event)\"\r\n >\r\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\r\n <span class=\"file-upload-field__remove-text\">Remover</span>\r\n </button>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n @if (showClearAllButton) {\r\n <button\r\n type=\"button\"\r\n class=\"file-upload-field__clear\"\r\n [disabled]=\"disabled\"\r\n (click)=\"clearAll($event)\"\r\n >\r\n Limpar tudo\r\n </button>\r\n }\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport {\r\n ButtonComponent,\r\n ButtonType,\r\n ButtonVariant,\r\n} from '../../../buttons';\r\nimport { SkeletonBlockComponent } from '../../../loading/skeleton-loading';\r\nimport {\r\n FILE_PREVIEW_UNAVAILABLE_MESSAGE,\r\n appendPdfIframeViewerParams,\r\n getFilePreviewKind,\r\n type FilePreviewKind,\r\n} from '../_utils/file-accept.util';\r\n\r\n/**\r\n * Painel reutilizável de pré-visualização (imagem, PDF com blob, URL remota, vazio\r\n * ou aviso único se não for possível pré-visualizar).\r\n */\r\n@Component({\r\n selector: 'app-image-preview-panel',\r\n standalone: true,\r\n imports: [ButtonComponent, SkeletonBlockComponent],\r\n templateUrl: './image-preview-panel.component.html',\r\n styleUrl: './image-preview-panel.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ImagePreviewPanelComponent implements OnChanges, OnDestroy {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n @Input() title? = '';\r\n @Input() subtitle? = '';\r\n @Input() imageUrl?: string | null;\r\n @Input() file?: File | null;\r\n @Input() emptyText? = 'Sem imagem';\r\n @Input({ transform: booleanAttribute }) loading = false;\r\n @Input({ transform: booleanAttribute }) rounded = false;\r\n @Input({ transform: booleanAttribute }) showImageActions = false;\r\n @Input() objectFit: 'cover' | 'contain' = 'cover';\r\n\r\n @Output() readonly remove = new EventEmitter<void>();\r\n @Output() readonly change = new EventEmitter<void>();\r\n /** Mensagem reutilizada: falha de carga, tipo não suportado, etc. */\r\n readonly previewUnavailableMessage = FILE_PREVIEW_UNAVAILABLE_MESSAGE;\r\n\r\n /** `blob:` a revogar ao trocar ou destruir. */\r\n private fileObjectUrl: string | null = null;\r\n\r\n /** Só `image` local ou `imageUrl` remota. */\r\n displaySrc: string | null = null;\r\n imageLoadError = false;\r\n /** Remote URL só entra como \"imagem visível\" após evento de load. */\r\n imageLoaded = false;\r\n\r\n /** PDF a partir de `File` (URL sanitizada). */\r\n safePdfUrl: SafeResourceUrl | null = null;\r\n pdfLoadError = false;\r\n\r\n /** `file` local: imagem, PDF ou não suportado; remoto vindo de `imageUrl` só. */\r\n fileKind: FilePreviewKind | 'remote' = 'remote';\r\n\r\n ngOnChanges(c: SimpleChanges): void {\r\n if (c['file'] || c['imageUrl']) {\r\n this.revokeFileObjectUrl();\r\n this.imageLoadError = false;\r\n this.imageLoaded = false;\r\n this.pdfLoadError = false;\r\n this.fileKind = 'remote';\r\n this.displaySrc = null;\r\n this.safePdfUrl = null;\r\n this.updateDisplaySource();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.revokeFileObjectUrl();\r\n }\r\n\r\n onImgError(): void {\r\n this.imageLoadError = true;\r\n this.imageLoaded = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onImgLoad(): void {\r\n this.imageLoadError = false;\r\n this.imageLoaded = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onPdfFrameError(): void {\r\n this.pdfLoadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onTrocar(): void {\r\n this.change.emit();\r\n }\r\n\r\n onRemover(): void {\r\n this.remove.emit();\r\n }\r\n\r\n get showImage(): boolean {\r\n if (this.loading || !this.displaySrc || this.imageLoadError) {\r\n return false;\r\n }\r\n if (this.fileKind === 'remote') {\r\n return this.imageLoaded;\r\n }\r\n return (\r\n this.fileKind === 'image'\r\n );\r\n }\r\n\r\n /**\r\n * Mantém o `<img>` montado (para disparar load/error) mesmo quando remoto ainda não terminou de carregar.\r\n * Evita flick de ações e permite cair no fallback amarelo quando a URL falha.\r\n */\r\n get shouldRenderImage(): boolean {\r\n return (\r\n !this.loading &&\r\n (this.fileKind === 'image' || this.fileKind === 'remote') &&\r\n !!this.displaySrc &&\r\n !this.imageLoadError\r\n );\r\n }\r\n\r\n get showPdf(): boolean {\r\n return (\r\n !this.loading &&\r\n this.fileKind === 'pdf' &&\r\n this.safePdfUrl != null &&\r\n !this.pdfLoadError\r\n );\r\n }\r\n\r\n get showPreviewFallback(): boolean {\r\n if (this.loading) {\r\n return false;\r\n }\r\n if (this.file && this.fileKind === 'unsupported') {\r\n return true;\r\n }\r\n if (this.imageLoadError && (this.fileKind === 'image' || this.fileKind === 'remote')) {\r\n return true;\r\n }\r\n if (this.fileKind === 'pdf' && this.pdfLoadError) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n get showEmpty(): boolean {\r\n if (this.loading) {\r\n return false;\r\n }\r\n if (this.file) {\r\n return false;\r\n }\r\n return this.imageUrl == null || this.imageUrl.length === 0;\r\n }\r\n\r\n get showActions(): boolean {\r\n if (!this.showImageActions) {\r\n return false;\r\n }\r\n return this.showImage;\r\n }\r\n\r\n private updateDisplaySource(): void {\r\n if (this.file) {\r\n const kind = getFilePreviewKind(this.file);\r\n this.fileKind = kind;\r\n if (kind === 'unsupported') {\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n this.fileObjectUrl = URL.createObjectURL(this.file);\r\n if (kind === 'image') {\r\n this.displaySrc = this.fileObjectUrl;\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n if (kind === 'pdf') {\r\n this.safePdfUrl = this.sanitizer.bypassSecurityTrustResourceUrl(\r\n appendPdfIframeViewerParams(this.fileObjectUrl),\r\n );\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n }\r\n this.fileKind = 'remote';\r\n this.displaySrc =\r\n this.imageUrl && this.imageUrl.length > 0 ? this.imageUrl : null;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private revokeFileObjectUrl(): void {\r\n if (this.fileObjectUrl) {\r\n URL.revokeObjectURL(this.fileObjectUrl);\r\n this.fileObjectUrl = null;\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"image-preview-panel\"\r\n [class.image-preview-panel--rounded]=\"rounded\"\r\n [class.image-preview-panel--loading]=\"loading\"\r\n>\r\n @if (title && title.length > 0) {\r\n <h3 class=\"image-preview-panel__title\">{{ title }}</h3>\r\n }\r\n @if (subtitle && subtitle.length > 0) {\r\n <p class=\"image-preview-panel__subtitle\">{{ subtitle }}</p>\r\n }\r\n\r\n <div\r\n class=\"image-preview-panel__frame\"\r\n [class.image-preview-panel__frame--rounded]=\"rounded\"\r\n >\r\n @if (loading) {\r\n <div\r\n class=\"image-preview-panel__skeleton\"\r\n role=\"status\"\r\n aria-label=\"Carregando pré-visualização\"\r\n >\r\n <app-skeleton-block\r\n class=\"image-preview-panel__skeleton-poster\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n radius=\"0\"\r\n />\r\n <div class=\"image-preview-panel__skeleton-lines\">\r\n <app-skeleton-block width=\"72%\" height=\"0.6rem\" radius=\"6px\" />\r\n <app-skeleton-block width=\"48%\" height=\"0.55rem\" radius=\"6px\" />\r\n </div>\r\n </div>\r\n } @else if (showEmpty) {\r\n <div class=\"image-preview-panel__empty\" role=\"img\" [attr.aria-label]=\"emptyText\">\r\n <i class=\"fa-regular fa-image image-preview-panel__empty-icon\" aria-hidden=\"true\"></i>\r\n <span class=\"image-preview-panel__empty-text\">{{ emptyText }}</span>\r\n </div>\r\n } @else {\r\n @if (showPreviewFallback) {\r\n <div\r\n class=\"image-preview-panel__preview-fallback\"\r\n role=\"status\"\r\n [attr.aria-label]=\"previewUnavailableMessage\"\r\n >\r\n <i\r\n class=\"fa-solid fa-triangle-exclamation image-preview-panel__preview-fallback-icon\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n <span class=\"image-preview-panel__preview-fallback-text\">{{ previewUnavailableMessage }}</span>\r\n </div>\r\n } @else if (showPdf) {\r\n <iframe\r\n class=\"image-preview-panel__pdf\"\r\n [src]=\"safePdfUrl\"\r\n title=\"Pré-visualização do PDF\"\r\n (error)=\"onPdfFrameError()\"\r\n ></iframe>\r\n } @else if (shouldRenderImage) {\r\n <img\r\n class=\"image-preview-panel__img\"\r\n [class.image-preview-panel__img--hidden]=\"!showImage\"\r\n [src]=\"displaySrc!\"\r\n [alt]=\"title || 'Pré-visualização'\"\r\n [style.object-fit]=\"objectFit\"\r\n (load)=\"onImgLoad()\"\r\n (error)=\"onImgError()\"\r\n />\r\n }\r\n }\r\n </div>\r\n\r\n @if (showActions) {\r\n <div class=\"image-preview-panel__actions\" role=\"group\" [attr.aria-label]=\"'Ações da imagem'\">\r\n <app-button\r\n type=\"button\"\r\n variant=\"secondary\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onTrocar()\"\r\n >\r\n Trocar\r\n </app-button>\r\n <app-button\r\n type=\"button\"\r\n variant=\"danger\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onRemover()\"\r\n >\r\n Remover\r\n </app-button>\r\n </div>\r\n }\r\n</div>\r\n","/** Espaçamento entre itens da linha ou da pilha dentro de uma coluna. */\r\nexport const FormLayoutGap = {\r\n Xs: 'xs',\r\n Sm: 'sm',\r\n Md: 'md',\r\n Lg: 'lg',\r\n} as const;\r\nexport type FormLayoutGap = (typeof FormLayoutGap)[keyof typeof FormLayoutGap];\r\n\r\n/** Alinhamento no eixo cruzado (itens da linha). */\r\nexport const FormRowAlign = {\r\n Start: 'start',\r\n Center: 'center',\r\n End: 'end',\r\n Stretch: 'stretch',\r\n} as const;\r\nexport type FormRowAlign = (typeof FormRowAlign)[keyof typeof FormRowAlign];\r\n\r\n/** Distribuição no eixo principal. */\r\nexport const FormRowJustify = {\r\n Start: 'start',\r\n Center: 'center',\r\n End: 'end',\r\n Between: 'between',\r\n} as const;\r\nexport type FormRowJustify = (typeof FormRowJustify)[keyof typeof FormRowJustify];\r\n\r\n/** Variante visual do grupo. */\r\nexport enum FormGroupVariant {\r\n Default = 'default',\r\n Outlined = 'outlined',\r\n Subtle = 'subtle',\r\n}\r\n\r\n/** Alinhamento horizontal no eixo principal (`justify-content`) em `app-layout-stack`. */\r\nexport enum LayoutStackAlign {\r\n Start = 'start',\r\n Center = 'center',\r\n End = 'end',\r\n SpaceBetween = 'space-between',\r\n}\r\n\r\n/**\r\n * Eixo principal do flex em `app-layout-stack` (equivalente a `flex-direction` em CSS).\r\n *\r\n * - **`Row`** — `flex-direction: row`: filhos **lado a lado** na horizontal (é o que se costuma\r\n * querer para “várias colunas” no ecrã ou `form-row` + `form-col` na mesma linha).\r\n * - **`Column`** — `flex-direction: column`: filhos **uns por baixo dos outros** (pilha vertical).\r\n * **Não** é “colunas de grelha” ao lado uma da outra; para isso use **`Row`**.\r\n */\r\nexport enum LayoutStackDirection {\r\n Row = 'row',\r\n Column = 'column',\r\n}\r\n\r\n/** Alias legível: blocos lado a lado (= `LayoutStackDirection.Row`). */\r\nexport const LAYOUT_STACK_SIDE_BY_SIDE = LayoutStackDirection.Row;\r\n\r\n/** Alias legível: pilha vertical (= `LayoutStackDirection.Column`). */\r\nexport const LAYOUT_STACK_STACKED = LayoutStackDirection.Column;\r\n\r\n/** Alinhamento no eixo cruzado (`align-items` em `row`; largura/centragem em `column`). */\r\nexport enum LayoutStackItemAlign {\r\n Stretch = 'stretch',\r\n Start = 'start',\r\n Center = 'center',\r\n End = 'end',\r\n}\r\n\r\n/** Alinhamento em `app-form-actions` (barra de ações de formulário). */\r\nexport const FormActionsAlign = {\r\n Start: 'start',\r\n Center: 'center',\r\n End: 'end',\r\n SpaceBetween: 'space-between',\r\n} as const;\r\nexport type FormActionsAlign = (typeof FormActionsAlign)[keyof typeof FormActionsAlign];\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Linha separadora horizontal — mesmos tokens que `[divider]` em `app-form-actions`\r\n * e `[stackDivider]` em `app-layout-stack`.\r\n *\r\n * `tightTop`: sem `margin-top` extra (útil quando o `gap` do pai já separa o bloco anterior).\r\n */\r\n@Component({\r\n selector: 'app-divider',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './divider.component.html',\r\n styleUrl: './divider.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n role: 'separator',\r\n 'aria-orientation': 'horizontal',\r\n },\r\n})\r\nexport class DividerComponent {\r\n /**\r\n * Omite o `margin-top` de 0.25rem — alinhado ao antigo divisor interno de `app-layout-stack`\r\n * (evita duplicar respiro com o `gap` da secção em que a stack está).\r\n */\r\n @Input({ transform: booleanAttribute }) tightTop = false;\r\n\r\n @HostBinding('class')\r\n readonly hostClass = 'ui-divider';\r\n\r\n @HostBinding('class.ui-divider--tight-top')\r\n get tightTopClass(): boolean {\r\n return this.tightTop;\r\n }\r\n}\r\n","<!-- Separador (aparência em :host) -->\r\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n booleanAttribute,\n} from '@angular/core';\nimport {\n LayoutStackAlign,\n LayoutStackDirection,\n LayoutStackItemAlign,\n} from '../_models/form-layout.model';\nimport { DividerComponent } from '../divider/divider.component';\n\n/**\n * Faixa flexível com projeção de conteúdo.\n *\n * - `align` — eixo principal (`justify-content`: start / center / end / space-between).\n * Com `stackFill` activo, o `align` deixa de ser sobrescrito (antes era forçado `flex-start`).\n * - `direction` — igual a `flex-direction` em CSS:\n * - **`Row`** = filhos **na horizontal** (lado a lado). Use para “colunas” no ecrã ou `form-row` + `form-col` na mesma linha.\n * - **`Column`** = filhos **empilhados** (um por baixo do outro). **Não** coloca “colunas” lado a lado; para isso use **`Row`**.\n * `app-layout-stack` **aninhado** conserva o próprio `direction` (não herda regras de flex do pai em coluna).\n * Constantes: `LAYOUT_STACK_SIDE_BY_SIDE` e `LAYOUT_STACK_STACKED` no barrel `form-layout`.\n * - `itemAlign` — eixo cruzado (`align-items` em `row`: topo/meio/baixo; em `column`: alinhamento horizontal dos blocos).\n */\n@Component({\n selector: 'app-layout-stack',\n standalone: true,\n imports: [DividerComponent],\n templateUrl: './layout-stack.component.html',\n styleUrl: './layout-stack.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutStackComponent {\n /** Distribuição no eixo principal do contentor flex (`justify-content`). */\n @Input() align: LayoutStackAlign = LayoutStackAlign.End;\n\n /**\n * `Row` = lado a lado (horizontal). `Column` = pilha vertical (um por baixo do outro), **não** “várias colunas” no ecrã.\n */\n @Input() direction: LayoutStackDirection = LayoutStackDirection.Row;\n\n /**\n * Eixo cruzado: em `row` alinha no vertical (ex.: `start` = topo); em `column` alinha no horizontal.\n * Se não for definido: sem `stackFill` = eixo cruzado centrado; com `stackFill` em `row` = `flex-start` (altura = conteúdo).\n * Use `LayoutStackItemAlign.Stretch` se quiser todas as células da fila com a mesma altura.\n */\n @Input() itemAlign: LayoutStackItemAlign | null = null;\n\n /**\n * Em ecrãs &lt; `40rem` (o mesmo breakpoint que `app-form-row`), a faixa passa a **coluna**:\n * filhos em pilha, largura total, mesmo com `direction=\"row\"`. Desative para manter fila no telemóvel.\n */\n @Input({ transform: booleanAttribute }) stackOnMobile = true;\n\n /**\n * Linha separadora acima da faixa — renderiza {@link DividerComponent} (`app-divider`)\n * com `[tightTop]=\"true\"` (sem `margin-top` extra; o `gap` do contentor já separa o bloco anterior).\n */\n @Input({ transform: booleanAttribute }) stackDivider = false;\n\n /**\n * Quando `true` (por defeito), em **`Row`** os filhos repartem a **largura** (`flex: 1`).\n * Em **`Column`**, o preenchimento é só **largura total** (empilhamento natural de altura);\n * não se usa `flex-grow` na vertical para evitar colapso / sobreposição.\n */\n @Input({ transform: booleanAttribute }) stackFill = true;\n\n @HostBinding('class')\n get hostClass(): string {\n const parts = [\n 'layout-stack',\n `layout-stack--align-${this.align}`,\n `layout-stack--dir-${this.direction}`,\n ];\n if (this.itemAlign != null) {\n parts.push(`layout-stack--items-${this.itemAlign}`);\n }\n if (this.stackOnMobile) {\n parts.push('layout-stack--stack-mobile');\n }\n if (this.stackFill) {\n parts.push('layout-stack--fill');\n }\n return parts.join(' ');\n }\n}\n","@if (stackDivider) {\r\n <app-divider [tightTop]=\"true\" />\r\n}\r\n<div class=\"layout-stack__track\">\r\n <ng-content />\r\n</div>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n booleanAttribute,\n} from '@angular/core';\nimport { FormActionsAlign, LayoutStackAlign } from '../_models/form-layout.model';\nimport { DividerComponent } from '../divider/divider.component';\nimport { LayoutStackComponent } from '../layout-stack/layout-stack.component';\n\n/** Barra de ações de formulário (Salvar, Cancelar, Adicionar, …). Projeção de conteúdo. */\n@Component({\n selector: 'app-form-actions',\n imports: [DividerComponent, LayoutStackComponent],\n templateUrl: './form-actions.component.html',\n styleUrl: './form-actions.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FormActionsComponent {\n @Input() align: FormActionsAlign = 'end';\n @Input({ transform: booleanAttribute }) stackOnMobile = true;\n /**\n * Por omissão `true`: os botões repartem a largura da faixa (um botão ≈ 100%; vários repartem por igual).\n * Use `false` para faixa compacta (largura intrínseca, ex.: várias ações alinhadas à direita).\n */\n @Input({ transform: booleanAttribute }) fill = true;\n @Input({ transform: booleanAttribute }) divider = false;\n\n /** `FormActionsAlign` e `LayoutStackAlign` partilham os mesmos valores; delegação ao `app-layout-stack`. */\n get layoutAlign(): LayoutStackAlign {\n return this.align as unknown as LayoutStackAlign;\n }\n\n @HostBinding('class')\n get hostClass(): string {\n const parts = ['form-actions', `form-actions--align-${this.align}`];\n if (this.stackOnMobile) {\n parts.push('form-actions--stack-mobile');\n }\n if (this.fill) {\n parts.push('form-actions--fill');\n }\n return parts.join(' ');\n }\n}\n","@if (divider) {\n <app-divider />\n}\n<app-layout-stack\n class=\"form-actions__stack\"\n [align]=\"layoutAlign\"\n [stackOnMobile]=\"stackOnMobile\"\n [stackFill]=\"fill\"\n [stackDivider]=\"false\"\n>\n <ng-content />\n</app-layout-stack>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { FormRowAlign, FormLayoutGap, FormRowJustify } from '../_models/form-layout.model';\r\n\r\n/**\r\n * Coluna no sistema de 12 trilhos da {@link FormRowComponent}.\r\n * Breakpoints (min-width): sm 40rem, md 48rem, lg 64rem, xl 80rem.\r\n * Valores omitidos (ex.: só `xs` e `md`) propagam-se a partir do maior definido — ex.: `md` preenche `sm` quando `sm` não está definido.\r\n */\r\n@Component({\r\n selector: 'app-form-col',\r\n standalone: true,\r\n templateUrl: './form-col.component.html',\r\n styleUrl: './form-col.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormColComponent {\r\n /** Colunas ocupadas em &lt; `sm` (por defeito 12 = linha inteira). */\r\n @Input({ transform: numberAttribute }) xs = 12;\r\n\r\n @Input() sm?: number;\r\n @Input() md?: number;\r\n @Input() lg?: number;\r\n @Input() xl?: number;\r\n\r\n @Input({ transform: numberAttribute }) order?: number;\r\n\r\n /** Quando `true`, a coluna preenche o espaço horizontal restante na grelha (`auto / -1`). */\r\n @Input({ transform: booleanAttribute }) grow = false;\r\n\r\n /** Espaço entre elementos na pilha vertical — mesmo “passo” que o `column-gap` de {@link FormRowComponent} com o mesmo `gap`. */\r\n @Input() gap: FormLayoutGap = FormLayoutGap.Md;\r\n\r\n @Input() align: FormRowAlign = FormRowAlign.Stretch;\r\n\r\n /** No eixo vertical da pilha (`justify-content`). */\r\n @Input() justify: FormRowJustify = FormRowJustify.Start;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = [\r\n 'form-col',\r\n `form-col--gap-${this.gap}`,\r\n `form-col--align-${this.align}`,\r\n `form-col--justify-${this.justify}`,\r\n ];\r\n if (this.grow) {\r\n parts.push('form-col--grow');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n @HostBinding('attr.style')\r\n get hostVars(): string {\r\n const { xs, sm, md, lg, xl } = this.resolvedSpans();\r\n const parts = [\r\n `--form-col-xs:${xs}`,\r\n `--form-col-sm:${sm}`,\r\n `--form-col-md:${md}`,\r\n `--form-col-lg:${lg}`,\r\n `--form-col-xl:${xl}`,\r\n ];\r\n if (this.order != null && !Number.isNaN(this.order)) {\r\n parts.push(`order:${this.order}`);\r\n }\r\n return parts.join(';');\r\n }\r\n\r\n /**\r\n * Cada patamar herda do próximo **maior** explicitamente definido quando o intermédio falta\r\n * (ex.: só `xs` + `md` → `sm` usa `md`, evitando faixa 40–48rem presa em `xs`).\r\n */\r\n private resolvedSpans(): { xs: number; sm: number; md: number; lg: number; xl: number } {\r\n const xs = this.clampSpan(this.xs);\r\n const smIn = this.optionalSpan(this.sm);\r\n const mdIn = this.optionalSpan(this.md);\r\n const lgIn = this.optionalSpan(this.lg);\r\n const xlIn = this.optionalSpan(this.xl);\r\n\r\n const sm = this.clampSpan(this.firstDefined(smIn, mdIn, lgIn, xlIn, xs));\r\n const md = this.clampSpan(this.firstDefined(mdIn, lgIn, xlIn, sm, xs));\r\n const lg = this.clampSpan(this.firstDefined(lgIn, xlIn, md, sm, xs));\r\n const xl = this.clampSpan(this.firstDefined(xlIn, lg, md, sm, xs));\r\n return { xs, sm, md, lg, xl };\r\n }\r\n\r\n private optionalSpan(v: number | undefined): number | undefined {\r\n if (v == null || !Number.isFinite(v)) {\r\n return undefined;\r\n }\r\n return this.clampSpan(v);\r\n }\r\n\r\n private firstDefined(...candidates: (number | undefined)[]): number {\r\n for (const c of candidates) {\r\n if (c != null && Number.isFinite(c)) {\r\n return c;\r\n }\r\n }\r\n return 12;\r\n }\r\n\r\n private clampSpan(n: number): number {\r\n if (!Number.isFinite(n) || n < 1) {\r\n return 12;\r\n }\r\n return Math.min(12, Math.max(1, Math.round(n)));\r\n }\r\n}\r\n","<div class=\"form-col__inner\">\r\n <ng-content />\r\n</div>\r\n","import { ChangeDetectorRef, DestroyRef } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\nimport { Observable, Subscription, fromEvent, merge, timer } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\n\ntype RegistryEntry = {\n cdRefs: Set<ChangeDetectorRef>;\n sub: Subscription | null;\n};\n\n/**\n * Um `FormGroup` raiz partilhado por vários `app-form-group` com `formGroupPath`: uma única\n * subscrição agregada evita `merge` duplicados e garante `markForCheck` em todos os anfitriões.\n *\n * Usa-se só `valueChanges` / `statusChanges` do **raiz**: ao alterar um filho, o Angular propaga\n * `updateValueAndValidity` para os ascendentes e o raiz volta a emitir `statusChanges` / `valueChanges`\n * (comportamento de {@link AbstractControl#updateValueAndValidity}). Subscrever cada folho\n * multiplicava observables (dezenas por formulário) e deixava o runtime pesado em formulários grandes.\n */\nconst rootRefreshRegistry = new WeakMap<AbstractControl, RegistryEntry>();\n\nfunction markAllCdrs(entry: RegistryEntry): void {\n for (const c of entry.cdRefs) {\n c.markForCheck();\n }\n}\n\n/**\n * Mantém ícones / getters que dependem do estado reactivo actualizados com OnPush.\n * `markAllAsTouched()` pode não emitir `valueChanges` no raiz; o `submit` do `<form>` (após um tick)\n * cobre o caso de submissão — alinhado a {@link FormGroupComponent} `setupFormPathInvalidTracking`.\n */\nexport function subscribeMarkForCheckOnInvalidUiRefresh(\n rootCtrl: AbstractControl,\n hostElement: HTMLElement,\n cdr: ChangeDetectorRef,\n destroyRef: DestroyRef,\n): void {\n let entry = rootRefreshRegistry.get(rootCtrl);\n if (!entry) {\n entry = { cdRefs: new Set(), sub: null };\n rootRefreshRegistry.set(rootCtrl, entry);\n }\n entry.cdRefs.add(cdr);\n\n if (!entry.sub) {\n const streams: Observable<unknown>[] = [rootCtrl.valueChanges, rootCtrl.statusChanges];\n\n const formEl =\n hostElement.closest('form') ?? hostElement.querySelector('form');\n if (formEl) {\n streams.push(\n fromEvent(formEl, 'submit').pipe(switchMap(() => timer(0))),\n );\n }\n\n /** Agrupa rajadas síncronas (ex.: um `patchValue` que dispara valor + estado no mesmo turno). */\n entry.sub = merge(...streams)\n .pipe(debounceTime(0))\n .subscribe(() => markAllCdrs(entry!));\n }\n\n destroyRef.onDestroy(() => {\n const e = rootRefreshRegistry.get(rootCtrl);\n if (!e) {\n return;\n }\n e.cdRefs.delete(cdr);\n if (e.cdRefs.size === 0) {\n e.sub?.unsubscribe();\n e.sub = null;\n rootRefreshRegistry.delete(rootCtrl);\n }\n });\n}\n","import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';\r\n\r\n/** Resolve `a.b.c` a partir da raiz do formulário (normalmente o `FormGroup` do `<form [formGroup]>`). */\r\nexport function resolveControlAtPath(\r\n root: AbstractControl,\r\n path: string,\r\n): AbstractControl | null {\r\n const segments = path\r\n .split('.')\r\n .map((s) => s.trim())\r\n .filter((s) => s.length > 0);\r\n let current: AbstractControl | null = root;\r\n for (const seg of segments) {\r\n if (current instanceof FormGroup) {\r\n const childCtrl: AbstractControl | null = current.get(seg);\r\n if (childCtrl === null) {\r\n return null;\r\n }\r\n current = childCtrl;\r\n } else if (current instanceof FormArray && /^\\d+$/.test(seg)) {\r\n current = current.at(Number(seg));\r\n } else {\r\n return null;\r\n }\r\n }\r\n return current;\r\n}\r\n\r\n/**\r\n * Há erro “visível” na subárvore: folho inválido e (`dirty` ou `formSubmitted`).\r\n * `formSubmitted` deve incluir o equivalente a «formulário já enviado» (ex.: `FormGroupDirective.submitted`\r\n * ou passo activo após o evento `submit` do `<form>` em `app-form-group`), para acender o ícone após\r\n * «Salvar» + `markAllAsTouched()` sem exigir `dirty` em cada campo.\r\n * Não usar `touched` sozinho: Tab/blur marca touched sem alterar valor e não deve acender o ícone.\r\n */\r\nexport function subtreeHasVisibleInvalid(\r\n control: AbstractControl,\r\n formSubmitted = false,\r\n): boolean {\r\n if (control instanceof FormControl) {\r\n return !!(control.invalid && (control.dirty || formSubmitted));\r\n }\r\n if (control instanceof FormGroup) {\r\n for (const key of Object.keys(control.controls)) {\r\n const ch = control.controls[key];\r\n if (ch && subtreeHasVisibleInvalid(ch, formSubmitted)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n if (control instanceof FormArray) {\r\n for (let i = 0; i < control.length; i++) {\r\n const ch = control.at(i);\r\n if (ch && subtreeHasVisibleInvalid(ch, formSubmitted)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Critério alinhado ao ícone automático de `app-form-group` com `formGroupPath`\r\n * (e reutilizável para aviso por separador, ex. `app-form-tab` + `formGroupName`).\r\n */\r\nexport function sectionHasVisibleInvalid(\r\n root: AbstractControl,\r\n path: string,\r\n formSubmitted = false,\r\n): boolean {\r\n const c = resolveControlAtPath(root, path);\r\n return c ? subtreeHasVisibleInvalid(c, formSubmitted) : false;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormGroupDirective } from '@angular/forms';\r\nimport { fromEvent } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { FormGroupVariant } from '../_models/form-layout.model';\r\nimport { subscribeMarkForCheckOnInvalidUiRefresh } from './form-root-invalid-ui-refresh.util';\r\nimport { resolveControlAtPath, subtreeHasVisibleInvalid } from './form-path.utils';\r\n\r\n/** Par com `app-validation-summary` / foco em campo (expandir ancestrais antes do scroll). */\r\nconst UI_REQUEST_EXPAND_FORM_GROUP = 'ui-request-expand';\r\n\r\n@Component({\r\n selector: 'app-form-group',\r\n standalone: true,\r\n templateUrl: './form-group.component.html',\r\n styleUrl: './form-group.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormGroupComponent implements OnChanges, OnInit, DoCheck {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n private readonly rootFormDir = inject(FormGroupDirective, { optional: true });\r\n\r\n @Input({ required: true }) titulo!: string;\r\n @Input() subtitulo = '';\r\n\r\n @Input({ transform: booleanAttribute }) collapsible = true;\r\n /**\r\n * Quando `true` (padrão), o cabeçalho alterna aberto/fechado (respeita {@link collapsed}).\r\n * Quando `false`, o grupo permanece **sempre expandido** (não recolhe), a seta fica só indicativa **em cinza**\r\n * e o cabeçalho deixa de ser clicável — útil para seções obrigatórias sempre visíveis.\r\n */\r\n @Input({ transform: booleanAttribute }) foldable = true;\r\n /**\r\n * Com `collapsible`: `true` = grupo **fechado** (só cabeçalho visível), `false` = **aberto**.\r\n * O pai pode fixar o estado inicial e manter com `(collapsedChange)` ou `[collapsed]` ligado a uma variável.\r\n * Se {@link foldable} for `false`, o estado efectivo é sempre **aberto** (ignora-se `collapsed` para o corpo).\r\n */\r\n @Input({ transform: booleanAttribute }) collapsed = false;\r\n @Input({ transform: booleanAttribute }) disabled = false;\r\n /**\r\n * Modo só leitura de UX: o título e subtítulo do cabeçalho deixam de ser seleccionáveis\r\n * (p.ex. alinhado a secções cujo conteúdo é `[readonly]`). Não força o `FormGroup` a read-only.\r\n * Alias `readonly` para o template — `readOnly` evita edge cases com minificação / metadata.\r\n */\r\n @Input({ transform: booleanAttribute, alias: 'readonly' }) readOnly = false;\r\n @Input({ transform: booleanAttribute }) dense = false;\r\n @Input({ transform: booleanAttribute }) canMoveUp = false;\r\n @Input({ transform: booleanAttribute }) canMoveDown = false;\r\n @Input({ transform: booleanAttribute }) showHeader = true;\r\n @Input({ transform: booleanAttribute }) showDivider = false;\r\n @Input() variant: FormGroupVariant = FormGroupVariant.Default;\r\n /**\r\n * Com `collapsible` e `collapsed`: se `true`, o corpo **não** é criado no DOM enquanto o\r\n * grupo está fechado (após a primeira expansão pode voltar a fechar e voltar a desmontar).\r\n * Útil para blocos pesados inicialmente fechados; o `FormGroup` reactivo no ascendente\r\n * conserva valores — os `FormControlName` religam ao reabrir.\r\n */\r\n @Input({ transform: booleanAttribute }) destroyOnCollapse = false;\r\n /**\r\n * Quando `true`, o corpo não força `flex-direction: column` nos filhos projetados (ex.: conteúdo\r\n * próprio com grade ou `flex` em linha). O padrão `false` mantém o espaçamento vertical entre\r\n * várias `app-form-row` / wrapper com `formGroupName`.\r\n */\r\n @Input({ transform: booleanAttribute }) skipBodyChildStacking = false;\r\n /**\r\n * Quando `true`, mostra o ícone de aviso no cabeçalho. O pai deve refletir inválido **e** critério\r\n * de UX (ex. `dirty` ou formulário já submetido), não só `touched` — Tab/foco não deve acender sozinho.\r\n * Ignorado quando {@link formGroupPath} está definido (usa-se só o cálculo automático).\r\n */\r\n @Input({ transform: booleanAttribute }) groupInvalid = false;\r\n\r\n /**\r\n * Caminho no `FormGroup` raiz do `<form [formGroup]>` (ex.: `identificacao`, `endereco.morada`).\r\n * Quando preenchido, o ícone de aviso é calculado automaticamente a partir do estado reativo,\r\n * sem precisar de `[groupInvalid]` manual.\r\n */\r\n @Input() formGroupPath = '';\r\n\r\n /**\r\n * Quando `true`, o critério “já houve tentativa de envio” para o ícone automático (`formGroupPath`)\r\n * inclui este sinal (ex.: alinhar a `app-form-tabs` `[warning]` com `markAllAsTouched()` sem `submitted`\r\n * no `FormGroupDirective`, ou validação disparada por `(click)` em vez de `submit`).\r\n */\r\n @Input({ transform: booleanAttribute }) uxSubmittedPass = false;\r\n\r\n @Output() readonly collapsedChange = new EventEmitter<boolean>();\r\n @Output() readonly moveUp = new EventEmitter<void>();\r\n @Output() readonly moveDown = new EventEmitter<void>();\r\n\r\n /** Estado interno espelha o input (OnPush + alterações externas). */\r\n private collapsedInternal = false;\r\n /** Evita `scrollIntoView` duplo no mesmo ciclo (clique + `[collapsed]` do pai). */\r\n private scrollIntoViewCoalesce = false;\r\n /**\r\n * `FormGroupDirective.submitted` nem sempre fica `true` no ciclo do ícone com `[formGroup]` reactivo;\r\n * o `submit` nativo do `<form>` garante aviso nos filhos após «Salvar» + `markAllAsTouched()`.\r\n * Repõe-se quando o `FormGroup` raiz volta a `VALID`.\r\n */\r\n private formSubmitPassActive = false;\r\n\r\n /** Rastreia `rootFormDir.submitted` para repor {@link formSubmitPassActive} após `resetForm` com raiz ainda inválida. */\r\n private prevRootFormSubmitted: boolean | null = null;\r\n\r\n ngOnInit(): void {\r\n this.applyCollapsedFromInputs();\r\n this.setupFormPathInvalidTracking();\r\n this.setupExpandRequestListener();\r\n }\r\n\r\n /**\r\n * Permite expandir o grupo a partir do exterior (ex.: resumo de validação antes de focar um campo).\r\n * `CustomEvent` no host: `ui-request-expand` (sem bubbles).\r\n */\r\n private setupExpandRequestListener(): void {\r\n const host = this.hostRef.nativeElement;\r\n const onExpandRequest = (ev: Event): void => {\r\n ev.stopPropagation();\r\n if (\r\n !this.collapsible ||\r\n this.disabled ||\r\n !this.foldable ||\r\n !this.collapsedInternal\r\n ) {\r\n return;\r\n }\r\n // Síncrono: o resumo adia `navigateToFieldId` com `setTimeout`, fora do CD. Expandir já aqui\r\n // garante que o scroll/foco seguinte vê o grupo aberto (evita precisar de um segundo clique).\r\n this.setCollapsed(false, { skipScroll: true });\r\n };\r\n host.addEventListener(UI_REQUEST_EXPAND_FORM_GROUP, onExpandRequest);\r\n this.destroyRef.onDestroy(() =>\r\n host.removeEventListener(UI_REQUEST_EXPAND_FORM_GROUP, onExpandRequest),\r\n );\r\n }\r\n\r\n /** Ícone de aviso: automático com `formGroupPath`, senão `groupInvalid` manual. */\r\n get invalidFlagVisible(): boolean {\r\n const raw = this.formGroupPath?.trim();\r\n if (raw && this.rootFormDir?.control) {\r\n const target = resolveControlAtPath(this.rootFormDir.control, raw);\r\n if (!target?.invalid) {\r\n return false;\r\n }\r\n const formSubmitted =\r\n !!this.rootFormDir.submitted ||\r\n this.formSubmitPassActive ||\r\n this.uxSubmittedPass;\r\n return subtreeHasVisibleInvalid(target, formSubmitted);\r\n }\r\n return this.groupInvalid;\r\n }\r\n\r\n /**\r\n * `markAllAsTouched()` / `submitted` não passam sempre por `valueChanges`; com OnPush o getter\r\n * do ícone precisa do `submit` do `<form>` ancestral (após um tick) para atualizar.\r\n */\r\n private setupFormPathInvalidTracking(): void {\r\n const raw = this.formGroupPath?.trim();\r\n const rootCtrl = this.rootFormDir?.control;\r\n if (!raw || !rootCtrl) {\r\n return;\r\n }\r\n\r\n subscribeMarkForCheckOnInvalidUiRefresh(\r\n rootCtrl,\r\n this.hostRef.nativeElement,\r\n this.cdr,\r\n this.destroyRef,\r\n );\r\n\r\n const formEl = this.hostRef.nativeElement.closest('form');\r\n if (formEl) {\r\n fromEvent(formEl, 'submit', { capture: true })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.formSubmitPassActive = true;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n rootCtrl.statusChanges\r\n .pipe(\r\n filter(() => rootCtrl.valid),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => {\r\n this.formSubmitPassActive = false;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (\r\n changes['uxSubmittedPass'] ||\r\n changes['formGroupPath'] ||\r\n changes['groupInvalid'] ||\r\n changes['readOnly']\r\n ) {\r\n this.cdr.markForCheck();\r\n }\r\n if (changes['collapsed'] || changes['foldable']) {\r\n const c = changes['collapsed'];\r\n const wasCollapsed =\r\n !!c && !c.firstChange && c.previousValue === true;\r\n this.applyCollapsedFromInputs();\r\n const nowExpanded = !this.collapsedInternal;\r\n if (this.collapsible && this.foldable && wasCollapsed && nowExpanded) {\r\n this.scheduleScrollIntoView();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /** Estado interno de colapso: com `foldable === false` força sempre expandido. */\r\n private applyCollapsedFromInputs(): void {\r\n this.collapsedInternal = this.foldable ? this.collapsed : false;\r\n }\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = ['form-group', `form-group--${this.variant}`];\r\n if (this.dense) {\r\n parts.push('form-group--dense');\r\n }\r\n if (this.disabled) {\r\n parts.push('form-group--disabled');\r\n }\r\n if (this.readOnly) {\r\n parts.push('form-group--readonly');\r\n }\r\n if (this.showDivider) {\r\n parts.push('form-group--divider');\r\n }\r\n if (this.collapsible) {\r\n parts.push('form-group--collapsible');\r\n if (!this.foldable) {\r\n parts.push('form-group--fold-locked');\r\n }\r\n parts.push(\r\n this.collapsedInternal ? 'form-group--collapsed' : 'form-group--expanded',\r\n );\r\n } else {\r\n /* Sem colapso: o corpo está sempre “aberto” — `form-group--expanded` liga a moldura/padding\r\n * iguais ao grupo colapsável expandido (bordas cinza na lib e no consumo npm). */\r\n parts.push('form-group--expanded');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n get showHeaderBar(): boolean {\r\n if (!this.showHeader) {\r\n return false;\r\n }\r\n return (\r\n this.titulo.trim().length > 0 ||\r\n this.subtitulo.trim().length > 0 ||\r\n this.collapsible ||\r\n !this.collapsible /* seta + moldura com `collapsible=false` (prod/npm sem depender de FA) */ ||\r\n this.canMoveUp ||\r\n this.canMoveDown ||\r\n this.invalidFlagVisible\r\n );\r\n }\r\n\r\n get isCollapsed(): boolean {\r\n return this.collapsedInternal;\r\n }\r\n\r\n get renderBodyInDom(): boolean {\r\n if (this.destroyOnCollapse) {\r\n return !this.collapsedInternal;\r\n }\r\n return true;\r\n }\r\n\r\n get bodyVisuallyHidden(): boolean {\r\n return !this.destroyOnCollapse && this.collapsedInternal;\r\n }\r\n\r\n get headerIsInteractive(): boolean {\r\n return this.collapsible && !this.disabled && this.foldable;\r\n }\r\n\r\n onHeaderClick(): void {\r\n if (!this.headerIsInteractive) {\r\n return;\r\n }\r\n this.setCollapsed(!this.collapsedInternal);\r\n }\r\n\r\n onHeaderKeydown(ev: KeyboardEvent): void {\r\n if (!this.headerIsInteractive) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.setCollapsed(!this.collapsedInternal);\r\n }\r\n }\r\n\r\n onMoveUpClick(ev: Event): void {\r\n ev.stopPropagation();\r\n if (this.disabled || !this.canMoveUp) {\r\n return;\r\n }\r\n this.moveUp.emit();\r\n }\r\n\r\n onMoveDownClick(ev: Event): void {\r\n ev.stopPropagation();\r\n if (this.disabled || !this.canMoveDown) {\r\n return;\r\n }\r\n this.moveDown.emit();\r\n }\r\n\r\n private setCollapsed(\r\n next: boolean,\r\n options?: { skipScroll?: boolean },\r\n ): void {\r\n if (!this.foldable && next) {\r\n return;\r\n }\r\n const wasCollapsed = this.collapsedInternal;\r\n this.collapsedInternal = next;\r\n this.collapsedChange.emit(next);\r\n this.cdr.markForCheck();\r\n const skipScroll = options?.skipScroll === true;\r\n if (this.collapsible && this.foldable && wasCollapsed && !next && !skipScroll) {\r\n this.scheduleScrollIntoView();\r\n }\r\n }\r\n\r\n /**\r\n * `block: 'start'` aproxima o grupo ao bordo superior (mais do que o `nearest`), mas o\r\n * `scroll-margin-top` no :host (CSS) cria respiro para ainda se ver o contexto de cima\r\n * (separador, outra aba) sem ir ao cimo absoluto. Dois `rAF` pós-`markForCheck` (incl. aninhados).\r\n */\r\n private scheduleScrollIntoView(): void {\r\n if (this.scrollIntoViewCoalesce) {\r\n return;\r\n }\r\n this.scrollIntoViewCoalesce = true;\r\n const reduced = this.prefersReducedMotion();\r\n queueMicrotask(() => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n this.scrollIntoViewCoalesce = false;\r\n this.hostRef.nativeElement.scrollIntoView({\r\n behavior: reduced ? 'auto' : 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n });\r\n });\r\n });\r\n }\r\n\r\n private prefersReducedMotion(): boolean {\r\n if (typeof globalThis.matchMedia !== 'function') {\r\n return false;\r\n }\r\n return globalThis.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (!this.formGroupPath?.trim()) {\r\n return;\r\n }\r\n const submitted = !!this.rootFormDir?.submitted;\r\n if (this.prevRootFormSubmitted === true && submitted === false) {\r\n this.formSubmitPassActive = false;\r\n this.cdr.markForCheck();\r\n }\r\n this.prevRootFormSubmitted = submitted;\r\n }\r\n}\r\n","@if (showHeaderBar) {\n <div\n class=\"form-group__header\"\n [class.form-group__header--single-line]=\"!subtitulo.trim()\"\n [class.form-group__header--interactive]=\"headerIsInteractive\"\n [attr.role]=\"headerIsInteractive ? 'button' : null\"\n [attr.tabindex]=\"headerIsInteractive ? 0 : null\"\n [attr.aria-expanded]=\"headerIsInteractive ? !isCollapsed : null\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n (click)=\"onHeaderClick()\"\n (keydown)=\"onHeaderKeydown($event)\"\n >\n <div\n class=\"form-group__header-main\"\n [class.form-group__header-main--single-line]=\"!subtitulo.trim()\"\n >\n <span\n class=\"form-group__chevron\"\n [class.form-group__chevron--locked]=\"!collapsible || !foldable\"\n aria-hidden=\"true\"\n >\n @if (collapsible && foldable && isCollapsed) {\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\"\n />\n </svg>\n } @else {\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n }\n </span>\n <div class=\"form-group__titles\">\n @if (titulo.trim()) {\n <h3 class=\"form-group__title\">{{ titulo }}</h3>\n }\n @if (subtitulo.trim()) {\n <p class=\"form-group__subtitle\">{{ subtitulo }}</p>\n }\n </div>\n </div>\n <div class=\"form-group__header-trailing\">\n <span\n class=\"form-group__invalid-flag\"\n [class.form-group__invalid-flag--visible]=\"invalidFlagVisible\"\n [attr.role]=\"invalidFlagVisible ? 'img' : null\"\n [attr.aria-label]=\"invalidFlagVisible ? 'Existem erros de validação neste grupo' : null\"\n [attr.aria-hidden]=\"invalidFlagVisible ? null : 'true'\"\n [attr.title]=\"invalidFlagVisible ? 'Existem erros de validação neste grupo' : null\"\n >\n <svg class=\"form-group__icon-svg form-group__icon-svg--warning\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480H40c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24V296c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"\n />\n </svg>\n </span>\n @if (canMoveUp || canMoveDown) {\n <div class=\"form-group__reorder\" (click)=\"$event.stopPropagation()\">\n @if (canMoveUp) {\n <button\n type=\"button\"\n class=\"form-group__reorder-btn\"\n [disabled]=\"disabled\"\n aria-label=\"Mover grupo para cima\"\n (click)=\"onMoveUpClick($event)\"\n >\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z\"\n />\n </svg>\n </button>\n }\n @if (canMoveDown) {\n <button\n type=\"button\"\n class=\"form-group__reorder-btn\"\n [disabled]=\"disabled\"\n aria-label=\"Mover grupo para baixo\"\n (click)=\"onMoveDownClick($event)\"\n >\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M169.4 470.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 370.8 224 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 306.7L54.6 265.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z\"\n />\n </svg>\n </button>\n }\n </div>\n }\n </div>\n </div>\n}\n\n@if (renderBodyInDom) {\n <div class=\"form-group__body\" [class.form-group__body--collapsed-hidden]=\"bodyVisuallyHidden\">\n <div\n class=\"form-group__body-stack\"\n [class.form-group__body-stack--neutral]=\"skipBodyChildStacking\"\n >\n <ng-content />\n </div>\n </div>\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { FormRowAlign, FormLayoutGap, FormRowJustify } from '../_models/form-layout.model';\r\n\r\n/**\r\n * Grelha de formulário: com `app-form-col` usa 12 trilhos; **sem** `app-form-col`, os filhos\r\n * directos repartem a largura em colunas iguais (comportamento por omissão).\r\n *\r\n * Por omissão: **`align=\"center\"`** e **`justify=\"between\"`** (equivalente a barra de ações).\r\n */\r\n@Component({\r\n selector: 'app-form-row',\r\n standalone: true,\r\n templateUrl: './form-row.component.html',\r\n styleUrl: './form-row.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormRowComponent {\r\n @Input() gap: FormLayoutGap = 'md';\r\n @Input() align: FormRowAlign = 'center';\r\n @Input() justify: FormRowJustify = 'between';\r\n /**\r\n * Quando `true`, cada filho que **não** é `app-form-col` ocupa uma linha inteira da grelha\r\n * (`grid-column: 1 / -1`). Sem `grow`, campos soltos já dividem a linha em partes iguais.\r\n */\r\n @Input({ transform: booleanAttribute }) grow = false;\r\n @Input({ transform: booleanAttribute }) wrap = true;\r\n @Input({ transform: booleanAttribute }) stackOnMobile = true;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = [\r\n 'form-row',\r\n `form-row--gap-${this.gap}`,\r\n `form-row--align-${this.align}`,\r\n `form-row--justify-${this.justify}`,\r\n ];\r\n if (this.grow) {\r\n parts.push('form-row--grow');\r\n }\r\n if (this.wrap) {\r\n parts.push('form-row--wrap');\r\n }\r\n if (this.stackOnMobile) {\r\n parts.push('form-row--stack-mobile');\r\n }\r\n return parts.join(' ');\r\n }\r\n}\r\n","<div class=\"form-row__grid\">\r\n <ng-content />\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\nexport const FormSectionVariant = {\r\n Plain: 'plain',\r\n Card: 'card',\r\n Panel: 'panel',\r\n} as const;\r\nexport type FormSectionVariant = (typeof FormSectionVariant)[keyof typeof FormSectionVariant];\r\n\r\nexport const FormSectionAlign = {\r\n Start: 'start',\r\n Center: 'center',\r\n} as const;\r\nexport type FormSectionAlign = (typeof FormSectionAlign)[keyof typeof FormSectionAlign];\r\n\r\nexport const FormSectionRadius = {\r\n None: 'none',\r\n Sm: 'sm',\r\n Md: 'md',\r\n Lg: 'lg',\r\n Xl: 'xl',\r\n} as const;\r\nexport type FormSectionRadius = (typeof FormSectionRadius)[keyof typeof FormSectionRadius];\r\n\r\n@Component({\r\n selector: 'app-form-section',\r\n standalone: true,\r\n templateUrl: './form-section.component.html',\r\n styleUrl: './form-section.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormSectionComponent {\r\n @Input({ required: true }) titulo!: string;\r\n @Input() subtitulo = '';\r\n\r\n @Input({ transform: booleanAttribute }) dense = false;\r\n @Input({ transform: booleanAttribute }) divider = false;\r\n @Input() variant: FormSectionVariant = 'plain';\r\n @Input() align: FormSectionAlign = 'start';\r\n @Input() maxWidth: string | null = null;\r\n @Input({ transform: booleanAttribute }) fullWidth = true;\r\n @Input() radius: FormSectionRadius = 'md';\r\n @Input({ transform: booleanAttribute }) elevated = false;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = ['form-section'];\r\n parts.push(`form-section--${this.variant}`);\r\n parts.push(`form-section--align-${this.align}`);\r\n if (this.usesSurfaceVariant) {\r\n parts.push(`form-section--radius-${this.radius}`);\r\n }\r\n if (this.dense) {\r\n parts.push('form-section--dense');\r\n }\r\n if (this.divider) {\r\n parts.push('form-section--divider');\r\n }\r\n if (!this.fullWidth) {\r\n parts.push('form-section--inline');\r\n }\r\n if (this.usesSurfaceVariant && this.elevated && this.variant === 'card') {\r\n parts.push('form-section--elevated');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n @HostBinding('style.max-width')\r\n get hostMaxWidth(): string | null {\r\n const value = this.maxWidth?.trim();\r\n return value ? value : null;\r\n }\r\n\r\n @HostBinding('style.margin-inline')\r\n get hostMarginInline(): string | null {\r\n return this.hostMaxWidth ? 'auto' : null;\r\n }\r\n\r\n get usesSurfaceVariant(): boolean {\r\n return this.variant === 'card' || this.variant === 'panel';\r\n }\r\n\r\n get showHeader(): boolean {\r\n return this.titulo.trim().length > 0 || this.subtitulo.trim().length > 0;\r\n }\r\n}\r\n","@if (showHeader) {\r\n<header class=\"form-section__header\">\r\n @if (titulo.trim()) {\r\n <h2 class=\"form-section__title\">{{ titulo }}</h2>\r\n }\r\n @if (subtitulo.trim()) {\r\n <p class=\"form-section__subtitle\">{{ subtitulo }}</p>\r\n }\r\n</header>\r\n}\r\n<div class=\"form-section__content form-section__body\">\r\n <ng-content />\r\n</div>","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n Injector,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n afterNextRender,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport type {\n ValidationSummaryItem,\n ValidationSummaryVariant,\n} from '../_models/validation-summary.model';\n\n/** Evento no host `app-form-group`: expandir grupo sem scroll próprio (navegação a partir do resumo). */\nconst UI_REQUEST_EXPAND_FORM_GROUP = 'ui-request-expand';\n\n@Component({\n selector: 'app-validation-summary',\n standalone: true,\n templateUrl: './validation-summary.component.html',\n styleUrl: './validation-summary.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ValidationSummaryComponent implements OnChanges, OnDestroy {\n private static nextTitleUid = 0;\n private static nextListRegionUid = 0;\n private static nextPanelDomId = 0;\n\n /** Troca de aba (`beforeItemActivate`) + `queueMicrotask` no `app-form-tabs` — o alvo pode ficar em `[hidden]` até o próximo CD. */\n private readonly navigateToFieldMaxAttempts = 28;\n\n private readonly appRef = inject(ApplicationRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Id estável do painel — quando o nó `pinned` passa a `document.body` (Safari iOS) o\n * `getElementById` permite reintegrá-lo no host antes do `@if` o destruir.\n */\n readonly panelDomId = `structra-vsum-p-${++ValidationSummaryComponent.nextPanelDomId}`;\n\n @ViewChild('panelRoot', { read: ElementRef })\n private panelRootRef?: ElementRef<HTMLElement>;\n\n /** `id` único para `aria-labelledby` quando há vários resumos na página. */\n readonly titleElementId = `validation-summary-title-${++ValidationSummaryComponent.nextTitleUid}`;\n\n /** `id` da região da lista (acessibilidade do botão recolher / expandir). */\n readonly listRegionId = `validation-summary-list-${++ValidationSummaryComponent.nextListRegionUid}`;\n\n /** Lista simples (retrocompatível). Ignorada se {@link items} tiver entradas. */\n @Input() messages: string[] | null = null;\n\n /** Lista rica com `fieldId` opcional para navegação até o controle. */\n @Input() items: ValidationSummaryItem[] | null = null;\n\n /**\n * Título do cabeçalho (`title=\"…\"` no template).\n * Não usar a propriedade `title` na classe: colide com `HTMLElement.title` no host e o\n * browser pode desenhar tooltip nativo / comportamentos estranhos.\n */\n @Input('title') summaryHeading = '';\n\n @Input({ transform: booleanAttribute }) visible = true;\n\n /**\n * `false` (padrão): fluxo em documento (ex.: no topo do formulário) — o consumidor pode fazer scroll até o painel.\n * `true`: painel `position: fixed` no topo do viewport, com fade-in **sem** reservar espaço no formulário\n * nem alterar o scroll da página (útil em formulários muito longos).\n */\n @Input({ transform: booleanAttribute }) pinned = false;\n\n /**\n * Com resumo em fluxo (`pinned === false`), após o painel passar a visível, rola o scrollport\n * (ex.: `main` com overflow) até alinhar o painel no topo — necessário além de `window.scrollTo`\n * quando o layout aplica scroll num contentor (docs, modais, etc.).\n * Com `pinned === true` não tem efeito.\n */\n @Input({ transform: booleanAttribute }) autoScrollOnReveal = true;\n\n /**\n * Incrementar a cada submissão com erros (ex.: `++validarComErroSeq`) para voltar a rolar\n * o painel **em fluxo** quando já está visível. Sem ligação, mantém-se só o scroll da\n * primeira revelação.\n */\n @Input() unpinnedScrollTick = 0;\n\n @Input() variant: ValidationSummaryVariant = 'error';\n\n @Input({ transform: booleanAttribute }) compact = false;\n\n /**\n * Altura máxima do painel da lista (ex.: `12rem`, `min(40vh, 14rem)`).\n * Quando definido, a lista obtém scroll vertical interno.\n */\n @Input() panelMaxHeight: string | null = null;\n\n /** Comportamento de scroll ao centrar o alvo na tela. */\n @Input() scrollBehavior: ScrollBehavior = 'smooth';\n\n /**\n * Chamado antes de localizar o elemento por `fieldId` (ex.: ativar a aba onde está o campo).\n * Mantém o contrato do resumo como fonte única de scroll/foco em `navigateToFieldId`.\n */\n @Input() beforeItemActivate?: (item: ValidationSummaryItem) => void;\n\n /** Mostra botão que apenas fecha o painel (não altera validação nem o formulário). */\n @Input({ transform: booleanAttribute }) showCloseButton = false;\n\n /**\n * Mostra o botão com setas (recolher / expandir) ao lado do título para esconder só a lista\n * e poupar espaço vertical sem fechar o painel.\n */\n @Input({ transform: booleanAttribute }) showListCollapseToggle = true;\n\n @Input() closeButtonLabel = 'Fechar';\n\n /** Texto da dica nativa (`title`) nas linhas com destino ao campo. */\n @Input() fieldNavigateHint = 'Clique para ir ao campo.';\n\n @Output() readonly panelClose = new EventEmitter<void>();\n\n /** Com `pinned`: breve fade-in após o painel passar a visível (sem deslocar o layout). */\n pinnedOpen = false;\n\n /** `true`: lista de erros visível; `false`: só cabeçalho + botões (menos altura). */\n panelBodyExpanded = true;\n\n private wasShown = false;\n\n /** Evita loop em {@link scrollHostIntoNearestBlockScrollport} se o host ainda não tiver medidas. */\n private unpinnedScrollMeasureAttempts = 0;\n\n @HostBinding('class')\n get hostClass(): string {\n const parts = [\n 'validation-summary',\n `validation-summary--${this.variant}`,\n ];\n if (this.compact) {\n parts.push('validation-summary--compact');\n }\n if (this.pinned && this.isShown) {\n parts.push('validation-summary--pinned-host');\n }\n return parts.join(' ');\n }\n\n ngOnChanges(c: SimpleChanges): void {\n if (!this.isShown) {\n this.repatriatePinnedPanelToHost();\n }\n const shown = this.isShown;\n if (this.pinned && shown && !this.wasShown) {\n this.pinnedOpen = false;\n this.cdr.markForCheck();\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.pinnedOpen = true;\n this.cdr.markForCheck();\n });\n });\n } else if (!shown) {\n this.pinnedOpen = false;\n this.panelBodyExpanded = true;\n } else if (this.autoScrollOnReveal && !this.pinned && shown) {\n const tch = c['unpinnedScrollTick'];\n const tickBumped =\n !!tch &&\n tch.currentValue !== tch.previousValue &&\n (tch.previousValue !== undefined ||\n (typeof tch.currentValue === 'number' && tch.currentValue > 0));\n if (tickBumped || !this.wasShown) {\n this.scheduleUnpinnedRevealScroll();\n }\n }\n this.wasShown = shown;\n if (shown) {\n afterNextRender(\n () => this.syncPinnedBodyPlacement(),\n { injector: this.injector },\n );\n }\n }\n\n ngOnDestroy(): void {\n const el = this.getPanelElement();\n if (el && el.parentElement === this.document.body) {\n try {\n this.hostRef.nativeElement.appendChild(el);\n } catch {\n el.remove();\n }\n }\n }\n\n private getPanelElement(): HTMLElement | null {\n return (\n (this.document.getElementById(this.panelDomId) as HTMLElement | null) ??\n this.panelRootRef?.nativeElement ??\n null\n );\n }\n\n private repatriatePinnedPanelToHost(): void {\n const el = this.getPanelElement();\n if (!el || el.parentElement !== this.document.body) {\n return;\n }\n this.hostRef.nativeElement.appendChild(el);\n }\n\n /**\n * Safari iOS: `position: fixed` no painel, por baixo de scroll (`main`), fica abaixo do topbar\n * a não ser com `z-index` ardiloso — o painel anexa-se a `body` (fora de qualquer overflow).\n */\n private syncPinnedBodyPlacement(): void {\n if (!this.isShown) {\n return;\n }\n const el = this.getPanelElement();\n if (!el) {\n return;\n }\n if (this.pinned) {\n if (el.parentElement !== this.document.body) {\n this.document.body.appendChild(el);\n }\n return;\n }\n if (el.parentElement === this.document.body) {\n this.hostRef.nativeElement.appendChild(el);\n }\n }\n\n @HostBinding('attr.hidden')\n get hostHidden(): true | null {\n return this.isShown ? null : true;\n }\n\n get resolvedItems(): ValidationSummaryItem[] {\n const fromItems = (this.items ?? []).filter(\n (i) => i && typeof i.message === 'string' && i.message.trim().length > 0,\n );\n if (fromItems.length > 0) {\n return fromItems.map((i) => ({\n message: i.message.trim(),\n fieldId: i.fieldId?.trim() || undefined,\n }));\n }\n return (this.messages ?? [])\n .filter((m) => typeof m === 'string' && m.trim().length > 0)\n .map((message) => ({ message: message.trim() }));\n }\n\n get isShown(): boolean {\n return this.visible && this.resolvedItems.length > 0;\n }\n\n onCloseClick(): void {\n this.panelClose.emit();\n this.cdr.markForCheck();\n }\n\n toggleListBody(): void {\n this.panelBodyExpanded = !this.panelBodyExpanded;\n this.cdr.markForCheck();\n }\n\n /**\n * Chave estável para `@for` — `track $index` reutiliza mal nós quando a lista muda ao vivo\n * e o getter `resolvedItems` devolve novas referências a cada CD.\n */\n itemTrackKey(row: ValidationSummaryItem, index: number): string {\n const fid = row.fieldId?.trim();\n if (fid) {\n return fid;\n }\n return `msg-${index}-${row.message}`;\n }\n\n /**\n * Clique na linha com destino: primeiro alinha a linha no `list-wrap` com scroll\n * (itens parcialmente visíveis passam a ficar totalmente visíveis), depois navega.\n */\n onSummaryLinkActivate(ev: Event, item: ValidationSummaryItem): void {\n const el = ev.currentTarget as HTMLElement | null;\n if (el) {\n el.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n behavior: 'auto',\n });\n }\n this.onItemActivate(item);\n }\n\n /** Navegação até o controle com `fieldId` (chamado após {@link onSummaryLinkActivate}). */\n onItemActivate(item: ValidationSummaryItem): void {\n const id = item.fieldId?.trim();\n if (!id) {\n return;\n }\n\n this.beforeItemActivate?.(item);\n\n // 1) `afterNextRender`: após o DOM refletir (ex.: mudança de aba em `beforeItemActivate`).\n // 2) `setTimeout(0)`: fora do ciclo de verificação — evita NG0100 ao expandir `app-form-group`.\n afterNextRender(\n () => {\n setTimeout(() => this.navigateToFieldId(id), 0);\n },\n { injector: this.injector },\n );\n }\n\n private navigateToFieldId(id: string, attempt = 0): void {\n const resolved = document.getElementById(id);\n if (!resolved || !(resolved instanceof HTMLElement)) {\n if (attempt < this.navigateToFieldMaxAttempts) {\n /*\n * Com `destroyOnCollapse`, o controle não existe no DOM enquanto o `app-form-group` está fechado;\n * `expandCollapsedFormGroupAncestors` nunca corre porque depende do elemento já existir.\n * Expandimos todos os grupos colapsados no `<form>` mais próximo e repetimos após um CD.\n */\n this.expandCollapsedFormGroupsInNearestForm();\n this.appRef.tick();\n queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));\n }\n return;\n }\n // Separadores inativos (`app-form-tab`) usam `[hidden]` — `getElementById` existe mas foco falha\n // até o painel estar visível; re-tenta após CD (ex.: demo Abas ao saltar de aba).\n if (resolved.closest('[hidden]')) {\n if (attempt < this.navigateToFieldMaxAttempts) {\n this.appRef.tick();\n queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));\n }\n return;\n }\n\n /**\n * Com `app-form-group` colapsado (corpo `display: none`), `getElementById` ainda encontra o alvo\n * mas o foco falha até o próximo CD — sem reintento parece que é preciso um segundo clique no resumo.\n */\n if (this.isInsideCollapsedFormGroupBody(resolved)) {\n this.expandCollapsedFormGroupAncestors(resolved);\n this.appRef.tick();\n if (attempt < this.navigateToFieldMaxAttempts) {\n queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));\n }\n return;\n }\n\n this.expandCollapsedFormGroupAncestors(resolved);\n this.appRef.tick();\n this.scheduleScrollAndFocusAfterDomFlush(id);\n }\n\n /** Após `tick()`, garante um frame de pintura antes de scroll/foco (evita foco em ramo ainda oculto). */\n private scheduleScrollAndFocusAfterDomFlush(id: string): void {\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => this.scrollAndFocusFieldById(id));\n });\n });\n }\n\n private isInsideCollapsedFormGroupBody(el: HTMLElement): boolean {\n let node: HTMLElement | null = el;\n while (node) {\n if (node.classList?.contains('form-group__body--collapsed-hidden')) {\n return true;\n }\n node = node.parentElement;\n }\n return false;\n }\n\n private scrollAndFocusFieldById(id: string): void {\n const el = document.getElementById(id);\n if (!el || !(el instanceof HTMLElement)) {\n return;\n }\n const focusable = this.resolveFocusable(el);\n focusable.scrollIntoView({\n behavior: this.scrollBehavior,\n block: 'center',\n inline: 'nearest',\n });\n queueMicrotask(() => {\n try {\n focusable.focus({ preventScroll: true });\n } catch {\n focusable.focus({ preventScroll: true });\n }\n });\n this.cdr.markForCheck();\n }\n\n /**\n * Dispara `ui-request-expand` em cada `app-form-group` colapsado do formulário que contém este resumo,\n * para montar campos com `destroyOnCollapse` antes de `getElementById(fieldId)`.\n * Ordem do DOM (pais antes dos filhos) alinha a expansão de grupos aninhados.\n */\n private expandCollapsedFormGroupsInNearestForm(): void {\n const form = this.hostRef.nativeElement.closest('form');\n if (!(form instanceof HTMLFormElement)) {\n return;\n }\n const hosts = Array.from(\n form.querySelectorAll('app-form-group.form-group--collapsed'),\n ) as HTMLElement[];\n for (const host of hosts) {\n host.dispatchEvent(\n new CustomEvent(UI_REQUEST_EXPAND_FORM_GROUP, {\n bubbles: false,\n cancelable: true,\n }),\n );\n }\n }\n\n /** Expande do mais externo para o mais interno para o conteúdo ficar visível. */\n private expandCollapsedFormGroupAncestors(start: HTMLElement): void {\n const hosts: HTMLElement[] = [];\n let node: HTMLElement | null = start.parentElement;\n while (node) {\n if (\n node.tagName.toLowerCase() === 'app-form-group' &&\n node.classList.contains('form-group--collapsed')\n ) {\n hosts.push(node);\n }\n node = node.parentElement;\n }\n for (let i = hosts.length - 1; i >= 0; i--) {\n hosts[i].dispatchEvent(\n new CustomEvent(UI_REQUEST_EXPAND_FORM_GROUP, {\n bubbles: false,\n cancelable: true,\n }),\n );\n }\n }\n\n private resolveFocusable(el: HTMLElement): HTMLElement {\n if (this.isFocusableElement(el)) {\n return el;\n }\n const inner = el.querySelector<HTMLElement>(\n 'input, select, textarea, button, [href], [tabindex]:not([tabindex=\"-1\"])',\n );\n return inner ?? el;\n }\n\n private scheduleUnpinnedRevealScroll(): void {\n this.unpinnedScrollMeasureAttempts = 0;\n afterNextRender(\n () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => this.scrollHostIntoNearestBlockScrollport());\n });\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Rola o primeiro contentor com overflow (ex.: `main` da shell de docs) para mostrar o host.\n * `Element.scrollIntoView` em contentores aninhados é pouco fiável; usamos o rect do alvo\n * relativamente ao scrollport, como no foco a partir de um item.\n */\n private scrollHostIntoNearestBlockScrollport(): void {\n if (this.pinned) {\n return;\n }\n const el = this.hostRef.nativeElement;\n if (!el.isConnected) {\n return;\n }\n const { width, height } = el.getBoundingClientRect();\n if (width === 0 && height === 0) {\n if (this.unpinnedScrollMeasureAttempts++ < 5) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => this.scrollHostIntoNearestBlockScrollport());\n });\n }\n return;\n }\n const marginPx = 12;\n const scrollport =\n this.findFirstBlockScrollportAncestor(el) ??\n (document.scrollingElement as HTMLElement | null) ??\n document.documentElement;\n const elRect = el.getBoundingClientRect();\n const portRect = scrollport.getBoundingClientRect();\n const deltaY = elRect.top - portRect.top - marginPx;\n if (Math.abs(deltaY) < 2) {\n return;\n }\n const nextTop = scrollport.scrollTop + deltaY;\n const maxTop = Math.max(0, scrollport.scrollHeight - scrollport.clientHeight);\n const clamped = Math.max(0, Math.min(maxTop, nextTop));\n scrollport.scrollTo({ top: clamped, behavior: this.scrollBehavior });\n }\n\n private findFirstBlockScrollportAncestor(\n from: HTMLElement,\n ): HTMLElement | null {\n let node: HTMLElement | null = from.parentElement;\n let depth = 0;\n while (node && depth < 64) {\n if (node === document.body || node === document.documentElement) {\n return null;\n }\n const { overflowY } = getComputedStyle(node);\n if (\n (overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay') &&\n node.scrollHeight > node.clientHeight + 1\n ) {\n return node;\n }\n node = node.parentElement;\n depth += 1;\n }\n return null;\n }\n\n private isFocusableElement(el: HTMLElement): boolean {\n if (el.hasAttribute('disabled')) {\n return false;\n }\n const tag = el.tagName;\n if (\n tag === 'INPUT' ||\n tag === 'SELECT' ||\n tag === 'TEXTAREA' ||\n tag === 'BUTTON'\n ) {\n return true;\n }\n const tab = el.getAttribute('tabindex');\n return tab != null && tab !== '-1';\n }\n\n}\n","@if (isShown) {\r\n<div #panelRoot\r\n [attr.id]=\"panelDomId\"\r\n class=\"validation-summary__panel\" role=\"region\"\r\n [attr.aria-labelledby]=\"summaryHeading.trim() ? titleElementId : null\"\r\n [attr.aria-label]=\"summaryHeading.trim() ? null : 'Resumo de validação'\"\r\n [class.validation-summary__panel--pinned]=\"pinned\"\r\n [class.validation-summary__panel--pinned-open]=\"pinned && pinnedOpen\"\r\n [class.validation-summary__panel--list-collapsed]=\"!panelBodyExpanded\"\r\n [class.validation-summary__panel--surface-error]=\"variant === 'error'\"\r\n [class.validation-summary__panel--surface-warning]=\"variant === 'warning'\"\r\n [class.validation-summary__panel--surface-info]=\"variant === 'info'\"\r\n [class.validation-summary__panel--size-compact]=\"compact\">\r\n <div class=\"validation-summary__head\">\r\n @if (showListCollapseToggle) {\r\n <button type=\"button\" class=\"validation-summary__collapse-toggle\" (click)=\"toggleListBody()\"\r\n [attr.aria-expanded]=\"panelBodyExpanded\" [attr.aria-controls]=\"listRegionId\"\r\n [attr.aria-label]=\"panelBodyExpanded ? 'Recolher lista de erros' : 'Expandir lista de erros'\">\r\n <i class=\"fa-solid\" aria-hidden=\"true\" [class.fa-chevron-up]=\"panelBodyExpanded\"\r\n [class.fa-chevron-down]=\"!panelBodyExpanded\"></i>\r\n </button>\r\n }\r\n @if (summaryHeading.trim()) {\r\n <h3 class=\"validation-summary__title\" [id]=\"titleElementId\">\r\n {{ summaryHeading }}\r\n </h3>\r\n }\r\n @if (showCloseButton) {\r\n <button type=\"button\" class=\"validation-summary__close\" (click)=\"onCloseClick()\">\r\n {{ closeButtonLabel }}\r\n </button>\r\n }\r\n </div>\r\n <div class=\"validation-summary__list-wrap\" [id]=\"listRegionId\"\r\n [class.validation-summary__list-wrap--scrollable]=\"!!panelMaxHeight && panelBodyExpanded\"\r\n [class.validation-summary__list-wrap--collapsed]=\"!panelBodyExpanded\"\r\n [style.max-height]=\"panelBodyExpanded ? (panelMaxHeight || null) : null\" [attr.title]=\"fieldNavigateHint\">\r\n <ul class=\"validation-summary__list\" role=\"list\">\r\n @for (row of resolvedItems; track itemTrackKey(row, $index)) {\r\n <li class=\"validation-summary__item\" role=\"listitem\" (click)=\"onSummaryLinkActivate($event, row)\">\r\n @if (row.fieldId) {\r\n <button type=\"button\" class=\"validation-summary__link\" [attr.title]=\"fieldNavigateHint\">\r\n {{ row.message }}\r\n </button>\r\n } @else {\r\n <span class=\"validation-summary__text\">{{ row.message }}</span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n</div>\r\n}","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostBinding,\n Input,\n OnChanges,\n SimpleChanges,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { FormTabsComponent } from '../form-tabs/form-tabs.component';\n\n@Component({\n selector: 'app-form-tab',\n standalone: true,\n templateUrl: './form-tab.component.html',\n styleUrl: './form-tab.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormTabComponent implements OnChanges {\n /** Sem `host: true`: o pai está no injetor normal (filho de `app-form-tabs`). */\n private readonly tabs = inject(FormTabsComponent, { optional: true });\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) key!: string;\n\n /**\n * Texto do separador na lista de abas.\n * Não usar o nome `title`: no host `<app-form-tab>` o atributo HTML `title` gera tooltip nativo\n * sobre o painel (ex.: ao passar o mouse sobre o conteúdo).\n */\n @Input({ required: true }) tabTitle!: string;\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n @Input({ transform: booleanAttribute }) warning = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n !this.tabs ||\n (!changes['warning'] && !changes['disabled'] && !changes['tabTitle'])\n ) {\n return;\n }\n this.tabs.onTabHeaderStateChanged();\n }\n\n get isActive(): boolean {\n if (!this.tabs) {\n return false;\n }\n return this.tabs.activeKey === this.key;\n }\n\n /**\n * Com `[keepAlive]=\"false\"` no `app-form-tabs` pai, painéis inactivos saem do DOM (menos\n * custo acumulado em ecrãs com muitas abas ou conteúdo pesado).\n */\n get detachInactivePanel(): boolean {\n return !!this.tabs && this.tabs.keepAlive === false;\n }\n\n /** Chamado por {@link FormTabsComponent} quando a aba ativa muda (OnPush). */\n refreshActiveState(): void {\n this.cdr.markForCheck();\n }\n\n @HostBinding('class')\n get hostClass(): string {\n return 'form-tab';\n }\n\n panelId(): string {\n return this.tabs ? this.tabs.panelIdFor(this.key) : `form-tab-panel-${this.key}`;\n }\n\n labelledById(): string {\n return this.tabs ? this.tabs.headerIdFor(this.key) : '';\n }\n}\n","<div\r\n class=\"form-tab__panel\"\r\n role=\"tabpanel\"\r\n [id]=\"panelId()\"\r\n [attr.aria-labelledby]=\"labelledById() || null\"\r\n [attr.aria-hidden]=\"!isActive\"\r\n [hidden]=\"!isActive\"\r\n [class.form-tab__panel--active]=\"isActive\"\r\n>\r\n @if (!detachInactivePanel || isActive) {\r\n <ng-content />\r\n }\r\n</div>\r\n","import {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n QueryList,\r\n booleanAttribute,\r\n forwardRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormTabComponent } from '../form-tab/form-tab.component';\r\nimport type { FormTabsVariant } from '../_models/form-tabs.model';\r\n\r\n@Component({\r\n selector: 'app-form-tabs',\r\n standalone: true,\r\n templateUrl: './form-tabs.component.html',\r\n styleUrl: './form-tabs.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormTabsComponent implements AfterContentInit {\r\n private static nextUid = 0;\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n readonly uid = `ft-${++FormTabsComponent.nextUid}`;\r\n\r\n @ContentChildren(forwardRef(() => FormTabComponent), { descendants: false })\r\n tabQuery!: QueryList<FormTabComponent>;\r\n\r\n private _activeKey = '';\r\n\r\n @Input()\r\n set activeKey(v: string | undefined | null) {\r\n const next = (v ?? '').trim();\r\n if (next === this._activeKey) {\r\n return;\r\n }\r\n this._activeKey = next;\r\n queueMicrotask(() => this.refreshTabPanels());\r\n }\r\n get activeKey(): string {\r\n return this._activeKey;\r\n }\r\n\r\n @Output() readonly activeKeyChange = new EventEmitter<string>();\r\n\r\n /**\r\n * `true` (padrão): todos os painéis permanecem no DOM; inactivos usam `[hidden]` (útil para\r\n * preservar estado de UI puramente client-side dentro da aba).\r\n * `false`: só o painel da aba activa é montado — menos DOM/CD ao alternar; o modelo reactivo\r\n * (`FormGroup` no ascendente) mantém-se; ao voltar à aba, os campos remontam e religam-se.\r\n */\r\n @Input({ transform: booleanAttribute }) keepAlive = true;\r\n\r\n @Input({ transform: booleanAttribute }) stretch = false;\r\n\r\n @Input() variant: FormTabsVariant = 'default';\r\n\r\n /** Rótulo acessível para a lista de separadores (ex.: “Seções do formulário”). */\r\n @Input() tablistAriaLabel = 'Separadores do formulário';\r\n\r\n ngAfterContentInit(): void {\r\n this.syncInitialActiveKey();\r\n this.tabQuery.changes.subscribe(() => {\r\n this.syncInitialActiveKey();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n get tabs(): FormTabComponent[] {\r\n return this.tabQuery?.toArray() ?? [];\r\n }\r\n\r\n get hostClass(): string {\r\n const parts = ['form-tabs', `form-tabs--${this.variant}`];\r\n if (this.stretch) {\r\n parts.push('form-tabs--stretch');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n baseId(): string {\r\n return `form-tabs-${this.uid}`;\r\n }\r\n\r\n headerIdFor(key: string): string {\r\n return `${this.baseId()}-tab-${key}`;\r\n }\r\n\r\n panelIdFor(key: string): string {\r\n return `${this.baseId()}-panel-${key}`;\r\n }\r\n\r\n selectTab(key: string): void {\r\n const tab = this.tabs.find((t) => t.key === key);\r\n if (!tab || tab.disabled) {\r\n return;\r\n }\r\n if (this._activeKey === key) {\r\n return;\r\n }\r\n this._activeKey = key;\r\n this.activeKeyChange.emit(key);\r\n this.cdr.markForCheck();\r\n this.refreshTabPanels();\r\n }\r\n\r\n private refreshTabPanels(): void {\r\n this.tabQuery?.forEach((tab) => tab.refreshActiveState());\r\n }\r\n\r\n /**\r\n * Chamado por {@link FormTabComponent} quando inputs que afetam o tablist (ex.: `warning`, `tabTitle`)\r\n * mudam — com OnPush o cabeçalho não voltava a desenhar só com alterações nos filhos projetados.\r\n */\r\n onTabHeaderStateChanged(): void {\r\n this.cdr.markForCheck();\r\n }\r\n\r\n isSelected(key: string): boolean {\r\n return this._activeKey === key;\r\n }\r\n\r\n private syncInitialActiveKey(): void {\r\n const list = this.tabs;\r\n if (!list.length) {\r\n return;\r\n }\r\n const hasActive =\r\n !!this._activeKey && list.some((t) => t.key === this._activeKey);\r\n if (hasActive) {\r\n return;\r\n }\r\n const firstEnabled = list.find((t) => !t.disabled) ?? list[0];\r\n if (firstEnabled) {\r\n this._activeKey = firstEnabled.key;\r\n this.activeKeyChange.emit(this._activeKey);\r\n this.refreshTabPanels();\r\n }\r\n }\r\n}\r\n","<div [class]=\"hostClass\">\n <div class=\"form-tabs__shell\">\n <div class=\"form-tabs__header-scroll\">\n <div\n class=\"form-tabs__tablist\"\n role=\"tablist\"\n [attr.aria-label]=\"tablistAriaLabel\"\n >\n @for (tab of tabs; track tab.key) {\n <button\n type=\"button\"\n class=\"form-tabs__tab\"\n role=\"tab\"\n [id]=\"headerIdFor(tab.key)\"\n [attr.aria-selected]=\"isSelected(tab.key)\"\n [attr.aria-controls]=\"panelIdFor(tab.key)\"\n [attr.tabindex]=\"isSelected(tab.key) ? 0 : -1\"\n [disabled]=\"tab.disabled\"\n [class.form-tabs__tab--active]=\"isSelected(tab.key)\"\n [class.form-tabs__tab--warn]=\"tab.warning\"\n (click)=\"selectTab(tab.key)\"\n >\n <span class=\"form-tabs__tab-label\">{{ tab.tabTitle }}</span>\n @if (tab.warning) {\n <span\n class=\"form-tabs__tab-warn-icon\"\n aria-hidden=\"true\"\n title=\"Existem erros nesta seção\"\n >\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </span>\n }\n </button>\n }\n </div>\n </div>\n <div class=\"form-tabs__panels\">\n <ng-content select=\"app-form-tab\" />\n </div>\n </div>\n</div>\n","/**\r\n * HTML injetado no AG Grid (`overlayNoRowsTemplate`) — manter alinhado ao markup de {@link EmptyStateComponent}.\r\n */\r\nexport function escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n}\r\n\r\nexport function buildEmptyStateOverlayHtml(message: string): string {\r\n const safe = escapeHtml(message);\r\n return (\r\n `<div class=\"empty-state empty-state--embed\" role=\"status\">` +\r\n `<span class=\"empty-state__icon\" aria-hidden=\"true\">` +\r\n `<i class=\"fa-solid fa-inbox\"></i></span>` +\r\n `<p class=\"empty-state__message\">${safe}</p></div>`\r\n );\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport type { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport type { GridApi, ICellRendererParams } from 'ag-grid-community';\r\n\r\n/** Contexto injetado pelo {@link DataGridComponent} (não exportado para consumidores). */\r\nexport interface DataGridActionsContext<T = unknown> {\r\n onEditRow: (row: T) => void;\r\n onRemoveRow: (row: T) => void;\r\n}\r\n\r\n@Component({\r\n selector: 'app-data-grid-actions-cell-renderer',\r\n standalone: true,\r\n templateUrl: './data-grid-actions-cell-renderer.component.html',\r\n styleUrl: './data-grid-actions-cell-renderer.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DataGridActionsCellRendererComponent\r\n implements ICellRendererAngularComp\r\n{\r\n params!: ICellRendererParams & { context?: DataGridActionsContext };\r\n\r\n agInit(params: ICellRendererParams): void {\r\n this.params = params as ICellRendererParams & {\r\n context?: DataGridActionsContext;\r\n };\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n\r\n /** `params.context` nem sempre vem preenchido; o grid guarda o mesmo objeto em `gridOptions.context`. */\r\n private get actionsContext(): DataGridActionsContext | undefined {\r\n const p = this.params as ICellRendererParams & {\r\n context?: DataGridActionsContext;\r\n };\r\n if (p.context?.onEditRow && p.context?.onRemoveRow) {\r\n return p.context;\r\n }\r\n const api = p.api as GridApi | undefined;\r\n const fromGrid = api?.getGridOption?.('context') as\r\n | DataGridActionsContext\r\n | undefined;\r\n return fromGrid;\r\n }\r\n\r\n edit(): void {\r\n const row = this.params.data;\r\n const ctx = this.actionsContext;\r\n if (row != null && ctx) {\r\n ctx.onEditRow(row);\r\n }\r\n }\r\n\r\n remove(): void {\r\n const row = this.params.data;\r\n const ctx = this.actionsContext;\r\n if (row != null && ctx) {\r\n ctx.onRemoveRow(row);\r\n }\r\n }\r\n}\r\n","<div class=\"data-grid-actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"edit()\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn data-grid-actions__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"remove()\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n</div>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n numberAttribute,\n} from '@angular/core';\nimport { AgGridAngular } from 'ag-grid-angular';\nimport type {\n ColDef,\n GetRowIdParams,\n GridApi,\n GridReadyEvent,\n} from 'ag-grid-community';\nimport type { DataGridColumn } from '../_models/data-grid-column.model';\nimport { buildEmptyStateOverlayHtml } from '../empty-state/empty-state-overlay.util';\nimport {\n DataGridActionsCellRendererComponent,\n type DataGridActionsContext,\n} from './data-grid-actions-cell-renderer.component';\nimport { SkeletonTableComponent } from '../../loading/skeleton-loading';\n\nconst ACTIONS_RENDERER_NAME = 'dataGridActions';\n\n/** Emitido quando o usuário muda de página ou tamanho de página na grade paginada. */\nexport interface DataGridPaginationChangeEvent {\n /** Índice 0-based da página atual (API ag-Grid). */\n currentPage: number;\n newPage: boolean;\n newPageSize: boolean;\n}\n\n@Component({\n selector: 'app-data-grid',\n imports: [AgGridAngular, SkeletonTableComponent],\n templateUrl: './data-grid.component.html',\n styleUrl: './data-grid.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DataGridComponent<T = unknown> implements OnInit, OnChanges, OnDestroy {\n private readonly ngZone = inject(NgZone);\n private gridApi: GridApi<T> | null = null;\n private paginationChangedListener?: (event: unknown) => void;\n\n @Input({ required: true }) rows!: T[];\n @Input({ required: true }) columns!: DataGridColumn<T>[];\n\n @Input() pageSize = 15;\n @Input() loading = false;\n /**\n * Após remontar a grade (ex.: skeleton), volta a esta página (0-based).\n * Só aplicado em `gridReady` e quando o valor muda com a API já disponível.\n */\n @Input({ transform: numberAttribute }) initialPaginationPage = 0;\n @Input() height: string | null = '420px';\n @Input() emptyMessage = 'Sem registros para mostrar.';\n @Input() pagination = true;\n /** Se `false`, omite colunas com `type: 'actions'` (editar/remover). Por omissão `true`. */\n @Input() showActionsColumn = true;\n\n @Output() readonly edit = new EventEmitter<T>();\n @Output() readonly remove = new EventEmitter<T>();\n /** Reservado para evolução (seleção de linhas); não ligado na v1 para manter a UI minimal. */\n @Output() readonly selectionChange = new EventEmitter<T[]>();\n\n /** Paginação interna do ag-Grid: mudança de página ou de `pageSize`. */\n @Output() readonly paginationChanged =\n new EventEmitter<DataGridPaginationChangeEvent>();\n\n readonly frameworkComponents = {\n [ACTIONS_RENDERER_NAME]: DataGridActionsCellRendererComponent,\n };\n\n readonly paginationPageSizeChoices = [10, 15, 25, 50];\n\n /**\n * O AG Grid avisa se `paginationPageSize` não está em `paginationPageSizeSelector`.\n * Junta `pageSize` às opções base quando o consumidor usa um valor fora da lista (ex.: 8).\n */\n get effectivePaginationPageSizeSelector(): number[] {\n const size = Number(this.pageSize);\n const base = [...this.paginationPageSizeChoices];\n if (Number.isFinite(size) && size > 0 && !base.includes(size)) {\n base.push(size);\n base.sort((a, b) => a - b);\n }\n return base;\n }\n\n get skeletonColumnCount(): number {\n const n = this.columns?.length ?? 4;\n return Math.min(8, Math.max(2, n));\n }\n\n get skeletonRowCount(): number {\n return Math.min(14, Math.max(5, this.pageSize));\n }\n\n readonly defaultColDef: ColDef<T> = {\n sortable: true,\n resizable: true,\n flex: 1,\n minWidth: 120,\n };\n\n /**\n * O AG Grid corre muitos callbacks fora da `NgZone`; sem `run()`, o pai com `OnPush`\n * não volta a renderizar e editar/remover parece “morto”.\n */\n readonly actionsContext: DataGridActionsContext<T> = {\n onEditRow: (row: T) =>\n this.ngZone.run(() => {\n this.edit.emit(row);\n }),\n onRemoveRow: (row: T) =>\n this.ngZone.run(() => {\n this.remove.emit(row);\n }),\n };\n\n agColumnDefs: ColDef<T>[] = [];\n\n ngOnInit(): void {\n if (this.columns?.length) {\n this.agColumnDefs = this.mapColumnsToColDef(this.columns);\n }\n }\n\n /**\n * IDs estáveis por linha (evita `''` duplicado quando não existe `id` nos dados).\n * Tenta `id`, depois `sku` (comum em grades de produto), senão impressão digital do objeto.\n */\n readonly getRowId = (params: GetRowIdParams<T>): string => {\n const d = params.data as Record<string, unknown> | undefined;\n if (!d) {\n return '__no-row-data';\n }\n const idVal = d['id'];\n if (idVal !== undefined && idVal !== null && String(idVal).trim() !== '') {\n return String(idVal);\n }\n const skuVal = d['sku'];\n if (skuVal !== undefined && skuVal !== null && String(skuVal).trim() !== '') {\n return `sku:${String(skuVal)}`;\n }\n return `row:${this.stableRowFingerprint(d)}`;\n };\n\n /** Identificador determinístico e curto para linhas sem chave explícita. */\n private stableRowFingerprint(d: Record<string, unknown>): string {\n const keys = Object.keys(d).sort();\n const s = keys.map((k) => `${k}:${JSON.stringify(d[k])}`).join('|');\n let h = 2166136261;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return (h >>> 0).toString(36);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['loading'] && this.loading) {\n this.detachPaginationListenerIfLive();\n this.gridApi = null;\n }\n if (\n (changes['columns'] || changes['showActionsColumn']) &&\n this.columns?.length\n ) {\n this.agColumnDefs = this.mapColumnsToColDef(this.columns);\n }\n if (\n changes['emptyMessage'] &&\n this.gridApi &&\n !this.gridApi.isDestroyed() &&\n changes['emptyMessage'].previousValue !==\n changes['emptyMessage'].currentValue\n ) {\n this.gridApi.setGridOption(\n 'overlayNoRowsTemplate',\n this.emptyOverlayTemplate,\n );\n }\n if (\n changes['initialPaginationPage'] &&\n this.gridApi &&\n !this.gridApi.isDestroyed() &&\n !changes['initialPaginationPage'].firstChange\n ) {\n this.applyInitialPaginationPage(this.gridApi);\n }\n }\n\n ngOnDestroy(): void {\n this.detachPaginationListenerIfLive();\n this.gridApi = null;\n }\n\n get emptyOverlayTemplate(): string {\n return buildEmptyStateOverlayHtml(this.emptyMessage);\n }\n\n get hostHeight(): string {\n return (this.height && this.height.trim()) || '420px';\n }\n\n onGridReady(ev: GridReadyEvent<T>): void {\n this.detachPaginationListenerIfLive();\n\n this.gridApi = ev.api;\n ev.api.setGridOption('context', this.actionsContext);\n\n this.paginationChangedListener = (event: unknown) => {\n const e = event as { newPage?: boolean; newPageSize?: boolean };\n if (!e?.newPage && !e?.newPageSize) {\n return;\n }\n const currentPage = ev.api.paginationGetCurrentPage();\n this.ngZone.run(() => {\n this.paginationChanged.emit({\n currentPage,\n newPage: !!e.newPage,\n newPageSize: !!e.newPageSize,\n });\n });\n };\n ev.api.addEventListener('paginationChanged', this.paginationChangedListener);\n\n queueMicrotask(() => this.applyInitialPaginationPage(ev.api));\n }\n\n private applyInitialPaginationPage(api: GridApi<T>): void {\n if (api.isDestroyed()) {\n return;\n }\n const p = this.initialPaginationPage;\n if (p > 0 && api.paginationGetTotalPages() > p) {\n api.paginationGoToPage(p);\n }\n }\n\n /** Evita `removeEventListener` na API depois do grid destruído (ex.: `@if (loading)` remove o DOM). */\n private detachPaginationListenerIfLive(): void {\n const api = this.gridApi;\n const fn = this.paginationChangedListener;\n if (api && fn && !api.isDestroyed()) {\n api.removeEventListener('paginationChanged', fn);\n }\n this.paginationChangedListener = undefined;\n }\n\n private columnsForGrid(cols: DataGridColumn<T>[]): DataGridColumn<T>[] {\n if (this.showActionsColumn) {\n return cols;\n }\n return cols.filter((c) => c.type !== 'actions');\n }\n\n private mapColumnsToColDef(cols: DataGridColumn<T>[]): ColDef<T>[] {\n return this.columnsForGrid(cols).map((c) => {\n if (c.type === 'actions') {\n return {\n colId: String(c.key),\n headerName: c.header,\n sortable: false,\n filter: false,\n resizable: false,\n suppressMovable: true,\n cellRenderer: ACTIONS_RENDERER_NAME,\n cellClass: 'data-grid__actions-cell',\n width: c.width ?? 168,\n flex: c.flex,\n pinned: 'left',\n } as ColDef<T>;\n }\n const field = String(c.key);\n const def: ColDef<T> = {\n field: field as ColDef<T>['field'],\n headerName: c.header,\n sortable: c.sortable !== false,\n width: c.width,\n flex: c.flex,\n };\n if (c.type === 'number') {\n def.type = 'numericColumn';\n }\n return def;\n });\n }\n}\n","<div class=\"data-grid\" [style.height]=\"hostHeight\">\n @if (loading) {\n <div class=\"data-grid__skeleton\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <span class=\"visually-hidden\">A carregar grid...</span>\n <app-skeleton-table [columnCount]=\"skeletonColumnCount\" [rowCount]=\"skeletonRowCount\" [showPager]=\"pagination\" />\n </div>\n } @else {\n <ag-grid-angular\n class=\"data-grid__ag ag-theme-alpine\"\n [theme]=\"'legacy'\"\n [rowData]=\"rows\"\n [columnDefs]=\"agColumnDefs\"\n [components]=\"frameworkComponents\"\n [context]=\"actionsContext\"\n [defaultColDef]=\"defaultColDef\"\n [pagination]=\"pagination\"\n [paginationPageSize]=\"pageSize\"\n [paginationPageSizeSelector]=\"effectivePaginationPageSizeSelector\"\n [suppressCellFocus]=\"true\"\n [animateRows]=\"false\"\n [domLayout]=\"'normal'\"\n [overlayNoRowsTemplate]=\"emptyOverlayTemplate\"\n [getRowId]=\"getRowId\"\n (gridReady)=\"onGridReady($event)\"\n />\n }\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n/** Barra de consulta: pesquisa, filtros, ações e contador (slots `toolbar-start` / `toolbar-end`). */\r\n@Component({\r\n selector: 'app-data-toolbar',\r\n standalone: true,\r\n templateUrl: './data-toolbar.component.html',\r\n styleUrl: './data-toolbar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DataToolbarComponent {}\r\n","<div class=\"data-toolbar\">\r\n <div class=\"data-toolbar__start\">\r\n <ng-content select=\"[toolbar-start]\"></ng-content>\r\n </div>\r\n <div class=\"data-toolbar__end\">\r\n <ng-content select=\"[toolbar-end]\"></ng-content>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-data-card',\r\n standalone: true,\r\n templateUrl: './data-card.component.html',\r\n styleUrl: './data-card.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DataCardComponent {\r\n @Input({ required: true }) title!: string;\r\n @Input() subtitle?: string;\r\n /** 1–2 caracteres para o círculo de iniciais. */\r\n @Input() avatarText?: string;\r\n @Input() variant: 'default' = 'default';\r\n @Input() showActions = true;\r\n\r\n @Output() readonly edit = new EventEmitter<void>();\r\n @Output() readonly remove = new EventEmitter<void>();\r\n\r\n onEditClick(ev: Event): void {\r\n ev.stopPropagation();\r\n this.edit.emit();\r\n }\r\n\r\n onRemoveClick(ev: Event): void {\r\n ev.stopPropagation();\r\n this.remove.emit();\r\n }\r\n}\r\n","<article\r\n class=\"data-card\"\r\n [class.data-card--default]=\"variant === 'default'\"\r\n [attr.data-variant]=\"variant\"\r\n>\r\n <div class=\"data-card__row\">\r\n <div class=\"data-card__main\">\r\n @if (avatarText?.trim()) {\r\n <div class=\"data-card__avatar\" aria-hidden=\"true\">\r\n {{ avatarText!.trim().slice(0, 2) }}\r\n </div>\r\n }\r\n <div class=\"data-card__text\">\r\n <h4 class=\"data-card__title\">{{ title }}</h4>\r\n @if (subtitle?.trim()) {\r\n <p class=\"data-card__subtitle\">{{ subtitle }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"data-card__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"onEditClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn data-card__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"onRemoveClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</article>\r\n","import { ChangeDetectionStrategy, Component, Input, booleanAttribute } from '@angular/core';\n\n@Component({\n selector: 'app-empty-state',\n standalone: true,\n templateUrl: './empty-state.component.html',\n styleUrl: './empty-state.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyStateComponent {\n @Input({ required: true }) message!: string;\n @Input() description?: string;\n /** Classe Font Awesome do ícone (ex.: `fa-solid fa-inbox`). */\n @Input() iconClass = 'fa-solid fa-inbox';\n @Input() variant: 'default' = 'default';\n\n /** Padding reduzido (ex.: células de tabela, listas densas). */\n @Input({ transform: booleanAttribute }) embed = false;\n}\n","<div\n class=\"empty-state\"\n [class.empty-state--default]=\"variant === 'default'\"\n [class.empty-state--embed]=\"embed\"\n role=\"status\"\n>\n <span class=\"empty-state__icon\" aria-hidden=\"true\">\n <i [class]=\"iconClass\"></i>\n </span>\n <p class=\"empty-state__message\">{{ message }}</p>\n @if (description?.trim()) {\n <p class=\"empty-state__description\">{{ description }}</p>\n }\n</div>\n","import { NgStyle } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { DataCardComponent } from '../data-card/data-card.component';\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\nimport { SkeletonCardComponent } from '../../loading/skeleton-loading';\nimport type { CardItemView, CardListMapFn } from '../_models/card-item-view.model';\n\n/**\n * - **memory**: `items` tem a lista completa (ex.: 500 em memória); só se mostram\n * `scrollBatchSize` de cada vez até o usuário fazer scroll (fatia local).\n * - **remote**: `items` são só as linhas já devolvidas pela API; ao fim do scroll\n * emite `loadMore` para pedir a próxima página (SQL OFFSET/FETCH no backend).\n */\nexport type CardListDataMode = 'memory' | 'remote';\n\n@Component({\n selector: 'app-card-list',\n imports: [NgStyle, DataCardComponent, EmptyStateComponent, SkeletonCardComponent],\n templateUrl: './card-list.component.html',\n styleUrl: './card-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CardListComponent<T = unknown> implements OnChanges {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) items!: T[];\n @Input() loading = false;\n /**\n * Com itens já visíveis: mostra **um** skeleton no fundo (próxima página remota)\n * para não saltar o scroll nem ocupar altura de vários cartões. O carregamento inicial\n * continua a usar só {@link loading} (lista vazia ou refresh completo com `loading` e sem `loadingMore`).\n */\n @Input({ transform: booleanAttribute }) loadingMore = false;\n @Input() emptyMessage = 'Sem itens para mostrar.';\n @Input() variant: 'default' = 'default';\n @Input({ required: true }) mapItem!: CardListMapFn<T>;\n @Input() showItemActions = true;\n @Input() trackByProp: keyof T | string = 'id' as keyof T;\n\n @Input() dataMode: CardListDataMode = 'memory';\n\n /** Em modo `memory`: quantos itens revelar por cada passo de scroll. Por omissão `10`. */\n @Input() scrollBatchSize = 10;\n @Input() scrollLoadThresholdPx = 80;\n /** Mostra o rodapé com o resumo (“X de Y”) e dica. Por omissão `true`; com `false` oculta o footer. */\n @Input() showFooter = true;\n @Input() scrollMaxHeight: string | null = 'min(28rem, 50vh)';\n\n /**\n * Modo **remote**: total de registros no servidor (ex.: COUNT SQL), para o texto “X de Y”.\n * Se `null`, usa `items.length`.\n */\n @Input() totalCountRemote: number | null = null;\n /** Modo **remote**: existe página seguinte para pedir ao backend. */\n @Input() hasNextPage = false;\n /** Modo **remote**: pedido de mais dados (próxima página). */\n @Output() readonly loadMore = new EventEmitter<void>();\n\n @Output() readonly edit = new EventEmitter<T>();\n @Output() readonly remove = new EventEmitter<T>();\n\n /** Modo memory: quantos cartões renderizar (fatia inicial = scrollBatchSize). */\n visibleCount = 0;\n\n private loadMorePending = false;\n\n /** Skeleton que ocupa a lista inteira (carregamento inicial / refresh com `loading`). */\n get showFullSkeleton(): boolean {\n return this.loading && !this.loadingMore;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['items']) {\n this.loadMorePending = false;\n }\n if (\n changes['items'] ||\n changes['dataMode'] ||\n changes['scrollBatchSize']\n ) {\n this.resetVisibleWindow();\n }\n }\n\n get totalItemCount(): number {\n return this.items?.length ?? 0;\n }\n\n /** Total para o rodapé “X de Y”. */\n get totalForStatus(): number {\n if (this.dataMode === 'remote' && this.totalCountRemote != null) {\n return this.totalCountRemote;\n }\n return this.totalItemCount;\n }\n\n get visibleItems(): T[] {\n const list = this.items ?? [];\n if (this.dataMode === 'remote') {\n return list;\n }\n return list.slice(0, this.visibleCount);\n }\n\n get scrollStatusLabel(): string {\n if (this.totalForStatus === 0) {\n return '';\n }\n if (this.dataMode === 'remote') {\n const loaded = this.totalItemCount;\n return `${loaded} de ${this.totalForStatus} registro(s)`;\n }\n const shown = Math.min(this.visibleCount, this.totalItemCount);\n return `${shown} de ${this.totalForStatus} registro(s)`;\n }\n\n get scrollAreaStyle(): Record<string, string> {\n const h = this.scrollMaxHeight;\n if (h === null || h === undefined || h.trim() === '') {\n return {};\n }\n // Carregamento inicial (skeleton em lista vazia): sem barra de scroll; só com itens reais\n // é que `auto` entra em efeito se o conteúdo exceder `max-height`.\n return {\n 'max-height': h,\n 'overflow-y': this.showFullSkeleton ? 'hidden' : 'auto',\n 'overflow-x': 'hidden',\n };\n }\n\n /** Há mais linhas para mostrar (memória) ou para pedir à API (remote). */\n get hasMoreToReveal(): boolean {\n if (this.dataMode === 'remote') {\n return this.hasNextPage;\n }\n return (\n this.visibleCount < this.totalItemCount && this.totalItemCount > 0\n );\n }\n\n viewFor(item: T): CardItemView {\n return this.mapItem(item);\n }\n\n skeletonCardIndices(): number[] {\n const n = Math.min(8, Math.max(3, this.scrollBatchSize));\n return Array.from({ length: n }, (_, i) => i);\n }\n\n /** Um único cartão skeleton no fundo durante `loadingMore` (mantém o scroll estável). */\n skeletonTailIndices(): number[] {\n return [0];\n }\n\n trackFn = (index: number, item: T): unknown => {\n if (item != null && typeof item === 'object') {\n const key = this.trackByProp as string;\n if (key in (item as object)) {\n return (item as Record<string, unknown>)[key];\n }\n }\n return index;\n };\n\n onScroll(ev: Event): void {\n const el = ev.target as HTMLElement;\n const remaining = el.scrollHeight - el.scrollTop - el.clientHeight;\n if (remaining > this.scrollLoadThresholdPx) {\n return;\n }\n\n if (this.dataMode === 'remote') {\n this.requestRemotePage();\n return;\n }\n\n this.loadMoreMemoryChunk();\n }\n\n private requestRemotePage(): void {\n if (!this.hasNextPage || this.loading || this.loadingMore || this.loadMorePending) {\n return;\n }\n this.loadMorePending = true;\n this.loadMore.emit();\n this.cdr.markForCheck();\n }\n\n private loadMoreMemoryChunk(): void {\n if (this.visibleCount >= this.totalItemCount) {\n return;\n }\n this.visibleCount = Math.min(\n this.visibleCount + this.scrollBatchSize,\n this.totalItemCount,\n );\n this.cdr.markForCheck();\n }\n\n private resetVisibleWindow(): void {\n if (this.dataMode === 'remote') {\n this.visibleCount = this.totalItemCount;\n this.cdr.markForCheck();\n return;\n }\n const total = this.totalItemCount;\n this.visibleCount = Math.min(this.scrollBatchSize, total);\n this.cdr.markForCheck();\n }\n}\n","<div class=\"card-list\" [attr.data-variant]=\"variant\">\r\n @if (showFullSkeleton) {\r\n <div class=\"card-list__body\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"card-list__visually-hidden\">A carregar lista…</span>\r\n <div class=\"card-list__scroll\" [ngStyle]=\"scrollAreaStyle\">\r\n <div class=\"card-list__stack\">\r\n @for (_ of skeletonCardIndices(); track $index) {\r\n <app-skeleton-card [showActions]=\"showItemActions\" />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!showFullSkeleton && totalItemCount === 0 && !loadingMore) {\r\n <app-empty-state [message]=\"emptyMessage\" />\r\n }\r\n\r\n @if (!showFullSkeleton && totalItemCount > 0) {\r\n <div class=\"card-list__body\">\r\n <div class=\"card-list__scroll\" [ngStyle]=\"scrollAreaStyle\" (scroll)=\"onScroll($event)\"\r\n [attr.aria-busy]=\"loadingMore ? true : null\">\r\n <div class=\"card-list__stack\">\r\n @for (item of visibleItems; track trackFn($index, item)) {\r\n <app-data-card [title]=\"viewFor(item).title\" [subtitle]=\"viewFor(item).subtitle\"\r\n [avatarText]=\"viewFor(item).avatarText\" [variant]=\"variant\" [showActions]=\"showItemActions\"\r\n (edit)=\"edit.emit(item)\" (remove)=\"remove.emit(item)\" />\r\n }\r\n @if (loadingMore) {\r\n <span class=\"card-list__visually-hidden\">A carregar mais itens…</span>\r\n @for (_ of skeletonTailIndices(); track $index) {\r\n <app-skeleton-card [showActions]=\"showItemActions\" />\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showFooter) {\r\n <div class=\"card-list__status\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"card-list__status-text\">{{ scrollStatusLabel }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n inject,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DataGridComponent } from '../data-grid/data-grid.component';\nimport { CardListComponent } from '../card-list/card-list.component';\nimport type { DataGridColumn } from '../_models/data-grid-column.model';\nimport type { CardListMapFn } from '../_models/card-item-view.model';\n\n/** Limite de largura para tratar como “mobile” na escolha grid vs card. */\nexport const ADAPTIVE_DATA_VIEW_MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport type AdaptiveDataViewMode = 'grid' | 'card';\n\n/**\n * Escolhe **um** de `app-data-grid` ou `app-card-list` conforme breakpoint e preferências.\n * Nunca renderiza os dois em simultâneo.\n */\n@Component({\n selector: 'app-adaptive-data-view',\n imports: [DataGridComponent, CardListComponent],\n templateUrl: './adaptive-data-view.component.html',\n styleUrl: './adaptive-data-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AdaptiveDataViewComponent<T = unknown> implements OnInit {\n private readonly bp = inject(BreakpointObserver);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n\n @Input({ required: true }) items!: T[];\n @Input({ required: true }) gridColumns!: DataGridColumn<T>[];\n @Input({ required: true }) mapItem!: CardListMapFn<T>;\n\n @Input() pageSize = 15;\n @Input() gridHeight: string | null = 'min(28rem, 50vh)';\n @Input() cardScrollMaxHeight: string | null = 'min(28rem, 50vh)';\n @Input() emptyMessageGrid = 'Sem registros para mostrar.';\n @Input() emptyMessageCard = 'Sem itens para mostrar.';\n @Input() pagination = true;\n @Input() showActionsColumn = true;\n @Input() showCardItemActions = true;\n @Input() scrollBatchSize = 10;\n @Input() showCardFooter = false;\n /** Estado de carregamento reposto no grid ou na lista conforme a vista ativa. */\n @Input() loading = false;\n\n /**\n * Mostra uma linha de contagem **abaixo** da grade ou da lista (incluindo paginação interna).\n * Texto padrão em português; use `{count}` como marcador do número de linhas em `items`.\n */\n @Input() showResultCount = true;\n @Input() resultCountTemplate = '{count} registro(s)';\n\n /** Vista quando `ADAPTIVE_DATA_VIEW_MOBILE_QUERY` corresponde. Por padrão `card`. */\n @Input() mobileView: AdaptiveDataViewMode = 'card';\n /** Vista quando a tela é maior. Por padrão `grid`. */\n @Input() desktopView: AdaptiveDataViewMode = 'grid';\n\n @Output() readonly edit = new EventEmitter<T>();\n @Output() readonly remove = new EventEmitter<T>();\n @Output() readonly loadMore = new EventEmitter<void>();\n\n /** Corresponde ao breakpoint mobile. */\n isMobileLayout = false;\n\n ngOnInit(): void {\n this.bp\n .observe([ADAPTIVE_DATA_VIEW_MOBILE_QUERY])\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((state) => {\n this.isMobileLayout = state.matches;\n this.cdr.markForCheck();\n });\n }\n\n get effectiveKind(): AdaptiveDataViewMode {\n return this.isMobileLayout ? this.mobileView : this.desktopView;\n }\n\n get showGrid(): boolean {\n return this.effectiveKind === 'grid';\n }\n\n get showCard(): boolean {\n return this.effectiveKind === 'card';\n }\n\n get resultCountDisplay(): string {\n const tpl = (this.resultCountTemplate ?? '').trim();\n if (!tpl) {\n return '';\n }\n const n = this.items?.length ?? 0;\n return tpl.replaceAll('{count}', String(n));\n }\n}\n","<div class=\"adaptive-data-view\">\r\n <div class=\"adaptive-data-view__main\">\r\n @if (showGrid) {\r\n <app-data-grid\r\n [rows]=\"items\"\r\n [columns]=\"gridColumns\"\r\n [pageSize]=\"pageSize\"\r\n [pagination]=\"pagination\"\r\n [height]=\"gridHeight\"\r\n [emptyMessage]=\"emptyMessageGrid\"\r\n [showActionsColumn]=\"showActionsColumn\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n />\r\n }\r\n @if (showCard) {\r\n <app-card-list\r\n [items]=\"items\"\r\n [mapItem]=\"mapItem\"\r\n [scrollBatchSize]=\"scrollBatchSize\"\r\n [showItemActions]=\"showCardItemActions\"\r\n [showFooter]=\"showCardFooter\"\r\n [scrollMaxHeight]=\"cardScrollMaxHeight\"\r\n [emptyMessage]=\"emptyMessageCard\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n (loadMore)=\"loadMore.emit()\"\r\n />\r\n }\r\n </div>\r\n @if (showResultCount && resultCountDisplay) {\r\n <div class=\"adaptive-data-view__result-count\" aria-live=\"polite\">\r\n {{ resultCountDisplay }}\r\n </div>\r\n }\r\n</div>\r\n","import { NgClass } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport type { StatusBadgeSize, StatusBadgeVariant } from '../_models/data-display.models';\r\n\r\n/**\r\n * Etiqueta de estado (Ativo, Pendente, etc.) com fundo suave e cor semântica.\r\n */\r\n@Component({\n selector: 'app-status-badge',\n imports: [NgClass],\n templateUrl: './status-badge.component.html',\n styleUrl: './status-badge.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class StatusBadgeComponent {\r\n @Input({ required: true }) label!: string;\r\n\r\n @Input() variant: StatusBadgeVariant = 'neutral';\r\n\r\n /** Classes Font Awesome (ex.: `fa-solid fa-check`). */\r\n @Input() icon = '';\r\n\r\n @Input() size: StatusBadgeSize = 'md';\r\n\r\n @Input({ transform: booleanAttribute }) bordered = true;\r\n\r\n readonly variantClassMap: Record<StatusBadgeVariant, string> = {\r\n success: 'status-badge--success',\r\n error: 'status-badge--error',\r\n warning: 'status-badge--warning',\r\n info: 'status-badge--info',\r\n neutral: 'status-badge--neutral',\r\n };\r\n}\r\n","<span\r\n class=\"status-badge\"\r\n [ngClass]=\"variantClassMap[variant]\"\r\n [class.status-badge--sm]=\"size === 'sm'\"\r\n [class.status-badge--md]=\"size === 'md'\"\r\n [class.status-badge--bordered]=\"bordered\"\r\n [class.status-badge--no-border]=\"!bordered\"\r\n role=\"status\"\r\n>\r\n @if (icon.trim()) {\r\n <span class=\"status-badge__icon\" aria-hidden=\"true\">\r\n <i [attr.class]=\"icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n }\r\n <span class=\"status-badge__label\">{{ label }}</span>\r\n</span>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonTextComponent } from '../../loading/skeleton-loading';\r\nimport type { DetailsViewItem } from '../_models/data-display.models';\r\n\r\n/**\r\n * Lista de descrição (chave → valor) para detalhes, drawer ou resumo.\r\n * Modo **lista**: `[items]`; modo **composto**: projectar `app-details-field` no conteúdo.\r\n */\r\n@Component({\n selector: 'app-details-view',\n imports: [SkeletonTextComponent],\n templateUrl: './details-view.component.html',\n styleUrl: './details-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class DetailsViewComponent {\r\n @Input() items: readonly DetailsViewItem[] = [];\r\n\r\n /**\r\n * Se `true`, ignora `items` e renderiza só `<ng-content />` dentro de um `<dl>`\r\n * (usar com `app-details-field` para valores ricos).\r\n */\r\n @Input({ transform: booleanAttribute }) projectionOnly = false;\r\n\r\n /** `2` ativa grade em dois tempos em telas largas. */\r\n @Input() columns: 1 | 2 = 1;\r\n\r\n @Input({ transform: booleanAttribute }) loading = false;\r\n\r\n /** Texto quando `items` está vazio, sem `loading` e sem `projectionOnly`. */\r\n @Input() emptyMessage = 'Sem dados para mostrar.';\r\n\r\n readonly emDash = '—';\r\n\r\n /** Linhas de skeleton em modo loading. */\r\n readonly skeletonPairs = [0, 1, 2, 3];\r\n}\r\n","<section\r\n class=\"details-view\"\r\n [class.details-view--2col]=\"columns === 2\"\r\n [attr.aria-busy]=\"loading ? true : null\"\r\n>\r\n @if (loading) {\r\n <div class=\"details-view__loading\" aria-live=\"polite\">\r\n @for (_ of skeletonPairs; track $index) {\r\n <div class=\"details-view__skeleton-pair\">\r\n <app-skeleton-text [lines]=\"1\" lineHeight=\"0.65rem\" lastLineWidthPct=\"28\" />\r\n <app-skeleton-text [lines]=\"1\" lineHeight=\"0.85rem\" lastLineWidthPct=\"72\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (projectionOnly) {\r\n <dl\r\n class=\"details-view__list\"\r\n [class.details-view__list--2col]=\"columns === 2\"\r\n >\r\n <ng-content />\r\n </dl>\r\n } @else if (items.length > 0) {\r\n <dl\r\n class=\"details-view__list\"\r\n [class.details-view__list--2col]=\"columns === 2\"\r\n >\r\n @for (item of items; track $index) {\r\n <div class=\"details-view__pair\">\r\n <dt class=\"details-view__term\">{{ item.label }}</dt>\r\n <dd class=\"details-view__def\">{{ item.value?.trim() ? item.value : emDash }}</dd>\r\n </div>\r\n }\r\n </dl>\r\n } @else {\r\n <p class=\"details-view__empty\">{{ emptyMessage }}</p>\r\n }\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n/**\r\n * Uma linha chave → valor para usar **dentro** de `app-details-view` (projeção).\r\n * O host usa `display: contents` para manter `<dl>` > `<dt>`/`<dd>` válidos.\r\n */\r\n@Component({\r\n selector: 'app-details-field',\r\n standalone: true,\r\n templateUrl: './details-field.component.html',\r\n styleUrl: './details-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'details-field-host',\r\n style: 'display: contents',\r\n },\r\n})\r\nexport class DetailsFieldComponent {\r\n @Input({ required: true }) label!: string;\r\n}\r\n","<dt class=\"details-field__label\">{{ label }}</dt>\r\n<dd class=\"details-field__value\">\r\n <ng-content />\r\n</dd>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport type { StatCardDeltaTone } from '../_models/data-display.models';\r\n\r\n/**\r\n * Cartão de métrica (KPI) com a **mesma superfície** que `app-data-card` (mixin SCSS `data-card-shell`).\r\n * Não usa o selector `app-data-card` (esse componente é para linhas de lista com ações).\r\n */\r\n@Component({\r\n selector: 'app-stat-card',\r\n standalone: true,\r\n templateUrl: './stat-card.component.html',\r\n styleUrl: './stat-card.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StatCardComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input({ required: true }) value!: string;\r\n\r\n @Input() description = '';\r\n\r\n @Input() icon = '';\r\n\r\n /** Texto curto (ex.: +12% ou −3%). */\r\n @Input() delta = '';\r\n\r\n @Input() deltaTone: StatCardDeltaTone = 'neutral';\r\n\r\n @Input({ transform: booleanAttribute }) clickable = false;\r\n\r\n @Output() readonly cardActivate = new EventEmitter<void>();\r\n\r\n onActivate(ev: Event): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.cardActivate.emit();\r\n }\r\n\r\n onKeydown(ev: KeyboardEvent): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.cardActivate.emit();\r\n }\r\n }\r\n}\r\n","<article\r\n class=\"stat-card\"\r\n [class.stat-card--clickable]=\"clickable\"\r\n [attr.role]=\"clickable ? 'button' : null\"\r\n [attr.tabindex]=\"clickable ? 0 : null\"\r\n (click)=\"onActivate($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <div class=\"stat-card__header\">\r\n @if (icon.trim()) {\r\n <span class=\"stat-card__icon\" aria-hidden=\"true\">\r\n <i [attr.class]=\"icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n }\r\n <h3 class=\"stat-card__title\">{{ title }}</h3>\r\n </div>\r\n <p class=\"stat-card__value\">{{ value }}</p>\r\n @if (description.trim()) {\r\n <p class=\"stat-card__description\">{{ description }}</p>\r\n }\r\n @if (delta.trim()) {\r\n <p\r\n class=\"stat-card__delta\"\r\n [class.stat-card__delta--positive]=\"deltaTone === 'positive'\"\r\n [class.stat-card__delta--negative]=\"deltaTone === 'negative'\"\r\n [class.stat-card__delta--neutral]=\"deltaTone === 'neutral'\"\r\n >\r\n <span class=\"stat-card__delta-text\">{{ delta }}</span>\r\n </p>\r\n }\r\n</article>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n HostListener,\r\n Input,\r\n Output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Linha base para listas (`app-data-list`): texto, área de estado e ações projetadas.\r\n * Estrutura preparada para selecção futura (`selectable` apenas aplica classe visual).\r\n */\r\n@Component({\r\n selector: 'app-list-item',\r\n standalone: true,\r\n templateUrl: './list-item.component.html',\r\n styleUrl: './list-item.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ListItemComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input() subtitle = '';\r\n\r\n @Input({ transform: booleanAttribute }) clickable = false;\r\n\r\n /**\r\n * Reserva visual para selecção futura (sem lógica de modelo).\r\n */\r\n @Input({ transform: booleanAttribute }) selectable = false;\r\n\r\n @Output() readonly itemActivate = new EventEmitter<void>();\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(ev: KeyboardEvent): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.itemActivate.emit();\r\n }\r\n }\r\n\r\n onClick(ev: MouseEvent): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement | null;\r\n if (el?.closest('.list-item__actions')) {\r\n return;\r\n }\r\n this.itemActivate.emit();\r\n }\r\n}\r\n","<div\r\n class=\"list-item\"\r\n [class.list-item--clickable]=\"clickable\"\r\n [class.list-item--selectable]=\"selectable\"\r\n role=\"listitem\"\r\n [attr.tabindex]=\"clickable ? 0 : null\"\r\n (click)=\"onClick($event)\"\r\n>\r\n <div class=\"list-item__main\">\r\n <h4 class=\"list-item__title\">{{ title }}</h4>\r\n @if (subtitle.trim()) {\r\n <p class=\"list-item__subtitle\">{{ subtitle }}</p>\r\n }\r\n <div class=\"list-item__extra\">\r\n <ng-content />\r\n </div>\r\n </div>\r\n <div class=\"list-item__status\">\r\n <ng-content select=\"[list-item-status]\" />\r\n </div>\r\n <div class=\"list-item__actions\">\r\n <ng-content select=\"[list-item-actions]\" />\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input, booleanAttribute } from '@angular/core';\nimport { SkeletonListComponent } from '../../loading/skeleton-loading';\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\n\n/**\n * Lista vertical de registros com estados de loading e vazio padronizados.\n * O conteúdo de cada linha deve usar `app-list-item` (ou composição equivalente).\n */\n@Component({\n selector: 'app-data-list',\n imports: [SkeletonListComponent, EmptyStateComponent],\n templateUrl: './data-list.component.html',\n styleUrl: './data-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DataListComponent {\n @Input({ transform: booleanAttribute }) loading = false;\n\n @Input({ transform: booleanAttribute }) empty = false;\n\n @Input() emptyTitle = 'Sem registros';\n\n @Input() emptyDescription = '';\n\n @Input() emptyIconClass = 'fa-solid fa-inbox';\n\n /** Linhas de skeleton em modo loading. */\n @Input() skeletonRows = 5;\n}\n","<div class=\"data-list\" [attr.aria-busy]=\"loading ? true : null\">\r\n @if (loading) {\r\n <div class=\"data-list__loading\" role=\"status\" aria-live=\"polite\">\r\n <app-skeleton-list\r\n [rows]=\"skeletonRows\"\r\n [leading]=\"true\"\r\n rowGap=\"0.5rem\"\r\n lineHeight=\"0.85rem\"\r\n />\r\n </div>\r\n } @else if (empty) {\r\n <app-empty-state\r\n [message]=\"emptyTitle\"\r\n [description]=\"emptyDescription\"\r\n [iconClass]=\"emptyIconClass\"\r\n [embed]=\"true\"\r\n />\r\n } @else {\r\n <div class=\"data-list__items\" role=\"list\">\r\n <ng-content />\r\n </div>\r\n }\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\nlet dashboardSectionSeq = 0;\r\n\r\n/**\r\n * Bloco de dashboard: título, ações opcionais e conteúdo (stat-cards, listas, grades).\r\n * Superfície alinhada aos cartões da lib.\r\n */\r\n@Component({\r\n selector: 'app-dashboard-section',\r\n standalone: true,\r\n templateUrl: './dashboard-section.component.html',\r\n styleUrl: './dashboard-section.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DashboardSectionComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input() subtitle = '';\r\n\r\n readonly titleId = `app-dashboard-section-title-${++dashboardSectionSeq}`;\r\n}\r\n","<section class=\"dashboard-section\" [attr.aria-labelledby]=\"titleId\">\r\n <header class=\"dashboard-section__header\">\r\n <div class=\"dashboard-section__headline\">\r\n <h2 class=\"dashboard-section__title\" [id]=\"titleId\">{{ title }}</h2>\r\n @if (subtitle.trim()) {\r\n <p class=\"dashboard-section__subtitle\">{{ subtitle }}</p>\r\n }\r\n </div>\r\n <div class=\"dashboard-section__actions\">\r\n <ng-content select=\"[dashboard-section-actions]\" />\r\n </div>\r\n </header>\r\n <div class=\"dashboard-section__body\">\r\n <ng-content />\r\n </div>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { DataToolbarComponent } from '../data-toolbar/data-toolbar.component';\r\n\r\n/**\r\n * Barra auxiliar para tabelas / grades: envolve {@link DataToolbarComponent}\r\n * com áreas para pesquisa, contagem e ações.\r\n */\r\n@Component({\n selector: 'app-table-toolbar',\n imports: [DataToolbarComponent],\n templateUrl: './table-toolbar.component.html',\n styleUrl: './table-toolbar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class TableToolbarComponent {\r\n /** Ex.: `128 resultados` ou `Nenhum resultado`. */\r\n @Input() resultCountLabel = '';\r\n}\r\n","<app-data-toolbar class=\"table-toolbar__data-toolbar\">\r\n <div toolbar-start class=\"table-toolbar__start\">\r\n <div class=\"table-toolbar__search-filters\">\r\n <ng-content select=\"[tableToolbarSearch]\" />\r\n <ng-content select=\"[tableToolbarFilters]\" />\r\n </div>\r\n @if (resultCountLabel.trim()) {\r\n <p class=\"table-toolbar__count\" aria-live=\"polite\">{{ resultCountLabel }}</p>\r\n }\r\n </div>\r\n <div toolbar-end class=\"table-toolbar__end\">\r\n <ng-content select=\"[tableToolbarActions]\" />\r\n </div>\r\n</app-data-toolbar>\r\n","import { ChangeDetectionStrategy, Component, Input, booleanAttribute } from '@angular/core';\r\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\r\n\r\n/**\r\n * Estado vazio para tabelas ou listas densas — reutiliza {@link EmptyStateComponent}\r\n * e permite uma ação opcional (ex.: limpar filtros).\r\n */\r\n@Component({\n selector: 'app-table-empty-state',\n imports: [EmptyStateComponent],\n templateUrl: './table-empty-state.component.html',\n styleUrl: './table-empty-state.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class TableEmptyStateComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input() description = '';\r\n\r\n @Input() iconClass = 'fa-solid fa-table';\r\n\r\n @Input({ transform: booleanAttribute }) embed = true;\r\n}\r\n","<div class=\"table-empty-state\">\r\n <app-empty-state\r\n [message]=\"title\"\r\n [description]=\"description\"\r\n [iconClass]=\"iconClass\"\r\n [embed]=\"embed\"\r\n />\r\n <div class=\"table-empty-state__action\">\r\n <ng-content select=\"[tableEmptyAction]\" />\r\n </div>\r\n</div>\r\n","import type { MenuNodeItem } from '../_models/menu-item.model';\r\n\r\n/** Remove marcas de acento (NFD) e passa a minúsculas — para pesquisa insensível a acentos e capitalização. */\r\nexport function normalizeSearchText(raw: string): string {\r\n const t = raw.trim().toLowerCase();\r\n return t.normalize('NFD').replace(/\\p{M}/gu, '');\r\n}\r\n\r\nfunction matchesQuery(\r\n qNormalized: string,\r\n ...parts: (string | undefined)[]\r\n): boolean {\r\n return parts.some((p) => normalizeSearchText(p ?? '').includes(qNormalized));\r\n}\r\n\r\n/**\r\n * Filtra a árvore de menu: grupo ou submenu mantém-se se o rótulo casar ou se algum descendente casar.\r\n * Divisores de primeiro nível são omitidos no resultado filtrado.\r\n */\r\nexport function filterMenuNodesByQuery<T>(\r\n nodes: readonly MenuNodeItem<T>[] | undefined,\r\n rawQuery: string,\r\n): MenuNodeItem<T>[] {\r\n const q = normalizeSearchText(rawQuery);\r\n if (!nodes?.length) {\r\n return [];\r\n }\r\n if (!q) {\r\n return [...nodes];\r\n }\r\n\r\n const out: MenuNodeItem<T>[] = [];\r\n for (const node of nodes) {\r\n const filtered = filterOneNode(node, q, rawQuery);\r\n if (filtered) {\r\n out.push(filtered);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction filterOneNode<T>(\r\n node: MenuNodeItem<T>,\r\n qNormalized: string,\r\n rawQuery: string,\r\n): MenuNodeItem<T> | null {\r\n if (node.kind === 'divider') {\r\n return null;\r\n }\r\n if (node.kind === 'item') {\r\n return matchesQuery(qNormalized, node.label, node.description)\r\n ? node\r\n : null;\r\n }\r\n if (node.kind === 'submenu') {\r\n if (matchesQuery(qNormalized, node.label, node.description)) {\r\n return node;\r\n }\r\n const inner = filterMenuNodesByQuery(node.items, rawQuery);\r\n return inner.length > 0 ? { ...node, items: inner } : null;\r\n }\r\n if (node.kind === 'group') {\r\n if (node.label != null && matchesQuery(qNormalized, node.label)) {\r\n return node;\r\n }\r\n const inner = filterMenuNodesByQuery(node.items, rawQuery);\r\n return inner.length > 0 ? { ...node, items: inner } : null;\r\n }\r\n return null;\r\n}\r\n","import { FormsModule } from '@angular/forms';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\nimport type { AppTheme, StructraTheme } from '../../theme';\nimport { filterMenuNodesByQuery } from '../_utils/filter-menu-nodes.util';\nimport { TextFieldComponent } from '../../fields/input-fields';\nimport { MenuListBodyComponent } from './menu-list-body.component';\n\n@Component({\n selector: 'app-menu-list',\n templateUrl: './menu-list.component.html',\n styleUrl: './menu-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [CdkScrollable],\n imports: [FormsModule, TextFieldComponent, MenuListBodyComponent, CdkScrollable],\n})\nexport class MenuListComponent<T = string> implements OnChanges {\n private readonly cdr = inject(ChangeDetectorRef);\n\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input() menuId = 'app-menu';\n\n @Input({ transform: booleanAttribute }) dense = false;\n\n @Input({ transform: booleanAttribute }) nested = false;\n\n @Input() selectedItemId: T | null = null;\n\n @Input({ transform: booleanAttribute }) compressText = false;\n\n @Input() clickToOpen = true;\n\n @Input({ transform: booleanAttribute }) groupCollapsible = true;\n\n /** Repasse para {@link MenuListBodyComponent.groupDefaultExpansion}. */\n @Input() groupDefaultExpansion: 'all' | 'first' = 'all';\n\n @Input({ transform: booleanAttribute }) searchable = false;\n\n @Input() searchPlaceholder = 'Pesquisar';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n\n @Output() readonly closeRequest = new EventEmitter<void>();\n\n @Output() readonly submenuBack = new EventEmitter<void>();\n\n @ViewChild(MenuListBodyComponent) private body?: MenuListBodyComponent<T>;\n\n searchQuery = '';\n\n displayItems: MenuNodeItem<T>[] = [];\n\n get showSearchField(): boolean {\n return this.searchable && !this.nested && !this.compressText;\n }\n\n get expandAllGroupsWhenSearching(): boolean {\n return (\n this.searchable &&\n !this.nested &&\n !this.compressText &&\n this.groupCollapsible &&\n this.searchQuery.trim().length > 0\n );\n }\n\n get showSearchNoResults(): boolean {\n return (\n this.showSearchField &&\n this.searchQuery.trim().length > 0 &&\n this.displayItems.length === 0\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes['items'] ||\n changes['searchable'] ||\n changes['compressText'] ||\n changes['nested']\n ) {\n this.syncDisplayItems();\n }\n if (\n changes['selectedItemId'] ||\n changes['items'] ||\n changes['searchable'] ||\n changes['compressText'] ||\n changes['dense'] ||\n changes['menuId'] ||\n changes['clickToOpen'] ||\n changes['groupCollapsible'] ||\n changes['groupDefaultExpansion']\n ) {\n this.cdr.markForCheck();\n }\n }\n\n onSearchQueryInput(value: string | null): void {\n this.searchQuery = value ?? '';\n this.body?.closeOpenSubmenu();\n this.syncDisplayItems();\n this.cdr.markForCheck();\n }\n\n resetHighlight(): void {\n this.body?.resetHighlight();\n }\n\n focusFirstOption(): void {\n this.body?.focusFirstOption();\n }\n\n private syncDisplayItems(): void {\n if (!this.searchable || this.nested || this.compressText) {\n this.displayItems = [...(this.items ?? [])];\n } else {\n this.displayItems = filterMenuNodesByQuery(this.items ?? [], this.searchQuery);\n }\n }\n}\n","<app-menu-list-body\n [items]=\"displayItems\"\n [menuId]=\"menuId\"\n [nested]=\"nested\"\n [dense]=\"dense\"\n [compressText]=\"compressText\"\n [groupCollapsible]=\"groupCollapsible\"\n [groupDefaultExpansion]=\"groupDefaultExpansion\"\n [clickToOpen]=\"clickToOpen\"\n [selectedItemId]=\"selectedItemId\"\n [appTheme]=\"appTheme()\"\n [expandAllGroupsInitially]=\"expandAllGroupsWhenSearching\"\n (itemSelect)=\"itemSelect.emit($event)\"\n (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"submenuBack.emit()\"\n>\n @if (showSearchField) {\n <div class=\"menu-list__search\" role=\"search\">\n <app-text-field\n class=\"menu-list__search-field\"\n [id]=\"menuId + '-search'\"\n [name]=\"menuId + '-menu-search'\"\n size=\"sm\"\n [ngModel]=\"searchQuery\"\n (ngModelChange)=\"onSearchQueryInput($event)\"\n [placeholder]=\"searchPlaceholder\"\n [label]=\"''\"\n [showPrefixIcon]=\"true\"\n prefixIcon=\"fa-solid fa-magnifying-glass\"\n [clearable]=\"true\"\n [autocomplete]=\"false\"\n />\n </div>\n }\n @if (showSearchNoResults) {\n <p class=\"menu-list__search-empty\">Nenhum item encontrado</p>\n }\n</app-menu-list-body>\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n Signal,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { Subscription, fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n getThemeClassList,\n injectEffectiveThemeId,\n type AppTheme,\n type AppThemeId,\n type StructraTheme,\n} from '../../theme';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\nimport { MenuListComponent } from '../menu-list/menu-list.component';\n\nconst PANEL_MIN_W = 200;\nconst VIEWPORT_PAD = 8;\n\n@Component({\n selector: 'app-context-menu',\n imports: [MenuListComponent, NgClass],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ContextMenuComponent<T = string> implements OnDestroy {\n private readonly overlay: Overlay;\n private readonly vcr: ViewContainerRef;\n private readonly cdr: ChangeDetectorRef;\n\n /** Igual a `[appTheme]` na lib; omitir = tema global. */\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n readonly effectiveThemeId: Signal<AppThemeId>;\n\n constructor(\n overlay: Overlay,\n vcr: ViewContainerRef,\n cdr: ChangeDetectorRef,\n ) {\n this.overlay = overlay;\n this.vcr = vcr;\n this.cdr = cdr;\n this.effectiveThemeId = injectEffectiveThemeId(this.appTheme);\n }\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n @Input() menuId = '';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n\n @ViewChild('menuTpl', { static: true }) menuTpl!: TemplateRef<unknown>;\n @ViewChild(MenuListComponent) private menuList?: MenuListComponent<T>;\n\n private overlayRef: OverlayRef | null = null;\n private escSub: Subscription | null = null;\n\n private readonly generatedId = `app-ctx-${Math.random().toString(36).slice(2, 9)}`;\n\n readonly panelThemeNgClass = computed(() => {\n const [base, token] = getThemeClassList(this.effectiveThemeId());\n return { [base]: true, [token]: true };\n });\n\n get resolvedMenuId(): string {\n return this.menuId.trim() || this.generatedId;\n }\n\n ngOnDestroy(): void {\n this.disposeOverlay();\n }\n\n onContextMenu(ev: MouseEvent): void {\n if (this.disabled) {\n return;\n }\n ev.preventDefault();\n ev.stopPropagation();\n this.openAt(ev.clientX, ev.clientY);\n }\n\n private openAt(clientX: number, clientY: number): void {\n this.disposeOverlay();\n\n const left = Math.min(\n clientX,\n window.innerWidth - PANEL_MIN_W - VIEWPORT_PAD,\n );\n const top = Math.min(\n clientY,\n window.innerHeight - VIEWPORT_PAD,\n );\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n panelClass: [...getThemeClassList(this.effectiveThemeId())],\n scrollStrategy: this.overlay.scrollStrategies.close(),\n positionStrategy: this.overlay\n .position()\n .global()\n .left(`${Math.max(VIEWPORT_PAD, left)}px`)\n .top(`${Math.max(VIEWPORT_PAD, top)}px`),\n });\n\n const portal = new TemplatePortal(this.menuTpl, this.vcr);\n this.overlayRef.attach(portal);\n\n this.overlayRef.backdropClick().subscribe(() => this.disposeOverlay());\n\n this.escSub = fromEvent<KeyboardEvent>(document, 'keydown')\n .pipe(filter((e) => e.key === 'Escape'))\n .subscribe(() => this.disposeOverlay());\n\n queueMicrotask(() => {\n this.menuList?.resetHighlight();\n this.cdr.markForCheck();\n });\n }\n\n private disposeOverlay(): void {\n this.escSub?.unsubscribe();\n this.escSub = null;\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n }\n\n onItemSelect(id: T): void {\n this.itemSelect.emit(id);\n this.disposeOverlay();\n }\n\n onCloseRequest(): void {\n this.disposeOverlay();\n }\n}\n","<span class=\"context-menu__host\" (contextmenu)=\"onContextMenu($event)\">\r\n <ng-content />\r\n</span>\r\n\r\n<ng-template #menuTpl>\r\n <div class=\"context-menu__surface\" [ngClass]=\"panelThemeNgClass()\" (click)=\"$event.stopPropagation()\">\r\n <app-menu-list\r\n [appTheme]=\"effectiveThemeId()\"\r\n [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\r\n [clickToOpen]=\"false\"\r\n (itemSelect)=\"onItemSelect($event)\"\r\n (closeRequest)=\"onCloseRequest()\"\r\n />\r\n </div>\r\n</ng-template>\r\n","/** Lado de ancoragem do drawer. */\r\nexport enum DrawerSide {\r\n Left = 'left',\r\n Right = 'right',\r\n Bottom = 'bottom',\r\n}\r\n","/** Larguras padronizadas do painel lateral (drawer). */\r\nexport enum DrawerSize {\r\n Sm = 'sm',\r\n Md = 'md',\r\n Lg = 'lg',\r\n}\r\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n Renderer2,\n SimpleChanges,\n ViewChild,\n afterNextRender,\n booleanAttribute,\n effect,\n inject,\n} from '@angular/core';\nimport { AppThemeService } from '../../theme/app-theme.service';\nimport { applyOptionalThemeHostClasses } from '../../theme/theme-host-apply';\nimport { DrawerSide } from '../_models/drawer-side.model';\nimport { DrawerSize } from '../_models/drawer-size.model';\n\nlet drawerTitleSeq = 0;\n\n@Component({\n selector: 'app-drawer',\n imports: [NgClass],\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'app-drawer-host',\n '[class.app-drawer-host--open]': 'open',\n }\n})\nexport class DrawerComponent implements OnChanges, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly appTheme = inject(AppThemeService);\n\n @Input({ transform: booleanAttribute }) open = false;\n\n @Input() side: DrawerSide = DrawerSide.Right;\n\n @Input() size: DrawerSize = DrawerSize.Md;\n\n /** `title=\"…\"` no template — evita colisão com `HTMLElement.title` no host. */\n @Input('title') drawerHeading = '';\n\n @Input({ transform: booleanAttribute }) showCloseButton = true;\n\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n @ViewChild('panelRef') private panelRef?: ElementRef<HTMLElement>;\n\n readonly DrawerSide = DrawerSide;\n readonly DrawerSize = DrawerSize;\n\n readonly titleId = `app-drawer-title-${++drawerTitleSeq}`;\n\n private focusPreOpen: HTMLElement | null = null;\n\n constructor() {\n /**\n * O host pode ir para `document.body` ao abrir — sem isto, perde-se `.app-library-theme.theme-*`\n * herdado da app e os tokens voltam ao azul de `:root`.\n */\n effect(() => {\n const id = this.appTheme.activeThemeId();\n applyOptionalThemeHostClasses(this.renderer, this.hostEl.nativeElement, id);\n });\n }\n\n /** Igual ao `app-dialog`: backdrop + painel no `body` para `backdrop-filter` correcto. */\n private bodyRestoreParent: HTMLElement | null = null;\n private bodyRestoreNext: ChildNode | null = null;\n\n get panelClasses(): Record<string, boolean> {\n return {\n [`app-drawer__panel--side-${this.side}`]: true,\n [`app-drawer__panel--size-${this.size}`]: true,\n };\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['open']) {\n return;\n }\n if (this.open) {\n this.attachHostToBody();\n const a = document.activeElement;\n if (a instanceof HTMLElement && a !== document.body) {\n this.focusPreOpen = a;\n }\n /**\n * Garante CD na árvore projectada (sidebar / app-menu-list) com OnPush; sem isto, o\n * realce `option--selected` só surgia após p.ex. `mouseenter` na lista.\n */\n this.cdr.markForCheck();\n afterNextRender(\n () => {\n this.cdr.markForCheck();\n if (this.open) {\n this.panelRef?.nativeElement?.focus({ preventScroll: true });\n }\n },\n { injector: this.injector },\n );\n } else if (changes['open'].previousValue === true) {\n this.detachHostFromBody();\n this.restoreFocus();\n }\n }\n\n ngOnDestroy(): void {\n this.detachHostFromBody();\n }\n\n private attachHostToBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement === document.body) {\n return;\n }\n this.bodyRestoreParent = el.parentElement;\n this.bodyRestoreNext = el.nextSibling;\n document.body.appendChild(el);\n }\n\n private detachHostFromBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement !== document.body) {\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n return;\n }\n const parent = this.bodyRestoreParent;\n const next = this.bodyRestoreNext;\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n if (parent && document.body.contains(parent)) {\n if (next && next.parentNode === parent) {\n parent.insertBefore(el, next);\n return;\n }\n parent.appendChild(el);\n return;\n }\n const appRoot = document.querySelector('app-root');\n if (appRoot) {\n appRoot.appendChild(el);\n }\n }\n\n onBackdropClick(): void {\n this.requestClose();\n }\n\n onCloseClick(): void {\n this.requestClose();\n }\n\n onPanelKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'Escape') {\n ev.preventDefault();\n this.requestClose();\n }\n }\n\n requestClose(): void {\n if (!this.open) {\n return;\n }\n this.openChange.emit(false);\n }\n\n private restoreFocus(): void {\n if (this.focusPreOpen && document.contains(this.focusPreOpen)) {\n this.focusPreOpen.focus({ preventScroll: true });\n }\n this.focusPreOpen = null;\n }\n}\n","@if (open) {\r\n <div\r\n class=\"app-drawer__backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n\r\n <aside\r\n #panelRef\r\n class=\"app-drawer__panel\"\r\n [ngClass]=\"panelClasses\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"drawerHeading.trim() ? titleId : null\"\r\n tabindex=\"-1\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n <header\r\n class=\"app-drawer__header\"\r\n [class.app-drawer__header--no-title]=\"!drawerHeading.trim()\"\r\n >\r\n @if (drawerHeading.trim()) {\r\n <h2 class=\"app-drawer__title\" [id]=\"titleId\">{{ drawerHeading }}</h2>\r\n }\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-drawer__close\"\r\n aria-label=\"Fechar painel\"\r\n (click)=\"onCloseClick()\"\r\n >\r\n <span class=\"app-drawer__close-x\" aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n\r\n <div class=\"app-drawer__body\">\r\n <ng-content />\r\n </div>\r\n\r\n <footer class=\"app-drawer__footer\">\r\n <ng-content select=\"[appDrawerFooter]\" />\r\n </footer>\r\n </aside>\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\nimport { DropdownMenuComponent } from '../dropdown-menu/dropdown-menu.component';\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\n\n/**\n * Menu de ações padrão: mesmo comportamento do `dropdown-menu` com trigger «…» (overflow).\n * Mantém a API de itens existente (`MenuNodeItem`).\n */\n@Component({\n selector: 'app-action-menu',\n imports: [DropdownMenuComponent],\n templateUrl: './action-menu.component.html',\n styleUrl: './action-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ActionMenuComponent<T = string> {\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\n\n @Input() minWidthPx = 200;\n\n @Input() menuId = '';\n\n /** Texto acessível do botão de gatilho. */\n @Input() triggerLabel = 'Mais ações';\n\n /** O painel não segue a largura do botão (ícone estreito). */\n @Input({ transform: booleanAttribute }) matchTriggerWidth = false;\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n readonly MenuDropdownPlacement = MenuDropdownPlacement;\n}\n","<app-dropdown-menu\r\n class=\"action-menu\"\r\n [items]=\"items\"\r\n [placement]=\"placement\"\r\n [minWidthPx]=\"minWidthPx\"\r\n [matchTriggerWidth]=\"matchTriggerWidth\"\r\n [menuId]=\"menuId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n (openChange)=\"openChange.emit($event)\"\r\n>\r\n <button type=\"button\" class=\"action-menu__trigger\" [attr.aria-label]=\"triggerLabel\">\r\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\r\n </button>\r\n</app-dropdown-menu>\r\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n TemplateRef,\n booleanAttribute,\n computed,\n inject,\n} from '@angular/core';\nimport {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n Overlay,\n type ConnectedPosition,\n type ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { AppThemeService } from '../../theme';\n\n/**\n * Fundação reutilizável para painéis ancorados (tooltip, popover, autocomplete, datepicker, etc.).\n * Usa `CdkConnectedOverlay` + tema da lib.\n *\n * @see `DropdownBaseComponent` — overlay para painéis de **campo** (menus/select): backdrop e fecho por omissão\n * alinhados a esse caso; mantido separado para não quebrar contratos públicos.\n */\n@Component({\n selector: 'app-anchored-overlay',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgClass, NgTemplateOutlet],\n templateUrl: './anchored-overlay.component.html',\n styleUrl: './anchored-overlay.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AnchoredOverlayComponent {\n private readonly appTheme = inject(AppThemeService);\n private readonly overlay = inject(Overlay);\n\n @Input({ transform: booleanAttribute }) open = false;\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n @Input({ required: true }) panelTemplate!: TemplateRef<unknown>;\n\n @Input() connectedPositions: ConnectedPosition[] = [];\n\n @Input({ transform: booleanAttribute }) pushConnectedOverlay = true;\n\n @Input({ transform: booleanAttribute }) hasBackdrop = false;\n\n @Input({ transform: booleanAttribute }) closeOnEscape = true;\n\n /** Fecha ao clicar fora do painel e fora da âncora (popover, dialogs leves). */\n @Input({ transform: booleanAttribute }) closeOnOutsideClick = false;\n\n @Input() panelWidthPx: number | null = null;\n @Input() panelMinWidthPx: number | null = null;\n @Input() panelMaxWidthPx: number | null = null;\n\n /**\n * Estratégia de scroll (predefinição: reposicionar; `close` para fechar ao scroll em certos modais).\n */\n @Input() scrollStrategy: ScrollStrategy | null = null;\n\n readonly overlayPanelClasses = computed((): string[] => [\n ...this.appTheme.themeClassList(),\n 'anchored-overlay__pane',\n ]);\n\n readonly panelThemeNgClass = computed(() => this.appTheme.themeClassMap());\n\n readonly defaultScrollStrategy = this.overlay.scrollStrategies.reposition();\n\n get effectiveScrollStrategy(): ScrollStrategy {\n return this.scrollStrategy ?? this.defaultScrollStrategy;\n }\n\n get overlayWidthCss(): number | string | undefined {\n const w = this.panelWidthPx;\n if (w != null && w > 0) {\n return w;\n }\n return undefined;\n }\n\n get overlayMinWidthCss(): number | string | undefined {\n const w = this.panelMinWidthPx;\n if (w != null && w > 0) {\n return w;\n }\n return undefined;\n }\n\n onBackdropClick(): void {\n this.setOpen(false);\n }\n\n onOverlayOutsideClick(): void {\n if (!this.closeOnOutsideClick) {\n return;\n }\n this.setOpen(false);\n }\n\n onOverlayKeydown(ev: KeyboardEvent): void {\n if (this.closeOnEscape && ev.key === 'Escape') {\n ev.preventDefault();\n this.setOpen(false);\n }\n }\n\n onDetach(): void {\n this.setOpen(false);\n }\n\n setOpen(next: boolean): void {\n if (this.open === next) {\n return;\n }\n this.open = next;\n this.openChange.emit(next);\n }\n}\n","<div class=\"anchored-overlay\">\n <span class=\"anchored-overlay__origin\" cdkOverlayOrigin #anchorOrigin=\"cdkOverlayOrigin\">\n <ng-content />\n </span>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayOrigin]=\"anchorOrigin\"\n [cdkConnectedOverlayPositions]=\"connectedPositions\"\n [cdkConnectedOverlayPush]=\"pushConnectedOverlay\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayScrollStrategy]=\"effectiveScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayWidth]=\"$any(overlayWidthCss)\"\n [cdkConnectedOverlayMinWidth]=\"$any(overlayMinWidthCss)\"\n [cdkConnectedOverlayDisableClose]=\"false\"\n (backdropClick)=\"onBackdropClick()\"\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n (detach)=\"onDetach()\"\n >\n <div\n class=\"anchored-overlay__surface\"\n [ngClass]=\"panelThemeNgClass()\"\n [style.max-width.px]=\"panelMaxWidthPx != null && panelMaxWidthPx > 0 ? panelMaxWidthPx : null\"\n role=\"presentation\"\n >\n <ng-container [ngTemplateOutlet]=\"panelTemplate\" />\n </div>\n </ng-template>\n</div>\n","/**\r\n * Posição preferencial do painel em relação à âncora (com fallbacks via CDK `push` / ordem de posições).\r\n */\r\nexport enum OverlayPlacement {\r\n Top = 'top',\r\n Bottom = 'bottom',\r\n Left = 'left',\r\n Right = 'right',\r\n}\r\n","import type { ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { OverlayPlacement } from '../_models/overlay-placement.model';\r\n\r\nconst DEFAULT_GAP = 8;\r\n\r\n/**\r\n * Constrói posições CDK para overlay ancorado (tooltip, popover, autocomplete, etc.).\r\n * Inclui alternativas para inverter quando não há espaço (`push` no componente).\r\n *\r\n * Menus dropdown usam {@link menuConnectedPositions} em `menus/_utils` (alinhamento `start`, gap tipicamente menor).\r\n */\r\nexport function anchoredOverlayPositions(\r\n placement: OverlayPlacement,\r\n offsetPx = DEFAULT_GAP,\r\n): ConnectedPosition[] {\r\n const o = offsetPx;\r\n switch (placement) {\r\n case OverlayPlacement.Top:\r\n return [\r\n {\r\n originX: 'center',\r\n originY: 'top',\r\n overlayX: 'center',\r\n overlayY: 'bottom',\r\n offsetY: -o,\r\n },\r\n {\r\n originX: 'center',\r\n originY: 'bottom',\r\n overlayX: 'center',\r\n overlayY: 'top',\r\n offsetY: o,\r\n },\r\n ];\r\n case OverlayPlacement.Bottom:\r\n return [\r\n {\r\n originX: 'center',\r\n originY: 'bottom',\r\n overlayX: 'center',\r\n overlayY: 'top',\r\n offsetY: o,\r\n },\r\n {\r\n originX: 'center',\r\n originY: 'top',\r\n overlayX: 'center',\r\n overlayY: 'bottom',\r\n offsetY: -o,\r\n },\r\n ];\r\n case OverlayPlacement.Left:\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'center',\r\n overlayX: 'end',\r\n overlayY: 'center',\r\n offsetX: -o,\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'center',\r\n overlayX: 'start',\r\n overlayY: 'center',\r\n offsetX: o,\r\n },\r\n ];\r\n case OverlayPlacement.Right:\r\n return [\r\n {\r\n originX: 'end',\r\n originY: 'center',\r\n overlayX: 'start',\r\n overlayY: 'center',\r\n offsetX: o,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'center',\r\n overlayX: 'end',\r\n overlayY: 'center',\r\n offsetX: -o,\r\n },\r\n ];\r\n default:\r\n return anchoredOverlayPositions(OverlayPlacement.Bottom, o);\r\n }\r\n}\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n/**\r\n * Marca um `ng-template` como conteúdo do painel do tooltip (em alternativa a `text`).\r\n */\r\n@Directive({\r\n selector: 'ng-template[appTooltipPanel]',\r\n standalone: true,\r\n})\r\nexport class TooltipPanelTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n Input,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { AnchoredOverlayComponent } from '../anchored-overlay/anchored-overlay.component';\r\nimport { OverlayPlacement } from '../_models/overlay-placement.model';\r\nimport { anchoredOverlayPositions } from '../_utils/anchored-overlay-positions.util';\r\nimport { TooltipPanelTemplateDirective } from './tooltip-panel-template.directive';\r\n\r\nlet tooltipSeq = 0;\r\n\r\n/**\r\n * Tooltip ancorado ao conteúdo projectado (trigger).\r\n * — Texto: `text` ou `ng-template` com `appTooltipPanel`.\r\n */\r\n@Component({\n selector: 'app-tooltip',\n imports: [AnchoredOverlayComponent, NgTemplateOutlet],\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class TooltipComponent {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @Input() text = '';\r\n\r\n @Input() placement: OverlayPlacement = OverlayPlacement.Top;\r\n\r\n @Input() offsetPx = 8;\r\n\r\n @Input() showDelayMs = 200;\r\n @Input() hideDelayMs = 0;\r\n\r\n @Input({ transform: booleanAttribute }) disabled = false;\r\n\r\n @ContentChild(TooltipPanelTemplateDirective)\r\n private readonly panelDirective?: TooltipPanelTemplateDirective;\r\n\r\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\r\n\r\n readonly placementEnum = OverlayPlacement;\r\n\r\n readonly tooltipId = `app-tooltip-${++tooltipSeq}`;\r\n\r\n open = false;\r\n\r\n private showTimer: ReturnType<typeof setTimeout> | null = null;\r\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n get panelContentTpl(): TemplateRef<unknown> | null {\r\n return this.panelDirective?.templateRef ?? null;\r\n }\r\n\r\n get positions() {\r\n return anchoredOverlayPositions(this.placement, this.offsetPx);\r\n }\r\n\r\n get describedByWhenOpen(): string | null {\r\n return this.open && !this.disabled ? this.tooltipId : null;\r\n }\r\n\r\n onTriggerMouseEnter(): void {\r\n this.scheduleShow();\r\n }\r\n\r\n onTriggerMouseLeave(): void {\r\n this.scheduleHide();\r\n }\r\n\r\n onTriggerFocusIn(): void {\r\n this.scheduleShow();\r\n }\r\n\r\n onTriggerFocusOut(): void {\r\n this.scheduleHide();\r\n }\r\n\r\n onPanelMouseEnter(): void {\r\n this.cancelHide();\r\n }\r\n\r\n onPanelMouseLeave(): void {\r\n this.scheduleHide();\r\n }\r\n\r\n private scheduleShow(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.cancelHide();\r\n this.cancelShow();\r\n this.showTimer = setTimeout(() => {\r\n this.showTimer = null;\r\n this.open = true;\r\n this.cdr.markForCheck();\r\n }, this.showDelayMs);\r\n }\r\n\r\n private scheduleHide(): void {\r\n this.cancelShow();\r\n this.cancelHide();\r\n this.hideTimer = setTimeout(() => {\r\n this.hideTimer = null;\r\n this.open = false;\r\n this.cdr.markForCheck();\r\n }, this.hideDelayMs);\r\n }\r\n\r\n private cancelShow(): void {\r\n if (this.showTimer) {\r\n clearTimeout(this.showTimer);\r\n this.showTimer = null;\r\n }\r\n }\r\n\r\n private cancelHide(): void {\r\n if (this.hideTimer) {\r\n clearTimeout(this.hideTimer);\r\n this.hideTimer = null;\r\n }\r\n }\r\n\r\n onAnchoredOpenChange(next: boolean): void {\r\n this.open = next;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-anchored-overlay\r\n [open]=\"open\"\r\n (openChange)=\"onAnchoredOpenChange($event)\"\r\n [panelTemplate]=\"panelTpl\"\r\n [connectedPositions]=\"positions\"\r\n [pushConnectedOverlay]=\"true\"\r\n [hasBackdrop]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n [closeOnOutsideClick]=\"false\"\r\n>\r\n <span\r\n class=\"tooltip__trigger\"\r\n [attr.aria-describedby]=\"describedByWhenOpen\"\r\n (mouseenter)=\"onTriggerMouseEnter()\"\r\n (mouseleave)=\"onTriggerMouseLeave()\"\r\n (focusin)=\"onTriggerFocusIn()\"\r\n (focusout)=\"onTriggerFocusOut()\"\r\n >\r\n <ng-content />\r\n </span>\r\n</app-anchored-overlay>\r\n\r\n<ng-template #panelTpl>\r\n <div\r\n class=\"tooltip__panel\"\r\n [id]=\"tooltipId\"\r\n role=\"tooltip\"\r\n (mouseenter)=\"onPanelMouseEnter()\"\r\n (mouseleave)=\"onPanelMouseLeave()\"\r\n >\r\n @if (panelContentTpl) {\r\n <ng-container [ngTemplateOutlet]=\"panelContentTpl\" />\r\n } @else {\r\n {{ text }}\r\n }\r\n </div>\r\n</ng-template>\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[appPopoverBody]',\r\n standalone: true,\r\n})\r\nexport class PopoverBodyTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[appPopoverFooter]',\r\n standalone: true,\r\n})\r\nexport class PopoverFooterTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { AnchoredOverlayComponent } from '../anchored-overlay/anchored-overlay.component';\r\nimport { OverlayPlacement } from '../_models/overlay-placement.model';\r\nimport { anchoredOverlayPositions } from '../_utils/anchored-overlay-positions.util';\r\nimport { PopoverBodyTemplateDirective } from './popover-body-template.directive';\r\nimport { PopoverFooterTemplateDirective } from './popover-footer-template.directive';\r\n\r\nlet popoverSeq = 0;\r\n\r\n/**\r\n * Painel flutuante ancorado (ações contextuais, ajuda rica, mini-formulários).\r\n * Conteúdo: `ng-template appPopoverBody` obrigatório; `appPopoverFooter` opcional; trigger com `appPopoverTrigger`.\r\n */\r\n@Component({\n selector: 'app-popover',\n imports: [AnchoredOverlayComponent, NgTemplateOutlet],\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class PopoverComponent {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @Input() title = '';\r\n\r\n /** Modo controlado: `open` + `openChange`. */\r\n @Input({ transform: booleanAttribute }) open = false;\r\n @Output() readonly openChange = new EventEmitter<boolean>();\r\n\r\n @Input() placement: OverlayPlacement = OverlayPlacement.Bottom;\r\n\r\n @Input() offsetPx = 8;\r\n\r\n @Input() minWidthPx = 220;\r\n\r\n @Input() maxWidthPx = 360;\r\n\r\n /** Rótulo acessível quando não há título visível. */\r\n @Input() ariaLabel = '';\r\n\r\n @ContentChild(PopoverBodyTemplateDirective)\r\n readonly bodyDirective?: PopoverBodyTemplateDirective;\r\n\r\n @ContentChild(PopoverFooterTemplateDirective)\r\n readonly footerDirective?: PopoverFooterTemplateDirective;\r\n\r\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\r\n\r\n readonly popoverId = `app-popover-${++popoverSeq}`;\r\n\r\n get bodyTpl(): TemplateRef<unknown> | null {\r\n return this.bodyDirective?.templateRef ?? null;\r\n }\r\n\r\n get footerTpl(): TemplateRef<unknown> | null {\r\n return this.footerDirective?.templateRef ?? null;\r\n }\r\n\r\n get positions() {\r\n return anchoredOverlayPositions(this.placement, this.offsetPx);\r\n }\r\n\r\n get titleId(): string {\r\n return `${this.popoverId}-title`;\r\n }\r\n\r\n get effectiveAriaLabel(): string | null {\r\n return this.ariaLabel?.trim() || this.title?.trim() || null;\r\n }\r\n\r\n onTriggerClick(ev: Event): void {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.toggle();\r\n }\r\n\r\n toggle(): void {\r\n this.setOpen(!this.open);\r\n }\r\n\r\n /** Sincroniza com `app-anchored-overlay` e notifica o pai (`[(open)]`). */\r\n setOpen(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.openChange.emit(next);\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-anchored-overlay\r\n [open]=\"open\"\r\n (openChange)=\"setOpen($event)\"\r\n [panelTemplate]=\"panelTpl\"\r\n [connectedPositions]=\"positions\"\r\n [pushConnectedOverlay]=\"true\"\r\n [hasBackdrop]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n [closeOnOutsideClick]=\"true\"\r\n [panelMinWidthPx]=\"minWidthPx\"\r\n [panelMaxWidthPx]=\"maxWidthPx\"\r\n>\r\n <span class=\"popover__trigger-slot\" (click)=\"onTriggerClick($event)\">\r\n <ng-content select=\"[appPopoverTrigger]\" />\r\n </span>\r\n</app-anchored-overlay>\r\n\r\n<ng-template #panelTpl>\r\n <div\r\n class=\"popover__surface\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"false\"\r\n [attr.aria-labelledby]=\"title.trim() ? titleId : null\"\r\n [attr.aria-label]=\"!title.trim() ? effectiveAriaLabel : null\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (title.trim()) {\r\n <header class=\"popover__header\" [id]=\"titleId\">{{ title }}</header>\r\n }\r\n <div class=\"popover__body\">\r\n @if (bodyTpl) {\r\n <ng-container [ngTemplateOutlet]=\"bodyTpl\" />\r\n }\r\n </div>\r\n @if (footerTpl) {\r\n <footer class=\"popover__footer\">\r\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\r\n </footer>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { Directive } from '@angular/core';\r\n\r\n/** Marca o elemento que abre/fecha o popover ao clicar. */\r\n@Directive({\r\n selector: '[appPopoverTrigger]',\r\n standalone: true,\r\n})\r\nexport class PopoverTriggerDirective {}\r\n","/**\r\n * **Overlay (camada de UI flutuante)**\r\n *\r\n * - **`AnchoredOverlayComponent`**: primitives CDK (`CdkConnectedOverlay`) + tema (`AppThemeService`).\r\n * Usado por **tooltip** e **popover** (comportamento genérico: `open`/`openChange`, Escape, clique fora opcional).\r\n * - **Menus** (`app-dropdown-menu`, campos): usam **`DropdownBaseComponent`** em `fields/dropdown-fields` — contrato\r\n * estável (backdrop, fecho, largura de painel alinhada ao campo); não foi fundido com `AnchoredOverlay` para\r\n * não alterar comportamento dos formulários.\r\n * - **Enums**: `OverlayPlacement` (tooltip/popover, centro do trigger) vs `MenuDropdownPlacement` (menus alinhados\r\n * ao início do trigger, gap menor — ver `menu-connected-positions.util`).\r\n */\r\nexport { AnchoredOverlayComponent } from './anchored-overlay/anchored-overlay.component';\r\nexport { TooltipComponent } from './tooltip/tooltip.component';\r\nexport { TooltipPanelTemplateDirective } from './tooltip/tooltip-panel-template.directive';\r\nexport { PopoverComponent } from './popover/popover.component';\r\nexport { PopoverTriggerDirective } from './popover/popover-trigger.directive';\r\nexport { PopoverBodyTemplateDirective } from './popover/popover-body-template.directive';\r\nexport { PopoverFooterTemplateDirective } from './popover/popover-footer-template.directive';\r\n\r\nexport { OverlayPlacement } from './_models/overlay-placement.model';\r\nexport { anchoredOverlayPositions } from './_utils/anchored-overlay-positions.util';\r\n","/**\r\n * Duração da animação de largura da lateral (`flex-basis` / `width` / `padding`).\r\n * Manter alinhado com `$app-sidebar-layout-duration` em `_sidebar-reveal.scss`.\r\n */\r\nexport const APP_SIDEBAR_LAYOUT_DURATION_MS = 0;\r\n\r\n/** Folga após o layout, antes de revelar rótulos (evita texto a “comprimir”). */\r\nexport const APP_SIDEBAR_LABEL_REVEAL_LAG_MS = 48;\r\n\r\nexport const APP_SIDEBAR_NAV_REVEAL_TOTAL_MS =\r\n APP_SIDEBAR_LAYOUT_DURATION_MS + APP_SIDEBAR_LABEL_REVEAL_LAG_MS;\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n/**\r\n * Marca o `ng-template` cuja instância é projectada na barra lateral (desktop) e no `app-drawer` (mobile).\r\n *\r\n * ```html\r\n * <app-shell>\r\n * <ng-template appShellSidebar>\r\n * <app-sidebar ... />\r\n * </ng-template>\r\n * ...\r\n * </app-shell>\r\n * ```\r\n */\r\n@Directive({\r\n selector: 'ng-template[appShellSidebar]',\r\n standalone: true,\r\n})\r\nexport class AppShellSidebarTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n TemplateRef,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ADAPTIVE_DATA_VIEW_MOBILE_QUERY } from '../data-display/adaptive-data-view/adaptive-data-view.component';\r\nimport { DrawerComponent } from '../menus/drawer/drawer.component';\r\nimport { DrawerSide } from '../menus/_models/drawer-side.model';\r\nimport { DrawerSize } from '../menus/_models/drawer-size.model';\r\nimport {\r\n applyOptionalThemeHostClasses,\r\n type AppTheme,\r\n type StructraTheme,\r\n} from '../theme';\r\nimport { AppShellSidebarTemplateDirective } from './app-shell-sidebar-template.directive';\r\n\r\n/**\r\n * Estrutura principal: barra lateral, topo e conteúdo. Em mobile a lateral projecta-se no `app-drawer`.\r\n *\r\n * Use `exportAs: 'appShell'` e `toggleMobileNav` / `toggleSidebarCollapsed` a partir da topbar.\r\n *\r\n * Tema no host opcional; sem ele, herda de ancestral com {@link ThemeDirective}.\r\n */\r\n@Component({\r\n selector: 'app-shell',\r\n exportAs: 'appShell',\r\n imports: [NgTemplateOutlet, DrawerComponent],\r\n templateUrl: './app-shell.component.html',\r\n styleUrl: './app-shell.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppShellComponent implements OnInit {\r\n private readonly bp = inject(BreakpointObserver);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly hostEl = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n\r\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\r\n\r\n constructor() {\r\n effect(() => {\r\n applyOptionalThemeHostClasses(\r\n this.renderer,\r\n this.hostEl.nativeElement,\r\n this.appTheme(),\r\n );\r\n });\r\n }\r\n\r\n @ContentChild(AppShellSidebarTemplateDirective)\r\n private readonly sidebarSlot?: AppShellSidebarTemplateDirective;\r\n\r\n /** Conteúdo lateral (obrigatório): `<ng-template appShellSidebar>...</ng-template>`. */\r\n get sidebarTemplate(): TemplateRef<unknown> | null {\r\n return this.sidebarSlot?.templateRef ?? null;\r\n }\r\n\r\n /** Barra lateral estreita (ícones + compressão de texto na lista). */\r\n @Input({ transform: booleanAttribute }) sidebarCollapsed = false;\r\n\r\n @Output() readonly sidebarCollapsedChange = new EventEmitter<boolean>();\r\n\r\n /** Estado do drawer mobile (usar `[(mobileNavOpen)]` para controlar o menu hamburger). */\r\n @Input({ transform: booleanAttribute }) mobileNavOpen = false;\r\n\r\n @Output() readonly mobileNavOpenChange = new EventEmitter<boolean>();\r\n\r\n /** Consulta CDK para modo mobile (por omissão igual à vista adaptativa). */\r\n @Input() mobileLayoutQuery = ADAPTIVE_DATA_VIEW_MOBILE_QUERY;\r\n\r\n isMobileLayout = false;\r\n\r\n readonly DrawerSide = DrawerSide;\r\n readonly DrawerSize = DrawerSize;\r\n\r\n ngOnInit(): void {\r\n this.bp\r\n .observe([this.mobileLayoutQuery])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((state) => {\r\n const next = state.matches;\r\n if (next !== this.isMobileLayout) {\r\n this.isMobileLayout = next;\r\n /**\r\n * Modo «rail» (só ícones) só faz sentido em desktop. No telemóvel o drawer deve mostrar\r\n * rótulos — repõe `sidebarCollapsed` para o pai não manter `compressText` na lista.\r\n */\r\n if (next && this.sidebarCollapsed) {\r\n this.sidebarCollapsedChange.emit(false);\r\n }\r\n if (!next && this.mobileNavOpen) {\r\n this.emitMobileNavOpen(false);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n onMobileDrawerOpenChange(next: boolean): void {\r\n this.emitMobileNavOpen(next);\r\n }\r\n\r\n /** Emite alteração; com `[(mobileNavOpen)]` no pai o `@Input` actualiza o estado do drawer. */\r\n private emitMobileNavOpen(next: boolean): void {\r\n if (this.mobileNavOpen === next) {\r\n return;\r\n }\r\n this.mobileNavOpenChange.emit(next);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n toggleMobileNav(): void {\r\n const next = !this.mobileNavOpen;\r\n if (next && this.sidebarCollapsed) {\r\n this.sidebarCollapsedChange.emit(false);\r\n }\r\n this.emitMobileNavOpen(next);\r\n }\r\n\r\n toggleSidebarCollapsed(): void {\r\n this.sidebarCollapsedChange.emit(!this.sidebarCollapsed);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n closeMobileNav(): void {\r\n if (this.mobileNavOpen) {\r\n this.emitMobileNavOpen(false);\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"app-shell\"\r\n [class.app-shell--mobile]=\"isMobileLayout\"\r\n [class.app-shell--sidebar-collapsed]=\"sidebarCollapsed\"\r\n>\r\n @if (!isMobileLayout && sidebarTemplate) {\r\n <aside class=\"app-shell__sidebar\" aria-label=\"Navegação principal\">\r\n <ng-container [ngTemplateOutlet]=\"sidebarTemplate\" />\r\n </aside>\r\n }\r\n\r\n @if (isMobileLayout && sidebarTemplate) {\r\n <app-drawer\r\n [open]=\"mobileNavOpen\"\r\n (openChange)=\"onMobileDrawerOpenChange($event)\"\r\n [side]=\"DrawerSide.Left\"\r\n [size]=\"DrawerSize.Sm\"\r\n [showCloseButton]=\"true\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"sidebarTemplate\" />\r\n </app-drawer>\r\n }\r\n\r\n <div class=\"app-shell__main\">\r\n <ng-content select=\"[appShellTopbar]\" />\r\n <main class=\"app-shell__content\">\r\n <ng-content />\r\n </main>\r\n </div>\r\n</div>\r\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n Renderer2,\n SimpleChanges,\n afterNextRender,\n booleanAttribute,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport { MenuListComponent } from '../../menus/menu-list/menu-list.component';\nimport {\n applyOptionalThemeHostClasses,\n type AppTheme,\n type StructraTheme,\n} from '../../theme';\nimport type { MenuNodeItem } from '../../menus/_models/menu-item.model';\nimport { APP_SIDEBAR_NAV_REVEAL_TOTAL_MS } from '../sidebar-reveal.constants';\n\n/**\n * Navegação lateral com o mesmo modelo `MenuNodeItem` dos menus da lib (grupos, submenus, teclado).\n * Com `collapsed`, `app-menu-list` usa `compressText`: rótulos de grupo (ex. «Principal») ficam ocultos;\n * itens mostram só ícones com `title` / `aria-label` para acessibilidade.\n *\n * Tema: `[appTheme]` opcional no host; sem ele, herda paleta de um ancestral com {@link ThemeDirective}\n * (ex.: `<div appTheme=\"purple\">`). Com input explícito, aplica as classes no host.\n */\n@Component({\n selector: 'app-sidebar',\n imports: [CdkScrollable, MenuListComponent],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppSidebarComponent<T extends string = string>\n implements OnChanges, AfterViewInit\n{\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n\n /** Igual a `[appTheme]` / {@link ThemeDirective}: paleta explícita no host; omitir = herdar / serviço. */\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n @Input({ required: true }) items!: readonly MenuNodeItem<T>[];\n\n @Input() menuId = 'app-shell-sidebar';\n\n /** Sincronizar com o item de navegação activo (realce persistente). */\n @Input() selectedItemId: T | null = null;\n\n /** Modo estreito: só ícones + `compressText` na lista (rótulos via `title` / `aria-label`). */\n @Input({ transform: booleanAttribute }) collapsed = false;\n\n /** Repassado a {@link MenuListComponent.searchable}: campo de pesquisa na lista da lateral. */\n @Input({ transform: booleanAttribute }) searchable = false;\n\n /**\n * Repassado a {@link MenuListComponent.clickToOpen}: submenus na lateral abrem por **clique** (`true`, omissão)\n * ou por **hover** (`false`).\n */\n @Input() clickToOpen = true;\n\n /**\n * Repassado a {@link MenuListComponent.groupCollapsible}: `false` desactiva expandir/recolher nas secções.\n */\n @Input({ transform: booleanAttribute }) groupCollapsible = true;\n\n /**\n * Repassado a {@link MenuListComponent.groupDefaultExpansion}: omissão de `expanded` nos grupos.\n * Com `'first'` e primeiro grupo `alwaysExpanded`, use `expanded: true` no grupo que deve abrir ao carregar.\n */\n @Input() groupDefaultExpansion: 'all' | 'first' = 'all';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n\n /**\n * Valor efectivo de `compressText` em `app-menu-list`: ao expandir a partir do modo rail,\n * mantém-se comprimido até a animação de largura terminar (evita flicker de texto).\n * Começa em `false` para a primeira pintura com lateral já expandida corresponder ao estado real\n * e o `menu-list` aplicar bem `expanded` nos grupos.\n */\n readonly listCompressText = signal(false);\n\n private listRevealTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.clearListRevealTimeout());\n effect(() => {\n applyOptionalThemeHostClasses(\n this.renderer,\n this.hostEl.nativeElement,\n this.appTheme(),\n );\n });\n /**\n * CSS global no host (ex. flex utilitários com `!important`) pode sobrepor estilos encapsulados\n * e centrar o grupo marca+botão. `setProperty(..., 'important')` no DOM ganha na cascata.\n */\n afterNextRender(() => this.scheduleSidebarHeadLayoutGuards());\n }\n\n ngAfterViewInit(): void {\n this.scheduleSidebarHeadLayoutGuards();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['selectedItemId'] || changes['items']) {\n this.cdr.markForCheck();\n }\n if (changes['collapsed']) {\n this.scheduleSidebarHeadLayoutGuards();\n }\n\n const collapsedCh = changes['collapsed'];\n if (!collapsedCh) {\n return;\n }\n this.clearListRevealTimeout();\n\n if (collapsedCh.firstChange) {\n this.listCompressText.set(this.collapsed);\n return;\n }\n\n if (this.collapsed) {\n this.listCompressText.set(true);\n return;\n }\n\n this.listCompressText.set(true);\n this.listRevealTimeoutId = setTimeout(() => {\n this.listRevealTimeoutId = null;\n this.listCompressText.set(false);\n }, APP_SIDEBAR_NAV_REVEAL_TOTAL_MS);\n }\n\n private clearListRevealTimeout(): void {\n if (this.listRevealTimeoutId !== null) {\n clearTimeout(this.listRevealTimeoutId);\n this.listRevealTimeoutId = null;\n }\n }\n\n private scheduleSidebarHeadLayoutGuards(): void {\n queueMicrotask(() => this.applySidebarHeadLayoutGuards());\n }\n\n private applySidebarHeadLayoutGuards(): void {\n const root = this.hostEl.nativeElement;\n const head = root.querySelector('[data-app-sidebar-head]') as HTMLElement | null;\n if (!head) {\n return;\n }\n\n head.style.setProperty('flex-direction', 'row', 'important');\n head.style.setProperty('direction', 'ltr', 'important');\n\n if (this.collapsed) {\n head.style.setProperty('justify-content', 'center', 'important');\n } else {\n head.style.setProperty('justify-content', 'flex-start', 'important');\n }\n\n const brand = root.querySelector('.app-sidebar__brand') as HTMLElement | null;\n if (brand) {\n /** Colapsado: não forçar `display:flex` — isso anulava o `display:none` do modo rail no SCSS. */\n if (this.collapsed) {\n brand.style.setProperty('display', 'none', 'important');\n } else {\n brand.style.setProperty('display', 'flex', 'important');\n /** Reforço flex: evita consumidores/utilitários a empurrarem o título para a direita. */\n brand.style.setProperty('flex', '1 1 0%', 'important');\n brand.style.setProperty('min-width', '0', 'important');\n }\n brand.style.setProperty('text-align', 'start', 'important');\n brand.style.setProperty('justify-content', 'flex-start', 'important');\n brand.style.setProperty('align-items', 'center', 'important');\n }\n\n /** Projectado com `[appSidebarBrand]`: Tailwind (`ms-auto`, `justify-end`) ganha em prod sem isto. */\n const brandSlot = root.querySelector('[appSidebarBrand]') as HTMLElement | null;\n if (brandSlot && !this.collapsed) {\n brandSlot.style.setProperty('display', 'inline-flex', 'important');\n brandSlot.style.setProperty('justify-content', 'flex-start', 'important');\n brandSlot.style.setProperty('align-items', 'center', 'important');\n brandSlot.style.setProperty('align-self', 'flex-start', 'important');\n brandSlot.style.setProperty('margin-inline-start', '0', 'important');\n brandSlot.style.setProperty('margin-inline-end', 'auto', 'important');\n brandSlot.style.setProperty('text-align', 'start', 'important');\n brandSlot.style.setProperty('width', 'auto', 'important');\n brandSlot.style.setProperty('max-width', '100%', 'important');\n brandSlot.style.setProperty('flex', '1 1 0%', 'important');\n brandSlot.style.setProperty('min-width', '0', 'important');\n }\n\n const toolbar = root.querySelector('.app-sidebar__toolbar') as HTMLElement | null;\n if (!toolbar || toolbar.children.length === 0) {\n return;\n }\n\n if (this.collapsed) {\n toolbar.style.setProperty('margin-inline-start', '0', 'important');\n } else {\n toolbar.style.setProperty('margin-inline-start', 'auto', 'important');\n }\n }\n}\n","<nav class=\"app-sidebar app-nav-surface\" [class.app-sidebar--collapsed]=\"collapsed\"\r\n [attr.aria-label]=\"'Navegação principal'\">\r\n <div class=\"app-sidebar__head\" data-app-sidebar-head=\"\" translate=\"no\">\r\n <div class=\"app-sidebar__brand\"><ng-content select=\"[appSidebarBrand]\" /></div>\r\n <div class=\"app-sidebar__toolbar\"><ng-content select=\"[appSidebarToolbar]\" /></div>\r\n </div>\r\n <!-- `cdkScrollable` no elemento nativo que faz overflow — o CDK reposiciona submenus ao scroll (custom elements como host falhavam). -->\r\n <div class=\"app-sidebar__scroll\" cdkScrollable>\r\n <app-menu-list\r\n class=\"app-sidebar__list\"\r\n [appTheme]=\"appTheme()\"\r\n [items]=\"items\"\r\n [menuId]=\"menuId\"\r\n [dense]=\"collapsed\"\r\n [compressText]=\"listCompressText()\"\r\n [searchable]=\"searchable\"\r\n [clickToOpen]=\"clickToOpen\"\r\n [groupCollapsible]=\"groupCollapsible\"\r\n [groupDefaultExpansion]=\"groupDefaultExpansion\"\r\n [selectedItemId]=\"selectedItemId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n />\r\n </div>\r\n</nav>\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marca **só** o botão recolher/expandir no topo da sidebar (slot direito).\r\n * O **título/marca** deve usar `[appSidebarBrand]` como irmão — não envolver título + toggle num único\r\n * `[appSidebarToolbar]`: no drawer mobile do `app-shell` isso pode esconder o título ou criar layout estranho.\r\n *\r\n * ```html\r\n * <app-sidebar [items]=\"nav\">\r\n * <span appSidebarBrand>Minha aplicação</span>\r\n * <app-shell-sidebar-toggle appSidebarToolbar [collapsed]=\"collapsed\" (toggle)=\"onToggle()\" />\r\n * </app-sidebar>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[appSidebarToolbar]',\r\n standalone: true,\r\n})\r\nexport class AppSidebarToolbarDirective {}\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marca o título no topo da lateral: **na mesma linha** que o botão recolher (à esquerda);\r\n * oculto no modo rail (só ícones).\r\n *\r\n * **Importante:** o título **tem** de usar `[appSidebarBrand]` no próprio nó de texto (ou wrapper só da marca).\r\n * Não dependa só de um `span` dentro de um `div [appSidebarToolbar]` — em mobile o drawer só oculta o toggle,\r\n * mas o padrão correcto é marca + toolbar como **irmãos** projectados (evita cabeçalho vazio se o CSS do host mudar).\r\n *\r\n * ```html\r\n * <app-sidebar [items]=\"nav\">\r\n * <span appSidebarBrand>Minha aplicação</span>\r\n * <app-shell-sidebar-toggle appSidebarToolbar … />\r\n * </app-sidebar>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[appSidebarBrand]',\r\n standalone: true,\r\n})\r\nexport class AppSidebarBrandDirective {}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Botão só ícone (setas «abrir/fechar») para recolher/expandir a largura da lateral.\r\n * Na demo, usar com `appSidebarToolbar` projectado em `app-sidebar`.\r\n */\r\n@Component({\r\n selector: 'app-shell-sidebar-toggle',\r\n standalone: true,\r\n templateUrl: './shell-sidebar-toggle.component.html',\r\n styleUrl: './shell-sidebar-toggle.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppShellSidebarToggleComponent {\r\n /** `true` quando a lateral está estreita / recolhida. */\r\n @Input({ transform: booleanAttribute }) collapsed = false;\r\n\r\n /** Rótulos acessíveis quando `collapsed` é `true` (accção: expandir). */\r\n @Input() expandLabel = 'Expandir navegação';\r\n\r\n /** Rótulos quando `collapsed` é `false` (accção: recolher). */\r\n @Input() collapseLabel = 'Recolher navegação';\r\n\r\n @Output() readonly toggle = new EventEmitter<void>();\r\n\r\n onClick(): void {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n class=\"app-shell-sidebar-toggle__btn\"\r\n [attr.aria-pressed]=\"collapsed\"\r\n [attr.aria-expanded]=\"!collapsed\"\r\n [attr.aria-label]=\"collapsed ? expandLabel : collapseLabel\"\r\n [attr.title]=\"collapsed ? expandLabel : collapseLabel\"\r\n (click)=\"onClick()\"\r\n>\r\n <i\r\n class=\"fa-solid\"\r\n [class.fa-angles-left]=\"!collapsed\"\r\n [class.fa-angles-right]=\"collapsed\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n</button>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n/**\r\n * Barra superior com três zonas de projeção: início (ex.: menu), título, fim (ex.: usuário).\r\n */\r\n@Component({\r\n selector: 'app-topbar',\r\n standalone: true,\r\n templateUrl: './topbar.component.html',\r\n styleUrl: './topbar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppTopbarComponent {}\r\n","<div class=\"app-topbar\" role=\"banner\">\r\n <div class=\"app-topbar__start\">\r\n <ng-content select=\"[appTopbarStart]\" />\r\n </div>\r\n <div class=\"app-topbar__title\">\r\n <ng-content select=\"[appTopbarTitle]\" />\r\n </div>\r\n <div class=\"app-topbar__end\">\r\n <ng-content select=\"[appTopbarEnd]\" />\r\n </div>\r\n</div>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\nimport { DropdownMenuComponent } from '../../menus/dropdown-menu/dropdown-menu.component';\nimport { MenuDropdownPlacement } from '../../menus/_models/menu-dropdown-placement.model';\nimport type { MenuNodeItem } from '../../menus/_models/menu-item.model';\n\n/**\n * Menu do usuário: `app-dropdown-menu` com gatilho personalizado (avatar ou ícone).\n */\n@Component({\n selector: 'app-user-menu',\n imports: [DropdownMenuComponent],\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AppUserMenuComponent<T extends string = string> {\n @Input({ required: true }) items!: readonly MenuNodeItem<T>[];\n\n @Input() menuId = 'app-user-menu';\n\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\n\n @Input() minWidthPx = 220;\n\n /** Texto junto ao avatar (oculto em ecrãs muito estreitos via CSS). */\n @Input() displayName = '';\n\n /** URL de imagem para avatar; sem valor usa ícone genérico. */\n @Input() avatarUrl = '';\n\n @Input() triggerLabel = 'Menu do usuário';\n\n @Input({ transform: booleanAttribute }) showName = true;\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n readonly MenuDropdownPlacement = MenuDropdownPlacement;\n}\n","<app-dropdown-menu\r\n class=\"user-menu__dropdown\"\r\n [items]=\"items\"\r\n [placement]=\"placement\"\r\n [minWidthPx]=\"minWidthPx\"\r\n [matchTriggerWidth]=\"false\"\r\n [menuId]=\"menuId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n (openChange)=\"openChange.emit($event)\"\r\n>\r\n <button type=\"button\" class=\"user-menu__trigger\" [attr.aria-label]=\"triggerLabel\">\r\n @if (avatarUrl.trim()) {\r\n <img class=\"user-menu__avatar\" [src]=\"avatarUrl\" alt=\"\" width=\"32\" height=\"32\" />\r\n } @else {\r\n <span class=\"user-menu__avatar-fallback\" aria-hidden=\"true\">\r\n <i class=\"fa-solid fa-user\"></i>\r\n </span>\r\n }\r\n @if (showName && displayName.trim()) {\r\n <span class=\"user-menu__name\">{{ displayName }}</span>\r\n }\r\n </button>\r\n</app-dropdown-menu>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport type { BreadcrumbItem } from '../_models/breadcrumb-item.model';\r\n\r\n/**\r\n * Filo hierárquico com `nav` + lista ordenada; último segmento com `aria-current=\"page\"`.\r\n */\r\n@Component({\n selector: 'app-breadcrumb',\n imports: [RouterLink],\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class AppBreadcrumbComponent {\r\n @Input({ required: true }) items!: readonly BreadcrumbItem[];\r\n}\r\n","@if (items.length) {\r\n <nav class=\"app-breadcrumb\" aria-label=\"Navegação em filo\">\r\n <ol class=\"app-breadcrumb__list\">\r\n @for (item of items; track $index; let last = $last) {\r\n <li class=\"app-breadcrumb__item\" [class.app-breadcrumb__item--current]=\"last\">\r\n @if (last) {\r\n <span class=\"app-breadcrumb__text app-breadcrumb__text--current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n } @else if (item.route != null) {\r\n <a class=\"app-breadcrumb__link\" [routerLink]=\"$any(item.route)\">{{ item.label }}</a>\r\n <span class=\"app-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n } @else if (item.href?.trim()) {\r\n <a class=\"app-breadcrumb__link\" [href]=\"item.href!.trim()\">{{ item.label }}</a>\r\n <span class=\"app-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n } @else {\r\n <span class=\"app-breadcrumb__text\">{{ item.label }}</span>\r\n <span class=\"app-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n}\r\n","/**\r\n * **App Shell & Navigation** — estrutura de aplicação (barra lateral, topo, filo, usuário).\r\n *\r\n * - **`AppShellComponent`**: grade principal; em viewports estreitos a sidebar projeta-se em `app-drawer` (`menus/`).\r\n * - **`AppSidebarComponent`**: delega em `app-menu-list` (`MenuNodeItem`, teclado, submenus); `[appSidebarToolbar]` + **`AppShellSidebarToggleComponent`** no topo (recolher).\r\n * - **`AppTopbarComponent`**: projeção por zonas (`appTopbarStart` / `appTopbarTitle` / `appTopbarEnd`).\r\n * - **`AppUserMenuComponent`**: `app-dropdown-menu` com gatilho avatar/nome (sem menu duplicado).\r\n * - **`AppBreadcrumbComponent`**: `nav` + lista; segmentos com `route` ou `href`.\r\n */\r\nexport {\r\n APP_SIDEBAR_LAYOUT_DURATION_MS,\r\n APP_SIDEBAR_LABEL_REVEAL_LAG_MS,\r\n APP_SIDEBAR_NAV_REVEAL_TOTAL_MS,\r\n} from './sidebar-reveal.constants';\r\nexport { AppShellComponent } from './app-shell.component';\r\nexport { AppShellSidebarTemplateDirective } from './app-shell-sidebar-template.directive';\r\nexport { AppSidebarComponent } from './sidebar/sidebar.component';\r\nexport { AppSidebarToolbarDirective } from './sidebar/app-sidebar-toolbar.directive';\r\nexport { AppSidebarBrandDirective } from './sidebar/app-sidebar-brand.directive';\r\nexport { AppShellSidebarToggleComponent } from './sidebar/shell-sidebar-toggle.component';\r\nexport { AppTopbarComponent } from './topbar/topbar.component';\r\nexport { AppUserMenuComponent } from './user-menu/user-menu.component';\r\nexport { AppBreadcrumbComponent } from './breadcrumb/breadcrumb.component';\r\nexport type { BreadcrumbItem } from './_models/breadcrumb-item.model';\r\n","/**\n * Entrada do pacote npm `structra-ui` (ng-packagr).\n * Mantém `rootDir` em `src/` para compilar a árvore de imports sem erros NG3004.\n */\n\nexport { STRUCTRA_UI } from './structra-version';\n\nexport * from './app/alert';\nexport * from './app/buttons';\nexport * from './app/fields/input-fields';\nexport * from './app/fields/checkbox-fields';\nexport * from './app/fields/dropdown-fields';\nexport * from './app/fields/file-upload-fields';\nexport * from './app/form-layout';\nexport * from './app/loading/skeleton-loading';\nexport * from './app/data-display';\nexport * from './app/dialogs';\nexport * from './app/menus';\nexport * from './app/overlay';\nexport * from './app/app-shell';\nexport * from './app/theme';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './structra-public-api';\n"],"names":["i1.AppThemeService","i1","UI_REQUEST_EXPAND_FORM_GROUP","i2"],"mappings":"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"}
1
+ {"version":3,"file":"structra-ui.mjs","sources":["../../../src/structra-version.ts","../../../src/app/alert/alert.component.ts","../../../src/app/alert/alert.component.html","../../../src/app/buttons/base-button/base-button.component.ts","../../../src/app/buttons/base-button/base-button.component.html","../../../src/app/buttons/button/button.component.ts","../../../src/app/shared/id/auto-id.ts","../../../src/app/fields/input-fields/_base/base-field.directive.ts","../../../src/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.ts","../../../src/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.html","../../../src/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.ts","../../../src/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.html","../../../src/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.ts","../../../src/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.html","../../../src/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.ts","../../../src/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.html","../../../src/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.ts","../../../src/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.html","../../../src/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.ts","../../../src/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.html","../../../src/app/theme/theme.types.ts","../../../src/app/theme/theme-class.helpers.ts","../../../src/app/theme/app-theme.service.ts","../../../src/app/theme/theme.directive.ts","../../../src/app/theme/theme-effective-id.ts","../../../src/app/theme/theme-host-apply.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.html","../../../src/app/menus/_models/menu-dropdown-placement.model.ts","../../../src/app/menus/_utils/menu-connected-positions.util.ts","../../../src/app/menus/menu-divider/menu-divider.component.ts","../../../src/app/menus/menu-group/menu-group.component.ts","../../../src/app/menus/_utils/menu-rows.util.ts","../../../src/app/menus/_utils/submenu-connected-positions.util.ts","../../../src/app/menus/menu-list/menu-list-body.component.ts","../../../src/app/menus/menu-list/menu-list-body.component.html","../../../src/app/menus/dropdown-menu/dropdown-menu.component.ts","../../../src/app/menus/dropdown-menu/dropdown-menu.component.html","../../../src/app/fields/input-fields/_base/base-field.component.ts","../../../src/app/fields/input-fields/_base/base-field.component.html","../../../src/app/fields/input-fields/_base/ng-control-field.directive.ts","../../../src/app/fields/input-fields/text-field/text-field.component.ts","../../../src/app/fields/input-fields/text-field/text-field.component.html","../../../src/app/fields/input-fields/password-field/password-field.component.ts","../../../src/app/fields/input-fields/password-field/password-field.component.html","../../../src/app/fields/input-fields/textarea-field/textarea-field.component.ts","../../../src/app/fields/input-fields/textarea-field/textarea-field.component.html","../../../src/app/_utils/integer-value.utils.ts","../../../src/app/_utils/integer-br.utils.ts","../../../src/app/fields/input-fields/integer-field/integer-field.component.ts","../../../src/app/fields/input-fields/integer-field/integer-field.component.html","../../../src/app/_utils/decimal-br.utils.ts","../../../src/app/fields/input-fields/decimal-field/decimal-field.component.ts","../../../src/app/fields/input-fields/decimal-field/decimal-field.component.html","../../../src/app/_utils/date-pt-br.utils.ts","../../../src/app/fields/input-fields/date-field/date-field.component.ts","../../../src/app/fields/input-fields/date-field/date-field.component.html","../../../src/app/fields/input-fields/_utils/mask-format.utils.ts","../../../src/app/fields/input-fields/_base/masked-text-field.base.ts","../../../src/app/fields/input-fields/input-mask-field/input-mask-field.component.ts","../../../src/app/fields/input-fields/input-mask-field/input-mask-field.component.html","../../../src/app/fields/input-fields/cep-field/cep-field.component.ts","../../../src/app/fields/input-fields/cep-field/cep-field.component.html","../../../src/app/fields/input-fields/phone-field/phone-field.component.ts","../../../src/app/fields/input-fields/phone-field/phone-field.component.html","../../../src/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.ts","../../../src/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.html","../../../src/app/fields/input-fields/_utils/mask-complete.validators.ts","../../../src/app/_utils/estados-br.data.ts","../../../src/app/fields/checkbox-fields/_base/boolean-field.directive.ts","../../../src/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.ts","../../../src/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.html","../../../src/app/fields/checkbox-fields/switch-field/switch-field.component.ts","../../../src/app/fields/checkbox-fields/switch-field/switch-field.component.html","../../../src/app/fields/dropdown-fields/_base/dropdown-option-field.base.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.ts","../../../src/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.ts","../../../src/app/fields/dropdown-fields/select-field/select-field.component.ts","../../../src/app/fields/dropdown-fields/select-field/select-field.component.html","../../../src/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.ts","../../../src/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.html","../../../src/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.ts","../../../src/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.html","../../../src/app/_utils/scroll/body-scroll-lock.util.ts","../../../src/app/dialogs/_models/lib-dialog-size.model.ts","../../../src/app/dialogs/app-dialog/app-dialog.component.ts","../../../src/app/dialogs/app-dialog/app-dialog.component.html","../../../src/app/dialogs/app-dialog/dialog-footer.directive.ts","../../../src/app/dialogs/confirm-dialog/confirm-dialog.component.ts","../../../src/app/dialogs/confirm-dialog/confirm-dialog.component.html","../../../src/app/dialogs/_utils/app-lib-light-block-scroll-strategy.ts","../../../src/app/dialogs/_utils/lib-dialog-panel-classes.ts","../../../src/app/dialogs/confirm-dialog/confirm-dialog.service.ts","../../../src/app/dialogs/toast/toast.service.ts","../../../src/app/dialogs/toast/toast-host.component.ts","../../../src/app/dialogs/toast/toast-host.component.html","../../../src/app/dialogs/loading-dialog/loading-dialog.component.ts","../../../src/app/dialogs/loading-dialog/loading-dialog.component.html","../../../src/app/dialogs/loading-dialog/loading-dialog.service.ts","../../../src/app/fields/file-upload-fields/_utils/file-accept.util.ts","../../../src/app/fields/file-upload-fields/file-upload-field/file-upload-field.component.ts","../../../src/app/fields/file-upload-fields/file-upload-field/file-upload-field.component.html","../../../src/app/fields/file-upload-fields/image-preview-panel/image-preview-panel.component.ts","../../../src/app/fields/file-upload-fields/image-preview-panel/image-preview-panel.component.html","../../../src/app/form-layout/_models/form-layout.model.ts","../../../src/app/form-layout/divider/divider.component.ts","../../../src/app/form-layout/divider/divider.component.html","../../../src/app/form-layout/layout-stack/layout-stack.component.ts","../../../src/app/form-layout/layout-stack/layout-stack.component.html","../../../src/app/form-layout/form-actions/form-actions.component.ts","../../../src/app/form-layout/form-actions/form-actions.component.html","../../../src/app/form-layout/form-col/form-col.component.ts","../../../src/app/form-layout/form-col/form-col.component.html","../../../src/app/form-layout/form-group/form-root-invalid-ui-refresh.util.ts","../../../src/app/form-layout/form-group/form-path.utils.ts","../../../src/app/form-layout/form-group/form-group.component.ts","../../../src/app/form-layout/form-group/form-group.component.html","../../../src/app/form-layout/form-row/form-row.component.ts","../../../src/app/form-layout/form-row/form-row.component.html","../../../src/app/form-layout/form-section/form-section.component.ts","../../../src/app/form-layout/form-section/form-section.component.html","../../../src/app/form-layout/validation-summary/validation-summary.component.ts","../../../src/app/form-layout/validation-summary/validation-summary.component.html","../../../src/app/form-layout/form-tab/form-tab.component.ts","../../../src/app/form-layout/form-tab/form-tab.component.html","../../../src/app/form-layout/form-tabs/form-tabs.component.ts","../../../src/app/form-layout/form-tabs/form-tabs.component.html","../../../src/app/data-display/empty-state/empty-state-overlay.util.ts","../../../src/app/data-display/data-grid/data-grid-actions-cell-renderer.component.ts","../../../src/app/data-display/data-grid/data-grid-actions-cell-renderer.component.html","../../../src/app/data-display/data-grid/data-grid.component.ts","../../../src/app/data-display/data-grid/data-grid.component.html","../../../src/app/data-display/data-toolbar/data-toolbar.component.ts","../../../src/app/data-display/data-toolbar/data-toolbar.component.html","../../../src/app/data-display/data-card/data-card.component.ts","../../../src/app/data-display/data-card/data-card.component.html","../../../src/app/data-display/empty-state/empty-state.component.ts","../../../src/app/data-display/empty-state/empty-state.component.html","../../../src/app/data-display/card-list/card-list.component.ts","../../../src/app/data-display/card-list/card-list.component.html","../../../src/app/data-display/adaptive-data-view/adaptive-data-view.component.ts","../../../src/app/data-display/adaptive-data-view/adaptive-data-view.component.html","../../../src/app/data-display/status-badge/status-badge.component.ts","../../../src/app/data-display/status-badge/status-badge.component.html","../../../src/app/data-display/details-view/details-view.component.ts","../../../src/app/data-display/details-view/details-view.component.html","../../../src/app/data-display/details-field/details-field.component.ts","../../../src/app/data-display/details-field/details-field.component.html","../../../src/app/data-display/stat-card/stat-card.component.ts","../../../src/app/data-display/stat-card/stat-card.component.html","../../../src/app/data-display/list-item/list-item.component.ts","../../../src/app/data-display/list-item/list-item.component.html","../../../src/app/data-display/data-list/data-list.component.ts","../../../src/app/data-display/data-list/data-list.component.html","../../../src/app/data-display/dashboard-section/dashboard-section.component.ts","../../../src/app/data-display/dashboard-section/dashboard-section.component.html","../../../src/app/data-display/table-toolbar/table-toolbar.component.ts","../../../src/app/data-display/table-toolbar/table-toolbar.component.html","../../../src/app/data-display/table-empty-state/table-empty-state.component.ts","../../../src/app/data-display/table-empty-state/table-empty-state.component.html","../../../src/app/menus/_utils/filter-menu-nodes.util.ts","../../../src/app/menus/menu-list/menu-list.component.ts","../../../src/app/menus/menu-list/menu-list.component.html","../../../src/app/menus/context-menu/context-menu.component.ts","../../../src/app/menus/context-menu/context-menu.component.html","../../../src/app/menus/_models/drawer-side.model.ts","../../../src/app/menus/_models/drawer-size.model.ts","../../../src/app/menus/drawer/drawer.component.ts","../../../src/app/menus/drawer/drawer.component.html","../../../src/app/menus/action-menu/action-menu.component.ts","../../../src/app/menus/action-menu/action-menu.component.html","../../../src/app/overlay/anchored-overlay/anchored-overlay.component.ts","../../../src/app/overlay/anchored-overlay/anchored-overlay.component.html","../../../src/app/overlay/_models/overlay-placement.model.ts","../../../src/app/overlay/_utils/anchored-overlay-positions.util.ts","../../../src/app/overlay/tooltip/tooltip-panel-template.directive.ts","../../../src/app/overlay/tooltip/tooltip.component.ts","../../../src/app/overlay/tooltip/tooltip.component.html","../../../src/app/overlay/popover/popover-body-template.directive.ts","../../../src/app/overlay/popover/popover-footer-template.directive.ts","../../../src/app/overlay/popover/popover.component.ts","../../../src/app/overlay/popover/popover.component.html","../../../src/app/overlay/popover/popover-trigger.directive.ts","../../../src/app/overlay/index.ts","../../../src/app/app-shell/sidebar-reveal.constants.ts","../../../src/app/app-shell/app-shell-sidebar-template.directive.ts","../../../src/app/app-shell/app-shell.component.ts","../../../src/app/app-shell/app-shell.component.html","../../../src/app/app-shell/sidebar/sidebar.component.ts","../../../src/app/app-shell/sidebar/sidebar.component.html","../../../src/app/app-shell/sidebar/app-sidebar-toolbar.directive.ts","../../../src/app/app-shell/sidebar/app-sidebar-brand.directive.ts","../../../src/app/app-shell/sidebar/shell-sidebar-toggle.component.ts","../../../src/app/app-shell/sidebar/shell-sidebar-toggle.component.html","../../../src/app/app-shell/topbar/topbar.component.ts","../../../src/app/app-shell/topbar/topbar.component.html","../../../src/app/app-shell/user-menu/user-menu.component.ts","../../../src/app/app-shell/user-menu/user-menu.component.html","../../../src/app/app-shell/breadcrumb/breadcrumb.component.ts","../../../src/app/app-shell/breadcrumb/breadcrumb.component.html","../../../src/app/app-shell/index.ts","../../../src/structra-public-api.ts","../../../src/structra-ui.ts"],"sourcesContent":["/** Marcador de pacote publicado como `structra-ui`. */\r\nexport const STRUCTRA_UI = 'structra-ui' as const;\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n signal,\r\n} from '@angular/core';\r\n\r\nexport type AlertType = 'error' | 'success' | 'warning' | 'info';\r\n\r\n/**\r\n * Feedback visual inline (erro, sucesso, aviso, informação). Reutiliza tokens semânticos da lib.\r\n */\r\n@Component({\r\n selector: 'app-alert',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './alert.component.html',\r\n styleUrl: './alert.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AlertComponent {\r\n /** Remove o host do fluxo ao fechar (evita faixa em branco com `display: block` vazio). */\r\n @HostBinding('hidden')\r\n protected get hostHidden(): boolean {\r\n return !this.visible();\r\n }\r\n\r\n @Input() type: AlertType = 'info';\r\n\r\n @Input() message = '';\r\n\r\n @Input({ transform: booleanAttribute }) closable = false;\r\n\r\n /** Quando `closable`, o alerta deixa de renderizar após fechar. */\r\n protected readonly visible = signal(true);\r\n\r\n protected get hasMessage(): boolean {\r\n return this.message != null && String(this.message).trim().length > 0;\r\n }\r\n\r\n private readonly modifierByType: Record<AlertType, string> = {\r\n error: 'alert--error',\r\n success: 'alert--success',\r\n warning: 'alert--warning',\r\n info: 'alert--info',\r\n };\r\n\r\n protected get alertHostClass(): string {\r\n return `alert ${this.modifierByType[this.type]}`;\r\n }\r\n\r\n protected onClose(): void {\r\n this.visible.set(false);\r\n }\r\n}\r\n","@if (visible()) {\r\n <div [class]=\"alertHostClass\" role=\"alert\">\r\n <div class=\"alert__content\">\r\n @if (hasMessage) {\r\n <span class=\"alert__text\">{{ message }}</span>\r\n } @else {\r\n <span class=\"alert__text\"><ng-content /></span>\r\n }\r\n </div>\r\n\r\n @if (closable) {\r\n <button type=\"button\" class=\"alert__close\" aria-label=\"Fechar alerta\" (click)=\"onClose()\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </div>\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n ViewChild,\n booleanAttribute,\n} from '@angular/core';\nexport const ButtonVariant = {\n Primary: 'primary',\n Secondary: 'secondary',\n /** Texto/ícone sem caixa — navegação secundária, “link” com aparência de botão acessível. */\n Ghost: 'ghost',\n /**\n * Hiperligação em estilo `<a>`: só texto sublinhado, fundo transparente; hover altera só a cor do texto.\n */\n Link: 'link',\n /**\n * Ação destrutiva / apagar: tokens de erro do tema\n * (`--app-color-error*`), mesmo padrão em toda a lib.\n */\n Danger: 'danger',\n /** Estado de alerta: amarelo escuro, com contraste adequado para texto/ícone. */\n Warning: 'warning',\n /** Estado positivo: verde de sucesso, no mesmo padrão de hover e active. */\n Success: 'success',\n} as const;\nexport type ButtonVariant = (typeof ButtonVariant)[keyof typeof ButtonVariant];\n\nexport const ButtonType = {\n Button: 'button',\n Submit: 'submit',\n Reset: 'reset',\n} as const;\nexport type ButtonType = (typeof ButtonType)[keyof typeof ButtonType];\n\n/** Tamanhos do design system: `md` coincide com os valores que o botão já usava antes desta propriedade. */\nexport const ButtonSize = {\n Sm: 'sm',\n Md: 'md',\n Lg: 'lg',\n /** Maior que `lg` — ênfase / touch targets amplos (CTAs hero). */\n Xl: 'xl',\n /** Escala extra para CTAs de maior destaque. */\n Xxl: 'xxl',\n} as const;\nexport type ButtonSize = (typeof ButtonSize)[keyof typeof ButtonSize];\n\n/** Radius semântico do design system (sem valores numéricos livres no template). */\nexport const ButtonRadius = {\n None: 'none',\n Sm: 'sm',\n Md: 'md',\n Lg: 'lg',\n Pill: 'pill',\n} as const;\nexport type ButtonRadius = (typeof ButtonRadius)[keyof typeof ButtonRadius];\n\n/**\n * Base do botão; **não** exposta no barrel público `buttons`. Use `ButtonComponent` (`app-button`).\n */\n@Component({\n selector: 'app-base-button',\n standalone: true,\n imports: [],\n templateUrl: './base-button.component.html',\n styleUrl: './base-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class BaseButtonComponent {\n @ViewChild('nativeBtn', { read: ElementRef })\n private nativeBtn?: ElementRef<HTMLButtonElement>;\n\n /** `submit` envia o `<form>` ancestral; use `button` para ações sem submit. */\n @Input() type: ButtonType = 'button';\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n /**\n * Não interage (como `disabled`), mas com aparência em cinza (tema somente leitura),\n * distinta do estado desabilitado genérico.\n */\n @Input({ transform: booleanAttribute }) readonly = false;\n\n /**\n * `true` (por defeito): estica à largura do contentor (útil em `app-layout-stack` com `fill`).\n * `false`: largura só ao conteúdo (texto + padding).\n */\n @Input({ transform: booleanAttribute }) fullWidth = true;\n\n /** Escala tipográfica e de paddings/`min-height` do design system. `md` = aparência legada do botão. */\n @Input() size: ButtonSize = 'md';\n\n /** Arredondamento semântico do botão (design system). */\n @Input() radius: ButtonRadius = 'md';\n\n /** Carregamento: spinner + `disabled` nativo + `aria-busy`; o rótulo projectado mantém-se visível. */\n @Input({ transform: booleanAttribute }) loading = false;\n\n /** `disabled` efectivo do `<button>` (inclui `readonly` e `loading`). */\n get isDisabled(): boolean {\n return this.disabled || this.readonly || this.loading;\n }\n\n /** Estilo visual base; pode ser estendido no SCSS do projeto. */\n @Input() variant: ButtonVariant = 'primary';\n\n /** Alias de {@link variant} (nome comum em design systems). */\n @Input('appearance')\n set appearance(value: ButtonVariant) {\n if (\n value === ButtonVariant.Primary ||\n value === ButtonVariant.Secondary ||\n value === ButtonVariant.Ghost ||\n value === ButtonVariant.Link ||\n value === ButtonVariant.Danger ||\n value === ButtonVariant.Warning ||\n value === ButtonVariant.Success\n ) {\n this.variant = value;\n }\n }\n\n @HostBinding('class')\n get hostClasses(): string {\n const parts = [\n 'base-button',\n `base-button--${this.variant}`,\n `base-button--size-${this.size}`,\n `base-button--radius-${this.radius}`,\n ];\n if (this.disabled) {\n parts.push('base-button--disabled');\n }\n if (this.readonly) {\n parts.push('base-button--readonly');\n }\n if (this.fullWidth) {\n parts.push('base-button--full-width');\n }\n if (this.loading) {\n parts.push('base-button--loading');\n }\n return parts.join(' ');\n }\n\n /** Foca o `<button>` nativo (o host do componente não é focável). */\n focusNative(options?: FocusOptions): void {\n this.nativeBtn?.nativeElement?.focus(options);\n }\n}\n","<button\n #nativeBtn\n class=\"base-button__native\"\n [class.base-button__native--loading]=\"loading\"\n [attr.type]=\"type\"\n [disabled]=\"isDisabled\"\n [attr.aria-readonly]=\"readonly ? true : null\"\n [attr.aria-busy]=\"loading ? 'true' : null\"\n>\n @if (loading) {\n <span class=\"base-button__spinner\" aria-hidden=\"true\"></span>\n } @else {\n <ng-content />\n }\n</button>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { BaseButtonComponent } from '../base-button/base-button.component';\n\n/**\n * Botão público da library (`app-button`). Comportamento e API iguais a {@link BaseButtonComponent};\n * use sempre este componente em templates — a base permanece interna ao pacote.\n */\n@Component({\n selector: 'app-button',\n standalone: true,\n imports: [],\n templateUrl: '../base-button/base-button.component.html',\n styleUrl: '../base-button/base-button.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ButtonComponent extends BaseButtonComponent {}\n","const counters = new Map<string, number>();\r\n\r\nexport function createAutoId(prefix: string): string {\r\n const next = (counters.get(prefix) ?? 0) + 1;\r\n counters.set(prefix, next);\r\n return `${prefix}-${next}`;\r\n}\r\n","import {\n ChangeDetectorRef,\n DestroyRef,\n Directive,\n EventEmitter,\n HostBinding,\n Injector,\n Input,\n Output,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { ElementRef } from '@angular/core';\nimport type { MenuNodeItem } from '../../../menus/_models/menu-item.model';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport {\n AbstractControl,\n ControlValueAccessor,\n FormGroupDirective,\n NgForm,\n Validators,\n} from '@angular/forms';\nimport { createAutoId } from '../../../shared/id/auto-id';\nimport type { FieldSize } from '../_models/field-size.model';\n\n/**\n * Diretiva base abstrata: CVA, valor interno, disabled, touched e inputs comuns.\n * Sem UI; os campos concretos envolvem o input com `BaseFieldComponent`.\n */\n@Directive()\nexport abstract class BaseFieldDirective<T> implements ControlValueAccessor {\n protected readonly cdr = inject(ChangeDetectorRef);\n protected readonly injector = inject(Injector);\n protected readonly destroyRef = inject(DestroyRef);\n private readonly hostElementRef = inject(ElementRef<HTMLElement>);\n\n private formGroupDir: FormGroupDirective | null | undefined = undefined;\n private ngFormDir: NgForm | null | undefined = undefined;\n\n /** Identificador estável para a11y quando `id` não é informado */\n protected readonly autoId = createAutoId(this.autoIdPrefix);\n\n @Input() id = '';\n @Input() name = '';\n @Input() label = '';\n @Input() placeholder = '';\n /**\n * Escala visual: `sm` (compacto), `md` (padrão), `lg` (maior).\n */\n @Input() size: FieldSize = 'md';\n @Input() errorMessage = '';\n /** Se `true`, exibe o parágrafo de erro; por defeito `false` (só estado inválido na borda/label). */\n @Input() showErrorMessage = false;\n /**\n * Com campo inválido, aplica fundo semântico de erro (`--ui-field-invalid-input-bg`).\n * Por defeito `false`: fundo igual ao válido (normal ou só leitura); só borda/foco/prefixo denunciam erro.\n */\n @Input({ transform: booleanAttribute }) invalidThemed = false;\n @Input() required = false;\n /** Se `true` e `required`, exibe o asterisco no label (`BaseFieldComponent`); por defeito `false`. */\n @Input() showRequiredMark = false;\n @Input() readonly = false;\n /** Exibe ícone à esquerda (classes Font Awesome, ex.: `fa-solid fa-user`). */\n @Input() showPrefixIcon = true;\n @Input() prefixIcon = '';\n\n /** Alias de {@link prefixIcon} (API alinhada a “ícone à esquerda”). */\n @Input('iconLeft')\n set iconLeft(value: string) {\n this.prefixIcon = value ?? '';\n }\n /** Exibe botão à direita para limpar o valor quando houver texto. */\n @Input() clearable = false;\n @Input() clearAriaLabel = 'Limpar campo';\n /**\n * Se `true`, o atributo HTML fica `autocomplete=\"on\"` (sugestões do browser).\n * `false` → `autocomplete=\"off\"`. Padrão `true`.\n */\n @Input({ transform: booleanAttribute }) autocomplete = true;\n\n /** Placeholder de carregamento no `app-base-field` (skeleton). */\n @Input({ transform: booleanAttribute }) loading = false;\n\n /**\n * Se `true`, foca o controlo nativo após a vista estar montada (ignora se `disabled`, `readonly` ou `loading`).\n * Por defeito `false`.\n */\n @Input({ transform: booleanAttribute }) autofocus = false;\n\n /**\n * Mostra botão «…» no sufixo que abre menu de ações (dropdown com os itens em {@link contextMenuItems}).\n * Por defeito `false`.\n */\n @Input({ transform: booleanAttribute }) mostrarMenuContexto = false;\n\n /** Itens do menu de contexto (rótulos, divisores, grupos); só o botão é mostrado se a lista não for vazia. */\n @Input() contextMenuItems: readonly MenuNodeItem<string>[] = [];\n\n /** `id` do menu (acessibilidade); por defeito `{id do campo}-ctx`. */\n @Input() contextMenuId = '';\n\n @Output() readonly contextMenuSelect = new EventEmitter<string>();\n\n protected internalValue: T | null = null;\n protected disabled = false;\n\n private onChange: (value: T | null) => void = () => { };\n private onTouched: () => void = () => { };\n\n get controlId(): string {\n return this.id || this.autoId;\n }\n\n /** Útil para inspeção no DOM sem colidir com `id` do input interno. */\n @HostBinding('attr.data-control-id')\n get hostDataControlId(): string {\n return this.controlId;\n }\n\n protected get autoIdPrefix(): string {\n const tag = this.hostElementRef.nativeElement.tagName\n .toLowerCase()\n .replace(/^app-/, '');\n return `str-${tag || 'field'}`;\n }\n\n /** Valor do atributo HTML `autocomplete` derivado de {@link autocomplete}. */\n get autocompleteAttr(): 'on' | 'off' {\n return this.autocomplete ? 'on' : 'off';\n }\n\n /**\n * Mensagem exibida quando inválido: `errorMessage` se preenchido;\n * senão, se obrigatório, o padrão \"Campo obrigatório\".\n * Campos não obrigatórios não exibem mensagem de erro da lib.\n */\n getErrorMessage(): string {\n if (!this.showErrorMessage || !this.isEffectiveRequired(this.resolveControlForRequired())) {\n return '';\n }\n const custom = this.errorMessage.trim();\n if (custom.length > 0) {\n return custom;\n }\n return 'Campo obrigatório';\n }\n\n /**\n * Obrigatório efetivo para UI: {@link required} ou `Validators.required` no `FormControl`.\n * Usado no asterisco do label e no atributo HTML `required`.\n */\n get requiredEffective(): boolean {\n return this.isEffectiveRequired(this.resolveControlForRequired());\n }\n\n /**\n * `true` se `[required]=\"true\"` **ou** o control tiver `Validators.required`.\n */\n protected isEffectiveRequired(control: AbstractControl | null | undefined): boolean {\n if (this.required) {\n return true;\n }\n if (!control) {\n return false;\n }\n return (\n control.hasValidator(Validators.required) ||\n control.hasValidator(Validators.requiredTrue)\n );\n }\n\n /** Sobrescrito em campos com `NgControl` para ler o `FormControl`. */\n protected resolveControlForRequired(): AbstractControl | null | undefined {\n return undefined;\n }\n\n /**\n * Estado visual de erro (borda/label): obrigatório efetivo + control inválido +\n * só após interação com o valor (`dirty`) ou envio do formulário (`submitted`).\n * Não usar `touched` sozinho: blur/tab marca touched sem alterar o valor e não deve mostrar erro.\n */\n protected controlInvalidUi(control: AbstractControl | null | undefined): boolean {\n if (!this.isEffectiveRequired(control)) {\n return false;\n }\n return (\n !!control &&\n control.invalid &&\n (control.dirty || this.isParentFormSubmitted())\n );\n }\n\n /** Reactive: `FormGroupDirective` no `<form [formGroup]>`; template-driven: `NgForm`. */\n protected isParentFormSubmitted(): boolean {\n if (this.formGroupDir === undefined) {\n this.formGroupDir =\n this.injector.get(FormGroupDirective, null, { optional: true }) ?? null;\n }\n if (this.ngFormDir === undefined) {\n this.ngFormDir = this.injector.get(NgForm, null, { optional: true }) ?? null;\n }\n return !!(this.formGroupDir?.submitted || this.ngFormDir?.submitted);\n }\n\n /**\n * Campos OnPush precisam reavaliar `baseInvalid` após o submit do form\n * (mudança de `submitted` não passa por `statusChanges`).\n */\n protected registerFormSubmitRecheck(): void {\n const fg = this.injector.get(FormGroupDirective, null, { optional: true });\n const nf = this.injector.get(NgForm, null, { optional: true });\n const mark = (): void => this.cdr.markForCheck();\n fg?.ngSubmit\n ?.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(mark);\n nf?.ngSubmit\n ?.pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(mark);\n }\n\n writeValue(value: T | null): void {\n this.internalValue = value;\n this.afterWriteValue(value);\n this.cdr.markForCheck();\n }\n\n /** Sincroniza exibição/DOM após writeValue ou reset do form. */\n protected afterWriteValue(_value: T | null): void { }\n\n registerOnChange(fn: (value: T | null) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n\n protected emitModelValue(value: T | null): void {\n if (this.disabled) {\n return;\n }\n this.internalValue = value;\n this.onChange(value);\n }\n\n protected notifyTouched(): void {\n this.onTouched();\n this.cdr.markForCheck();\n }\n\n /**\n * Chamado em `ngAfterViewInit` dos campos concretos com o elemento focável (input, textarea, combobox, etc.).\n */\n protected applyAutofocusIfNeeded(\n resolve: () => HTMLElement | null | undefined,\n ): void {\n if (!this.autofocus || this.disabled || this.readonly || this.loading) {\n return;\n }\n queueMicrotask(() => {\n const el = resolve();\n el?.focus({ preventScroll: false });\n });\n }\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/** Bloco genérico de skeleton (linhas, caixas, células). */\r\n@Component({\r\n selector: 'app-skeleton-block',\r\n standalone: true,\r\n templateUrl: './skeleton-block.component.html',\r\n styleUrl: './skeleton-block.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class SkeletonBlockComponent {\r\n /** Largura CSS (ex.: `100%`, `6rem`, `40%`). */\r\n @Input() width = '100%';\r\n /** Altura CSS. */\r\n @Input() height = '0.75rem';\r\n /** Raio de canto. */\r\n @Input() radius = '8px';\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = ['skeleton-block'];\r\n if (this.animate) {\r\n parts.push('skeleton-block--animate');\r\n } else {\r\n parts.push('skeleton-block--static');\r\n }\r\n return parts.join(' ');\r\n }\r\n}\r\n","<span class=\"skeleton-block__inner\" aria-hidden=\"true\" [style.width]=\"width\" [style.height]=\"height\"\r\n [style.border-radius]=\"radius\"></span>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Várias linhas de texto placeholder. */\r\n@Component({\n selector: 'app-skeleton-text',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-text.component.html',\n styleUrl: './skeleton-text.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonTextComponent {\r\n @Input({ transform: numberAttribute }) lines = 3;\r\n /** Largura da última linha em % (1–100). */\r\n @Input({ transform: numberAttribute }) lastLineWidthPct = 62;\r\n @Input() lineHeight = '0.7rem';\r\n @Input() gap = '0.45rem';\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n lineIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.lines) }, (_, i) => i);\r\n }\r\n\r\n widthForLine(i: number): string {\r\n const n = Math.max(1, this.lines);\r\n if (i === n - 1) {\r\n const p = Math.min(100, Math.max(20, this.lastLineWidthPct));\r\n return `${p}%`;\r\n }\r\n return '100%';\r\n }\r\n}\r\n","<div class=\"skeleton-text\" [style.gap]=\"gap\">\r\n @for (i of lineIndexes(); track i) {\r\n <app-skeleton-block [width]=\"widthForLine(i)\" [height]=\"lineHeight\" [animate]=\"animate\" />\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Lista vertical de linhas (ex.: opções de dropdown). */\r\n@Component({\n selector: 'app-skeleton-list',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-list.component.html',\n styleUrl: './skeleton-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonListComponent {\r\n @Input({ transform: numberAttribute }) rows = 6;\r\n /** Mostra um “leading” à esquerda (círculo pequeno). */\r\n @Input({ transform: booleanAttribute }) leading = true;\r\n @Input() rowGap = '0.25rem';\r\n /** Altura da barra por linha (alinhada às opções de select ~0,95rem / lh 1,35). */\r\n @Input() lineHeight = '1.05rem';\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n rowIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.rows) }, (_, i) => i);\r\n }\r\n}\r\n","<div class=\"skeleton-list\" [style.gap]=\"rowGap\">\r\n @for (i of rowIndexes(); track i) {\r\n <div class=\"skeleton-list__row\">\r\n @if (leading) {\r\n <app-skeleton-block class=\"skeleton-list__dot\" width=\"1.5rem\" height=\"1.5rem\" radius=\"999px\"\r\n [animate]=\"animate\" />\r\n }\r\n <app-skeleton-block class=\"skeleton-list__line\" width=\"100%\" [height]=\"lineHeight\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Placeholder de cartão (avatar + texto + ações). */\r\n@Component({\n selector: 'app-skeleton-card',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-card.component.html',\n styleUrl: './skeleton-card.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonCardComponent {\r\n @Input({ transform: booleanAttribute }) showActions = true;\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n}\r\n","<div class=\"skeleton-card\" aria-hidden=\"true\">\r\n <div class=\"skeleton-card__row\">\r\n <div class=\"skeleton-card__main\">\r\n <app-skeleton-block class=\"skeleton-card__avatar\" width=\"2.35rem\" height=\"2.35rem\" radius=\"999px\"\r\n [animate]=\"animate\" />\r\n <div class=\"skeleton-card__text\">\r\n <app-skeleton-block width=\"72%\" height=\"0.72rem\" radius=\"6px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"48%\" height=\"0.62rem\" radius=\"6px\" [animate]=\"animate\" />\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"skeleton-card__actions\">\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n <app-skeleton-block width=\"2rem\" height=\"2rem\" radius=\"8px\" [animate]=\"animate\" />\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Placeholder tabular (cabeçalho + linhas + faixa de paginação). */\r\n@Component({\n selector: 'app-skeleton-table',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-table.component.html',\n styleUrl: './skeleton-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonTableComponent {\r\n @Input({ transform: numberAttribute }) columnCount = 4;\r\n @Input({ transform: numberAttribute }) rowCount = 8;\r\n @Input({ transform: booleanAttribute }) showPager = true;\r\n\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n colIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.columnCount) }, (_, i) => i);\r\n }\r\n\r\n rowIndexes(): number[] {\r\n return Array.from({ length: Math.max(1, this.rowCount) }, (_, i) => i);\r\n }\r\n}\r\n","<div class=\"skeleton-table\" aria-hidden=\"true\">\r\n <div class=\"skeleton-table__header\">\r\n @for (c of colIndexes(); track c) {\r\n <app-skeleton-block class=\"skeleton-table__cell\" width=\"100%\" height=\"0.65rem\" radius=\"6px\" [animate]=\"animate\" />\r\n }\r\n </div>\r\n <div class=\"skeleton-table__body\">\r\n @for (r of rowIndexes(); track r) {\r\n <div class=\"skeleton-table__row\">\r\n @for (c of colIndexes(); track c) {\r\n <app-skeleton-block class=\"skeleton-table__cell\" width=\"100%\" height=\"0.55rem\" radius=\"5px\" [animate]=\"animate\" />\r\n }\r\n </div>\r\n }\r\n </div>\r\n @if (showPager) {\r\n <div class=\"skeleton-table__pager\">\r\n <app-skeleton-block width=\"40%\" height=\"0.55rem\" radius=\"6px\" [animate]=\"animate\" />\r\n </div>\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../skeleton-block/skeleton-block.component';\r\n\r\n/** Layout do placeholder no `app-base-field` quando `loading` é `true`. */\r\nexport type SkeletonFieldShellVariant = 'text' | 'select' | 'textarea';\r\n\r\n/**\r\n * Placeholder de campo: barra de valor e, opcionalmente, quadrado à esquerda quando não há\r\n * ícone Font Awesome na coluna de prefixo do `app-base-field`.\r\n */\r\n@Component({\r\n selector: 'app-skeleton-field-shell',\r\n imports: [SkeletonBlockComponent],\r\n templateUrl: './skeleton-field-shell.component.html',\r\n styleUrl: './skeleton-field-shell.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class SkeletonFieldShellComponent {\r\n /** `textarea`: várias barras (multilinha); restantes: uma barra estreita ao estilo «valor». */\r\n @Input() variant: SkeletonFieldShellVariant = 'text';\r\n @Input({ transform: booleanAttribute }) animate = true;\r\n\r\n /**\r\n * Quando `false`, não renderiza o quadrado à esquerda (o `app-base-field` já mostra o ícone\r\n * de prefixo inerte na coluna correcta durante `loading`).\r\n */\r\n @Input({ transform: booleanAttribute }) showLeadingIcon = true;\r\n}\r\n","<div\r\n class=\"skeleton-field-shell\"\r\n [class.skeleton-field-shell--bar-only]=\"!showLeadingIcon\"\r\n [class.skeleton-field-shell--textarea]=\"variant === 'textarea'\"\r\n aria-hidden=\"true\"\r\n>\r\n @if (showLeadingIcon) {\r\n <app-skeleton-block class=\"skeleton-field-shell__prefix\" width=\"1.35em\" height=\"1.35em\" radius=\"8px\"\r\n [animate]=\"animate\" />\r\n }\r\n @if (variant === 'textarea') {\r\n <div class=\"skeleton-field-shell__lines\">\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"72%\" height=\"1.05em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"92%\" height=\"1.05em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"58%\" height=\"1.05em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n </div>\r\n } @else {\r\n <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"72%\" height=\"1.35em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n }\r\n</div>\r\n","export const STRUCTRA_THEME_IDS = [\r\n 'blue',\r\n 'green',\r\n 'purple',\r\n 'orange',\r\n 'white',\r\n 'gray',\r\n 'sepia',\r\n 'black',\r\n] as const;\r\n\r\nexport type StructraTheme = (typeof STRUCTRA_THEME_IDS)[number];\r\n","import { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\r\n\r\nexport const APP_THEME_BASE_CLASS = 'app-library-theme';\r\n\r\nexport function normalizeStructraTheme(theme: StructraTheme | string): StructraTheme {\r\n const candidate = String(theme) as StructraTheme;\r\n if ((STRUCTRA_THEME_IDS as readonly string[]).includes(candidate)) {\r\n return candidate;\r\n }\r\n return 'black';\r\n}\r\n\r\nexport function getThemeTokenClass(theme: StructraTheme | string): string {\r\n return `theme-${normalizeStructraTheme(theme)}`;\r\n}\r\n\r\nexport function getThemeClassList(theme: StructraTheme | string): readonly [string, string] {\r\n return [APP_THEME_BASE_CLASS, getThemeTokenClass(theme)];\r\n}\r\n\r\nexport function getThemeClass(theme: StructraTheme | string): string {\r\n return getThemeClassList(theme).join(' ');\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\nimport { getThemeClass, getThemeClassList } from './theme-class.helpers';\nimport { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\n\n/** Identificadores de paleta suportados pela library (uso em `AppThemeService.setTheme`). */\nexport enum AppTheme {\n Blue = 'blue',\n Green = 'green',\n Purple = 'purple',\n Orange = 'orange',\n White = 'white',\n Gray = 'gray',\n Sepia = 'sepia',\n Black = 'black',\n}\n\nexport const APP_THEME_IDS = [\n ...STRUCTRA_THEME_IDS,\n] as const;\n\nexport type AppThemeId = StructraTheme;\n\n/** Opção de tema para UI (selector, documentação). */\nexport interface AppThemeOption {\n readonly id: AppThemeId;\n readonly label: string;\n}\n\n/**\n * Estado global do tema da library: **sempre** `.app-library-theme` + `theme-*` juntos.\n * Os tokens de paleta em `_theme-palettes.scss` usam o selector `.app-library-theme.theme-*`.\n */\n@Injectable({ providedIn: 'root' })\nexport class AppThemeService {\n private readonly activeId = signal<AppThemeId>(AppTheme.Black);\n\n /** Identificador do tema activo (`blue`, `green`, …). */\n readonly activeThemeId = this.activeId.asReadonly();\n\n /**\n * Classes separadas (ex.: CDK `panelClass` — uma string com espaço quebra `classList.add`).\n */\n readonly themeClassList = computed(\n (): readonly [string, string] => getThemeClassList(this.activeId()),\n );\n\n /**\n * As duas classes numa string — útil para `[class]`, `[ngClass]` com string, ou hosts HTML.\n * Ex.: `<div [ngClass]=\"libTheme.getTheme()\">` aplica paleta completa no consumidor.\n */\n readonly getTheme = computed(() => getThemeClass(this.activeId()));\n\n /** Mapa para `[ngClass]` com chaves dinâmicas (painéis overlay). */\n readonly themeClassMap = computed(() => {\n const [base, token] = this.themeClassList();\n return { [base]: true, [token]: true };\n });\n\n /** Lista fixa de temas suportados pela library. */\n readonly themeOptions: readonly AppThemeOption[] = [\n { id: AppTheme.Blue, label: 'Azul' },\n { id: AppTheme.Green, label: 'Verde' },\n { id: AppTheme.Purple, label: 'Roxo' },\n { id: AppTheme.Orange, label: 'Laranja' },\n { id: AppTheme.White, label: 'Branco' },\n { id: AppTheme.Gray, label: 'Cinza' },\n { id: AppTheme.Sepia, label: 'Sépia' },\n { id: AppTheme.Black, label: 'Preto' },\n ] as const;\n\n setTheme(id: AppThemeId): void {\n this.activeId.set(id);\n }\n\n isActive(id: AppThemeId): boolean {\n return this.activeId() === id;\n }\n}\n","import { Directive, ElementRef, Input, OnChanges, Renderer2 } from '@angular/core';\r\nimport { AppTheme, AppThemeService } from './app-theme.service';\r\nimport {\r\n APP_THEME_BASE_CLASS,\r\n getThemeTokenClass,\r\n normalizeStructraTheme,\r\n} from './theme-class.helpers';\r\nimport { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\r\n\r\n@Directive({\r\n selector: '[appTheme]',\r\n standalone: true,\r\n})\r\nexport class ThemeDirective implements OnChanges {\r\n @Input('appTheme') theme: StructraTheme | AppTheme = 'black';\r\n\r\n private readonly themeTokenClasses = STRUCTRA_THEME_IDS.map((themeId) => `theme-${themeId}`);\r\n\r\n constructor(\r\n private readonly elementRef: ElementRef<HTMLElement>,\r\n private readonly renderer: Renderer2,\r\n private readonly themeService: AppThemeService,\r\n ) {}\r\n\r\n ngOnChanges(): void {\r\n const element = this.elementRef.nativeElement;\r\n this.renderer.addClass(element, APP_THEME_BASE_CLASS);\r\n for (const themeClass of this.themeTokenClasses) {\r\n this.renderer.removeClass(element, themeClass);\r\n }\r\n this.renderer.addClass(element, getThemeTokenClass(this.theme));\r\n /** Overlays / hosts que leem {@link AppThemeService} alinham com o mesmo tema do wrapper. */\r\n this.themeService.setTheme(normalizeStructraTheme(this.theme as string));\r\n }\r\n}\r\n","import { Signal, computed, inject } from '@angular/core';\r\nimport { AppThemeService, type AppThemeId, type AppTheme } from './app-theme.service';\r\nimport { normalizeStructraTheme } from './theme-class.helpers';\r\nimport type { StructraTheme } from './theme.types';\r\n\r\n/**\r\n * Tema efectivo para hosts/overlays: valor de `[appTheme]` quando definido; caso contrário\r\n * {@link AppThemeService.activeThemeId} (mesmo comportamento que antes sem input).\r\n */\r\nexport function injectEffectiveThemeId(\r\n appTheme: Signal<StructraTheme | AppTheme | undefined | null>,\r\n): Signal<AppThemeId> {\r\n const svc = inject(AppThemeService);\r\n return computed(() => {\r\n const v = appTheme();\r\n if (v !== undefined && v !== null && String(v).trim() !== '') {\r\n return normalizeStructraTheme(v as string);\r\n }\r\n return svc.activeThemeId();\r\n });\r\n}\r\n","import { Renderer2 } from '@angular/core';\r\nimport type { AppTheme } from './app-theme.service';\r\nimport {\r\n APP_THEME_BASE_CLASS,\r\n getThemeTokenClass,\r\n normalizeStructraTheme,\r\n} from './theme-class.helpers';\r\nimport { STRUCTRA_THEME_IDS, type StructraTheme } from './theme.types';\r\n\r\n/**\r\n * Remove classes de tema do host e, se `explicitTheme` estiver definido, aplica `.app-library-theme`\r\n * + `theme-*`. Caso contrário deixa o host sem paleta própria (herda do ancestral / wrapper).\r\n */\r\nexport function applyOptionalThemeHostClasses(\r\n renderer: Renderer2,\r\n element: HTMLElement,\r\n explicitTheme: StructraTheme | AppTheme | string | undefined | null,\r\n): void {\r\n renderer.removeClass(element, APP_THEME_BASE_CLASS);\r\n for (const themeId of STRUCTRA_THEME_IDS) {\r\n renderer.removeClass(element, `theme-${themeId}`);\r\n }\r\n if (\r\n explicitTheme !== undefined &&\r\n explicitTheme !== null &&\r\n String(explicitTheme).trim() !== ''\r\n ) {\r\n const id = normalizeStructraTheme(explicitTheme as string);\r\n renderer.addClass(element, APP_THEME_BASE_CLASS);\r\n renderer.addClass(element, getThemeTokenClass(id));\r\n }\r\n}\r\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n booleanAttribute,\r\n computed,\r\n inject,\r\n} from '@angular/core';\r\nimport {\r\n CdkConnectedOverlay,\r\n CdkOverlayOrigin,\r\n Overlay,\r\n type ConnectedPosition,\r\n type ScrollStrategy,\r\n} from '@angular/cdk/overlay';\r\nimport { AppThemeService } from '../../../../theme';\r\n\r\n/** Posição por omissão do CDK (equivalente ao comportamento anterior sem `positions` explícitas). */\r\nconst DEFAULT_CONNECTED_POSITIONS: ConnectedPosition[] = [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n },\r\n];\r\n\r\n/**\r\n * Base de overlay para **listas ligadas a campos** (select, dropdown-menu, etc.).\r\n * Para tooltips/popovers genéricos ver `AnchoredOverlayComponent` em `overlay/` — mesma stack CDK e tema,\r\n * API de fecho semelhante (`open`/`openChange`, Escape), mas defaults diferentes (ex.: backdrop em dropdowns).\r\n */\r\n@Component({\r\n selector: 'app-dropdown-base',\r\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgClass, NgTemplateOutlet],\r\n templateUrl: './dropdown-base.component.html',\r\n styleUrl: './dropdown-base.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class DropdownBaseComponent {\r\n private readonly appTheme = inject(AppThemeService);\r\n private readonly overlay = inject(Overlay);\r\n\r\n /**\r\n * O overlay do CDK fica sob `body`; sem estas classes, `var(--app-color-*)` cai no `:root`.\r\n * Tem de ser **array**: uma única string com espaço quebra `classList.add` e as classes não aplicam.\r\n */\r\n readonly overlayPanelClasses = computed((): string[] => [\r\n ...this.appTheme.themeClassList(),\r\n ]);\r\n\r\n /**\r\n * O CDK não reaplica `cdkConnectedOverlayPanelClass` quando o overlay já existe.\r\n * As classes de tema no painel interno seguem o tema activo sempre.\r\n */\r\n readonly panelThemeNgClass = computed(() => this.appTheme.themeClassMap());\r\n\r\n @Input({ transform: booleanAttribute }) open = false;\r\n @Output() readonly openChange = new EventEmitter<boolean>();\r\n\r\n /** Conteúdo do painel (lista, etc.) renderizado no overlay. */\r\n @Input({ required: true }) panelTemplate!: TemplateRef<unknown>;\r\n\r\n /** Largura do painel em px (ex.: largura total do campo). */\r\n @Input() panelWidthPx: number | null = null;\r\n\r\n @Input({ transform: booleanAttribute }) closeOnEscape = true;\r\n @Input({ transform: booleanAttribute }) hasBackdrop = true;\r\n\r\n /**\r\n * Posições do overlay ligadas ao trigger (ex.: menu com flip vertical).\r\n * Por omissão mantém o alinhamento clássico «por baixo» dos campos.\r\n */\r\n @Input() connectedPositions: ConnectedPosition[] | undefined;\r\n\r\n /** Empurra o overlay para caber no viewport quando há espaço insuficiente. */\r\n @Input({ transform: booleanAttribute }) pushConnectedOverlay = false;\r\n\r\n /**\r\n * Por omissão **reposiciona** o painel quando o viewport ou contentores com scroll se movem\r\n * (mesma ideia que submenus em `app-menu-list`). Sobrescrever só em casos especiais (ex.: fechar ao scroll).\r\n */\r\n @Input() scrollStrategy: ScrollStrategy | null = null;\r\n\r\n readonly defaultScrollStrategy = this.overlay.scrollStrategies.reposition();\r\n\r\n get effectiveScrollStrategy(): ScrollStrategy {\r\n return this.scrollStrategy ?? this.defaultScrollStrategy;\r\n }\r\n\r\n /**\r\n * `true`: painel sem fundo/borda/sombra próprios — o conteúdo (ex.: `app-menu-list`) define o chrome.\r\n * Evita dupla moldura com `menu-surface-shell` nos menus de acção.\r\n */\r\n @Input({ transform: booleanAttribute }) bareOverlayPanel = false;\r\n\r\n get overlayWidthPx(): number {\r\n const w = this.panelWidthPx;\r\n return w != null && w > 0 ? w : 0;\r\n }\r\n\r\n get effectiveConnectedPositions(): ConnectedPosition[] {\r\n return this.connectedPositions ?? DEFAULT_CONNECTED_POSITIONS;\r\n }\r\n\r\n onBackdropClick(): void {\r\n this.setOpen(false);\r\n }\r\n\r\n /**\r\n * Cliques noutros controlos (fora do painel e fora do trigger) nem sempre passam pelo backdrop;\r\n * o CDK expõe `overlayOutsideClick` para o mesmo efeito de fechar.\r\n */\r\n onOverlayOutsideClick(): void {\r\n this.setOpen(false);\r\n }\r\n\r\n onOverlayKeydown(ev: KeyboardEvent): void {\r\n if (this.closeOnEscape && ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.setOpen(false);\r\n }\r\n }\r\n\r\n setOpen(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.open = next;\r\n this.openChange.emit(next);\r\n }\r\n\r\n toggle(): void {\r\n this.setOpen(!this.open);\r\n }\r\n}\r\n","<div class=\"dropdown-base\">\r\n <span class=\"dropdown-base__origin\" cdkOverlayOrigin #dropdownOrigin=\"cdkOverlayOrigin\">\r\n <ng-content select=\"[appDropdownTrigger]\" />\r\n </span>\r\n\r\n <ng-template\r\n cdkConnectedOverlay\r\n [cdkConnectedOverlayPositions]=\"effectiveConnectedPositions\"\r\n [cdkConnectedOverlayPush]=\"pushConnectedOverlay\"\r\n [cdkConnectedOverlayScrollStrategy]=\"effectiveScrollStrategy\"\r\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\r\n [cdkConnectedOverlayOrigin]=\"dropdownOrigin\"\r\n [cdkConnectedOverlayOpen]=\"open\"\r\n [cdkConnectedOverlayWidth]=\"$any(overlayWidthPx > 0 ? overlayWidthPx : undefined)\"\r\n [cdkConnectedOverlayMinWidth]=\"$any(overlayWidthPx > 0 ? overlayWidthPx : undefined)\"\r\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\r\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\r\n [cdkConnectedOverlayDisableClose]=\"false\"\r\n (backdropClick)=\"onBackdropClick()\"\r\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\r\n (overlayKeydown)=\"onOverlayKeydown($event)\"\r\n (detach)=\"setOpen(false)\"\r\n >\r\n <div\r\n class=\"dropdown-base__panel\"\r\n [class.dropdown-base__panel--bare]=\"bareOverlayPanel\"\r\n [ngClass]=\"panelThemeNgClass()\"\r\n role=\"presentation\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"panelTemplate\" />\r\n </div>\r\n </ng-template>\r\n</div>\r\n","/**\r\n * Posicionamento vertical preferido do dropdown em relação ao trigger.\r\n * O CDK faz flip automático se não couber no viewport quando configurado com posições múltiplas.\r\n */\r\nexport enum MenuDropdownPlacement {\r\n /** Abre por baixo do trigger (preferencial). */\r\n Below = 'below',\r\n /** Abre por cima do trigger. */\r\n Above = 'above',\r\n}\r\n","import type { ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\r\n\r\n/** Espaço entre trigger e painel (listas alinhadas ao `start`); mais apertado que `anchoredOverlayPositions` (8px). */\r\nconst GAP = 4;\r\n\r\n/** Posições com flip vertical (preferência em baixo ou em cima). */\r\nexport function menuConnectedPositions(\r\n placement: MenuDropdownPlacement,\r\n): ConnectedPosition[] {\r\n if (placement === MenuDropdownPlacement.Above) {\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetY: -GAP,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: GAP,\r\n },\r\n ];\r\n }\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'bottom',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetY: GAP,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'bottom',\r\n offsetY: -GAP,\r\n },\r\n ];\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n/**\r\n * Separador semântico reutilizável — mesma apresentação que o divisor do modelo de dados (`kind: 'divider'`).\r\n */\r\n@Component({\r\n selector: 'app-menu-divider',\r\n standalone: true,\r\n template: `<div class=\"menu-list__separator\" role=\"separator\" aria-hidden=\"true\"></div>`,\r\n styleUrl: './menu-divider.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MenuDividerComponent {}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\n\n/**\n * Cabeçalho opcional de grupo — alinhado a `MenuItemGroup` (`kind: 'group'`):\n * `alwaysExpanded` = sempre aberto sem toggle; caso contrário `expanded` no modelo define o estado inicial.\n */\n@Component({\n selector: 'app-menu-group',\n standalone: true,\n template: `\n @if (label?.trim() && !hideLabel) {\n @if (collapsible) {\n <button\n type=\"button\"\n class=\"menu-list__group-toggle\"\n [attr.aria-expanded]=\"expanded\"\n (click)=\"toggleExpand.emit()\"\n >\n <span class=\"menu-list__group-toggle-label\">{{ label }}</span>\n <span class=\"menu-list__group-toggle-icon\" aria-hidden=\"true\">\n @if (expanded) {\n <i class=\"fa-solid fa-chevron-up\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </span>\n </button>\n } @else {\n <div class=\"menu-list__group-label\" role=\"presentation\">{{ label }}</div>\n }\n }\n `,\n styleUrl: './menu-group.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MenuGroupComponent {\n @Input() label?: string;\n\n /** Quando `true`, não mostra o título (ex.: sidebar colapsada só com ícones). */\n @Input({ transform: booleanAttribute }) hideLabel = false;\n\n /** Quando `true`, mostra seta e permite expandir/recolher (controlado pelo `menu-list`). */\n @Input({ transform: booleanAttribute }) collapsible = false;\n\n @Input({ transform: booleanAttribute }) expanded = true;\n\n @Output() readonly toggleExpand = new EventEmitter<void>();\n}\n","import type {\n MenuItemAction,\n MenuItemSubmenu,\n MenuLeafItem,\n MenuNodeItem,\n} from '../_models/menu-item.model';\n\nexport interface MenuRowAction<T = string> {\n kind: 'action';\n item: MenuItemAction<T>;\n /** Índice na navegação por teclado; `null` se desabilitado. */\n focusIndex: number | null;\n /** `null` = fora de grupo; caso contrário, pertence a este grupo (oculto se o grupo estiver fechado). */\n containingGroupId?: number | null;\n}\n\nexport interface MenuRowDivider {\n kind: 'divider';\n containingGroupId?: number | null;\n}\n\nexport interface MenuRowGroup {\n kind: 'group';\n label?: string;\n groupId: number;\n /** Eco de {@link MenuItemGroup.alwaysExpanded}. */\n alwaysExpanded?: boolean;\n /** Eco de {@link MenuItemGroup.expanded} (nome interno para não confundir com UI `expanded`). */\n initialExpanded?: boolean;\n}\n\nexport interface MenuRowSubmenu<T = string> {\n kind: 'submenu';\n item: MenuItemSubmenu<T>;\n focusIndex: number | null;\n containingGroupId?: number | null;\n}\n\nexport type MenuRow<T = string> =\n | MenuRowAction<T>\n | MenuRowDivider\n | MenuRowGroup\n | MenuRowSubmenu<T>;\n\nexport function buildMenuRows<T = string>(\n nodes: readonly MenuNodeItem<T>[],\n): MenuRow<T>[] {\n const rows: MenuRow<T>[] = [];\n let focusCounter = 0;\n let nextGroupId = 0;\n\n const addLeaf = (leaf: MenuLeafItem<T>, parentGroupId: number | null): void => {\n if (leaf.kind === 'divider') {\n rows.push({ kind: 'divider', containingGroupId: parentGroupId });\n return;\n }\n const focusIndex = leaf.disabled ? null : focusCounter++;\n rows.push({\n kind: 'action',\n item: leaf,\n focusIndex,\n containingGroupId: parentGroupId,\n });\n };\n\n const addNode = (n: MenuNodeItem<T>, parentGroupId: number | null): void => {\n if (n.kind === 'divider') {\n rows.push({ kind: 'divider', containingGroupId: parentGroupId });\n return;\n }\n if (n.kind === 'submenu') {\n const focusIndex = n.disabled ? null : focusCounter++;\n rows.push({\n kind: 'submenu',\n item: n,\n focusIndex,\n containingGroupId: parentGroupId,\n });\n return;\n }\n if (n.kind === 'group') {\n const gid = nextGroupId++;\n rows.push({\n kind: 'group',\n label: n.label,\n groupId: gid,\n alwaysExpanded: n.alwaysExpanded === true,\n initialExpanded:\n n.expanded === true ? true : n.expanded === false ? false : undefined,\n });\n for (const child of n.items) {\n addNode(child, gid);\n }\n return;\n }\n addLeaf(n, parentGroupId);\n };\n\n for (const n of nodes) {\n addNode(n, null);\n }\n return rows;\n}\n\nexport function focusableActionCount<T>(rows: readonly MenuRow<T>[]): number {\n return rows.filter(\n (r): r is MenuRowAction<T> | MenuRowSubmenu<T> =>\n (r.kind === 'action' || r.kind === 'submenu') && r.focusIndex !== null,\n ).length;\n}\n\n/**\n * `true` se `selectedId` for id de um item de acção (folha) em qualquer profundidade.\n * Usado para marcar o gatilho de submenu como selected quando a selecção actual é um filho.\n */\nexport function menuNodeTreeContainsId<T>(\n items: readonly MenuNodeItem<T>[],\n selectedId: T,\n): boolean {\n for (const node of items) {\n if (node.kind === 'divider') {\n continue;\n }\n if (node.kind === 'item') {\n if (node.id === selectedId) {\n return true;\n }\n } else {\n if (menuNodeTreeContainsId(node.items, selectedId)) {\n return true;\n }\n }\n }\n return false;\n}\n","import type { ConnectedPosition } from '@angular/cdk/overlay';\r\n\r\n/**\r\n * Ligeira sobreposição (offsetX) para o rato nunca\r\n * percorrer “vácuo” entre a linha do `cdkOverlayOrigin` e o painel: nesse\r\n * vão, `mouseleave` do trigger dispara sem `mouseenter` no subpainel, e o\r\n * submenu de nível profundo fecha (comportamento típico de menus de SO).\r\n */\r\nconst SUBMENU_OVERLAP_PX = 4;\r\n\r\n/**\r\n * Submenu ao lado do item (preferência à direita); o CDK `push` inverte se não couber.\r\n */\r\nexport function submenuConnectedPositions(): ConnectedPosition[] {\r\n return [\r\n {\r\n originX: 'end',\r\n originY: 'top',\r\n overlayX: 'start',\r\n overlayY: 'top',\r\n offsetX: -SUBMENU_OVERLAP_PX,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'top',\r\n overlayX: 'end',\r\n overlayY: 'top',\r\n offsetX: SUBMENU_OVERLAP_PX,\r\n },\r\n ];\r\n}\r\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n Output,\n QueryList,\n Signal,\n SimpleChanges,\n ViewChildren,\n booleanAttribute,\n computed,\n forwardRef,\n input,\n} from '@angular/core';\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport type { MenuItemAction, MenuNodeItem } from '../_models/menu-item.model';\nimport {\n getThemeClassList,\n injectEffectiveThemeId,\n type AppTheme,\n type AppThemeId,\n type StructraTheme,\n} from '../../theme';\nimport { MenuDividerComponent } from '../menu-divider/menu-divider.component';\nimport { MenuGroupComponent } from '../menu-group/menu-group.component';\nimport {\n type MenuRow,\n type MenuRowGroup,\n buildMenuRows,\n menuNodeTreeContainsId,\n} from '../_utils/menu-rows.util';\nimport { submenuConnectedPositions } from '../_utils/submenu-connected-positions.util';\n\nconst SUBMENU_OPEN_MS = 200;\n/**\n * Margem para o cursor atravessar a zona entre a linha e o painel (o overlay\n * não fica no DOM do trigger) sem fechar; emparelha com a sobreposição de posição.\n */\nconst SUBMENU_CLOSE_MS = 1200;\n\n@Component({\n selector: 'app-menu-list-body',\n templateUrl: './menu-list-body.component.html',\n styleUrl: './menu-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n /**\n * Host + `.menu-list` interior registados no `ScrollDispatcher`:\n * os eventos `scroll` não propagam — quando só o interior tem `overflow:auto`\n * (dropdown / mixin `menu-surface-shell`), o host não recebe scroll; na sidebar\n * (`overflow-y:visible` em `.app-nav-surface`) quem rola é o host `app-menu-list`.\n * Ambos garantem que `RepositionScrollStrategy` volta a posicionar o submenu.\n */\n hostDirectives: [CdkScrollable],\n imports: [\n NgClass,\n forwardRef(() => MenuListBodyComponent),\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n CdkScrollable,\n MenuDividerComponent,\n MenuGroupComponent,\n ]\n})\nexport class MenuListBodyComponent<T = string> implements OnChanges {\n private readonly cdr: ChangeDetectorRef;\n readonly hostRef: ElementRef<HTMLElement>;\n\n /** Igual a `[appTheme]` na lib; omitir = tema global (ex.: propagado por `app-sidebar`). */\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n readonly effectiveThemeId: Signal<AppThemeId>;\n\n constructor(\n cdr: ChangeDetectorRef,\n hostRef: ElementRef<HTMLElement>,\n ) {\n this.cdr = cdr;\n this.hostRef = hostRef;\n this.effectiveThemeId = injectEffectiveThemeId(this.appTheme);\n }\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n /** Prefixo dos `id` das opções focáveis (`${menuId}-opt-${focusIndex}`). */\n @Input() menuId = 'app-menu';\n\n @Input({ transform: booleanAttribute }) dense = false;\n\n /** Quando `true`, o menu está dentro de um submenu — seta ← regressa um nível. */\n @Input({ transform: booleanAttribute }) nested = false;\n\n /**\n * Destaca visualmente o item cuja `id` coincide (navegação actual / rota activa).\n * Só aplica a linhas `kind: 'item'` neste nível.\n */\n @Input() selectedItemId: T | null = null;\n\n /**\n * Oculta rótulos e descrições (ex.: sidebar colapsada), mantendo ícones; define `title` nativo para hover.\n */\n @Input({ transform: booleanAttribute }) compressText = false;\n\n /**\n * Submenus (`kind: 'submenu'`):\n * - **`true` (omissão)** — abre/fecha **por clique** (e teclado); **não** abre ao passar o rato.\n * - **`false`** — igual ao comportamento anterior: abre **só com hover** (com atraso), sem alternar ao clicar na linha.\n */\n @Input() clickToOpen = true;\n\n /**\n * Grupos (`kind: 'group'`): quando `false`, cabeçalhos sem seta e itens sempre visíveis (não recolhe).\n */\n @Input({ transform: booleanAttribute }) groupCollapsible = true;\n\n /**\n * Com {@link groupCollapsible}: estado inicial ao receber `items` para grupos **sem** `expanded`\n * explícito no modelo.\n * - `'all'` — todos os grupos colapsáveis começam abertos.\n * - `'first'` — só o primeiro grupo da lista (se não for `alwaysExpanded`) começa aberto.\n */\n @Input() groupDefaultExpansion: 'all' | 'first' = 'all';\n\n /**\n * Quando `true`, expande todos os grupos colapsáveis (ex.: pesquisa activa na lista raiz).\n */\n @Input({ transform: booleanAttribute }) expandAllGroupsInitially = false;\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly closeRequest = new EventEmitter<void>();\n @Output() readonly submenuBack = new EventEmitter<void>();\n\n @ViewChildren(MenuListBodyComponent)\n private nestedLists?: QueryList<MenuListBodyComponent<T>>;\n\n rows: MenuRow<T>[] = [];\n\n /** Filtrado + índices de foco coerentes com grupos recolhidos. */\n displayRows: MenuRow<T>[] = [];\n\n /** Ids de grupo expandidos; ao mudar `items`, todos voltam a abertos. */\n private readonly expandedGroupIds = new Set<number>();\n\n private focusableCount = 0;\n\n /** Índice entre `0` e `focusableCount - 1`, ou `-1` = nenhum realce. */\n activeIndex = -1;\n\n /** Painel de submenu aberto (um por instância de lista). */\n openSubmenuKey: string | null = null;\n\n private submenuOpenTimer: ReturnType<typeof setTimeout> | null = null;\n private submenuCloseTimer: ReturnType<typeof setTimeout> | null = null;\n\n readonly submenuPositions = submenuConnectedPositions();\n\n readonly panelThemeNgClass = computed(() => {\n const [base, token] = getThemeClassList(this.effectiveThemeId());\n return { [base]: true, [token]: true };\n });\n\n overlayPanelClasses(): string[] {\n return [...getThemeClassList(this.effectiveThemeId()), 'menu-submenu__cdk-panel'];\n }\n\n onNestedItemSelect(id: T): void {\n this.closeOpenSubmenu();\n this.itemSelect.emit(id);\n }\n\n /** Identidade estável para `@for` — `track $index` quebra quando linhas são omitidas por grupo recolhido. */\n trackDisplayRow(index: number, row: MenuRow<T>): string {\n switch (row.kind) {\n case 'group':\n return `g-${String(row.groupId)}`;\n case 'divider':\n return `d-${String(row.containingGroupId ?? 'x')}-${index}`;\n case 'action':\n return `a-${String(row.item.id)}-${index}`;\n case 'submenu':\n return `s-${String(row.item.id)}-${index}`;\n default:\n return `r-${index}`;\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['items'] || changes['expandAllGroupsInitially']) {\n this.rebuildRowsFromItems();\n } else if (\n changes['groupCollapsible'] ||\n changes['compressText'] ||\n changes['groupDefaultExpansion']\n ) {\n if (changes['compressText']) {\n this.rebuildRowsFromItems();\n } else {\n if (changes['groupDefaultExpansion'] && !changes['items']) {\n this.applyInitialExpandedGroups();\n }\n this.syncDisplayRows();\n }\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = this.focusableCount - 1;\n }\n }\n if (\n changes['selectedItemId'] ||\n changes['items'] ||\n changes['expandAllGroupsInitially'] ||\n changes['compressText'] ||\n changes['dense'] ||\n changes['menuId'] ||\n changes['clickToOpen'] ||\n changes['groupCollapsible'] ||\n changes['groupDefaultExpansion']\n ) {\n this.cdr.markForCheck();\n }\n }\n\n private getRowsSourceItems(): MenuNodeItem<T>[] {\n return [...(this.items ?? [])];\n }\n\n private rebuildRowsFromItems(): void {\n this.rows = buildMenuRows(this.getRowsSourceItems());\n if (this.expandAllGroupsInitially) {\n this.expandAllVisibleGroupsWhenSearching();\n } else {\n this.applyInitialExpandedGroups();\n }\n this.syncDisplayRows();\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = -1;\n }\n this.applySearchSubmenuAutoOpen();\n }\n\n /**\n * Com pesquisa activa (lista filtrada), abre o primeiro submenu deste nível que\n * ainda tenha itens visíveis — para o utilizador ver logo o resultado sem hover/clique.\n */\n private applySearchSubmenuAutoOpen(): void {\n if (!this.expandAllGroupsInitially) {\n return;\n }\n for (let i = 0; i < this.displayRows.length; i++) {\n const row = this.displayRows[i];\n if (row.kind !== 'submenu' || row.item.disabled) {\n continue;\n }\n if (row.item.items?.length) {\n this.openSubmenuKey = this.submenuRowKey(row, i);\n this.cdr.markForCheck();\n return;\n }\n }\n }\n\n private expandAllVisibleGroupsWhenSearching(): void {\n this.expandedGroupIds.clear();\n for (const r of this.rows) {\n if (r.kind === 'group' && !r.alwaysExpanded) {\n this.expandedGroupIds.add(r.groupId);\n }\n }\n }\n\n /** Estado inicial de grupos expandidos (`expanded` / `alwaysExpanded` / `groupDefaultExpansion`). */\n private applyInitialExpandedGroups(): void {\n this.expandedGroupIds.clear();\n const groupRows = this.rows.filter((r): r is MenuRowGroup => r.kind === 'group');\n const mode =\n String(this.groupDefaultExpansion ?? 'all').trim() === 'first' ? 'first' : 'all';\n\n for (const r of groupRows) {\n if (r.alwaysExpanded) {\n continue;\n }\n let open: boolean;\n if (r.initialExpanded === true) {\n open = true;\n } else if (r.initialExpanded === false) {\n open = false;\n } else if (mode === 'all') {\n open = true;\n } else {\n const idx = groupRows.indexOf(r);\n const firstPinned = groupRows[0]?.alwaysExpanded === true;\n open = firstPinned ? false : idx === 0;\n }\n if (open) {\n this.expandedGroupIds.add(r.groupId);\n }\n }\n }\n\n private syncDisplayRows(): void {\n const visible = this.rows.filter((r) => this.isRowVisible(r));\n let fi = 0;\n this.displayRows = visible.map((row) => {\n if (row.kind === 'action') {\n const nf = row.focusIndex === null ? null : fi++;\n return { ...row, focusIndex: nf };\n }\n if (row.kind === 'submenu') {\n const nf = row.focusIndex === null ? null : fi++;\n return { ...row, focusIndex: nf };\n }\n return row;\n });\n this.focusableCount = fi;\n }\n\n isGroupExpanded(groupId: number): boolean {\n if (!this.groupCollapsible || this.compressText) {\n return true;\n }\n if (this.isGroupAlwaysExpanded(groupId)) {\n return true;\n }\n return this.expandedGroupIds.has(groupId);\n }\n\n /** Eco de `MenuItemGroup.alwaysExpanded` para este `groupId`. */\n private isGroupAlwaysExpanded(groupId: number): boolean {\n const r = this.rows.find(\n (x): x is MenuRowGroup => x.kind === 'group' && x.groupId === groupId,\n );\n return r?.alwaysExpanded === true;\n }\n\n private isRowVisible(row: MenuRow<T>): boolean {\n if (row.kind === 'group') {\n return true;\n }\n let gid: number | null | undefined;\n if (row.kind === 'divider') {\n gid = row.containingGroupId;\n } else if (row.kind === 'action' || row.kind === 'submenu') {\n gid = row.containingGroupId;\n } else {\n return true;\n }\n if (gid == null) {\n return true;\n }\n return this.isGroupExpanded(gid);\n }\n\n toggleGroup(groupId: number): void {\n if (!this.groupCollapsible || this.compressText) {\n return;\n }\n if (this.isGroupAlwaysExpanded(groupId)) {\n return;\n }\n if (this.expandedGroupIds.has(groupId)) {\n this.expandedGroupIds.delete(groupId);\n } else {\n this.expandedGroupIds.add(groupId);\n }\n this.syncDisplayRows();\n this.closeOpenSubmenu();\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = this.focusableCount - 1;\n }\n this.cdr.markForCheck();\n }\n\n submenuRowKey(row: MenuRow<T>, index: number): string {\n return row.kind === 'submenu' ? `sm-${String(row.item.id)}-${index}` : '';\n }\n\n isSubmenuOpen(row: MenuRow<T>, index: number): boolean {\n return (\n row.kind === 'submenu' && this.openSubmenuKey === this.submenuRowKey(row, index)\n );\n }\n\n submenuMenuId(row: MenuRow<T>): string {\n if (row.kind !== 'submenu') {\n return this.menuId;\n }\n return `${this.menuId}-sub-${String(row.item.id)}`;\n }\n\n onRowMouseEnter(row: MenuRow<T>): void {\n if (row.kind !== 'action' && row.kind !== 'submenu') {\n return;\n }\n if (row.focusIndex === null) {\n return;\n }\n this.activeIndex = row.focusIndex;\n this.cdr.markForCheck();\n }\n\n /**\n * Grupo / divisor não são `menuitem` com foco-mãe — ao passar o rato para o cabeçalho do grupo,\n * limpa o realce da opção anterior (`.menu-list__option--active`).\n */\n onNonOptionSurfaceEnter(): void {\n this.activeIndex = -1;\n this.cdr.markForCheck();\n }\n\n onSubmenuTriggerEnter(row: MenuRow<T>, index: number): void {\n if (row.kind !== 'submenu' || row.item.disabled) {\n return;\n }\n /** Sempre: ao entrar noutra linha, cancela fecho pendente (ex.: mover entre submenus). */\n this.cancelSubmenuCloseTimer();\n if (row.focusIndex !== null) {\n this.activeIndex = row.focusIndex;\n }\n /** Modo clique: não abrir por hover — só realça o item. */\n if (this.clickToOpen) {\n this.cancelSubmenuOpenTimer();\n this.cdr.markForCheck();\n return;\n }\n this.cancelSubmenuOpenTimer();\n const key = this.submenuRowKey(row, index);\n this.submenuOpenTimer = setTimeout(() => {\n this.submenuOpenTimer = null;\n this.openSubmenuKey = key;\n this.queueFocusNestedFirst();\n this.cdr.markForCheck();\n }, SUBMENU_OPEN_MS);\n this.cdr.markForCheck();\n }\n\n onSubmenuTriggerLeave(_row: MenuRow<T>, index: number): void {\n this.cancelSubmenuOpenTimer();\n /** Com `clickToOpen`, não há timer de abertura por hover; o fecho ao sair mantém-se para painéis já abertos. */\n this.scheduleSubmenuClose(index);\n }\n\n onSubmenuPanelEnter(): void {\n this.cancelSubmenuCloseTimer();\n }\n\n onSubmenuPanelLeave(row: MenuRow<T>, index: number): void {\n this.scheduleSubmenuClose(index);\n }\n\n private scheduleSubmenuClose(index: number): void {\n this.cancelSubmenuCloseTimer();\n this.submenuCloseTimer = setTimeout(() => {\n this.submenuCloseTimer = null;\n const row = this.displayRows[index];\n if (row?.kind === 'submenu') {\n const key = this.submenuRowKey(row, index);\n if (this.openSubmenuKey === key) {\n this.openSubmenuKey = null;\n this.cdr.markForCheck();\n }\n }\n }, SUBMENU_CLOSE_MS);\n }\n\n private cancelSubmenuOpenTimer(): void {\n if (this.submenuOpenTimer) {\n clearTimeout(this.submenuOpenTimer);\n this.submenuOpenTimer = null;\n }\n }\n\n private cancelSubmenuCloseTimer(): void {\n if (this.submenuCloseTimer) {\n clearTimeout(this.submenuCloseTimer);\n this.submenuCloseTimer = null;\n }\n }\n\n /** Fecha o submenu deste nível (seta ← no filho ou fecho de irmão). */\n closeOpenSubmenu(): void {\n this.cancelSubmenuOpenTimer();\n this.cancelSubmenuCloseTimer();\n this.openSubmenuKey = null;\n this.cdr.markForCheck();\n }\n\n onSubmenuRowClick(ev: MouseEvent, row: MenuRow<T>, index: number): void {\n if (row.kind !== 'submenu') {\n return;\n }\n if (row.item.disabled) {\n ev.preventDefault();\n ev.stopPropagation();\n return;\n }\n /** Modo só-hover: o clique não alterna o painel (abre por `mouseenter`). */\n if (!this.clickToOpen) {\n ev.preventDefault();\n return;\n }\n ev.preventDefault();\n const key = this.submenuRowKey(row, index);\n if (this.openSubmenuKey === key) {\n this.closeOpenSubmenu();\n } else {\n this.openSubmenuKey = key;\n this.queueFocusNestedFirst();\n this.cdr.markForCheck();\n }\n }\n\n onSubmenuOutsideClick(row: MenuRow<T>, index: number): void {\n if (row.kind === 'submenu' && this.isSubmenuOpen(row, index)) {\n this.closeOpenSubmenu();\n }\n }\n\n private openSubmenuForRowAt(index: number): void {\n const row = this.displayRows[index];\n if (row?.kind !== 'submenu' || row.item.disabled) {\n return;\n }\n this.openSubmenuKey = this.submenuRowKey(row, index);\n this.queueFocusNestedFirst();\n this.cdr.markForCheck();\n }\n\n private queueFocusNestedFirst(): void {\n queueMicrotask(() => {\n const nested = this.nestedLists?.last;\n nested?.focusFirstOption();\n });\n }\n\n /** Primeira opção focável (abertura por teclado). */\n focusFirstOption(): void {\n if (this.focusableCount === 0) {\n return;\n }\n this.activeIndex = 0;\n this.focusActiveDom();\n this.cdr.markForCheck();\n }\n\n onItemClick(ev: MouseEvent, item: MenuItemAction<T>): void {\n if (item.disabled || item.loading) {\n ev.preventDefault();\n ev.stopPropagation();\n return;\n }\n ev.preventDefault();\n this.closeOpenSubmenu();\n this.itemSelect.emit(item.id);\n }\n\n optionId(focusIndex: number): string {\n return `${this.menuId}-opt-${focusIndex}`;\n }\n\n isActiveRow(row: MenuRow<T>): boolean {\n if (this.activeIndex < 0) {\n return false;\n }\n if (row.kind === 'action' || row.kind === 'submenu') {\n return row.focusIndex !== null && row.focusIndex === this.activeIndex;\n }\n return false;\n }\n\n /** Realce de selecção persistente (ex.: item de navegação activo). */\n isRowSelected(row: MenuRow<T>): boolean {\n if (this.selectedItemId == null) {\n return false;\n }\n if (row.kind === 'action') {\n return row.item.id === this.selectedItemId;\n }\n if (row.kind === 'submenu') {\n return (\n row.item.id === this.selectedItemId ||\n menuNodeTreeContainsId(row.item.items, this.selectedItemId)\n );\n }\n return false;\n }\n\n resetHighlight(): void {\n this.activeIndex = -1;\n this.cdr.markForCheck();\n }\n\n onMenuSurfaceLeave(): void {\n if (this.openSubmenuKey !== null) {\n return;\n }\n this.activeIndex = -1;\n this.cdr.markForCheck();\n }\n\n private focusActiveDom(): void {\n if (this.activeIndex < 0) {\n return;\n }\n const id = this.optionId(this.activeIndex);\n const el = this.hostRef.nativeElement.querySelector(`#${CSS.escape(id)}`) as\n | HTMLElement\n | null;\n el?.focus({ preventScroll: true });\n }\n\n /**\n * O campo de pesquisa (e outros controlos) projectam-se dentro deste host; os eventos\n * sobem em bubble e activavam Space/Enter como se fossem opções do menu.\n */\n private eventTargetIsInsideEditableOrControl(ev: Event): boolean {\n const path =\n typeof ev.composedPath === 'function' ? ev.composedPath() : [ev.target];\n for (const node of path) {\n if (!(node instanceof HTMLElement)) {\n continue;\n }\n if (\n node.tagName === 'INPUT' ||\n node.tagName === 'TEXTAREA' ||\n node.tagName === 'SELECT' ||\n node.tagName === 'BUTTON'\n ) {\n return true;\n }\n if (node.isContentEditable) {\n return true;\n }\n }\n return false;\n }\n\n @HostListener('focusin', ['$event'])\n onFocusIn(ev: FocusEvent): void {\n if (this.eventTargetIsInsideEditableOrControl(ev)) {\n this.resetHighlight();\n }\n }\n\n @HostListener('keydown', ['$event'])\n onKeydown(ev: KeyboardEvent): void {\n if (this.eventTargetIsInsideEditableOrControl(ev)) {\n return;\n }\n\n if (ev.key === 'ArrowLeft' && this.nested) {\n ev.preventDefault();\n this.submenuBack.emit();\n return;\n }\n\n if (this.focusableCount === 0) {\n return;\n }\n const n = this.focusableCount;\n\n switch (ev.key) {\n case 'ArrowDown':\n ev.preventDefault();\n if (this.activeIndex < 0) {\n this.activeIndex = 0;\n } else {\n this.activeIndex = (this.activeIndex + 1) % n;\n }\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'ArrowUp':\n ev.preventDefault();\n if (this.activeIndex < 0) {\n this.activeIndex = n - 1;\n } else {\n this.activeIndex = (this.activeIndex - 1 + n) % n;\n }\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'Home':\n ev.preventDefault();\n this.activeIndex = 0;\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'End':\n ev.preventDefault();\n this.activeIndex = n - 1;\n this.focusActiveDom();\n this.cdr.markForCheck();\n break;\n case 'ArrowRight': {\n if (this.activeIndex < 0) {\n break;\n }\n let handled = false;\n for (let i = 0; i < this.displayRows.length; i++) {\n const r = this.displayRows[i];\n if (\n r.kind === 'submenu' &&\n r.focusIndex === this.activeIndex &&\n !r.item.disabled\n ) {\n ev.preventDefault();\n this.openSubmenuForRowAt(i);\n handled = true;\n break;\n }\n }\n if (!handled) {\n /* deixar propagar para o campo, se necessário */\n }\n break;\n }\n case 'Enter':\n case ' ': {\n ev.preventDefault();\n for (let i = 0; i < this.displayRows.length; i++) {\n const r = this.displayRows[i];\n if (r.kind !== 'action' && r.kind !== 'submenu') {\n continue;\n }\n if (r.focusIndex !== this.activeIndex || r.focusIndex === null) {\n continue;\n }\n if (r.kind === 'action') {\n if (r.item.disabled || r.item.loading) {\n break;\n }\n this.itemSelect.emit(r.item.id);\n break;\n }\n if (r.item.disabled) {\n break;\n }\n this.openSubmenuForRowAt(i);\n break;\n }\n break;\n }\n case 'Escape':\n ev.preventDefault();\n this.closeRequest.emit();\n break;\n default:\n break;\n }\n }\n}\n","<div class=\"menu-list\" [class.menu-list--nested]=\"nested\" [class.menu-list--dense]=\"dense\"\n [class.menu-list--compress-text]=\"compressText\" cdkScrollable tabindex=\"-1\" (mouseleave)=\"onMenuSurfaceLeave()\">\n <ng-content />\n <div class=\"menu-list__items\" role=\"menu\" [attr.aria-labelledby]=\"null\" tabindex=\"-1\">\n @for (row of displayRows; track trackDisplayRow($index, row); let idx = $index) {\n @switch (row.kind) {\n @case ('divider') {\n <app-menu-divider (mouseenter)=\"onNonOptionSurfaceEnter()\" />\n }\n @case ('group') {\n <div class=\"menu-list__group-row\" [class.menu-list__group-row--pinned]=\"row.alwaysExpanded\"\n (mouseenter)=\"onNonOptionSurfaceEnter()\">\n <app-menu-group [label]=\"row.label\" [hideLabel]=\"compressText\"\n [collapsible]=\"groupCollapsible && !compressText && !row.alwaysExpanded\"\n [expanded]=\"isGroupExpanded(row.groupId)\" (toggleExpand)=\"toggleGroup(row.groupId)\" />\n </div>\n }\n @case ('submenu') {\n <div class=\"menu-list__submenu-wrap\" cdkOverlayOrigin #subOrigin=\"cdkOverlayOrigin\"\n (mouseenter)=\"onSubmenuTriggerEnter(row, idx)\" (mouseleave)=\"onSubmenuTriggerLeave(row, idx)\">\n <div class=\"menu-list__option menu-list__option--submenu\" role=\"menuitem\" [attr.aria-haspopup]=\"'true'\"\n [attr.aria-expanded]=\"isSubmenuOpen(row, idx)\" [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\" [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\" [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--active]=\"isActiveRow(row)\" [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onSubmenuRowClick($event, row, idx)\" (mouseenter)=\"onRowMouseEnter(row)\">\n @if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n <span class=\"menu-list__submenu-chevron\" aria-hidden=\"true\">\n @if (isSubmenuOpen(row, idx)) {\n <i class=\"fa-solid fa-chevron-right\"></i>\n } @else {\n <i class=\"fa-solid fa-chevron-down\"></i>\n }\n </span>\n </div>\n <ng-template cdkConnectedOverlay [cdkConnectedOverlayOrigin]=\"subOrigin\"\n [cdkConnectedOverlayOpen]=\"isSubmenuOpen(row, idx)\" [cdkConnectedOverlayPositions]=\"submenuPositions\"\n [cdkConnectedOverlayPush]=\"true\" [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayMinWidth]=\"200\" (overlayOutsideClick)=\"onSubmenuOutsideClick(row, idx)\">\n <div class=\"menu-submenu__panel\" [ngClass]=\"panelThemeNgClass()\" (mouseenter)=\"onSubmenuPanelEnter()\"\n (mouseleave)=\"onSubmenuPanelLeave(row, idx)\" (click)=\"$event.stopPropagation()\">\n <app-menu-list-body [items]=\"row.item.items\" [menuId]=\"submenuMenuId(row)\" [nested]=\"true\" [dense]=\"dense\"\n [compressText]=\"compressText\" [groupCollapsible]=\"groupCollapsible\"\n [groupDefaultExpansion]=\"groupDefaultExpansion\" [expandAllGroupsInitially]=\"expandAllGroupsInitially\"\n [clickToOpen]=\"clickToOpen\" [selectedItemId]=\"selectedItemId\" [appTheme]=\"appTheme()\"\n (itemSelect)=\"onNestedItemSelect($event)\" (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"closeOpenSubmenu()\" />\n </div>\n </ng-template>\n </div>\n }\n @case ('action') {\n <div class=\"menu-list__option\" role=\"menuitem\" [id]=\"row.focusIndex !== null ? optionId(row.focusIndex) : null\"\n [attr.tabindex]=\"row.focusIndex !== null && !row.item.disabled ? (isActiveRow(row) ? 0 : -1) : -1\"\n [attr.aria-disabled]=\"row.item.disabled ? true : null\" [attr.aria-busy]=\"row.item.loading ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\" [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\" [class.menu-list__option--loading]=\"row.item.loading\"\n [class.menu-list__option--danger]=\"row.item.danger\" [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\" (click)=\"onItemClick($event, row.item)\"\n (mouseenter)=\"onRowMouseEnter(row)\">\n @if (row.item.loading) {\n <span class=\"menu-list__icon menu-list__icon--spin\" aria-hidden=\"true\">\n <i class=\"fa-solid fa-spinner\"></i>\n </span>\n } @else if (row.item.icon?.trim()) {\n <span class=\"menu-list__icon\" aria-hidden=\"true\">\n <i [ngClass]=\"row.item.icon\"></i>\n </span>\n }\n <span class=\"menu-list__text\">\n <span class=\"menu-list__label\">{{ row.item.label }}</span>\n @if (row.item.description?.trim()) {\n <span class=\"menu-list__description\">{{ row.item.description }}</span>\n }\n </span>\n </div>\n }\n }\n }\n </div>\n</div>","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { DropdownBaseComponent } from '../../fields/dropdown-fields/_base/dropdown-base/dropdown-base.component';\r\nimport type { MenuNodeItem } from '../_models/menu-item.model';\r\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\r\nimport { menuConnectedPositions } from '../_utils/menu-connected-positions.util';\r\nimport { MenuListBodyComponent } from '../menu-list/menu-list-body.component';\r\n\r\n@Component({\r\n selector: 'app-dropdown-menu',\r\n imports: [DropdownBaseComponent, MenuListBodyComponent],\r\n templateUrl: './dropdown-menu.component.html',\r\n styleUrl: './dropdown-menu.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DropdownMenuComponent<T = string> {\r\n private readonly host = inject(ElementRef<HTMLElement>);\r\n\r\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\r\n\r\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\r\n\r\n /** Largura mínima do painel em px (o painel pode alargar ao conteúdo). */\r\n @Input() minWidthPx = 200;\r\n\r\n /** Se `true`, a largura do painel segue a do trigger. */\r\n @Input({ transform: booleanAttribute }) matchTriggerWidth = true;\r\n\r\n @Input() menuId = '';\r\n\r\n @Output() readonly itemSelect = new EventEmitter<T>();\r\n @Output() readonly openChange = new EventEmitter<boolean>();\r\n\r\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\r\n @ViewChild(MenuListBodyComponent) private menuList?: MenuListBodyComponent<T>;\r\n\r\n open = false;\r\n\r\n private readonly generatedId = `app-dd-${Math.random().toString(36).slice(2, 9)}`;\r\n\r\n get resolvedMenuId(): string {\r\n return this.menuId.trim() || this.generatedId;\r\n }\r\n\r\n /** Largura do painel no overlay (mínimo garantido; pode igualar ao trigger). */\r\n get effectivePanelWidth(): number {\r\n if (this.matchTriggerWidth) {\r\n const w = this.host.nativeElement.getBoundingClientRect().width;\r\n return Math.max(this.minWidthPx, Math.ceil(w));\r\n }\r\n return this.minWidthPx;\r\n }\r\n\r\n get connectedPositions() {\r\n return menuConnectedPositions(this.placement);\r\n }\r\n\r\n onTriggerClick(ev: Event): void {\r\n ev.preventDefault();\r\n this.toggle();\r\n }\r\n\r\n toggle(): void {\r\n this.setOpen(!this.open);\r\n }\r\n\r\n setOpen(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.open = next;\r\n this.openChange.emit(next);\r\n if (next) {\r\n queueMicrotask(() => this.menuList?.resetHighlight());\r\n }\r\n }\r\n\r\n onBaseOpenChange(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.open = next;\r\n this.openChange.emit(next);\r\n if (next) {\r\n queueMicrotask(() => this.menuList?.resetHighlight());\r\n }\r\n }\r\n\r\n onItemSelect(id: T): void {\r\n this.itemSelect.emit(id);\r\n this.setOpen(false);\r\n }\r\n\r\n onCloseRequest(): void {\r\n this.setOpen(false);\r\n }\r\n}\r\n","<app-dropdown-base\r\n class=\"dropdown-menu\"\r\n [open]=\"open\"\r\n (openChange)=\"onBaseOpenChange($event)\"\r\n [panelTemplate]=\"panelTpl\"\r\n [panelWidthPx]=\"effectivePanelWidth\"\r\n [connectedPositions]=\"connectedPositions\"\r\n [pushConnectedOverlay]=\"true\"\r\n [hasBackdrop]=\"true\"\r\n [closeOnEscape]=\"true\"\r\n [bareOverlayPanel]=\"true\"\r\n>\r\n <span\r\n class=\"dropdown-menu__trigger-slot\"\r\n appDropdownTrigger\r\n (click)=\"onTriggerClick($event)\"\r\n [attr.aria-expanded]=\"open\"\r\n aria-haspopup=\"menu\"\r\n >\r\n <ng-content />\r\n </span>\r\n</app-dropdown-base>\r\n\r\n<ng-template #panelTpl>\r\n <div class=\"dropdown-menu__panel-inner\">\r\n <app-menu-list-body\r\n [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\r\n [clickToOpen]=\"false\"\r\n (itemSelect)=\"onItemSelect($event)\"\r\n (closeRequest)=\"onCloseRequest()\"\r\n />\r\n </div>\r\n</ng-template>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n booleanAttribute,\n} from '@angular/core';\nimport {\n SkeletonFieldShellComponent,\n type SkeletonFieldShellVariant,\n} from '../../../loading/skeleton-loading';\nimport { DropdownMenuComponent } from '../../../menus/dropdown-menu/dropdown-menu.component';\nimport type { MenuNodeItem } from '../../../menus/_models/menu-item.model';\nimport type { FieldSize } from '../_models/field-size.model';\n\n/**\n * Base visual do campo: caixa com label flutuante, prefixo opcional e erro.\n * Usada dentro dos componentes de campo (texto, inteiro, decimal).\n */\n@Component({\n selector: 'app-base-field',\n imports: [SkeletonFieldShellComponent, DropdownMenuComponent],\n templateUrl: './base-field.component.html',\n styleUrl: './base-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class BaseFieldComponent implements OnChanges, OnInit {\n @Input() label = '';\n @Input() errorMessage = '';\n @Input() required = false;\n /** Asterisco visual do obrigatório no label (validação HTML `required` inalterada); por defeito `false`. */\n @Input() showRequiredMark = false;\n @Input() invalid = false;\n /** Fundo semântico de erro no involúcro; só com `invalid` + este `true`. */\n @Input({ transform: booleanAttribute }) invalidThemed = false;\n @Input() filled = false;\n @Input() disabled = false;\n @Input() readonly = false;\n /** Igual a {@link BaseFieldDirective.size}: `sm` | `md` | `lg`. */\n @Input() size: FieldSize = 'md';\n @Input() inputId = '';\n @Input() errorId = '';\n\n @Input() showPrefixIcon = false;\n /** Classes Font Awesome (ex.: `fa-solid fa-user`). Usado com `showPrefixIcon`. */\n @Input() prefixIcon = '';\n @Input() clearable = true;\n @Input() clearAriaLabel = 'Limpar campo';\n /**\n * Quando `true`, renderiza `ng-content` com `[appFieldSuffix]` à direita do input\n * (antes do botão limpar, se houver).\n */\n @Input() showSuffixSlot = false;\n /** Alinha o texto do valor à direita no input projetado. */\n @Input() valueAlignEnd = false;\n\n @Input({ transform: booleanAttribute }) loading = false;\n /** Variante do skeleton quando {@link loading} é `true`. */\n @Input() skeletonVariant: SkeletonFieldShellVariant = 'text';\n\n @Input({ transform: booleanAttribute }) mostrarMenuContexto = false;\n @Input() contextMenuItems: readonly MenuNodeItem<string>[] = [];\n /** Sufixo do `id` do menu (ex.: `meuCampo-ctx`); por defeito deriva-se de {@link inputId}. */\n @Input() contextMenuId = '';\n\n @Output() clear = new EventEmitter<void>();\n @Output() contextMenuSelect = new EventEmitter<string>();\n\n /** Derivados do template (actualizados em `ngOnChanges`, não getters por CD). */\n showErrorTpl = false;\n showFloatTpl = false;\n showFaTpl = false;\n prefixIconClassTpl = '';\n showClearTpl = false;\n showCtxMenuTpl = false;\n showSuffixTpl = false;\n\n get resolvedContextMenuId(): string {\n const t = this.contextMenuId.trim();\n if (t.length > 0) {\n return t;\n }\n const base = this.inputId.trim();\n return base.length > 0 ? `${base}-ctx` : 'app-field-ctx-menu';\n }\n\n ngOnInit(): void {\n this.refreshTplFlags();\n }\n\n ngOnChanges(_changes: SimpleChanges): void {\n this.refreshTplFlags();\n }\n\n private refreshTplFlags(): void {\n const labelTrim = this.label.trim();\n this.showFloatTpl = labelTrim.length > 0;\n this.showErrorTpl = this.invalid && !!this.errorMessage;\n const iconTrim = this.prefixIcon.trim();\n this.showFaTpl = this.showPrefixIcon && iconTrim.length > 0;\n this.prefixIconClassTpl = `base-field__prefix-icon ${iconTrim}`.trim();\n this.showClearTpl =\n !this.loading &&\n this.clearable &&\n this.filled &&\n !this.disabled &&\n !this.readonly;\n this.showCtxMenuTpl =\n !this.loading &&\n !this.disabled &&\n !this.readonly &&\n this.mostrarMenuContexto &&\n (this.contextMenuItems?.length ?? 0) > 0;\n /* Com `loading`, mantém coluna de sufixo (ex.: toggle senha) para não encolher a caixa. */\n this.showSuffixTpl = this.loading\n ? this.showSuffixSlot\n : this.showSuffixSlot || this.showClearTpl || this.showCtxMenuTpl;\n }\n\n onClearClick(): void {\n this.clear.emit();\n }\n\n onContextMenuItemSelect(id: string): void {\n this.contextMenuSelect.emit(id);\n }\n}\n","<div class=\"base-field\" [class.base-field--size-sm]=\"size === 'sm'\"\n [class.base-field--size-lg]=\"size === 'lg'\"\n [class.base-field--invalid]=\"invalid\"\n [class.base-field--invalid-themed]=\"invalid && invalidThemed\" [class.base-field--filled]=\"filled\"\n [class.base-field--disabled]=\"disabled\" [class.base-field--readonly]=\"readonly\"\n [class.base-field--loading]=\"loading\" [attr.aria-busy]=\"loading ? true : null\"\n [attr.aria-label]=\"loading && showFloatTpl ? label : null\">\n <div class=\"base-field__box\">\n <div class=\"base-field__prefix\">\n @if (!loading) {\n <ng-content select=\"[appFieldPrefix]\" />\n }\n @if (showFaTpl) {\n <i [attr.class]=\"prefixIconClassTpl + (loading ? ' base-field__prefix-icon--loading-dim' : '')\"\n aria-hidden=\"true\"></i>\n }\n </div>\n\n <div class=\"base-field__field\">\n @if (showFloatTpl && !loading) {\n <label class=\"base-field__float-label\" [attr.for]=\"inputId || null\">\n {{ label }}\n @if (required && showRequiredMark) {\n <span class=\"base-field__required\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n <div class=\"base-field__control\" [class.base-field__control--value-end]=\"valueAlignEnd\"\n [class.base-field__control--textarea-skeleton]=\"loading && skeletonVariant === 'textarea'\">\n @if (!loading) {\n <ng-content />\n } @else {\n <app-skeleton-field-shell [variant]=\"skeletonVariant\" [showLeadingIcon]=\"!showFaTpl\" />\n }\n </div>\n </div>\n\n @if (showSuffixTpl) {\n <div class=\"base-field__suffix\" [class.base-field__suffix--loading]=\"loading\">\n @if (!loading) {\n @if (showCtxMenuTpl) {\n <app-dropdown-menu\n class=\"base-field__ctx-dropdown\"\n [items]=\"contextMenuItems\"\n [minWidthPx]=\"200\"\n [matchTriggerWidth]=\"false\"\n [menuId]=\"resolvedContextMenuId\"\n (itemSelect)=\"onContextMenuItemSelect($event)\"\n >\n <button type=\"button\" class=\"base-field__ctx-trigger\" aria-label=\"Mais opções\" tabindex=\"-1\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n </app-dropdown-menu>\n }\n @if (showSuffixSlot) {\n <ng-content select=\"[appFieldSuffix]\" />\n }\n @if (showClearTpl) {\n <button type=\"button\" class=\"base-field__clear\" tabindex=\"-1\" [attr.aria-label]=\"clearAriaLabel\"\n (click)=\"onClearClick()\">\n <span class=\"base-field__clear-x\" aria-hidden=\"true\">&times;</span>\n </button>\n }\n } @else if (loading && showSuffixSlot) {\n <span class=\"base-field__suffix-reserve\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n </div>\n\n @if (!loading && showErrorTpl) {\n <p class=\"base-field__error\" [id]=\"errorId || null\" role=\"alert\">\n {{ errorMessage }}\n </p>\n }\n</div>\n","import { Directive, DoCheck, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n AbstractControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n} from '@angular/forms';\r\nimport { distinctUntilChanged, merge } from 'rxjs';\r\nimport { BaseFieldDirective } from './base-field.directive';\r\n\r\n/**\r\n * Campos com `NgControl` + CVA: injeta o control e expõe estado de erro/a11y comuns.\r\n */\r\n@Directive()\r\nexport abstract class NgControlFieldDirective<T>\r\n extends BaseFieldDirective<T>\r\n implements OnInit, OnChanges, DoCheck\r\n{\r\n protected ngControl: NgControl | null = null;\r\n\r\n /** `FormGroupDirective.submitted` muda com `resetForm()` sem `ngSubmit` — OnPush precisa disto para a borda/erro. */\r\n private lastParentSubmitted: boolean | undefined;\r\n\r\n /**\r\n * Texto do label flutuante em `app-base-field` (`label` ou `placeholder`).\r\n * Mantido em campo (não getter) para reduzir trabalho por ciclo de deteção.\r\n */\r\n floatLabelCaption = '';\r\n\r\n /** Cache para o template (evita `getErrorMessage()` / getters a cada CD). */\r\n uiErrorMessage = '';\r\n uiRequiredEffective = false;\r\n uiInvalid = false;\r\n uiAriaDescribedBy: string | null = null;\r\n\r\n protected override resolveControlForRequired(): AbstractControl | null | undefined {\r\n return this.ngControl?.control ?? undefined;\r\n }\r\n\r\n ngOnChanges(_changes: SimpleChanges): void {\r\n this.refreshFloatLabelCaption();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n private refreshFloatLabelCaption(): void {\r\n this.floatLabelCaption = (this.label || this.placeholder).trim();\r\n }\r\n\r\n ngOnInit(): void {\r\n this.refreshFloatLabelCaption();\r\n this.ngControl = this.injector.get(NgControl, null, {\r\n optional: true,\r\n self: true,\r\n });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n const c = this.ngControl?.control;\r\n if (c) {\r\n merge(\r\n c.statusChanges,\r\n c.valueChanges.pipe(\r\n distinctUntilChanged((a, b) => Object.is(a, b)),\r\n ),\r\n )\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncControlUi());\r\n this.syncControlUi();\r\n }\r\n this.registerFormSubmitRecheck();\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (!this.ngControl?.control) {\r\n return;\r\n }\r\n const sub = this.isParentFormSubmitted();\r\n if (this.lastParentSubmitted === undefined) {\r\n this.lastParentSubmitted = sub;\r\n return;\r\n }\r\n if (this.lastParentSubmitted !== sub) {\r\n this.lastParentSubmitted = sub;\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n override writeValue(value: T | null): void {\r\n super.writeValue(value);\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n /**\r\n * Após propagar o valor ao `FormControl`, reavalia já `uiInvalid` / a11y.\r\n * Só confiar em `valueChanges` pode deixar o estado visual desfasado (ex.: select após escolha).\r\n */\r\n protected override emitModelValue(value: T | null): void {\r\n super.emitModelValue(value);\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n protected override registerFormSubmitRecheck(): void {\r\n const fg = this.injector.get(FormGroupDirective, null, { optional: true });\r\n const nf = this.injector.get(NgForm, null, { optional: true });\r\n const recheck = (): void => {\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n };\r\n fg?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n nf?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n }\r\n\r\n /**\r\n * Actualiza caches usados no template após mudança de valor/estado do control\r\n * ou de inputs que afectam mensagem / obrigatório.\r\n */\r\n protected syncControlUi(): void {\r\n this.uiInvalid = this.baseInvalid;\r\n this.uiRequiredEffective = this.requiredEffective;\r\n this.uiErrorMessage = this.getErrorMessage();\r\n this.uiAriaDescribedBy =\r\n this.uiInvalid && this.uiErrorMessage ? this.errorElementId : null;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get baseInvalid(): boolean {\r\n return this.controlInvalidUi(this.ngControl?.control);\r\n }\r\n\r\n get errorElementId(): string {\r\n return `${this.controlId}-error`;\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\n\r\n@Component({\r\n selector: 'app-text-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './text-field.component.html',\r\n styleUrl: './text-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class TextFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Limite de caracteres no valor do campo. */\r\n @Input({ transform: numberAttribute }) maxLength = 500;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.trim().length > 0;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const s = value ?? '';\r\n const clipped = this.maxLength > 0 ? s.slice(0, this.maxLength) : s;\r\n this.inputText = clipped;\r\n if (clipped !== s) {\r\n queueMicrotask(() =>\r\n this.emitModelValue(clipped === '' ? null : clipped),\r\n );\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLInputElement;\r\n const raw = el.value;\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? raw.slice(0, cap) : raw;\r\n if (raw !== clipped) {\r\n el.value = clipped;\r\n }\r\n this.inputText = clipped;\r\n this.emitModelValue(clipped === '' ? null : clipped);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"text-field__input\" type=\"text\" [id]=\"controlId\" [attr.name]=\"name || null\" [attr.placeholder]=\"''\"\n [attr.autocomplete]=\"autocompleteAttr\" [attr.maxlength]=\"maxLength > 0 ? maxLength : null\" [disabled]=\"disabled\"\n [readonly]=\"readonly\" [required]=\"uiRequiredEffective\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\"\n (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostBinding,\r\n Input,\r\n OnInit,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\n\r\n@Component({\r\n selector: 'app-password-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './password-field.component.html',\r\n styleUrl: './password-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => PasswordFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class PasswordFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit, OnInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Password já nasce com ícone de chave no prefixo; pode ser sobrescrito via `prefixIcon`. */\r\n @Input({ transform: booleanAttribute }) override showPrefixIcon = true;\r\n @Input() override prefixIcon = 'fa-solid fa-key';\r\n\r\n @HostBinding('class.password-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Por defeito `false`: o botão de limpar compete com o toggle de visibilidade. */\r\n @Input({ transform: booleanAttribute }) override clearable = false;\r\n\r\n @Input({ transform: numberAttribute }) maxLength = 500;\r\n /**\r\n * Com o input `autocomplete` da base a `true`, define o atributo HTML\r\n * (`current-password` / `new-password`). Com `autocomplete` a `false`, aplica-se `off`.\r\n */\r\n @Input() autoComplete: 'off' | 'current-password' | 'new-password' =\r\n 'current-password';\r\n\r\n /** `false` = caracteres ocultos (ícone olho aberto para revelar). */\r\n passwordVisible = false;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n inputTypeUi: 'password' | 'text' = 'password';\r\n toggleAriaLabelUi = 'Mostrar senha';\r\n toggleIconClassUi = 'fa-solid fa-eye';\r\n\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.refreshPasswordToggleUi();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.length > 0;\r\n }\r\n\r\n private refreshPasswordToggleUi(): void {\r\n this.inputTypeUi = this.passwordVisible ? 'text' : 'password';\r\n this.toggleAriaLabelUi = this.passwordVisible ? 'Ocultar senha' : 'Mostrar senha';\r\n this.toggleIconClassUi = this.passwordVisible\r\n ? 'fa-solid fa-eye-slash'\r\n : 'fa-solid fa-eye';\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const s = value ?? '';\r\n const clipped = this.maxLength > 0 ? s.slice(0, this.maxLength) : s;\r\n this.inputText = clipped;\r\n if (clipped !== s) {\r\n queueMicrotask(() =>\r\n this.emitModelValue(clipped === '' ? null : clipped),\r\n );\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLInputElement;\r\n const raw = el.value;\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? raw.slice(0, cap) : raw;\r\n if (raw !== clipped) {\r\n el.value = clipped;\r\n }\r\n this.inputText = clipped;\r\n this.emitModelValue(clipped === '' ? null : clipped);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n togglePasswordVisible(ev: Event): void {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.passwordVisible = !this.passwordVisible;\r\n this.refreshPasswordToggleUi();\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\" [showSuffixSlot]=\"true\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"password-field__input\" [type]=\"inputTypeUi\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocomplete ? autoComplete : 'off'\" [attr.maxlength]=\"maxLength > 0 ? maxLength : null\"\n [disabled]=\"disabled\" [readonly]=\"readonly\" [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\" (input)=\"onNativeInput($event)\"\n (blur)=\"onBlur()\" />\n <button type=\"button\" appFieldSuffix class=\"password-field__toggle\" tabindex=\"-1\"\n [disabled]=\"disabled || readonly\" [attr.aria-label]=\"toggleAriaLabelUi\" [attr.aria-pressed]=\"passwordVisible\"\n (click)=\"togglePasswordVisible($event)\">\n <i [class]=\"toggleIconClassUi\" aria-hidden=\"true\"></i>\n </button>\n</app-base-field>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n SimpleChanges,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\n\r\n@Component({\r\n selector: 'app-textarea-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './textarea-field.component.html',\r\n styleUrl: './textarea-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => TextareaFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class TextareaFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit, OnChanges, OnInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n @HostBinding('class.textarea-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Limite de caracteres no valor do campo. `0` = sem limite explícito no DOM. */\r\n @Input({ transform: numberAttribute }) maxLength = 0;\r\n\r\n @Input({ transform: numberAttribute }) rows = 3;\r\n\r\n /**\r\n * Limite de altura em linhas (mesma lógica de `rows`). Por omissão igual a {@link rows}.\r\n * O campo não é redimensionável pelo usuário (`resize: none`).\r\n */\r\n @Input({ transform: numberAttribute }) maxResizeRows = 0;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n /** Altura CSS (evita getter chamado a cada CD). */\r\n textareaMaxHeightCss = '';\r\n\r\n override ngOnInit(): void {\r\n super.ngOnInit();\r\n this.updateTextareaHeight();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (changes['rows'] || changes['maxResizeRows']) {\r\n this.updateTextareaHeight();\r\n }\r\n }\r\n\r\n private updateTextareaHeight(): void {\r\n const lines = Math.max(\r\n 1,\r\n this.maxResizeRows > 0 ? this.maxResizeRows : this.rows,\r\n );\r\n this.textareaMaxHeightCss = `calc(1.35rem + 0.45rem + ${lines} * 1.35em)`;\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.trim().length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const s = value ?? '';\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? s.slice(0, cap) : s;\r\n this.inputText = clipped;\r\n if (clipped !== s) {\r\n queueMicrotask(() =>\r\n this.emitModelValue(clipped === '' ? null : clipped),\r\n );\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLTextAreaElement;\r\n const raw = el.value;\r\n const cap = this.maxLength > 0 ? this.maxLength : undefined;\r\n const clipped = cap != null ? raw.slice(0, cap) : raw;\r\n if (raw !== clipped) {\r\n el.value = clipped;\r\n }\r\n this.inputText = clipped;\r\n this.emitModelValue(clipped === '' ? null : clipped);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\" skeletonVariant=\"textarea\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <textarea #nativeInput class=\"textarea-field__input\" [id]=\"controlId\" [attr.name]=\"name || null\" [attr.placeholder]=\"''\"\n [attr.rows]=\"rows\" [style.height]=\"textareaMaxHeightCss\" [style.min-height]=\"textareaMaxHeightCss\"\n [style.max-height]=\"textareaMaxHeightCss\" [attr.autocomplete]=\"autocompleteAttr\"\n [attr.maxlength]=\"maxLength > 0 ? maxLength : null\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\"></textarea>\n</app-base-field>\n","const DIGITS_ONLY = /^\\d*$/;\r\n\r\n/**\r\n * Mantém apenas dígitos (0–9). Primeira versão sem sinal negativo.\r\n */\r\nexport function sanitizeIntegerDigits(raw: string): string {\r\n return raw.replace(/\\D/g, '');\r\n}\r\n\r\nexport function parseIntegerString(digits: string): number | null {\r\n const t = digits.trim();\r\n if (t === '') {\r\n return null;\r\n }\r\n if (!DIGITS_ONLY.test(t)) {\r\n return null;\r\n }\r\n const n = Number.parseInt(t, 10);\r\n return Number.isFinite(n) ? n : null;\r\n}\r\n","/**\r\n * Formatação pt-BR para inteiros: apenas separador de milhar com ponto.\r\n * Usado pelo campo inteiro e pela parte inteira do decimal.\r\n */\r\n\r\n/**\r\n * Formata sequência de dígitos com pontos de milhar (ex.: 1234567 → 1.234.567).\r\n * Aceita string vazia; não normaliza zeros à esquerda.\r\n */\r\nexport function formatIntegerThousandsBr(intDigits: string): string {\r\n if (intDigits === '') {\r\n return '';\r\n }\r\n const reversed = intDigits.split('').reverse().join('');\r\n const groups = reversed.match(/.{1,3}/g) ?? [];\r\n return groups\r\n .map((g) => g.split('').reverse().join(''))\r\n .reverse()\r\n .join('.');\r\n}\r\n\r\n/**\r\n * Quantidade de dígitos à esquerda do caret na máscara (pontos ignorados).\r\n */\r\nexport function semanticIntegerDigitCountLeft(\r\n display: string,\r\n caret: number,\r\n): number {\r\n return display.slice(0, caret).replace(/\\D/g, '').length;\r\n}\r\n\r\n/**\r\n * Índice do caret após o enésimo dígito na string formatada (fim se não houver tantos).\r\n */\r\nexport function caretIndexFromIntegerDigitCount(\r\n display: string,\r\n digitCount: number,\r\n): number {\r\n if (digitCount <= 0) {\r\n return 0;\r\n }\r\n let seen = 0;\r\n for (let i = 0; i < display.length; i++) {\r\n const ch = display[i];\r\n if (ch === '.') {\r\n continue;\r\n }\r\n if (/\\d/.test(ch)) {\r\n seen++;\r\n if (seen === digitCount) {\r\n return i + 1;\r\n }\r\n }\r\n }\r\n return display.length;\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\nimport { parseIntegerString, sanitizeIntegerDigits } from '../../../_utils/integer-value.utils';\r\nimport {\r\n caretIndexFromIntegerDigitCount,\r\n formatIntegerThousandsBr,\r\n semanticIntegerDigitCountLeft,\r\n} from '../../../_utils/integer-br.utils';\r\n\r\n@Component({\r\n selector: 'app-integer-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './integer-field.component.html',\r\n styleUrl: './integer-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => IntegerFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class IntegerFieldComponent\r\n extends NgControlFieldDirective<number | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Valor máximo permitido (inclusive). */\r\n @Input({ transform: numberAttribute }) max = 999999;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: number | null): void {\r\n if (value == null) {\r\n this.inputText = '';\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n return;\r\n }\r\n const v = Math.min(Math.trunc(value), this.max);\r\n this.inputText = formatIntegerThousandsBr(String(v));\r\n if (v !== value) {\r\n queueMicrotask(() => this.emitModelValue(v));\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onBeforeInput(event: Event): void {\r\n const e = event as InputEvent;\r\n if (this.disabled || this.readonly || e.isComposing) {\r\n return;\r\n }\r\n if (e.inputType === 'insertText' || e.inputType === 'insertCompositionText') {\r\n const chunk = e.data ?? '';\r\n if (chunk.length === 1 && !/^\\d$/.test(chunk)) {\r\n e.preventDefault();\r\n }\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const input = event.target as HTMLInputElement;\r\n const raw = input.value;\r\n const caret = input.selectionStart ?? raw.length;\r\n const digitsLeftOfCaret = semanticIntegerDigitCountLeft(raw, caret);\r\n\r\n let digits = sanitizeIntegerDigits(raw);\r\n let parsed = parseIntegerString(digits);\r\n let clampedByMax = false;\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n digits = String(this.max);\r\n clampedByMax = true;\r\n }\r\n\r\n const display = formatIntegerThousandsBr(digits);\r\n\r\n if (input.value !== display) {\r\n input.value = display;\r\n const next = clampedByMax\r\n ? display.length\r\n : caretIndexFromIntegerDigitCount(\r\n display,\r\n Math.min(digitsLeftOfCaret, digits.length),\r\n );\r\n input.setSelectionRange(next, next);\r\n }\r\n\r\n this.inputText = display;\r\n this.emitModelValue(parsed);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n const digits = sanitizeIntegerDigits(this.inputText);\r\n let parsed = parseIntegerString(digits);\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n }\r\n const display = parsed == null ? '' : formatIntegerThousandsBr(String(parsed));\r\n const ctrl = this.ngControl?.control;\r\n const current = ctrl?.value ?? null;\r\n if (parsed !== current) {\r\n this.emitModelValue(parsed);\r\n }\r\n this.inputText = display;\r\n this.refreshFilledUi();\r\n this.notifyTouched();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"integer-field__input\" type=\"text\" inputmode=\"numeric\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\" [required]=\"uiRequiredEffective\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\"\n (beforeinput)=\"onBeforeInput($event)\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","/**\r\n * Utilitários pt-BR fixo: vírgula decimal, ponto milhar, duas casas na formatação final.\r\n */\r\n\r\nimport { formatIntegerThousandsBr } from './integer-br.utils';\r\n\r\nexport { formatIntegerThousandsBr } from './integer-br.utils';\r\n\r\nexport function sanitizeDecimalBrInput(raw: string): string {\r\n return raw.replace(/[^\\d,.]/g, '');\r\n}\r\n\r\n/**\r\n * Remove pontos e interpreta a última vírgula como separador decimal.\r\n * Retorna apenas dígitos na parte inteira e até 2 na fracionária.\r\n */\r\nexport function extractDecimalBrParts(rawDisplay: string): {\r\n intDigits: string;\r\n fracDigits: string;\r\n hasComma: boolean;\r\n} {\r\n const noDots = rawDisplay.replace(/\\./g, '');\r\n const lastComma = noDots.lastIndexOf(',');\r\n if (lastComma === -1) {\r\n return {\r\n intDigits: noDots.replace(/\\D/g, ''),\r\n fracDigits: '',\r\n hasComma: false,\r\n };\r\n }\r\n const intDigits = noDots.slice(0, lastComma).replace(/\\D/g, '');\r\n const fracDigits = noDots\r\n .slice(lastComma + 1)\r\n .replace(/\\D/g, '')\r\n .slice(0, 2);\r\n return { intDigits, fracDigits, hasComma: true };\r\n}\r\n\r\n/**\r\n * Monta o texto exibido durante a digitação (milhares com ponto, vírgula decimal).\r\n */\r\nexport function buildDecimalBrDisplay(parts: {\r\n intDigits: string;\r\n fracDigits: string;\r\n hasComma: boolean;\r\n}): string {\r\n const { intDigits, fracDigits, hasComma } = parts;\r\n if (!hasComma) {\r\n return formatIntegerThousandsBr(intDigits);\r\n }\r\n const intDisplay =\r\n intDigits === '' ? '0' : formatIntegerThousandsBr(intDigits);\r\n return `${intDisplay},${fracDigits}`;\r\n}\r\n\r\n/**\r\n * Posição semântica do cursor para remapear após reformatar.\r\n */\r\nexport function semanticCaretAt(\r\n value: string,\r\n caret: number,\r\n): { intCount: number; afterComma: boolean; fracCount: number } {\r\n const left = value.slice(0, caret);\r\n const noDots = left.replace(/\\./g, '');\r\n const commaIdx = noDots.indexOf(',');\r\n if (commaIdx === -1) {\r\n return {\r\n intCount: noDots.replace(/\\D/g, '').length,\r\n afterComma: false,\r\n fracCount: 0,\r\n };\r\n }\r\n const before = noDots.slice(0, commaIdx).replace(/\\D/g, '');\r\n const after = noDots.slice(commaIdx + 1).replace(/\\D/g, '');\r\n return {\r\n intCount: before.length,\r\n afterComma: true,\r\n fracCount: after.length,\r\n };\r\n}\r\n\r\n/**\r\n * Índice do caret no texto formatado a partir da posição semântica.\r\n */\r\nexport function caretIndexFromSemantic(\r\n display: string,\r\n target: { intCount: number; afterComma: boolean; fracCount: number },\r\n): number {\r\n let intCount = 0;\r\n let afterComma = false;\r\n let fracCount = 0;\r\n\r\n for (let i = 0; i < display.length; i++) {\r\n const ch = display[i];\r\n if (ch === ',') {\r\n if (!afterComma) {\r\n afterComma = true;\r\n if (\r\n target.afterComma &&\r\n target.fracCount === 0 &&\r\n target.intCount === intCount\r\n ) {\r\n return i + 1;\r\n }\r\n }\r\n continue;\r\n }\r\n if (ch === '.') {\r\n continue;\r\n }\r\n if (/\\d/.test(ch)) {\r\n if (!afterComma) {\r\n intCount++;\r\n if (!target.afterComma && intCount === target.intCount) {\r\n return i + 1;\r\n }\r\n } else {\r\n fracCount++;\r\n if (\r\n target.afterComma &&\r\n fracCount === target.fracCount &&\r\n intCount === target.intCount\r\n ) {\r\n return i + 1;\r\n }\r\n }\r\n }\r\n }\r\n return display.length;\r\n}\r\n\r\n/**\r\n * String passível de parseDecimalBr a partir das partes editáveis.\r\n */\r\nexport function buildDecimalBrParseString(parts: {\r\n intDigits: string;\r\n fracDigits: string;\r\n hasComma: boolean;\r\n}): string {\r\n if (!parts.hasComma) {\r\n return parts.intDigits;\r\n }\r\n return `${parts.intDigits},${parts.fracDigits}`;\r\n}\r\n\r\n/**\r\n * Interpreta string já sanitizada e retorna número com até 2 casas decimais (arredondamento).\r\n * Vazio → null. Vírgula como separador decimal; pontos são removidos da parte inteira.\r\n */\r\nexport function parseDecimalBr(sanitized: string): number | null {\r\n const t = sanitized.trim();\r\n if (t === '') {\r\n return null;\r\n }\r\n\r\n const lastComma = t.lastIndexOf(',');\r\n let intRaw: string;\r\n let fracRaw: string;\r\n\r\n if (lastComma >= 0) {\r\n intRaw = t.slice(0, lastComma).replace(/\\./g, '');\r\n fracRaw = t.slice(lastComma + 1).replace(/\\./g, '');\r\n } else {\r\n intRaw = t.replace(/\\./g, '');\r\n fracRaw = '';\r\n }\r\n\r\n if (!/^\\d*$/.test(intRaw) || !/^\\d*$/.test(fracRaw)) {\r\n return null;\r\n }\r\n if (intRaw === '' && fracRaw === '') {\r\n return null;\r\n }\r\n\r\n const intPart = intRaw === '' ? '0' : intRaw;\r\n const fracPadded = (fracRaw + '00').slice(0, 2);\r\n const n = Number(`${intPart}.${fracPadded}`);\r\n if (!Number.isFinite(n)) {\r\n return null;\r\n }\r\n return Math.round(n * 100) / 100;\r\n}\r\n\r\nexport function formatDecimalBr(value: number): string {\r\n return new Intl.NumberFormat('pt-BR', {\r\n minimumFractionDigits: 2,\r\n maximumFractionDigits: 2,\r\n }).format(value);\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n forwardRef,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\nimport {\r\n buildDecimalBrDisplay,\r\n buildDecimalBrParseString,\r\n caretIndexFromSemantic,\r\n extractDecimalBrParts,\r\n formatDecimalBr,\r\n parseDecimalBr,\r\n semanticCaretAt,\r\n} from '../../../_utils/decimal-br.utils';\r\n\r\n@Component({\r\n selector: 'app-decimal-field',\r\n imports: [BaseFieldComponent],\r\n templateUrl: './decimal-field.component.html',\r\n styleUrl: './decimal-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DecimalFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class DecimalFieldComponent\r\n extends NgControlFieldDirective<number | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Valor máximo permitido (inclusive), com até 2 casas decimais. */\r\n @Input({ transform: numberAttribute }) max = 999999;\r\n\r\n inputText = '';\r\n\r\n filledUi = false;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.inputText.trim().length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: number | null): void {\r\n if (value == null) {\r\n this.inputText = '';\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n return;\r\n }\r\n const v = Math.min(value, this.max);\r\n this.inputText = formatDecimalBr(v);\r\n if (v !== value) {\r\n queueMicrotask(() => this.emitModelValue(v));\r\n }\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onBeforeInput(event: Event): void {\r\n const e = event as InputEvent;\r\n if (this.disabled || this.readonly || e.isComposing) {\r\n return;\r\n }\r\n if (e.inputType === 'insertText' || e.inputType === 'insertCompositionText') {\r\n const data = e.data ?? '';\r\n if (data.length !== 1) {\r\n return;\r\n }\r\n const input = e.target as HTMLInputElement;\r\n const { hasComma } = extractDecimalBrParts(input.value);\r\n if (data === ',') {\r\n if (hasComma) {\r\n e.preventDefault();\r\n }\r\n return;\r\n }\r\n if (/^\\d$/.test(data)) {\r\n return;\r\n }\r\n e.preventDefault();\r\n }\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const input = event.target as HTMLInputElement;\r\n const caret = input.selectionStart ?? input.value.length;\r\n const semantic = semanticCaretAt(input.value, caret);\r\n\r\n const parts = extractDecimalBrParts(input.value);\r\n const display = buildDecimalBrDisplay(parts);\r\n const parseStr = buildDecimalBrParseString(parts);\r\n let parsed = parseDecimalBr(parseStr);\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n const capped = formatDecimalBr(parsed);\r\n input.value = capped;\r\n input.setSelectionRange(capped.length, capped.length);\r\n this.inputText = capped;\r\n this.emitModelValue(parsed);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n return;\r\n }\r\n\r\n if (input.value !== display) {\r\n input.value = display;\r\n const next = caretIndexFromSemantic(display, semantic);\r\n input.setSelectionRange(next, next);\r\n }\r\n\r\n this.inputText = display;\r\n this.emitModelValue(parsed);\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n if (this.disabled) {\r\n this.notifyTouched();\r\n return;\r\n }\r\n const parts = extractDecimalBrParts(this.inputText);\r\n const parseStr = buildDecimalBrParseString(parts);\r\n let parsed = parseDecimalBr(parseStr);\r\n if (parsed != null && parsed > this.max) {\r\n parsed = this.max;\r\n }\r\n const ctrl = this.ngControl?.control;\r\n const current = ctrl?.value ?? null;\r\n if (parsed !== current) {\r\n this.emitModelValue(parsed);\r\n }\r\n this.inputText = parsed != null ? formatDecimalBr(parsed) : '';\r\n this.refreshFilledUi();\r\n this.notifyTouched();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"decimal-field__input\" type=\"text\" inputmode=\"decimal\" [attr.autocomplete]=\"autocompleteAttr\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\" [attr.placeholder]=\"''\" [disabled]=\"disabled\" [readonly]=\"readonly\" [required]=\"uiRequiredEffective\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\"\n (beforeinput)=\"onBeforeInput($event)\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","/**\r\n * Formatação e normalização de data/hora no padrão pt-BR (lib ui-fields).\r\n */\r\n\r\nfunction pad2(n: number): string {\r\n return n.toString().padStart(2, '0');\r\n}\r\n\r\n/**\r\n * Exibe data como dd/mm/aaaa; com `showTimeHours`, dd/mm/aaaa hh:mm:ss (24h).\r\n */\r\nexport function formatDateTimePtBr(date: Date, showTimeHours: boolean): string {\r\n const d = pad2(date.getDate());\r\n const m = pad2(date.getMonth() + 1);\r\n const y = date.getFullYear();\r\n if (!showTimeHours) {\r\n return `${d}/${m}/${y}`;\r\n }\r\n return `${d}/${m}/${y} ${pad2(date.getHours())}:${pad2(date.getMinutes())}:${pad2(date.getSeconds())}`;\r\n}\r\n\r\n/**\r\n * Interpreta valor vindo do formulário / API.\r\n * Aceita data local sem fuso (`YYYY-MM-DD` ou `YYYY-MM-DDTHH:mm:ss`), `Date`, número ou ISO com `Z`.\r\n */\r\nexport function parseUiFieldDateValue(value: unknown): Date | null {\r\n if (value == null || value === '') {\r\n return null;\r\n }\r\n if (value instanceof Date) {\r\n return Number.isNaN(value.getTime()) ? null : value;\r\n }\r\n if (typeof value === 'number') {\r\n const d = new Date(value);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n }\r\n if (typeof value !== 'string') {\r\n return null;\r\n }\r\n const s = value.trim();\r\n const localDateOnly = /^(\\d{4})-(\\d{2})-(\\d{2})$/.exec(s);\r\n if (localDateOnly) {\r\n const y = +localDateOnly[1];\r\n const m = +localDateOnly[2] - 1;\r\n const d = +localDateOnly[3];\r\n const out = new Date(y, m, d, 0, 0, 0, 0);\r\n return Number.isNaN(out.getTime()) ? null : out;\r\n }\r\n const localDt = /^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})$/.exec(s);\r\n if (localDt) {\r\n const out = new Date(\r\n +localDt[1],\r\n +localDt[2] - 1,\r\n +localDt[3],\r\n +localDt[4],\r\n +localDt[5],\r\n +localDt[6],\r\n 0,\r\n );\r\n return Number.isNaN(out.getTime()) ? null : out;\r\n }\r\n const d = new Date(s);\r\n return Number.isNaN(d.getTime()) ? null : d;\r\n}\r\n\r\n/**\r\n * Valor persistido no `FormControl`: horário de parede local, sem `Z`\r\n * (evita 14:59 no input virar 17:59 no `JSON.stringify` de `Date`).\r\n */\r\nexport function formatUiFieldDateValue(d: Date, showTimeHours: boolean): string {\r\n const y = d.getFullYear();\r\n const mo = pad2(d.getMonth() + 1);\r\n const day = pad2(d.getDate());\r\n if (!showTimeHours) {\r\n return `${y}-${mo}-${day}`;\r\n }\r\n return `${y}-${mo}-${day}T${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`;\r\n}\r\n\r\n/** @deprecated use {@link parseUiFieldDateValue} */\r\nexport function normalizeFormDateValue(value: unknown): Date | null {\r\n return parseUiFieldDateValue(value);\r\n}\r\n\r\n/**\r\n * Data escolhida no calendário: meia-noite local, ou com `showTimeHours` a hora completa\r\n * (h, min, s, ms) do instante da seleção.\r\n */\r\nexport function applyPickedCalendarDate(\r\n picked: Date,\r\n showTimeHours: boolean,\r\n): Date {\r\n if (!showTimeHours) {\r\n return new Date(\r\n picked.getFullYear(),\r\n picked.getMonth(),\r\n picked.getDate(),\r\n 0,\r\n 0,\r\n 0,\r\n 0,\r\n );\r\n }\r\n const now = new Date();\r\n return new Date(\r\n picked.getFullYear(),\r\n picked.getMonth(),\r\n picked.getDate(),\r\n now.getHours(),\r\n now.getMinutes(),\r\n now.getSeconds(),\r\n now.getMilliseconds(),\r\n );\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n SimpleChanges,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { FormsModule, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { MatDatepicker, MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MAT_DATE_LOCALE, MatNativeDateModule } from '@angular/material/core';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { NgControlFieldDirective } from '../_base/ng-control-field.directive';\r\nimport {\r\n applyPickedCalendarDate,\r\n formatDateTimePtBr,\r\n formatUiFieldDateValue,\r\n parseUiFieldDateValue,\r\n} from '../../../_utils/date-pt-br.utils';\r\n\r\n@Component({\r\n selector: 'app-date-field',\r\n imports: [\r\n BaseFieldComponent,\r\n FormsModule,\r\n MatDatepickerModule,\r\n MatInputModule,\r\n MatNativeDateModule,\r\n ],\r\n templateUrl: './date-field.component.html',\r\n styleUrl: './date-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DateFieldComponent),\r\n multi: true,\r\n },\r\n { provide: MAT_DATE_LOCALE, useValue: 'pt-BR' },\r\n ]\r\n})\r\nexport class DateFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit, OnChanges\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('picker') picker?: MatDatepicker<Date>;\r\n\r\n /**\r\n * Se `true`, a formatação inclui hh:mm (24h) e, ao escolher no calendário,\r\n * usa a hora actual local no momento da selecção.\r\n */\r\n @Input({ transform: booleanAttribute }) showTimeHours = false;\r\n\r\n @Input() minDate: Date | null = null;\r\n @Input() maxDate: Date | null = null;\r\n\r\n innerDate: Date | null = null;\r\n\r\n filledUi = false;\r\n\r\n /** Texto da data no span (evita getter no template). */\r\n displayTextUi = '';\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (changes['showTimeHours'] && this.innerDate) {\r\n this.refreshDateDisplay();\r\n }\r\n }\r\n\r\n private refreshFilledUi(): void {\r\n this.filledUi = this.innerDate != null;\r\n }\r\n\r\n private refreshDateDisplay(): void {\r\n if (!this.innerDate) {\r\n this.displayTextUi = '';\r\n return;\r\n }\r\n this.displayTextUi = formatDateTimePtBr(this.innerDate, this.showTimeHours);\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n this.innerDate = parseUiFieldDateValue(value);\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n openPicker(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.picker?.open();\r\n }\r\n\r\n onGhostInputKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.openPicker();\r\n }\r\n }\r\n\r\n onPickedDate(next: Date | null): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (next == null) {\r\n this.innerDate = null;\r\n this.emitModelValue(null);\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n return;\r\n }\r\n const merged = applyPickedCalendarDate(next, this.showTimeHours);\r\n this.innerDate = merged;\r\n this.emitModelValue(formatUiFieldDateValue(merged, this.showTimeHours));\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.innerDate = null;\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshFilledUi();\r\n this.refreshDateDisplay();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\"\n [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\"\n [clearAriaLabel]=\"clearAriaLabel\" [valueAlignEnd]=\"false\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"date-field__date-wrap\">\n <span class=\"date-field__display\" aria-hidden=\"true\">{{ displayTextUi }}</span>\n <input #nativeInput matInput class=\"date-field__ghost-input\" [matDatepicker]=\"picker\" [(ngModel)]=\"innerDate\"\n [ngModelOptions]=\"{ standalone: true }\" (ngModelChange)=\"onPickedDate($event)\"\n [min]=\"minDate ?? undefined\" [max]=\"maxDate ?? undefined\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [id]=\"controlId\" [attr.name]=\"name || null\" [attr.autocomplete]=\"autocompleteAttr\"\n [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || 'Data'\" readonly (click)=\"openPicker()\"\n (keydown)=\"onGhostInputKeydown($event)\" (blur)=\"onBlur()\" />\n <mat-datepicker #picker panelClass=\"ui-field-datepicker-panel\" />\n </div>\n</app-base-field>\n","/**\r\n * Máscara com `#` como placeholder de um dígito (0–9); restantes caracteres são literais.\r\n * Ex.: `#####-###` (CEP), `(##) #####-####` (celular BR 11 dígitos).\r\n */\r\n\r\n/** Remove tudo que não é dígito. */\r\nexport function stripToDigits(s: string): string {\r\n return s.replace(/\\D/g, '');\r\n}\r\n\r\n/** Conta quantos `#` existem no padrão (= número máximo de dígitos). */\r\nexport function maskDigitCount(pattern: string): number {\r\n let n = 0;\r\n for (const c of pattern) {\r\n if (c === '#') {\r\n n++;\r\n }\r\n }\r\n return n;\r\n}\r\n\r\n/**\r\n * Formata apenas dígitos segundo o padrão. Não adiciona literais à direita sem dígitos\r\n * correspondentes (ex.: não fica \"12345-\" com 5 dígitos).\r\n */\r\nexport function formatMaskDigits(digitsOnly: string, pattern: string): string {\r\n const d = stripToDigits(digitsOnly);\r\n const max = maskDigitCount(pattern);\r\n const src = d.slice(0, max);\r\n let out = '';\r\n let j = 0;\r\n for (let i = 0; i < pattern.length && j < src.length; i++) {\r\n const c = pattern[i];\r\n if (c === '#') {\r\n out += src[j++];\r\n } else {\r\n out += c;\r\n }\r\n }\r\n return out;\r\n}\r\n","import {\r\n AfterViewInit,\r\n Directive,\r\n ElementRef,\r\n Input,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { NgControlFieldDirective } from './ng-control-field.directive';\r\nimport {\r\n formatMaskDigits,\r\n maskDigitCount,\r\n stripToDigits,\r\n} from '../_utils/mask-format.utils';\r\n\r\n/**\r\n * Campo de texto com máscara visual; valor do modelo = **apenas dígitos** (string), sem máscara.\r\n */\r\n@Directive()\r\nexport abstract class MaskedTextFieldBase\r\n extends NgControlFieldDirective<string | null>\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** Padrão com `#` para cada dígito (ex.: `#####-###`). Subclasses podem sobrescrever {@link pattern}. */\r\n @Input() maskPattern = '#####-###';\r\n\r\n inputText = '';\r\n\r\n /** Preenchido (só dígitos) para o label flutuante; actualizado com o texto mascarado. */\r\n filledUi = false;\r\n\r\n /** Padrão efetivo (permite CEP/telefone fixarem máscaras em subclasses). */\r\n protected get pattern(): string {\r\n return this.maskPattern;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n /**\r\n * Padrão de formatação para o valor digitado (só dígitos).\r\n * Sobrescrever para máscara dinâmica (ex.: CPF até 11 dígitos, CNPJ depois).\r\n */\r\n protected maskPatternFromDigits(digitsOnly: string): string {\r\n return this.pattern;\r\n }\r\n\r\n protected refreshMaskFilledUi(): void {\r\n this.filledUi = stripToDigits(this.inputText).length > 0;\r\n }\r\n\r\n protected override afterWriteValue(value: string | null): void {\r\n const incoming = stripToDigits(value ?? '');\r\n const pat = this.maskPatternFromDigits(incoming);\r\n const max = maskDigitCount(pat);\r\n const d = incoming.slice(0, max);\r\n this.inputText = formatMaskDigits(d, pat);\r\n if (incoming !== d) {\r\n queueMicrotask(() => this.emitModelValue(d.length ? d : null));\r\n }\r\n this.refreshMaskFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /**\r\n * Dígitos abaixo do tamanho da máscara actual (fixa ou dinâmica, ex. CPF/CNPJ), com valor parcial.\r\n * Aplica-se também sem obrigatório: máscara incompleta deve mostrar erro na UI (alinhado a `maskIncomplete`).\r\n * Mesma regra temporal que {@link BaseFieldDirective.controlInvalidUi}: `dirty` ou submit (não só `touched`).\r\n */\r\n protected isMaskIncompleteForUi(): boolean {\r\n const control = this.ngControl?.control;\r\n if (\r\n !control ||\r\n !(control.dirty || this.isParentFormSubmitted())\r\n ) {\r\n return false;\r\n }\r\n const digits = stripToDigits(this.inputText);\r\n if (digits.length === 0) {\r\n return false;\r\n }\r\n const pat = this.maskPatternFromDigits(digits);\r\n const max = maskDigitCount(pat);\r\n return digits.length < max;\r\n }\r\n\r\n override get baseInvalid(): boolean {\r\n if (this.isMaskIncompleteForUi()) {\r\n return true;\r\n }\r\n return super.baseInvalid;\r\n }\r\n\r\n override getErrorMessage(): string {\r\n if (!this.showErrorMessage) {\r\n return '';\r\n }\r\n if (this.isMaskIncompleteForUi()) {\r\n const custom = this.errorMessage.trim();\r\n if (custom.length > 0) {\r\n return custom;\r\n }\r\n return 'Campo obrigatório';\r\n }\r\n return super.getErrorMessage();\r\n }\r\n\r\n protected onMaskedInput(event: Event): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const el = event.target as HTMLInputElement;\r\n const incoming = stripToDigits(el.value);\r\n const pat = this.maskPatternFromDigits(incoming);\r\n const max = maskDigitCount(pat);\r\n const d = incoming.slice(0, max);\r\n const display = formatMaskDigits(d, pat);\r\n if (el.value !== display) {\r\n el.value = display;\r\n }\r\n this.inputText = display;\r\n this.emitModelValue(d.length ? d : null);\r\n this.refreshMaskFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n protected onMaskedBlur(): void {\r\n this.notifyTouched();\r\n }\r\n\r\n protected onMaskedClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.inputText = '';\r\n this.emitModelValue(null);\r\n this.notifyTouched();\r\n this.refreshMaskFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\n\r\n/**\r\n * Campo de texto com máscara configurável (`#` = dígito).\r\n * Valor do formulário: apenas dígitos, sem máscara.\r\n */\r\n@Component({\n selector: 'app-input-mask-field',\n imports: [BaseFieldComponent],\n templateUrl: './input-mask-field.component.html',\n styleUrl: './input-mask-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => InputMaskFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class InputMaskFieldComponent extends MaskedTextFieldBase {\r\n @HostBinding('class.input-mask-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Ex.: `#####-###`, `(##) #####-####`. */\r\n @Input() override maskPattern = '#####-###';\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"input-mask-field__input\" type=\"text\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\"\n [readonly]=\"readonly\" [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [value]=\"inputText\" (input)=\"onNativeInput($event)\"\n (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\n\r\n/** CEP brasileiro (8 dígitos). Valor do modelo: só dígitos, ex. `01310100`. */\r\n@Component({\n selector: 'app-cep-field',\n imports: [BaseFieldComponent],\n templateUrl: './cep-field.component.html',\n styleUrl: './cep-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CepFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class CepFieldComponent extends MaskedTextFieldBase {\r\n @HostBinding('class.cep-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n @Input() override maskPattern = '#####-###';\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"cep-field__input\" type=\"text\" inputmode=\"numeric\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\n\r\n/**\r\n * Telefone BR: celular 11 dígitos `(##) #####-####` ou fixo 10 `(##) ####-####`.\r\n * Valor do modelo: só dígitos (DDD + número), ex. `11999999999` ou `1133334444`.\r\n */\r\n@Component({\n selector: 'app-phone-field',\n imports: [BaseFieldComponent],\n templateUrl: './phone-field.component.html',\n styleUrl: './phone-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => PhoneFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class PhoneFieldComponent extends MaskedTextFieldBase {\r\n @HostBinding('class.phone-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Se `true`, máscara de fixo (10 dígitos). Se `false`, celular (11). */\r\n @Input({ transform: booleanAttribute }) landline = false;\r\n\r\n /**\r\n * Máscara manual (com `#`). Se vazio, usa celular ou fixo conforme {@link landline}.\r\n */\r\n @Input() override maskPattern = '';\r\n\r\n protected override get pattern(): string {\r\n const custom = this.maskPattern?.trim();\r\n if (custom && custom.includes('#')) {\r\n return custom;\r\n }\r\n return this.landline ? '(##) ####-####' : '(##) #####-####';\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"phone-field__input\" type=\"text\" inputmode=\"tel\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../_base/base-field.component';\r\nimport { MaskedTextFieldBase } from '../_base/masked-text-field.base';\r\nimport { stripToDigits } from '../_utils/mask-format.utils';\r\n\r\n/**\r\n * CPF (11 dígitos) ou CNPJ (14 dígitos) no mesmo campo.\r\n * Até 11 dígitos: `###.###.###-##`; a partir do 12º: `##.###.###/####-##`.\r\n * Valor do modelo: só dígitos, ex. `12345678901` ou `12345678000190`.\r\n */\r\n@Component({\n selector: 'app-cpf-cnpj-field',\n imports: [BaseFieldComponent],\n templateUrl: './cpf-cnpj-field.component.html',\n styleUrl: './cpf-cnpj-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CpfCnpjFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class CpfCnpjFieldComponent extends MaskedTextFieldBase {\r\n private static readonly CPF_MASK = '###.###.###-##';\r\n private static readonly CNPJ_MASK = '##.###.###/####-##';\r\n\r\n @HostBinding('class.cpf-cnpj-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Ignorado: a máscara é definida dinamicamente por {@link maskPatternFromDigits}. */\r\n @Input() override maskPattern = CpfCnpjFieldComponent.CPF_MASK;\r\n\r\n protected override maskPatternFromDigits(digitsOnly: string): string {\r\n return stripToDigits(digitsOnly).length <= 11\r\n ? CpfCnpjFieldComponent.CPF_MASK\r\n : CpfCnpjFieldComponent.CNPJ_MASK;\r\n }\r\n\r\n onNativeInput(event: Event): void {\r\n this.onMaskedInput(event);\r\n }\r\n\r\n onBlur(): void {\r\n this.onMaskedBlur();\r\n }\r\n\r\n onClear(): void {\r\n this.onMaskedClear();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\" [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\"\n [prefixIcon]=\"prefixIcon\" [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <input #nativeInput class=\"cpf-cnpj-field__input\" type=\"text\" inputmode=\"numeric\" [id]=\"controlId\" [attr.name]=\"name || null\"\n [attr.placeholder]=\"''\" [attr.autocomplete]=\"autocompleteAttr\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [required]=\"uiRequiredEffective\" [attr.aria-invalid]=\"uiInvalid\" [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [value]=\"inputText\" (input)=\"onNativeInput($event)\" (blur)=\"onBlur()\" />\n</app-base-field>\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\r\nimport { stripToDigits } from './mask-format.utils';\r\n\r\n/**\r\n * Validação alinhada às máscaras dinâmicas CPF/CNPJ: só dígitos; 11 ou 14 completos.\r\n * Vazio fica para `Validators.required`; com dígitos a menos devolve `maskIncomplete`.\r\n */\r\nexport function cpfCnpjMaskCompleteValidator(): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const raw = control.value;\r\n if (raw == null || raw === '') {\r\n return null;\r\n }\r\n const digits = stripToDigits(String(raw));\r\n if (digits.length === 0) {\r\n return null;\r\n }\r\n if (digits.length <= 11) {\r\n return digits.length === 11 ? null : { maskIncomplete: true };\r\n }\r\n return digits.length === 14 ? null : { maskIncomplete: true };\r\n };\r\n}\r\n\r\n/**\r\n * Telefone BR só dígitos (DDD + número): 10 fixo ou 11 celular, conforme {@link landline}.\r\n * Usar com `app-phone-field` para que `FormControl.invalid` e ícones de grupo/aba coincidam com a UI.\r\n */\r\nexport function phoneBrMaskCompleteValidator(landline: boolean): ValidatorFn {\r\n const expected = landline ? 10 : 11;\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const raw = control.value;\r\n if (raw == null || raw === '') {\r\n return null;\r\n }\r\n const digits = stripToDigits(String(raw));\r\n if (digits.length === 0) {\r\n return null;\r\n }\r\n return digits.length === expected ? null : { maskIncomplete: true };\r\n };\r\n}\r\n\r\n/**\r\n * Máscara com número fixo de dígitos (valor do modelo só dígitos, como CEP/telefone).\r\n * Valor vazio: `null` (delega em `Validators.required`); com dígitos a menos: `maskIncomplete`.\r\n */\r\nexport function fixedDigitsMaskCompleteValidator(expectedDigits: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const raw = control.value;\r\n if (raw == null || raw === '') {\r\n return null;\r\n }\r\n const digits = stripToDigits(String(raw));\r\n if (digits.length === 0) {\r\n return null;\r\n }\r\n return digits.length === expectedDigits ? null : { maskIncomplete: true };\r\n };\r\n}\r\n\r\n/** CEP brasileiro (`app-cep-field`): 8 dígitos. Usar com `Validators.required`. */\r\nexport function cepMaskCompleteValidator(): ValidatorFn {\r\n return fixedDigitsMaskCompleteValidator(8);\r\n}\r\n","import type { UiSelectOption } from '../fields/dropdown-fields/_models/select-option.model';\r\n\r\n/** Unidades federativas do Brasil (nome + sigla). Ordem alfabética por nome. */\r\nexport const BR_ESTADOS_NOME_SIGLA: ReadonlyArray<{ nome: string; sigla: string }> = [\r\n { nome: 'Acre', sigla: 'AC' },\r\n { nome: 'Alagoas', sigla: 'AL' },\r\n { nome: 'Amapá', sigla: 'AP' },\r\n { nome: 'Amazonas', sigla: 'AM' },\r\n { nome: 'Bahia', sigla: 'BA' },\r\n { nome: 'Ceará', sigla: 'CE' },\r\n { nome: 'Distrito Federal', sigla: 'DF' },\r\n { nome: 'Espírito Santo', sigla: 'ES' },\r\n { nome: 'Goiás', sigla: 'GO' },\r\n { nome: 'Maranhão', sigla: 'MA' },\r\n { nome: 'Mato Grosso', sigla: 'MT' },\r\n { nome: 'Mato Grosso do Sul', sigla: 'MS' },\r\n { nome: 'Minas Gerais', sigla: 'MG' },\r\n { nome: 'Pará', sigla: 'PA' },\r\n { nome: 'Paraíba', sigla: 'PB' },\r\n { nome: 'Paraná', sigla: 'PR' },\r\n { nome: 'Pernambuco', sigla: 'PE' },\r\n { nome: 'Piauí', sigla: 'PI' },\r\n { nome: 'Rio de Janeiro', sigla: 'RJ' },\r\n { nome: 'Rio Grande do Norte', sigla: 'RN' },\r\n { nome: 'Rio Grande do Sul', sigla: 'RS' },\r\n { nome: 'Rondônia', sigla: 'RO' },\r\n { nome: 'Roraima', sigla: 'RR' },\r\n { nome: 'Santa Catarina', sigla: 'SC' },\r\n { nome: 'São Paulo', sigla: 'SP' },\r\n { nome: 'Sergipe', sigla: 'SE' },\r\n { nome: 'Tocantins', sigla: 'TO' },\r\n] as const;\r\n\r\nexport function mapEstadosToOptions(\r\n slice: ReadonlyArray<{ nome: string; sigla: string }>,\r\n): UiSelectOption<string>[] {\r\n return slice.map((e) => ({\r\n label: `${e.nome} (${e.sigla})`,\r\n value: e.sigla,\r\n }));\r\n}\r\n","import { Directive, DoCheck, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport {\r\n AbstractControl,\r\n FormGroupDirective,\r\n NgControl,\r\n NgForm,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { distinctUntilChanged, merge } from 'rxjs';\r\nimport { BaseFieldDirective } from '../../input-fields/_base/base-field.directive';\r\n\r\n@Directive()\r\nexport abstract class BooleanFieldDirective\r\n extends BaseFieldDirective<boolean | null>\r\n implements OnInit, OnChanges, DoCheck\r\n{\r\n protected ngControl: NgControl | null = null;\r\n\r\n /** Ver {@link NgControlFieldDirective.ngDoCheck} — `resetForm()` sem `ngSubmit`. */\r\n private lastParentSubmitted: boolean | undefined;\r\n\r\n checked = false;\r\n\r\n /** Cache para templates OnPush (evita getters a cada CD). */\r\n uiInvalid = false;\r\n uiErrorMessage = '';\r\n uiAriaDescribedBy: string | null = null;\r\n uiRequiredEffective = false;\r\n\r\n /** Por omissão não mostra o parágrafo de erro (checkbox/switch); alinhado à base dos campos. */\r\n @Input()\r\n override showErrorMessage = false;\r\n\r\n protected override resolveControlForRequired(): AbstractControl | null | undefined {\r\n return this.ngControl?.control ?? undefined;\r\n }\r\n\r\n ngOnChanges(_changes: SimpleChanges): void {\r\n if (this.ngControl?.control) {\r\n this.syncBoolUi();\r\n }\r\n }\r\n\r\n ngOnInit(): void {\r\n this.ngControl = this.injector.get(NgControl, null, {\r\n optional: true,\r\n self: true,\r\n });\r\n if (this.ngControl) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n const c = this.ngControl?.control;\r\n if (c) {\r\n merge(\r\n c.statusChanges,\r\n c.valueChanges.pipe(\r\n distinctUntilChanged((a, b) => Object.is(a, b)),\r\n ),\r\n )\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => this.syncBoolUi());\r\n this.syncBoolUi();\r\n }\r\n this.registerFormSubmitRecheckBool();\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (!this.ngControl?.control) {\r\n return;\r\n }\r\n const sub = this.isParentFormSubmitted();\r\n if (this.lastParentSubmitted === undefined) {\r\n this.lastParentSubmitted = sub;\r\n return;\r\n }\r\n if (this.lastParentSubmitted !== sub) {\r\n this.lastParentSubmitted = sub;\r\n this.syncBoolUi();\r\n }\r\n }\r\n\r\n /**\r\n * Checkbox/switch: mostrar erro após alterar o valor (`dirty`), após foco (`touched`)\r\n * ou após envio do formulário — ao contrário dos inputs de texto, não há “valor intermédio”\r\n * e o utilizador espera feedback imediato ao marcar/desmarcar.\r\n */\r\n protected boolInvalidShownAfterInteraction(\r\n control: AbstractControl | null | undefined,\r\n ): boolean {\r\n return !!control && (control.dirty || control.touched || this.isParentFormSubmitted());\r\n }\r\n\r\n protected override controlInvalidUi(control: AbstractControl | null | undefined): boolean {\r\n if (!this.isEffectiveRequired(control)) {\r\n return false;\r\n }\r\n return (\r\n !!control &&\r\n control.invalid &&\r\n this.boolInvalidShownAfterInteraction(control)\r\n );\r\n }\r\n\r\n protected syncBoolUi(): void {\r\n this.uiInvalid = this.baseInvalid;\r\n this.uiRequiredEffective = this.requiredEffective;\r\n this.uiErrorMessage = this.getErrorMessage();\r\n this.uiAriaDescribedBy =\r\n this.uiInvalid && this.uiErrorMessage ? this.errorElementId : null;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private registerFormSubmitRecheckBool(): void {\r\n const fg = this.injector.get(FormGroupDirective, null, { optional: true });\r\n const nf = this.injector.get(NgForm, null, { optional: true });\r\n const recheck = (): void => this.syncBoolUi();\r\n fg?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n nf?.ngSubmit\r\n ?.pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(recheck);\r\n }\r\n\r\n protected override afterWriteValue(value: boolean | null): void {\r\n this.checked = value === true;\r\n if (this.ngControl?.control) {\r\n this.syncBoolUi();\r\n }\r\n }\r\n\r\n protected setChecked(next: boolean): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.checked = next;\r\n this.emitModelValue(next);\r\n const c = this.ngControl?.control;\r\n if (c) {\r\n c.markAsDirty();\r\n this.syncBoolUi();\r\n return;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get baseInvalid(): boolean {\r\n return this.controlInvalidUi(this.ngControl?.control);\r\n }\r\n\r\n /**\r\n * A classe base só devolvia texto quando `isEffectiveRequired` batia com o mesmo instante\r\n * do `NgControl`; com `requiredTrue` + submit, o estado vermelho aparecia sem mensagem.\r\n */\r\n override getErrorMessage(): string {\r\n if (!this.showErrorMessage) {\r\n return '';\r\n }\r\n const c = this.ngControl?.control;\r\n if (!c?.invalid) {\r\n return super.getErrorMessage();\r\n }\r\n const showState = this.boolInvalidShownAfterInteraction(c);\r\n if (!showState) {\r\n return super.getErrorMessage();\r\n }\r\n if (c.hasError('required')) {\r\n const requiredField =\r\n this.required ||\r\n c.hasValidator(Validators.required) ||\r\n c.hasValidator(Validators.requiredTrue);\r\n if (requiredField) {\r\n const custom = this.errorMessage.trim();\r\n return custom.length > 0 ? custom : 'Campo obrigatório';\r\n }\r\n }\r\n return super.getErrorMessage();\r\n }\r\n\r\n get errorElementId(): string {\r\n return `${this.controlId}-error`;\r\n }\r\n\r\n onBlur(): void {\r\n this.notifyTouched();\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n HostBinding,\r\n Input,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { SkeletonBlockComponent } from '../../../loading/skeleton-loading';\r\nimport { BooleanFieldDirective } from '../_base/boolean-field.directive';\r\n\r\n@Component({\r\n selector: 'app-checkbox-field',\r\n imports: [SkeletonBlockComponent],\r\n templateUrl: './checkbox-field.component.html',\r\n styleUrl: './checkbox-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => CheckboxFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class CheckboxFieldComponent\r\n extends BooleanFieldDirective\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n /** `false` (padrão): host usa largura intrínseca. Com `true`, ocupa 100%. */\r\n @Input({ transform: booleanAttribute }) fullWidth = false;\r\n\r\n @HostBinding('class.checkbox-field--full-width')\r\n get fullWidthClass(): boolean {\r\n return this.fullWidth;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n onCheckboxClick(ev: MouseEvent): void {\r\n if (this.readonly || this.loading) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n }\r\n }\r\n\r\n onNativeChange(event: Event): void {\r\n const el = event.target as HTMLInputElement;\r\n this.setChecked(el.checked);\r\n }\r\n}\r\n","@if (!loading) {\r\n<div class=\"checkbox-field\" [class.checkbox-field--invalid]=\"uiInvalid\"\r\n [class.checkbox-field--readonly]=\"readonly\">\r\n <label class=\"checkbox-field__row\">\r\n <input\r\n #nativeInput\r\n type=\"checkbox\"\r\n class=\"checkbox-field__native\"\r\n [id]=\"controlId\"\r\n [attr.name]=\"name || null\"\r\n [attr.tabindex]=\"readonly ? -1 : null\"\r\n [checked]=\"checked\"\r\n [disabled]=\"disabled\"\r\n [required]=\"uiRequiredEffective\"\r\n [attr.aria-invalid]=\"uiInvalid\"\r\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\r\n [attr.aria-readonly]=\"readonly ? true : null\"\r\n [attr.aria-label]=\"label || placeholder || 'Opção'\"\r\n (click)=\"onCheckboxClick($event)\"\r\n (change)=\"onNativeChange($event)\"\r\n (blur)=\"onBlur()\"\r\n />\r\n @if (label) {\r\n <span class=\"checkbox-field__label\">{{ label }}</span>\r\n }\r\n </label>\r\n @if (showErrorMessage && uiInvalid && uiErrorMessage) {\r\n <p class=\"checkbox-field__error\" [id]=\"errorElementId\" role=\"alert\">{{ uiErrorMessage }}</p>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"checkbox-field checkbox-field--loading\" role=\"status\" aria-live=\"polite\" [attr.aria-busy]=\"true\"\r\n [attr.aria-label]=\"label || 'A carregar'\">\r\n <div class=\"checkbox-field__skeleton-row\" aria-hidden=\"true\">\r\n <app-skeleton-block width=\"1.1rem\" height=\"1.1rem\" radius=\"4px\" />\r\n <app-skeleton-block width=\"11rem\" height=\"0.72rem\" radius=\"6px\" />\r\n </div>\r\n</div>\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n ViewChild,\r\n forwardRef,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { SkeletonBlockComponent } from '../../../loading/skeleton-loading';\r\nimport { BooleanFieldDirective } from '../_base/boolean-field.directive';\r\n\r\n@Component({\r\n selector: 'app-switch-field',\r\n imports: [SkeletonBlockComponent],\r\n templateUrl: './switch-field.component.html',\r\n styleUrl: './switch-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SwitchFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class SwitchFieldComponent\r\n extends BooleanFieldDirective\r\n implements AfterViewInit\r\n{\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n get labelId(): string {\r\n return `${this.controlId}-switch-label`;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n toggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n this.setChecked(!this.checked);\r\n }\r\n}\r\n","@if (!loading) {\r\n<div class=\"switch-field\" [class.switch-field--invalid]=\"uiInvalid\"\r\n [class.switch-field--readonly]=\"readonly\">\r\n <label class=\"switch-field__row\">\r\n <button\r\n #nativeInput\r\n type=\"button\"\r\n class=\"switch-field__track\"\r\n role=\"switch\"\r\n [id]=\"controlId\"\r\n [attr.name]=\"name || null\"\r\n [attr.aria-checked]=\"checked\"\r\n [attr.aria-labelledby]=\"label ? labelId : null\"\r\n [attr.aria-invalid]=\"uiInvalid\"\r\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\r\n [attr.aria-readonly]=\"readonly ? true : null\"\r\n [disabled]=\"disabled || readonly\"\r\n (click)=\"toggle()\"\r\n (blur)=\"onBlur()\"\r\n >\r\n <span class=\"switch-field__thumb\" aria-hidden=\"true\"></span>\r\n </button>\r\n @if (label) {\r\n <span class=\"switch-field__label\" [id]=\"labelId\">\r\n {{ label }}\r\n @if (uiRequiredEffective && showRequiredMark) {\r\n <span class=\"switch-field__required\" aria-hidden=\"true\">*</span>\r\n }\r\n </span>\r\n }\r\n </label>\r\n @if (showErrorMessage && uiInvalid && uiErrorMessage) {\r\n <p class=\"switch-field__error\" [id]=\"errorElementId\" role=\"alert\">{{ uiErrorMessage }}</p>\r\n }\r\n</div>\r\n} @else {\r\n<div class=\"switch-field switch-field--loading\" role=\"status\" aria-live=\"polite\" [attr.aria-busy]=\"true\"\r\n [attr.aria-label]=\"label || 'A carregar'\">\r\n <div class=\"switch-field__skeleton-row\" aria-hidden=\"true\">\r\n <app-skeleton-block width=\"2.75rem\" height=\"1.5rem\" radius=\"999px\" />\r\n <app-skeleton-block width=\"4.25rem\" height=\"0.72rem\" radius=\"6px\" />\r\n </div>\r\n</div>\r\n}\r\n","import { Directive, Input, booleanAttribute } from '@angular/core';\r\nimport { NgControlFieldDirective } from '../../input-fields/_base/ng-control-field.directive';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\n\r\n/**\r\n * Lógica comum de select / combobox: opções, índice ativo, comparação e\r\n * `notifyTouched` após seleção (evita flicker vermelho → válido no frame em que o valor ainda não atualizou o `FormControl`).\r\n */\r\n@Directive()\r\nexport abstract class DropdownOptionFieldBase extends NgControlFieldDirective<unknown | null> {\r\n /** Estado “tem valor” para o label flutuante (evita getter no template). */\r\n filledUi = false;\r\n\r\n private _options: ReadonlyArray<UiSelectOption<unknown>> = [];\r\n\r\n @Input()\r\n get options(): ReadonlyArray<UiSelectOption<unknown>> {\r\n return this._options;\r\n }\r\n set options(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n /** Alias de {@link options}. */\r\n @Input('items')\r\n set itemsInput(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n private _compareWith: (a: unknown, b: unknown) => boolean = Object.is;\r\n\r\n @Input()\r\n get compareWith(): (a: unknown, b: unknown) => boolean {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Alias de {@link compareWith}. */\r\n @Input('compareBy')\r\n set compareBy(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Lista de opções ainda a carregar (painel aberto ou primeiro fetch). */\r\n @Input({ transform: booleanAttribute }) optionsLoading = false;\r\n\r\n activeIndex = 0;\r\n\r\n protected refreshFilledUi(): void {\r\n const v = this.internalValue;\r\n this.filledUi = v != null && v !== '';\r\n }\r\n\r\n override writeValue(value: unknown | null): void {\r\n super.writeValue(value);\r\n this.refreshFilledUi();\r\n }\r\n\r\n protected override emitModelValue(value: unknown | null): void {\r\n super.emitModelValue(value);\r\n this.refreshFilledUi();\r\n }\r\n\r\n /**\r\n * Opções na ordem de exibição no painel: valor atual (se existir em `options`) em primeiro lugar.\r\n */\r\n get listOptions(): ReadonlyArray<UiSelectOption<unknown>> {\r\n const src = this._options;\r\n if (src.length === 0) {\r\n return src;\r\n }\r\n const iv = this.internalValue;\r\n if (iv == null || iv === '') {\r\n return src;\r\n }\r\n const idx = src.findIndex(\r\n (o) => !o.disabled && this.matches(o.value, iv),\r\n );\r\n if (idx <= 0) {\r\n return src;\r\n }\r\n const selected = src[idx];\r\n const rest = src.filter((_, i) => i !== idx);\r\n return [selected, ...rest];\r\n }\r\n\r\n /**\r\n * Chamar após `emitModelValue` + fechar painel ao **escolher** um item.\r\n * Adia `notifyTouched` para o próximo microtask para o validador já ver o valor novo.\r\n */\r\n protected finishSelectionTouch(): void {\r\n queueMicrotask(() => {\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n trackOption(_index: number, opt: UiSelectOption<unknown>): unknown {\r\n return opt.value;\r\n }\r\n\r\n isSelected(opt: UiSelectOption<unknown>): boolean {\r\n return this.matches(opt.value, this.internalValue);\r\n }\r\n\r\n protected findOptionByValue(\r\n value: unknown | null,\r\n ): UiSelectOption<unknown> | undefined {\r\n if (value == null) {\r\n return undefined;\r\n }\r\n return this._options.find(\r\n (o) => !o.disabled && this.matches(o.value, value),\r\n );\r\n }\r\n\r\n protected matches(a: unknown, b: unknown): boolean {\r\n return this._compareWith(a, b);\r\n }\r\n\r\n protected syncActiveIndexFromValue(value: unknown | null): void {\r\n const list = this.listOptions;\r\n const idx = list.findIndex(\r\n (o) => !o.disabled && this.matches(o.value, value),\r\n );\r\n this.activeIndex = idx >= 0 ? idx : this.firstEnabledIndex();\r\n }\r\n\r\n protected firstEnabledIndex(): number {\r\n const list = this.listOptions;\r\n const i = list.findIndex((o) => !o.disabled);\r\n return i >= 0 ? i : 0;\r\n }\r\n\r\n protected lastEnabledIndex(): number {\r\n const list = this.listOptions;\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n protected stepActive(delta: number): number {\r\n let i = this.activeIndex;\r\n const list = this.listOptions;\r\n const n = list.length;\r\n if (n === 0) {\r\n return 0;\r\n }\r\n for (let step = 0; step < n; step++) {\r\n i = (i + delta + n) % n;\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return this.activeIndex;\r\n }\r\n}\r\n","import { Directive, Input, booleanAttribute } from '@angular/core';\r\nimport { NgControlFieldDirective } from '../../input-fields/_base/ng-control-field.directive';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\n\r\n/**\r\n * Base para multiselect: valor `unknown[]`, opções, índice ativo (teclado) e comparação.\r\n */\r\n@Directive()\r\nexport abstract class DropdownMultiOptionFieldBase extends NgControlFieldDirective<\r\n unknown[]\r\n> {\r\n filledUi = false;\r\n\r\n private _options: ReadonlyArray<UiSelectOption<unknown>> = [];\r\n\r\n @Input()\r\n get options(): ReadonlyArray<UiSelectOption<unknown>> {\r\n return this._options;\r\n }\r\n set options(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n /** Alias de {@link options}. */\r\n @Input('items')\r\n set itemsInput(value: ReadonlyArray<UiSelectOption<unknown>>) {\r\n this._options = value ?? [];\r\n }\r\n\r\n private _compareWith: (a: unknown, b: unknown) => boolean = Object.is;\r\n\r\n @Input()\r\n get compareWith(): (a: unknown, b: unknown) => boolean {\r\n return this._compareWith;\r\n }\r\n set compareWith(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Alias de {@link compareWith}. */\r\n @Input('compareBy')\r\n set compareBy(fn: (a: unknown, b: unknown) => boolean) {\r\n this._compareWith = fn ?? Object.is;\r\n }\r\n\r\n /** Lista de opções ainda a carregar. */\r\n @Input({ transform: booleanAttribute }) optionsLoading = false;\r\n\r\n activeIndex = 0;\r\n\r\n protected refreshMultiFilledUi(): void {\r\n const vals = this.internalValue;\r\n this.filledUi = Array.isArray(vals) && vals.length > 0;\r\n }\r\n\r\n protected override emitModelValue(value: unknown[] | null): void {\r\n super.emitModelValue(value);\r\n this.refreshMultiFilledUi();\r\n }\r\n\r\n /**\r\n * Opções com as selecionadas primeiro (mesma ordem relativa que em `options`).\r\n */\r\n get listOptions(): ReadonlyArray<UiSelectOption<unknown>> {\r\n const src = this._options;\r\n if (src.length === 0) {\r\n return src;\r\n }\r\n const vals = this.internalValue;\r\n if (!Array.isArray(vals) || vals.length === 0) {\r\n return src;\r\n }\r\n const picked: UiSelectOption<unknown>[] = [];\r\n const rest: UiSelectOption<unknown>[] = [];\r\n for (const o of src) {\r\n if (o.disabled) {\r\n rest.push(o);\r\n continue;\r\n }\r\n const sel = vals.some((v) => this.matches(o.value, v));\r\n if (sel) {\r\n picked.push(o);\r\n } else {\r\n rest.push(o);\r\n }\r\n }\r\n return [...picked, ...rest];\r\n }\r\n\r\n protected finishMultiTouch(): void {\r\n queueMicrotask(() => {\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n trackOption(_index: number, opt: UiSelectOption<unknown>): unknown {\r\n return opt.value;\r\n }\r\n\r\n isSelected(opt: UiSelectOption<unknown>): boolean {\r\n const vals = this.internalValue;\r\n if (!Array.isArray(vals) || vals.length === 0) {\r\n return false;\r\n }\r\n return vals.some((v) => this.matches(opt.value, v));\r\n }\r\n\r\n protected findOptionByValue(\r\n value: unknown | null,\r\n ): UiSelectOption<unknown> | undefined {\r\n if (value == null) {\r\n return undefined;\r\n }\r\n return this._options.find(\r\n (o) => !o.disabled && this.matches(o.value, value),\r\n );\r\n }\r\n\r\n protected matches(a: unknown, b: unknown): boolean {\r\n return this._compareWith(a, b);\r\n }\r\n\r\n protected syncActiveIndexToFirstEnabled(): void {\r\n const list = this.listOptions;\r\n const idx = list.findIndex((o) => !o.disabled);\r\n this.activeIndex = idx >= 0 ? idx : 0;\r\n }\r\n\r\n protected firstEnabledIndex(): number {\r\n const list = this.listOptions;\r\n const i = list.findIndex((o) => !o.disabled);\r\n return i >= 0 ? i : 0;\r\n }\r\n\r\n protected lastEnabledIndex(): number {\r\n const list = this.listOptions;\r\n for (let i = list.length - 1; i >= 0; i--) {\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return 0;\r\n }\r\n\r\n protected stepActive(delta: number): number {\r\n let i = this.activeIndex;\r\n const list = this.listOptions;\r\n const n = list.length;\r\n if (n === 0) {\r\n return 0;\r\n }\r\n for (let step = 0; step < n; step++) {\r\n i = (i + delta + n) % n;\r\n if (!list[i].disabled) {\r\n return i;\r\n }\r\n }\r\n return this.activeIndex;\r\n }\r\n}\r\n","/**\r\n * Após `blur` no trigger ou na lista: se o painel está aberto e o foco não ficou\r\n * dentro da **origem do overlay** (valor + chevron / input; não o botão limpar do `base-field`)\r\n * nem no overlay CDK, fecha o painel.\r\n */\r\nexport function scheduleCloseDropdownPanelOnTriggerBlur(options: {\r\n triggerRoot: HTMLElement;\r\n isPanelOpen: () => boolean;\r\n closePanel: () => void;\r\n notifyTouched: () => void;\r\n /** Corre depois de fechar / `notifyTouched` (ex.: limpar texto órfão no combobox de pesquisa). */\r\n afterBlur?: () => void;\r\n /**\r\n * `FocusEvent.relatedTarget` do `blur` no trigger — quando o foco passa para a lista no overlay\r\n * (MultiSelect no toque), alguns browsers preenchem isto antes de `activeElement` actualizar.\r\n */\r\n blurRelatedTarget?: EventTarget | null;\r\n}): void {\r\n setTimeout(() => {\r\n const rt = options.blurRelatedTarget as HTMLElement | null | undefined;\r\n if (rt && typeof rt.closest === 'function') {\r\n if (options.triggerRoot.contains(rt) || rt.closest('.cdk-overlay-container')) {\r\n options.notifyTouched();\r\n options.afterBlur?.();\r\n return;\r\n }\r\n }\r\n const a = document.activeElement;\r\n if (a && options.triggerRoot.contains(a)) {\r\n return;\r\n }\r\n if (a && typeof (a as HTMLElement).closest === 'function') {\r\n if ((a as HTMLElement).closest('.cdk-overlay-container')) {\r\n return;\r\n }\r\n }\r\n if (options.isPanelOpen()) {\r\n options.closePanel();\r\n }\r\n options.notifyTouched();\r\n options.afterBlur?.();\r\n }, 0);\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n inject,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../../input-fields/_base/base-field.component';\r\nimport { DropdownOptionFieldBase } from '../_base/dropdown-option-field.base';\r\nimport type { SelectPageRequested } from '../_models/select-pagination.model';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\nimport { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';\r\nimport { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';\r\nimport { SkeletonListComponent } from '../../../loading/skeleton-loading';\r\n\r\n@Component({\r\n selector: 'app-select-field',\r\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\r\n templateUrl: './select-field.component.html',\r\n styleUrl: './select-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class SelectFieldComponent\r\n extends DropdownOptionFieldBase\r\n implements AfterViewInit, OnDestroy, OnChanges {\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n\r\n @HostBinding('class.select-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n @Input({ transform: booleanAttribute }) pagination = false;\r\n\r\n /** Alias de {@link pagination} (listas paginadas / infinitas). */\r\n @Input({ alias: 'pageable', transform: booleanAttribute })\r\n set pageableInput(value: boolean) {\r\n this.pagination = value;\r\n }\r\n\r\n @Input({ transform: numberAttribute }) pageSize = 10;\r\n @Input() hasMore = false;\r\n @Input() loadingMore = false;\r\n @Output() readonly pageRequested = new EventEmitter<SelectPageRequested>();\r\n\r\n @ViewChild('optionsPanelTpl', { static: true })\r\n optionsPanelTpl!: TemplateRef<unknown>;\r\n\r\n @ViewChild('dropdownFieldTriggerRoot', { read: ElementRef })\r\n private readonly dropdownTriggerRootRef!: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n protected override afterWriteValue(value: unknown | null): void {\r\n this.syncActiveIndexFromValue(value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get displayValue(): string {\r\n const opt = this.findOptionByValue(this.internalValue);\r\n return opt?.label ?? '';\r\n }\r\n\r\n get optionsListId(): string {\r\n return `${this.controlId}-list`;\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (!this.panelOpen || !this.pagination || this.loadingMore) {\r\n return;\r\n }\r\n if (changes['loadingMore'] || changes['options']) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n }\r\n\r\n onDropdownOpenChange(next: boolean): void {\r\n this.panelOpen = next;\r\n if (next) {\r\n this.syncActiveIndexFromValue(this.internalValue);\r\n if (this.pagination && !this.loadingMore) {\r\n this.pageRequested.emit({ page: 0, pageSize: this.pageSize });\r\n }\r\n } else {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n this.scrollLoadTimer = null;\r\n }\r\n setTimeout(() => this.focusValueButtonIfFocusLost(), 0);\r\n }\r\n if (next && this.pagination) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n setTimeout(() => this.tryEmitIfShortList(), 80);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Com painel aberto, o foco permanece no botão (como no combobox no input):\r\n * setas / Home / End / Enter / Espaço tratados aqui; Escape fecha.\r\n */\r\n onTriggerKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n if (this.readonly) {\r\n if (ev.key === ' ' || ev.key === 'Enter') {\r\n ev.preventDefault();\r\n }\r\n return;\r\n }\r\n\r\n if (this.panelOpen) {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n const n = this.listOptions.length;\r\n if (n > 0) {\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.commitActiveOption();\r\n return;\r\n default:\r\n break;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n (ev.key === 'Delete' || ev.key === 'Backspace') &&\r\n this.filledUi\r\n ) {\r\n ev.preventDefault();\r\n this.onClear();\r\n return;\r\n }\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault();\r\n this.openToggle();\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.openToggle();\r\n }\r\n }\r\n\r\n private focusValueButtonIfFocusLost(): void {\r\n const a = document.activeElement;\r\n if (a === document.body || a === document.documentElement || a == null) {\r\n document.getElementById(this.controlId)?.focus({ preventScroll: true });\r\n }\r\n }\r\n\r\n onOptionsListScroll(ev: Event): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement;\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.scrollLoadTimer = setTimeout(() => {\r\n this.scrollLoadTimer = null;\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n if (this.hasMore && !this.loadingMore && this.options.length > 0) {\r\n this.emitNextPageRequest();\r\n }\r\n return;\r\n }\r\n const nearBottom =\r\n el.scrollHeight - el.scrollTop - el.clientHeight <= 64;\r\n if (!nearBottom) {\r\n return;\r\n }\r\n this.emitNextPageRequest();\r\n }, 120);\r\n }\r\n\r\n private emitNextPageRequest(): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const nextPage = Math.floor(this.options.length / this.pageSize);\r\n this.pageRequested.emit({ page: nextPage, pageSize: this.pageSize });\r\n }\r\n\r\n private tryEmitIfShortList(): void {\r\n if (!this.panelOpen || !this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const el = document.getElementById(this.optionsListId) as HTMLElement | null;\r\n if (!el) {\r\n return;\r\n }\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n this.emitNextPageRequest();\r\n }\r\n }\r\n\r\n openToggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n const next = !this.panelOpen;\r\n if (next) {\r\n const w = this.hostRef.nativeElement.getBoundingClientRect().width;\r\n this.panelOverlayWidth = Math.max(0, Math.ceil(w));\r\n }\r\n this.onDropdownOpenChange(next);\r\n }\r\n\r\n /** Enter/Espaço com foco na linha da opção (tabindex). */\r\n onOptionRowKeydown(ev: KeyboardEvent, opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key !== 'Enter' && ev.key !== ' ') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.selectOption(opt);\r\n }\r\n\r\n onListKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\r\n if (!this.disabled && !this.readonly && this.filledUi) {\r\n ev.preventDefault();\r\n this.onClear();\r\n }\r\n return;\r\n }\r\n if (this.listOptions.length === 0) {\r\n return;\r\n }\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n break;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n break;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n break;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.commitActiveOption();\r\n break;\r\n default:\r\n return;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n selectOption(opt: UiSelectOption<unknown>): void {\r\n if (this.disabled || this.readonly || opt.disabled) {\r\n return;\r\n }\r\n this.emitModelValue(opt.value);\r\n this.onDropdownOpenChange(false);\r\n this.finishSelectionTouch();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.emitModelValue(null);\r\n this.onDropdownOpenChange(false);\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Blur no valor/chevron ou na lista: fecha o painel se o foco saiu do campo e do overlay CDK.\r\n */\r\n onDropdownBlur(ev?: FocusEvent): void {\r\n const triggerRoot =\r\n this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;\r\n scheduleCloseDropdownPanelOnTriggerBlur({\r\n triggerRoot,\r\n isPanelOpen: () => this.panelOpen,\r\n closePanel: () => this.onDropdownOpenChange(false),\r\n notifyTouched: () => this.notifyTouched(),\r\n blurRelatedTarget: ev?.relatedTarget ?? null,\r\n });\r\n }\r\n\r\n /** Escape com foco no limpar/prefixo do `base-field` (não passa pelo div da origem do overlay). */\r\n @HostListener('keydown', ['$event'])\r\n onDropdownHostEscape(ev: KeyboardEvent): void {\r\n if (!this.panelOpen || ev.key !== 'Escape') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n }\r\n\r\n private commitActiveOption(): void {\r\n const opt = this.listOptions[this.activeIndex];\r\n if (opt && !opt.disabled) {\r\n this.selectOption(opt);\r\n }\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"select-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"select-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <!-- `div` em vez de `<button>`: o texto do valor fica selecionável (copiar), como no combobox. -->\n <div\n #nativeInput\n role=\"combobox\"\n class=\"select-field__value-btn\"\n [class.select-field__value-btn--is-disabled]=\"disabled\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n [attr.aria-readonly]=\"readonly && !disabled ? true : null\"\n [attr.aria-expanded]=\"panelOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\"\n [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || placeholder || 'Selecionar'\"\n (click)=\"openToggle()\"\n (blur)=\"onDropdownBlur($event)\"\n >\n <span class=\"select-field__value\">{{ displayValue }}</span>\n </div>\n <button type=\"button\" class=\"select-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista de opções\"\n (click)=\"openToggle()\" (blur)=\"onDropdownBlur($event)\">\n <i class=\"fa-solid fa-chevron-down select-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"select-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n (blur)=\"onDropdownBlur($event)\" (keydown)=\"onListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || (pagination && loadingMore))) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"select-field__option\" [class.select-field__option--disabled]=\"opt.disabled\"\n [class.select-field__option--selected]=\"isSelected(opt)\"\n [class.select-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && pagination && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n</ng-template>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n forwardRef,\r\n inject,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../../input-fields/_base/base-field.component';\r\nimport { DropdownMultiOptionFieldBase } from '../_base/dropdown-multi-option-field.base';\r\nimport type { SelectPageRequested } from '../_models/select-pagination.model';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\nimport { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';\r\nimport { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';\r\nimport { SkeletonListComponent } from '../../../loading/skeleton-loading';\r\n\r\n@Component({\r\n selector: 'app-multiselect-field',\r\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\r\n templateUrl: './multiselect-field.component.html',\r\n styleUrl: './multiselect-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => MultiselectFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class MultiselectFieldComponent\r\n extends DropdownMultiOptionFieldBase\r\n implements AfterViewInit, OnDestroy, OnChanges\r\n{\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n\r\n @HostBinding('class.multiselect-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n /** Por omissão `true`: mesmo padrão do select com lista longa (`pageRequested` + scroll). */\r\n @Input({ transform: booleanAttribute }) pagination = true;\r\n\r\n /** Alias de {@link pagination}. */\r\n @Input({ alias: 'pageable', transform: booleanAttribute })\r\n set pageableInput(value: boolean) {\r\n this.pagination = value;\r\n }\r\n\r\n @Input({ transform: numberAttribute }) pageSize = 10;\r\n @Input() hasMore = false;\r\n @Input() loadingMore = false;\r\n @Output() readonly pageRequested = new EventEmitter<SelectPageRequested>();\r\n\r\n @ViewChild('optionsPanelTpl', { static: true })\r\n optionsPanelTpl!: TemplateRef<unknown>;\r\n\r\n @ViewChild('dropdownFieldTriggerRoot', { read: ElementRef })\r\n private readonly dropdownTriggerRootRef!: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n override writeValue(value: unknown[] | null): void {\r\n // Normaliza: FormControl pode enviar null; valor interno é sempre array.\r\n const normalized =\r\n value == null ? [] : Array.isArray(value) ? [...value] : [];\r\n this.internalValue = normalized;\r\n this.afterWriteValue(normalized);\r\n this.refreshMultiFilledUi();\r\n if (this.ngControl?.control) {\r\n this.syncControlUi();\r\n } else {\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n protected override afterWriteValue(_value: unknown[]): void {\r\n this.syncActiveIndexToFirstEnabled();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Texto numa linha: rótulos separados por vírgula + ellipsis no CSS. */\r\n get displaySummary(): string {\r\n const vals = this.internalValue;\r\n if (!Array.isArray(vals) || vals.length === 0) {\r\n return '';\r\n }\r\n return vals\r\n .map((v) => this.findOptionByValue(v)?.label ?? String(v))\r\n .join(', ');\r\n }\r\n\r\n get optionsListId(): string {\r\n return `${this.controlId}-multilist`;\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (!this.panelOpen || !this.pagination || this.loadingMore) {\r\n return;\r\n }\r\n if (changes['loadingMore'] || changes['options']) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n }\r\n\r\n onDropdownOpenChange(next: boolean): void {\r\n this.panelOpen = next;\r\n if (next) {\r\n this.syncActiveIndexToFirstEnabled();\r\n if (this.pagination && !this.loadingMore) {\r\n this.pageRequested.emit({ page: 0, pageSize: this.pageSize });\r\n }\r\n } else {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n this.scrollLoadTimer = null;\r\n }\r\n setTimeout(() => this.focusValueButtonIfFocusLost(), 0);\r\n }\r\n if (next && this.pagination) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n setTimeout(() => this.tryEmitIfShortList(), 80);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onTriggerKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n if (this.readonly) {\r\n if (ev.key === ' ' || ev.key === 'Enter') {\r\n ev.preventDefault();\r\n }\r\n return;\r\n }\r\n\r\n if (this.panelOpen) {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n const n = this.listOptions.length;\r\n if (n > 0) {\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.toggleActiveOption();\r\n return;\r\n default:\r\n break;\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (\r\n (ev.key === 'Delete' || ev.key === 'Backspace') &&\r\n this.filledUi\r\n ) {\r\n ev.preventDefault();\r\n this.onClear();\r\n return;\r\n }\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault();\r\n this.openToggle();\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.openToggle();\r\n }\r\n }\r\n\r\n private focusValueButtonIfFocusLost(): void {\r\n const a = document.activeElement;\r\n if (a === document.body || a === document.documentElement || a == null) {\r\n document.getElementById(this.controlId)?.focus({ preventScroll: true });\r\n }\r\n }\r\n\r\n onOptionsListScroll(ev: Event): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement;\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.scrollLoadTimer = setTimeout(() => {\r\n this.scrollLoadTimer = null;\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n if (this.hasMore && !this.loadingMore && this.options.length > 0) {\r\n this.emitNextPageRequest();\r\n }\r\n return;\r\n }\r\n const nearBottom =\r\n el.scrollHeight - el.scrollTop - el.clientHeight <= 64;\r\n if (!nearBottom) {\r\n return;\r\n }\r\n this.emitNextPageRequest();\r\n }, 120);\r\n }\r\n\r\n private emitNextPageRequest(): void {\r\n if (!this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const nextPage = Math.floor(this.options.length / this.pageSize);\r\n this.pageRequested.emit({ page: nextPage, pageSize: this.pageSize });\r\n }\r\n\r\n private tryEmitIfShortList(): void {\r\n if (!this.panelOpen || !this.pagination || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const el = document.getElementById(this.optionsListId) as HTMLElement | null;\r\n if (!el) {\r\n return;\r\n }\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n this.emitNextPageRequest();\r\n }\r\n }\r\n\r\n openToggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n const next = !this.panelOpen;\r\n if (next) {\r\n const w = this.hostRef.nativeElement.getBoundingClientRect().width;\r\n this.panelOverlayWidth = Math.max(0, Math.ceil(w));\r\n }\r\n this.onDropdownOpenChange(next);\r\n }\r\n\r\n toggleOption(opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n const cur = [...(Array.isArray(this.internalValue) ? this.internalValue : [])];\r\n const j = cur.findIndex((v) => this.matches(v, opt.value));\r\n if (j >= 0) {\r\n cur.splice(j, 1);\r\n } else {\r\n cur.push(opt.value);\r\n }\r\n this.emitModelValue(cur);\r\n this.finishMultiTouch();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private toggleActiveOption(): void {\r\n const opt = this.listOptions[this.activeIndex];\r\n if (opt && !opt.disabled) {\r\n this.toggleOption(opt);\r\n }\r\n }\r\n\r\n onOptionRowKeydown(ev: KeyboardEvent, opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key !== 'Enter' && ev.key !== ' ') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.toggleOption(opt);\r\n }\r\n\r\n onListKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\r\n if (!this.disabled && !this.readonly && this.filledUi) {\r\n ev.preventDefault();\r\n this.onClear();\r\n }\r\n return;\r\n }\r\n if (this.listOptions.length === 0) {\r\n return;\r\n }\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n break;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n break;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n break;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n break;\r\n case 'Enter':\r\n case ' ':\r\n ev.preventDefault();\r\n this.toggleActiveOption();\r\n break;\r\n default:\r\n return;\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.emitModelValue([]);\r\n this.onDropdownOpenChange(false);\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDropdownBlur(ev?: FocusEvent): void {\r\n const triggerRoot =\r\n this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;\r\n scheduleCloseDropdownPanelOnTriggerBlur({\r\n triggerRoot,\r\n isPanelOpen: () => this.panelOpen,\r\n closePanel: () => this.onDropdownOpenChange(false),\r\n notifyTouched: () => this.notifyTouched(),\r\n blurRelatedTarget: ev?.relatedTarget ?? null,\r\n });\r\n }\r\n\r\n /** Escape com foco no limpar/prefixo do `base-field` (não passa pelo div da origem do overlay). */\r\n @HostListener('keydown', ['$event'])\r\n onDropdownHostEscape(ev: KeyboardEvent): void {\r\n if (!this.panelOpen || ev.key !== 'Escape') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"multiselect-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"multiselect-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <div\n #nativeInput\n role=\"combobox\"\n class=\"multiselect-field__value-btn\"\n [class.multiselect-field__value-btn--is-disabled]=\"disabled\"\n [id]=\"controlId\"\n [attr.name]=\"name || null\"\n [attr.tabindex]=\"disabled ? -1 : 0\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n [attr.aria-readonly]=\"readonly && !disabled ? true : null\"\n [attr.aria-expanded]=\"panelOpen\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\"\n [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\"\n [attr.aria-label]=\"floatLabelCaption || placeholder || 'Selecionar vários'\"\n (click)=\"openToggle()\"\n (blur)=\"onDropdownBlur($event)\"\n >\n <span class=\"multiselect-field__value\">{{ displaySummary }}</span>\n </div>\n <button type=\"button\" class=\"multiselect-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista de opções\"\n (click)=\"openToggle()\" (blur)=\"onDropdownBlur($event)\">\n <i class=\"fa-solid fa-chevron-down multiselect-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"multiselect-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\" aria-multiselectable=\"true\"\n (mousedown)=\"$event.preventDefault()\"\n (blur)=\"onDropdownBlur($event)\" (keydown)=\"onListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || (pagination && loadingMore))) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"multiselect-field__option\" [class.multiselect-field__option--disabled]=\"opt.disabled\"\n [class.multiselect-field__option--selected]=\"isSelected(opt)\"\n [class.multiselect-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"toggleOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n <span class=\"multiselect-field__check\" aria-hidden=\"true\">\n @if (isSelected(opt)) {\n <i class=\"fa-solid fa-check multiselect-field__check-icon\"></i>\n }\n </span>\n <span class=\"multiselect-field__option-label\">{{ opt.label }}</span>\n </div>\n }\n @if (options.length > 0 && pagination && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n</ng-template>\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n HostListener,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n TemplateRef,\r\n ViewChild,\r\n forwardRef,\r\n inject,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { BaseFieldComponent } from '../../input-fields/_base/base-field.component';\r\nimport { DropdownOptionFieldBase } from '../_base/dropdown-option-field.base';\r\nimport type { DropdownSearchPageRequested } from '../_models/dropdown-search-page-requested.model';\r\nimport { UiSelectOption } from '../_models/select-option.model';\r\nimport { DropdownBaseComponent } from '../_base/dropdown-base/dropdown-base.component';\r\nimport { scheduleCloseDropdownPanelOnTriggerBlur } from '../_base/dropdown-trigger-blur.util';\r\nimport { SkeletonListComponent } from '../../../loading/skeleton-loading';\r\n\r\nenum DropdownSearchOpenMode {\r\n Default = 'default',\r\n KeepInput = 'keepInput',\r\n}\r\n\r\n@Component({\r\n selector: 'app-dropdown-search-field',\r\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\r\n templateUrl: './dropdown-search-field.component.html',\r\n styleUrl: './dropdown-search-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => DropdownSearchFieldComponent),\r\n multi: true,\r\n },\r\n ]\r\n})\r\nexport class DropdownSearchFieldComponent\r\n extends DropdownOptionFieldBase\r\n implements OnDestroy, OnChanges\r\n{\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n\r\n @HostBinding('class.dropdown-search-field--invalid')\r\n get hostInvalidClass(): boolean {\r\n return this.uiInvalid;\r\n }\r\n\r\n @Input({ transform: numberAttribute }) pageSize = 5;\r\n @Input() hasMore = false;\r\n @Input() loadingMore = false;\r\n /**\r\n * Após parar de digitar, dispara a mesma pesquisa que Enter (`pageRequested` com `query`).\r\n * `0` desativa (só Enter pesquisa).\r\n */\r\n @Input({ transform: numberAttribute }) searchDebounceMs = 350;\r\n\r\n @Output() readonly pageRequested =\r\n new EventEmitter<DropdownSearchPageRequested>();\r\n\r\n @ViewChild('optionsPanelTpl', { static: true })\r\n optionsPanelTpl!: TemplateRef<unknown>;\r\n\r\n @ViewChild('dropdownFieldTriggerRoot', { read: ElementRef })\r\n private readonly dropdownTriggerRootRef!: ElementRef<HTMLElement>;\r\n\r\n @ViewChild('nativeInput', { read: ElementRef })\r\n private readonly nativeInputRef?: ElementRef<HTMLElement>;\r\n\r\n searchQuery = '';\r\n committedQuery = '';\r\n\r\n panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\r\n private searchDebounceTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n ngAfterViewInit(): void {\r\n this.applyAutofocusIfNeeded(() => this.nativeInputRef?.nativeElement);\r\n }\r\n\r\n protected override afterWriteValue(value: unknown | null): void {\r\n this.searchQuery =\r\n value == null ? '' : (this.findOptionByValue(value)?.label ?? '');\r\n this.committedQuery = '';\r\n this.syncActiveIndexFromValue(value);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n get displayValue(): string {\r\n const opt = this.findOptionByValue(this.internalValue);\r\n return opt?.label ?? '';\r\n }\r\n\r\n get optionsListId(): string {\r\n return `${this.controlId}-search-list`;\r\n }\r\n\r\n /**\r\n * Com valor selecionado e painel fechado, o texto é só exibição do rótulo;\r\n * edição só com o painel aberto (pesquisa).\r\n */\r\n get isLockedSelectionDisplay(): boolean {\r\n return (\r\n !this.disabled &&\r\n !this.readonly &&\r\n this.filledUi &&\r\n !this.panelOpen\r\n );\r\n }\r\n\r\n /** `readonly` nativo: prop do campo ou bloqueio de exibição da seleção. */\r\n get isNativeInputReadonly(): boolean {\r\n if (this.disabled) {\r\n return false;\r\n }\r\n return this.readonly || this.isLockedSelectionDisplay;\r\n }\r\n\r\n override ngOnChanges(changes: SimpleChanges): void {\r\n super.ngOnChanges(changes);\r\n if (!this.panelOpen || this.loadingMore) {\r\n return;\r\n }\r\n if (changes['loadingMore'] || changes['options']) {\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.clearSearchDebounce();\r\n }\r\n\r\n onDropdownOpenChange(\r\n next: boolean,\r\n openMode: DropdownSearchOpenMode = DropdownSearchOpenMode.Default,\r\n ): void {\r\n if (!next) {\r\n if (!this.panelOpen) {\r\n return;\r\n }\r\n this.panelOpen = false;\r\n this.clearSearchDebounce();\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n this.scrollLoadTimer = null;\r\n }\r\n setTimeout(() => this.focusMainInputIfFocusLost(), 0);\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n if (openMode === DropdownSearchOpenMode.Default) {\r\n // Não limpar o texto quando já há seleção (comportamento alinhado ao select).\r\n this.committedQuery = '';\r\n if (this.filledUi) {\r\n const opt = this.findOptionByValue(this.internalValue);\r\n this.searchQuery = opt?.label ?? '';\r\n } else {\r\n this.searchQuery = '';\r\n }\r\n } else {\r\n this.committedQuery = this.searchQuery.trim();\r\n }\r\n this.panelOpen = true;\r\n this.syncActiveIndexFromValue(this.internalValue);\r\n const w = this.hostRef.nativeElement.getBoundingClientRect().width;\r\n this.panelOverlayWidth = Math.max(0, Math.ceil(w));\r\n if (!this.loadingMore) {\r\n this.pageRequested.emit({\r\n page: 0,\r\n pageSize: this.pageSize,\r\n query: this.committedQuery,\r\n });\r\n }\r\n setTimeout(() => this.tryEmitIfShortList(), 0);\r\n setTimeout(() => this.tryEmitIfShortList(), 80);\r\n setTimeout(() => {\r\n document.getElementById(this.controlId)?.focus();\r\n }, 0);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMainInput(ev: Event): void {\r\n if (this.isNativeInputReadonly) {\r\n return;\r\n }\r\n const el = ev.target as HTMLInputElement;\r\n this.searchQuery = el.value;\r\n this.scheduleDebouncedSearch();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onMainKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n\r\n if (ev.key === 'Delete' || ev.key === 'Backspace') {\r\n if (this.panelOpen) {\r\n return;\r\n }\r\n if (this.filledUi) {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.onClear();\r\n }\r\n return;\r\n }\r\n\r\n if (ev.key === 'Escape' && this.panelOpen) {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n\r\n if (this.panelOpen && this.listOptions.length > 0) {\r\n switch (ev.key) {\r\n case 'ArrowDown':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'ArrowUp':\r\n ev.preventDefault();\r\n this.activeIndex = this.stepActive(-1);\r\n this.cdr.markForCheck();\r\n return;\r\n case 'Home':\r\n ev.preventDefault();\r\n this.activeIndex = this.firstEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n case 'End':\r\n ev.preventDefault();\r\n this.activeIndex = this.lastEnabledIndex();\r\n this.cdr.markForCheck();\r\n return;\r\n default:\r\n break;\r\n }\r\n }\r\n\r\n if (ev.key === 'Enter') {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n if (!this.panelOpen) {\r\n if (\r\n this.searchQuery.trim() === '' ||\r\n this.isLockedSelectionDisplay\r\n ) {\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);\r\n } else {\r\n this.runSearch();\r\n }\r\n return;\r\n }\r\n const q = this.searchQuery.trim();\r\n const dirty = q !== this.committedQuery;\r\n if (dirty) {\r\n // Lista pedida com query vazia mas o input mostra o rótulo da seleção — não é pesquisa nova.\r\n if (this.isDisplayingSelectedLabelWithUnfilteredList()) {\r\n if (this.listOptions.length > 0) {\r\n this.commitActiveOption();\r\n }\r\n return;\r\n }\r\n this.runSearch();\r\n return;\r\n }\r\n if (this.listOptions.length > 0) {\r\n this.commitActiveOption();\r\n }\r\n return;\r\n }\r\n }\r\n\r\n /**\r\n * Ao reabrir, `committedQuery` é '' (lista sem filtro) e o texto do input é o rótulo do valor —\r\n * `q !== committedQuery` seria true sem o usuário ter pesquisado; Enter deve confirmar opção.\r\n */\r\n private isDisplayingSelectedLabelWithUnfilteredList(): boolean {\r\n if (!this.filledUi || this.committedQuery !== '') {\r\n return false;\r\n }\r\n const label = this.findOptionByValue(this.internalValue)?.label?.trim();\r\n if (label == null || label.length === 0) {\r\n return false;\r\n }\r\n return this.searchQuery.trim() === label;\r\n }\r\n\r\n onMainBlur(ev?: FocusEvent): void {\r\n const triggerRoot =\r\n this.dropdownTriggerRootRef?.nativeElement ?? this.hostRef.nativeElement;\r\n scheduleCloseDropdownPanelOnTriggerBlur({\r\n triggerRoot,\r\n isPanelOpen: () => this.panelOpen,\r\n closePanel: () => this.onDropdownOpenChange(false),\r\n notifyTouched: () => this.notifyTouched(),\r\n blurRelatedTarget: ev?.relatedTarget ?? null,\r\n afterBlur: () => this.clearOrphanSearchTextAfterBlur(),\r\n });\r\n }\r\n\r\n /**\r\n * Sem valor no modelo: remove texto livre deixado no input (ex.: pesquisa sem escolha válida).\r\n * Não altera o `FormControl` — mantém-se `null`/vazio e o estado inválido (ex.: obrigatório) continua visível.\r\n */\r\n private clearOrphanSearchTextAfterBlur(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n const v = this.internalValue;\r\n if (v != null && v !== '') {\r\n return;\r\n }\r\n if (this.searchQuery.trim() === '') {\r\n return;\r\n }\r\n this.searchQuery = '';\r\n this.committedQuery = '';\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /** Escape com foco no limpar/prefixo do `base-field` (fora do input da origem). */\r\n @HostListener('keydown', ['$event'])\r\n onDropdownHostEscape(ev: KeyboardEvent): void {\r\n if (!this.panelOpen || ev.key !== 'Escape') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n }\r\n\r\n onTriggerKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (\r\n (ev.key === 'Delete' || ev.key === 'Backspace') &&\r\n this.filledUi &&\r\n !this.panelOpen\r\n ) {\r\n ev.preventDefault();\r\n this.onClear();\r\n return;\r\n }\r\n if (this.panelOpen) {\r\n return;\r\n }\r\n if (ev.key === 'ArrowDown' || ev.key === 'ArrowUp') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);\r\n }\r\n }\r\n\r\n /** Enter/Espaço com foco na linha da opção (tabindex). */\r\n onOptionRowKeydown(ev: KeyboardEvent, opt: UiSelectOption<unknown>): void {\r\n if (opt.disabled || this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (ev.key !== 'Enter' && ev.key !== ' ') {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.selectOption(opt);\r\n }\r\n\r\n /** Foco na lista (ex.: Tab): Delete/Backspace limpam a seleção. */\r\n onSearchListKeydown(ev: KeyboardEvent): void {\r\n if (ev.key === 'Escape') {\r\n ev.preventDefault();\r\n this.onDropdownOpenChange(false);\r\n return;\r\n }\r\n if (ev.key !== 'Delete' && ev.key !== 'Backspace') {\r\n return;\r\n }\r\n if (this.disabled || this.readonly || !this.filledUi) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.onClear();\r\n }\r\n\r\n private focusMainInputIfFocusLost(): void {\r\n const a = document.activeElement;\r\n if (a === document.body || a === document.documentElement || a == null) {\r\n document.getElementById(this.controlId)?.focus({ preventScroll: true });\r\n }\r\n }\r\n\r\n private scheduleDebouncedSearch(): void {\r\n if (this.searchDebounceMs <= 0) {\r\n return;\r\n }\r\n if (this.searchDebounceTimer != null) {\r\n clearTimeout(this.searchDebounceTimer);\r\n }\r\n this.searchDebounceTimer = setTimeout(() => {\r\n this.searchDebounceTimer = null;\r\n this.applyDebouncedSearch();\r\n }, this.searchDebounceMs);\r\n }\r\n\r\n private clearSearchDebounce(): void {\r\n if (this.searchDebounceTimer != null) {\r\n clearTimeout(this.searchDebounceTimer);\r\n this.searchDebounceTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Alinha-se ao Enter: só dispara se `query` mudou em relação a `committedQuery`;\r\n * com painel fechado, só se houver texto pesquisável (como Enter sem abrir vazio).\r\n */\r\n private applyDebouncedSearch(): void {\r\n if (this.disabled || this.readonly || this.isNativeInputReadonly) {\r\n return;\r\n }\r\n const q = this.searchQuery.trim();\r\n if (q === this.committedQuery) {\r\n return;\r\n }\r\n if (!this.panelOpen) {\r\n if (q === '' || this.isLockedSelectionDisplay) {\r\n return;\r\n }\r\n this.runSearch();\r\n return;\r\n }\r\n if (this.isDisplayingSelectedLabelWithUnfilteredList()) {\r\n return;\r\n }\r\n this.runSearch();\r\n }\r\n\r\n runSearch(): void {\r\n this.clearSearchDebounce();\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n if (!this.panelOpen) {\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.KeepInput);\r\n return;\r\n }\r\n const q = this.searchQuery.trim();\r\n this.committedQuery = q;\r\n this.pageRequested.emit({\r\n page: 0,\r\n pageSize: this.pageSize,\r\n query: q,\r\n });\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onOptionsListScroll(ev: Event): void {\r\n if (this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement;\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n if (this.scrollLoadTimer != null) {\r\n clearTimeout(this.scrollLoadTimer);\r\n }\r\n this.scrollLoadTimer = setTimeout(() => {\r\n this.scrollLoadTimer = null;\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n if (this.hasMore && !this.loadingMore && this.options.length > 0) {\r\n this.emitNextPageRequest();\r\n }\r\n return;\r\n }\r\n const nearBottom =\r\n el.scrollHeight - el.scrollTop - el.clientHeight <= 64;\r\n if (!nearBottom) {\r\n return;\r\n }\r\n this.emitNextPageRequest();\r\n }, 120);\r\n }\r\n\r\n private emitNextPageRequest(): void {\r\n if (this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const nextPage = Math.floor(this.options.length / this.pageSize);\r\n this.pageRequested.emit({\r\n page: nextPage,\r\n pageSize: this.pageSize,\r\n query: this.committedQuery,\r\n });\r\n }\r\n\r\n private tryEmitIfShortList(): void {\r\n if (!this.panelOpen || this.loadingMore || !this.hasMore) {\r\n return;\r\n }\r\n if (this.options.length === 0) {\r\n return;\r\n }\r\n const el = document.getElementById(this.optionsListId) as HTMLElement | null;\r\n if (!el) {\r\n return;\r\n }\r\n if (el.scrollHeight <= el.clientHeight + 8) {\r\n this.emitNextPageRequest();\r\n }\r\n }\r\n\r\n openToggle(): void {\r\n if (this.disabled || this.readonly || this.loading) {\r\n return;\r\n }\r\n if (this.panelOpen) {\r\n this.onDropdownOpenChange(false);\r\n } else {\r\n this.onDropdownOpenChange(true, DropdownSearchOpenMode.Default);\r\n }\r\n }\r\n\r\n private commitActiveOption(): void {\r\n const opt = this.listOptions[this.activeIndex];\r\n if (opt && !opt.disabled) {\r\n this.selectOption(opt);\r\n }\r\n }\r\n\r\n selectOption(opt: UiSelectOption<unknown>): void {\r\n if (this.disabled || this.readonly || opt.disabled) {\r\n return;\r\n }\r\n this.emitModelValue(opt.value);\r\n this.searchQuery = opt.label;\r\n this.committedQuery = '';\r\n this.onDropdownOpenChange(false);\r\n this.finishSelectionTouch();\r\n }\r\n\r\n onClear(): void {\r\n if (this.disabled || this.readonly) {\r\n return;\r\n }\r\n this.clearSearchDebounce();\r\n this.emitModelValue(null);\r\n this.searchQuery = '';\r\n this.committedQuery = '';\r\n this.onDropdownOpenChange(false);\r\n this.notifyTouched();\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-base-field [label]=\"floatLabelCaption\" [filled]=\"filledUi\" [disabled]=\"disabled\" [readonly]=\"readonly\"\n [size]=\"size\"\n [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\" [invalidThemed]=\"invalidThemed\"\n [inputId]=\"controlId\" [errorId]=\"errorElementId\" [showPrefixIcon]=\"showPrefixIcon\" [prefixIcon]=\"prefixIcon\"\n [clearable]=\"clearable\" [clearAriaLabel]=\"clearAriaLabel\"\n [mostrarMenuContexto]=\"mostrarMenuContexto\" [contextMenuItems]=\"contextMenuItems\" [contextMenuId]=\"contextMenuId\"\n (clear)=\"onClear()\" (contextMenuSelect)=\"contextMenuSelect.emit($event)\">\n <ng-content select=\"[appFieldPrefix]\" />\n <div class=\"dropdown-search-field__wrap\">\n <app-dropdown-base [open]=\"panelOpen\" [panelTemplate]=\"optionsPanelTpl\" [panelWidthPx]=\"panelOverlayWidth\"\n (openChange)=\"onDropdownOpenChange($event)\">\n <div #dropdownFieldTriggerRoot class=\"dropdown-search-field__origin\" appDropdownTrigger\n (keydown)=\"onTriggerKeydown($event)\">\n <input #nativeInput type=\"text\" class=\"dropdown-search-field__input\"\n [class.dropdown-search-field__input--locked]=\"isLockedSelectionDisplay\" [id]=\"controlId\"\n [attr.name]=\"name || null\" [disabled]=\"disabled\" [readonly]=\"isNativeInputReadonly\" [attr.placeholder]=\"''\"\n autocomplete=\"off\" spellcheck=\"false\"\n [attr.aria-expanded]=\"panelOpen\" aria-autocomplete=\"list\" role=\"combobox\"\n [attr.aria-controls]=\"panelOpen ? optionsListId : null\" [attr.aria-invalid]=\"uiInvalid\"\n [attr.aria-describedby]=\"uiAriaDescribedBy\" [attr.aria-label]=\"floatLabelCaption || placeholder || 'Buscar e selecionar'\"\n [value]=\"searchQuery\" (input)=\"onMainInput($event)\" (keydown)=\"onMainKeydown($event)\"\n (blur)=\"onMainBlur($event)\" />\n <button type=\"button\" class=\"dropdown-search-field__chevron-btn\" tabindex=\"-1\" [disabled]=\"disabled || readonly\"\n [attr.aria-expanded]=\"panelOpen\" aria-haspopup=\"listbox\" aria-label=\"Abrir lista\" (click)=\"openToggle()\">\n <i class=\"fa-solid fa-chevron-down dropdown-search-field__chevron-icon\" aria-hidden=\"true\"></i>\n </button>\n </div>\n </app-dropdown-base>\n </div>\n</app-base-field>\n\n<ng-template #optionsPanelTpl>\n <div class=\"dropdown-search-field__panel-inner\" (mousedown)=\"$event.preventDefault()\">\n <div class=\"dropdown-search-field__list\" [id]=\"optionsListId\" role=\"listbox\" tabindex=\"-1\"\n [attr.aria-label]=\"floatLabelCaption || 'Opções'\" (blur)=\"onMainBlur($event)\"\n (keydown)=\"onSearchListKeydown($event)\" (scroll)=\"onOptionsListScroll($event)\">\n @if (listOptions.length === 0 && (optionsLoading || loadingMore)) {\n <app-skeleton-list [rows]=\"8\" />\n }\n @for (opt of listOptions; track trackOption($index, opt)) {\n <div role=\"option\" class=\"dropdown-search-field__option\"\n [class.dropdown-search-field__option--disabled]=\"opt.disabled\"\n [class.dropdown-search-field__option--selected]=\"isSelected(opt)\"\n [class.dropdown-search-field__option--active]=\"!opt.disabled && activeIndex === $index\"\n [attr.tabindex]=\"opt.disabled ? null : -1\" [attr.aria-selected]=\"isSelected(opt)\" (click)=\"selectOption(opt)\"\n (keydown)=\"onOptionRowKeydown($event, opt)\">\n {{ opt.label }}\n </div>\n }\n @if (options.length > 0 && loadingMore) {\n <app-skeleton-list [rows]=\"1\" [leading]=\"false\" />\n }\n </div>\n </div>\n</ng-template>\n","/**\r\n * Bloqueio de scroll global **alinhado ao CDK** (`BlockScrollStrategy`):\r\n * classe `cdk-global-scrollblock` no `documentElement` + deslocamento `left`/`top`\r\n * para congelar a posição de scroll.\r\n *\r\n * Também define `overflow: hidden` no `body` enquanto o lock está activo — o `html`\r\n * **não** usa `overflow-y: scroll` (isso forçava barra no viewport sem necessidade).\r\n *\r\n * Requer regras CSS em `styles.scss` para `.cdk-global-scrollblock` e\r\n * `[data-app-scroll-lock]`.\r\n */\r\n\r\nexport interface ScrollLockSnapshot {\r\n readonly htmlLeft: string;\r\n readonly htmlTop: string;\r\n readonly scrollX: number;\r\n readonly scrollY: number;\r\n readonly bodyOverflow: string;\r\n readonly bodyTouchAction: string;\r\n}\r\n\r\n/** Aplica o mesmo padrão visual do overlay CDK Dialog (confirm, etc.). */\r\nexport function lockPageScrollCdkStyle(): ScrollLockSnapshot {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n const scrollX = window.scrollX ?? html.scrollLeft;\r\n const scrollY = window.scrollY ?? html.scrollTop;\r\n const snapshot: ScrollLockSnapshot = {\r\n htmlLeft: html.style.left,\r\n htmlTop: html.style.top,\r\n scrollX,\r\n scrollY,\r\n bodyOverflow: body.style.overflow,\r\n bodyTouchAction: body.style.touchAction,\r\n };\r\n html.style.left = `${-scrollX}px`;\r\n html.style.top = `${-scrollY}px`;\r\n html.classList.add('cdk-global-scrollblock');\r\n body.style.overflow = 'hidden';\r\n body.style.touchAction = 'none';\r\n return snapshot;\r\n}\r\n\r\nexport function unlockPageScrollCdkStyle(s: ScrollLockSnapshot): void {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n html.classList.remove('cdk-global-scrollblock');\r\n html.style.left = s.htmlLeft;\r\n html.style.top = s.htmlTop;\r\n body.style.overflow = s.bodyOverflow;\r\n body.style.touchAction = s.bodyTouchAction;\r\n window.scroll(s.scrollX, s.scrollY);\r\n}\r\n\r\n/**\r\n * Bloqueio de scroll para o `app-dialog` declarativo: **sem** `position: fixed` nem `left`/`top`\r\n * negativos no `documentElement` (padrão CDK em {@link lockPageScrollCdkStyle}).\r\n *\r\n * Com esse padrão, em Chromium/WebKit o `position: fixed` do scrim deixa de ficar ancorado ao\r\n * `html` deslocado — evita faixa de conteúdo visível no topo e scrim branco/cinza errado em\r\n * apps onde o `body` faz scroll (ex.: site de documentação).\r\n */\r\nexport interface AppDialogScrollLockSnapshot {\r\n readonly scrollX: number;\r\n readonly scrollY: number;\r\n readonly htmlOverflow: string;\r\n readonly bodyOverflow: string;\r\n readonly bodyTouchAction: string;\r\n}\r\n\r\nlet appDialogLightLockDepth = 0;\r\nlet appDialogLightLockSnapshot: AppDialogScrollLockSnapshot | null = null;\r\n\r\nfunction applyAppDialogScrollLock(): AppDialogScrollLockSnapshot {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n const scrollX = window.scrollX ?? html.scrollLeft;\r\n const scrollY = window.scrollY ?? html.scrollTop;\r\n return {\r\n scrollX,\r\n scrollY,\r\n htmlOverflow: html.style.overflow,\r\n bodyOverflow: body.style.overflow,\r\n bodyTouchAction: body.style.touchAction,\r\n };\r\n}\r\n\r\nfunction installAppDialogScrollLockStyles(s: AppDialogScrollLockSnapshot): void {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n html.classList.add('app-dialog-scroll-lock');\r\n html.style.overflow = 'hidden';\r\n body.style.overflow = 'hidden';\r\n body.style.touchAction = 'none';\r\n}\r\n\r\nfunction restoreAppDialogScrollLock(s: AppDialogScrollLockSnapshot): void {\r\n const html = document.documentElement;\r\n const body = document.body;\r\n html.classList.remove('app-dialog-scroll-lock');\r\n html.style.overflow = s.htmlOverflow;\r\n body.style.overflow = s.bodyOverflow;\r\n body.style.touchAction = s.bodyTouchAction;\r\n window.scroll(s.scrollX, s.scrollY);\r\n}\r\n\r\n/**\r\n * Incrementa um contador de aninhamento: o primeiro lock aplica o DOM; locks interiores\r\n * (ex.: `app-dialog` + CDK Dialog) só incrementam a profundidade.\r\n */\r\nexport function lockPageScrollAppDialog(): AppDialogScrollLockSnapshot {\r\n if (appDialogLightLockDepth === 0) {\r\n appDialogLightLockSnapshot = applyAppDialogScrollLock();\r\n installAppDialogScrollLockStyles(appDialogLightLockSnapshot);\r\n }\r\n appDialogLightLockDepth++;\r\n return appDialogLightLockSnapshot!;\r\n}\r\n\r\n/** Par com {@link lockPageScrollAppDialog}; o snapshot pode ser ignorado — usa-se a pilha interna. */\r\nexport function unlockPageScrollAppDialog(_s: AppDialogScrollLockSnapshot): void {\r\n if (appDialogLightLockDepth > 0) {\r\n appDialogLightLockDepth--;\r\n }\r\n if (appDialogLightLockDepth === 0 && appDialogLightLockSnapshot !== null) {\r\n restoreAppDialogScrollLock(appDialogLightLockSnapshot);\r\n appDialogLightLockSnapshot = null;\r\n }\r\n}\r\n","/** Largura máxima do painel `app-dialog` (conteúdo responsivo). */\r\nexport enum LibDialogSize {\r\n Sm = 'sm',\r\n Md = 'md',\r\n Lg = 'lg',\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n inject,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n booleanAttribute,\n} from '@angular/core';\nimport { CdkTrapFocus } from '@angular/cdk/a11y';\nimport {\n lockPageScrollAppDialog,\n unlockPageScrollAppDialog,\n type AppDialogScrollLockSnapshot,\n} from '../../_utils/scroll/body-scroll-lock.util';\nimport { LibDialogSize } from '../_models/lib-dialog-size.model';\nimport { AppThemeService } from '../../theme';\n\nlet appDialogSeq = 0;\n\n/**\n * Diálogo modal declarativo com `[(open)]`, projeção de corpo e rodapé opcional (`[appDialogFooter]`).\n * Bloqueio de scroll com {@link lockPageScrollAppDialog} (sem deslocar o `html` como o CDK),\n * para o scrim `position: fixed` alinhar ao viewport em páginas com scroll no `body`.\n */\n@Component({\n selector: 'app-dialog',\n imports: [CdkTrapFocus],\n templateUrl: './app-dialog.component.html',\n styleUrl: './app-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AppDialogComponent implements OnInit, OnChanges, OnDestroy {\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly appTheme = inject(AppThemeService);\n\n /**\n * Com o host em `document.body`, sem isto os `--app-color-*` / `--ui-field-*` ficam só com\n * valores de `:root` (azul); alinhamos ao CDK Dialog (`libDialogPanelClasses`).\n */\n @HostBinding('class')\n get hostThemeClasses(): string {\n return this.appTheme.getTheme();\n }\n\n /**\n * Impede o tooltip nativo do browser: o `@Input('title')` alimenta só `dialogHeading`, mas o\n * binding `title=\"…\"` no host ainda podia definir `HTMLElement.title` no `<app-dialog>`.\n */\n @HostBinding('attr.title')\n readonly hostTitleAttr: null = null;\n\n @Input({ transform: booleanAttribute }) open = false;\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n /**\n * Título do cabeçalho (`<app-dialog title=\"…\">`).\n * O nome da propriedade **não** pode ser `title`: no host DOM isso colide com\n * `HTMLElement.title` e o browser desenha o tooltip nativo por cima do overlay.\n */\n @Input('title') dialogHeading = '';\n\n /** Texto de apoio abaixo do título (opcional); liga `aria-describedby` no painel. */\n @Input() description = '';\n\n /**\n * Rótulo acessível quando não há título (evita diálogo sem nome).\n * Ignorado se `dialogHeading` tiver texto.\n */\n @Input() ariaLabel = 'Diálogo';\n\n @Input() size: LibDialogSize = LibDialogSize.Md;\n\n /**\n * Quando `false`, a tecla Escape e o clique no backdrop não fecham o diálogo\n * (botão ✕, `[(open)]` e `requestClose()` continuam disponíveis).\n * Omisso: `true`.\n */\n @Input({ transform: booleanAttribute }) allowOverlayDismiss = true;\n\n @Input({ transform: booleanAttribute }) showCloseButton = true;\n\n readonly LibDialogSize = LibDialogSize;\n\n readonly titleId = `app-dialog-title-${++appDialogSeq}`;\n readonly descriptionId = `app-dialog-desc-${appDialogSeq}`;\n\n /**\n * O modal fica no fim de `document.body` enquanto aberto, para o `backdrop-filter`\n * não ficar «preso» a ancestrais com `overflow: auto` (ex.: `app-shell__content`).\n */\n private bodyRestoreParent: HTMLElement | null = null;\n private bodyRestoreNext: ChildNode | null = null;\n\n private previousActive: HTMLElement | null = null;\n private scrollLock: AppDialogScrollLockSnapshot = {\n htmlOverflow: '',\n scrollX: 0,\n scrollY: 0,\n bodyOverflow: '',\n bodyTouchAction: '',\n };\n\n ngOnInit(): void {\n this.stripHostNativeTitle();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n this.stripHostNativeTitle();\n if (changes['open']) {\n if (this.open) {\n this.attachHostToBody();\n const a = document.activeElement;\n if (a instanceof HTMLElement && a !== document.body) {\n this.previousActive = a;\n }\n this.scrollLock = lockPageScrollAppDialog();\n } else {\n unlockPageScrollAppDialog(this.scrollLock);\n this.detachHostFromBody();\n this.restoreFocus();\n }\n }\n }\n\n ngOnDestroy(): void {\n if (this.open) {\n unlockPageScrollAppDialog(this.scrollLock);\n }\n this.detachHostFromBody();\n }\n\n private attachHostToBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement === document.body) {\n return;\n }\n this.bodyRestoreParent = el.parentElement;\n this.bodyRestoreNext = el.nextSibling;\n document.body.appendChild(el);\n this.stripHostNativeTitle();\n }\n\n private detachHostFromBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement !== document.body) {\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n return;\n }\n const parent = this.bodyRestoreParent;\n const next = this.bodyRestoreNext;\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n if (parent && document.body.contains(parent)) {\n if (next && next.parentNode === parent) {\n parent.insertBefore(el, next);\n return;\n }\n parent.appendChild(el);\n return;\n }\n const appRoot = document.querySelector('app-root');\n if (appRoot) {\n appRoot.appendChild(el);\n }\n }\n\n @HostListener('document:keydown', ['$event'])\n onDocumentKeydown(ev: KeyboardEvent): void {\n if (!this.open || ev.key !== 'Escape' || !this.allowOverlayDismiss) {\n return;\n }\n ev.preventDefault();\n this.requestClose();\n }\n\n onBackdropClick(): void {\n if (!this.allowOverlayDismiss) {\n return;\n }\n this.requestClose();\n }\n\n requestClose(): void {\n if (!this.open) {\n return;\n }\n this.open = false;\n this.openChange.emit(false);\n unlockPageScrollAppDialog(this.scrollLock);\n this.restoreFocus();\n }\n\n private restoreFocus(): void {\n if (this.previousActive && document.contains(this.previousActive)) {\n this.previousActive.focus({ preventScroll: true });\n }\n this.previousActive = null;\n }\n\n private stripHostNativeTitle(): void {\n const el = this.hostEl.nativeElement;\n el.removeAttribute('title');\n el.title = '';\n }\n}\n","@if (open) {\r\n <div\r\n class=\"app-dialog-backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n <div class=\"app-dialog-stage\" aria-hidden=\"false\">\r\n <div\r\n class=\"app-dialog-panel\"\r\n [class.app-dialog-panel--sm]=\"size === LibDialogSize.Sm\"\r\n [class.app-dialog-panel--md]=\"size === LibDialogSize.Md\"\r\n [class.app-dialog-panel--lg]=\"size === LibDialogSize.Lg\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"\r\n dialogHeading.trim() ? titleId : description.trim() ? descriptionId : null\r\n \"\r\n [attr.aria-label]=\"!dialogHeading.trim() && !description.trim() ? ariaLabel : null\"\r\n [attr.aria-describedby]=\"\r\n dialogHeading.trim() && description.trim() ? descriptionId : null\r\n \"\r\n cdkTrapFocus\r\n [cdkTrapFocusAutoCapture]=\"true\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (dialogHeading.trim()) {\r\n <header class=\"app-dialog-header\">\r\n <h2 class=\"app-dialog-title\" [id]=\"titleId\">{{ dialogHeading }}</h2>\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-dialog-close\"\r\n aria-label=\"Fechar diálogo\"\r\n (click)=\"requestClose()\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n }\r\n @if (description.trim()) {\r\n <p class=\"app-dialog-description\" [id]=\"descriptionId\">{{ description }}</p>\r\n }\r\n <div class=\"app-dialog-body\">\r\n <ng-content />\r\n </div>\r\n <footer class=\"app-dialog-footer\">\r\n <ng-content select=\"[appDialogFooter]\" />\r\n </footer>\r\n </div>\r\n </div>\r\n}\r\n","import { Directive } from '@angular/core';\r\n\r\n/** Marca o conteúdo projectado no rodapé de `app-dialog`. */\r\n@Directive({\r\n selector: '[appDialogFooter]',\r\n standalone: true,\r\n})\r\nexport class DialogFooterDirective {}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ViewChild,\r\n inject,\r\n} from '@angular/core';\r\nimport { DIALOG_DATA, DialogRef } from '@angular/cdk/dialog';\r\nimport { ButtonComponent, ButtonType, ButtonVariant } from '../../buttons';\r\nimport type { ConfirmDialogData } from './confirm-dialog-data.model';\r\n\r\n@Component({\n selector: 'app-confirm-dialog',\n imports: [ButtonComponent],\n templateUrl: './confirm-dialog.component.html',\n styleUrl: './confirm-dialog.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class ConfirmDialogComponent implements AfterViewInit {\r\n readonly ref = inject(DialogRef<boolean, ConfirmDialogComponent>);\r\n readonly data = inject<ConfirmDialogData>(DIALOG_DATA);\r\n readonly titleId = `app-confirm-dlg-title-${++ConfirmDialogComponent.seq}`;\r\n readonly descId = `app-confirm-dlg-desc-${ConfirmDialogComponent.seq}`;\r\n\r\n @ViewChild('cancelBtn') private cancelBtn?: ButtonComponent;\r\n\r\n private static seq = 0;\r\n\r\n ngAfterViewInit(): void {\r\n queueMicrotask(() => {\r\n this.cancelBtn?.focusNative({ preventScroll: true });\r\n });\r\n }\r\n\r\n onConfirm(): void {\r\n this.ref.close(true);\r\n }\r\n\r\n onCancel(): void {\r\n this.ref.close(false);\r\n }\r\n}\r\n","<div\r\n class=\"confirm-dialog\"\r\n role=\"alertdialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"titleId\"\r\n [attr.aria-describedby]=\"descId\"\r\n>\r\n <header class=\"confirm-dialog__header\">\r\n <h2 class=\"confirm-dialog__title\" [id]=\"titleId\">{{ data.title }}</h2>\r\n </header>\r\n\r\n <div class=\"confirm-dialog__body\">\r\n <p class=\"confirm-dialog__message\" [id]=\"descId\">{{ data.message }}</p>\r\n </div>\r\n\r\n <footer class=\"confirm-dialog__footer\">\r\n <app-button\r\n #cancelBtn\r\n type=\"button\"\r\n variant=\"secondary\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onCancel()\"\r\n >\r\n {{ data.cancelLabel ?? 'Cancelar' }}\r\n </app-button>\r\n <app-button\r\n type=\"button\"\r\n [variant]=\"data.variant === 'danger' ? 'danger' : 'primary'\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onConfirm()\"\r\n >\r\n {{ data.confirmLabel ?? 'Confirmar' }}\r\n </app-button>\r\n </footer>\r\n</div>\r\n","import type { OverlayRef, ScrollStrategy } from '@angular/cdk/overlay';\r\nimport {\r\n lockPageScrollAppDialog,\r\n unlockPageScrollAppDialog,\r\n type AppDialogScrollLockSnapshot,\r\n} from '../../_utils/scroll/body-scroll-lock.util';\r\n\r\n/**\r\n * Substituto do `BlockScrollStrategy` do CDK para modais Structra (Dialog de confirmação,\r\n * loading, etc.): activa {@link lockPageScrollAppDialog} em vez de `cdk-global-scrollblock`\r\n * com `html` deslocado — alinha o backdrop do overlay ao viewport real.\r\n */\r\nexport class AppLibLightBlockScrollStrategy implements ScrollStrategy {\r\n private snapshot: AppDialogScrollLockSnapshot | null = null;\r\n\r\n attach(_overlayRef: OverlayRef): void {}\r\n\r\n enable(): void {\r\n this.snapshot = lockPageScrollAppDialog();\r\n }\r\n\r\n disable(): void {\r\n if (this.snapshot !== null) {\r\n unlockPageScrollAppDialog(this.snapshot);\r\n this.snapshot = null;\r\n }\r\n }\r\n}\r\n","import { AppThemeService } from '../../theme';\r\n\r\n/** Classes aplicadas ao painel CDK Dialog + tema da app. */\r\nexport function libDialogPanelClasses(\r\n theme: AppThemeService,\r\n extra: string | string[] = [],\r\n): string[] {\r\n const rest = Array.isArray(extra) ? extra : [extra];\r\n return ['app-lib-dialog-panel', ...theme.themeClassList(), ...rest];\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { Dialog } from '@angular/cdk/dialog';\r\nimport { Observable, firstValueFrom } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { AppThemeService } from '../../theme';\r\nimport { AppLibLightBlockScrollStrategy } from '../_utils/app-lib-light-block-scroll-strategy';\r\nimport { libDialogPanelClasses } from '../_utils/lib-dialog-panel-classes';\r\nimport { ConfirmDialogComponent } from './confirm-dialog.component';\r\nimport type { ConfirmDialogData } from './confirm-dialog-data.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ConfirmDialogService {\r\n private readonly dialog = inject(Dialog);\r\n private readonly theme = inject(AppThemeService);\r\n\r\n /**\r\n * Abre o diálogo de confirmação (CDK Dialog + `ConfirmDialogComponent`).\r\n * Emite `true` se confirmar, `false` se cancelar, `undefined` se fechar sem resultado (Esc/backdrop, quando permitido).\r\n * Por defeito permite dispensar com Esc e clique fora; use `data.blockOverlayDismiss` para exigir só botões.\r\n */\r\n open(data: ConfirmDialogData): Observable<boolean | undefined> {\r\n return this.dialog\r\n .open(ConfirmDialogComponent, {\r\n data,\r\n width: 'min(26rem, 92vw)',\r\n maxWidth: '92vw',\r\n disableClose: data.blockOverlayDismiss === true,\r\n hasBackdrop: true,\r\n backdropClass: 'app-lib-dialog-backdrop',\r\n panelClass: libDialogPanelClasses(this.theme),\r\n autoFocus: false,\r\n ariaModal: true,\r\n scrollStrategy: new AppLibLightBlockScrollStrategy(),\r\n })\r\n .closed.pipe(map((r) => r as boolean | undefined));\r\n }\r\n\r\n /** Confirmação como Promise (adequado a `async`/`await`). */\r\n confirm(data: ConfirmDialogData): Promise<boolean> {\r\n return firstValueFrom(\r\n this.open(data).pipe(map((r) => r === true)),\r\n );\r\n }\r\n}\r\n","import { Injectable, computed, signal } from '@angular/core';\r\nimport type { ToastInstance, ToastShowOptions, ToastType } from './toast.models';\r\n\r\nconst DEFAULT_DURATION_MS = 5000;\r\n\r\nlet toastIdSeq = 0;\r\n\r\nfunction nextId(): string {\r\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\r\n return crypto.randomUUID();\r\n }\r\n return `toast-${++toastIdSeq}`;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class ToastService {\r\n private readonly items = signal<ToastInstance[]>([]);\r\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\r\n private readonly actionHandlers = new Map<string, () => void>();\r\n\r\n /** Lista actual (mais recente primeiro). */\r\n readonly toasts = computed(() => this.items());\r\n\r\n /** Mostra um toast; devolve o id (para `dismiss` manual). */\r\n show(options: ToastShowOptions): string {\r\n const id = nextId();\r\n const type: ToastType = options.type ?? 'info';\r\n const durationMs =\r\n options.durationMs === undefined ? DEFAULT_DURATION_MS : options.durationMs;\r\n\r\n const row: ToastInstance = {\r\n id,\r\n message: options.message,\r\n title: options.title?.trim() || undefined,\r\n type,\r\n durationMs,\r\n actionLabel: options.actionLabel?.trim() || undefined,\r\n position: options.position ?? 'top',\r\n };\r\n\r\n this.items.update((list) => [row, ...list]);\r\n\r\n if (options.onAction && row.actionLabel) {\r\n this.actionHandlers.set(id, options.onAction);\r\n }\r\n\r\n this.clearTimer(id);\r\n if (durationMs > 0) {\r\n this.timers.set(\r\n id,\r\n setTimeout(() => this.dismiss(id), durationMs),\r\n );\r\n }\r\n\r\n return id;\r\n }\r\n\r\n dismiss(id: string): void {\r\n this.clearTimer(id);\r\n this.actionHandlers.delete(id);\r\n this.items.update((list) => list.filter((t) => t.id !== id));\r\n }\r\n\r\n clear(): void {\r\n for (const id of this.timers.keys()) {\r\n this.clearTimer(id);\r\n }\r\n this.actionHandlers.clear();\r\n this.items.set([]);\r\n }\r\n\r\n runAction(id: string): void {\r\n const fn = this.actionHandlers.get(id);\r\n if (fn) {\r\n fn();\r\n }\r\n this.dismiss(id);\r\n }\r\n\r\n private clearTimer(id: string): void {\r\n const t = this.timers.get(id);\r\n if (t != null) {\r\n clearTimeout(t);\r\n }\r\n this.timers.delete(id);\r\n }\r\n}\r\n","import { NgClass } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n inject,\r\n type Signal,\r\n} from '@angular/core';\r\nimport type { ToastInstance } from './toast.models';\r\nimport {\r\n animate,\r\n style,\r\n transition,\r\n trigger,\r\n} from '@angular/animations';\r\nimport { AppThemeService } from '../../theme';\r\nimport { ToastService } from './toast.service';\r\n\r\n@Component({\r\n selector: 'app-toast-host',\r\n imports: [NgClass],\r\n templateUrl: './toast-host.component.html',\r\n styleUrl: './toast-host.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n animations: [\r\n trigger('toastAnimTop', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateX(110%)' }),\r\n animate('240ms cubic-bezier(0.22, 1, 0.36, 1)', style({ opacity: 1, transform: 'translateX(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('180ms ease-in', style({ opacity: 0, transform: 'translateX(120%)' })),\r\n ]),\r\n ]),\r\n trigger('toastAnimBottom', [\r\n transition(':enter', [\r\n style({ opacity: 0, transform: 'translateY(110%)' }),\r\n animate('240ms cubic-bezier(0.22, 1, 0.36, 1)', style({ opacity: 1, transform: 'translateY(0)' })),\r\n ]),\r\n transition(':leave', [\r\n animate('180ms ease-in', style({ opacity: 0, transform: 'translateY(120%)' })),\r\n ]),\r\n ]),\r\n ]\r\n})\r\nexport class ToastHostComponent {\r\n readonly toastService = inject(ToastService);\r\n readonly theme = inject(AppThemeService);\r\n\r\n readonly topToasts: Signal<ToastInstance[]> = computed(() =>\r\n this.toastService.toasts().filter((t) => t.position === 'top'),\r\n );\r\n\r\n readonly bottomToasts: Signal<ToastInstance[]> = computed(() =>\r\n this.toastService.toasts().filter((t) => t.position === 'bottom'),\r\n );\r\n\r\n dismiss(id: string): void {\r\n this.toastService.dismiss(id);\r\n }\r\n\r\n action(id: string): void {\r\n this.toastService.runAction(id);\r\n }\r\n}\r\n","@if (topToasts().length > 0) {\r\n <div\r\n class=\"toast-host toast-host--top app-library-theme\"\r\n [ngClass]=\"theme.getTheme()\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n >\r\n @for (t of topToasts(); track t.id) {\r\n <div\r\n [ngClass]=\"['toast-host__item', 'toast-host__item--' + t.type]\"\r\n @toastAnimTop\r\n role=\"status\"\r\n >\r\n <div class=\"toast-host__body\">\r\n @if (t.title) {\r\n <p class=\"toast-host__title\">{{ t.title }}</p>\r\n }\r\n <p class=\"toast-host__message\">{{ t.message }}</p>\r\n @if (t.actionLabel) {\r\n <button type=\"button\" class=\"toast-host__action\" (click)=\"action(t.id)\">\r\n {{ t.actionLabel }}\r\n </button>\r\n }\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"toast-host__close\"\r\n [attr.aria-label]=\"'Fechar notificação'\"\r\n (click)=\"dismiss(t.id)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n@if (bottomToasts().length > 0) {\r\n <div\r\n class=\"toast-host toast-host--bottom app-library-theme\"\r\n [ngClass]=\"theme.getTheme()\"\r\n aria-live=\"polite\"\r\n aria-relevant=\"additions text\"\r\n >\r\n @for (t of bottomToasts(); track t.id) {\r\n <div\r\n [ngClass]=\"['toast-host__item', 'toast-host__item--' + t.type]\"\r\n @toastAnimBottom\r\n role=\"status\"\r\n >\r\n <div class=\"toast-host__body\">\r\n @if (t.title) {\r\n <p class=\"toast-host__title\">{{ t.title }}</p>\r\n }\r\n <p class=\"toast-host__message\">{{ t.message }}</p>\r\n @if (t.actionLabel) {\r\n <button type=\"button\" class=\"toast-host__action\" (click)=\"action(t.id)\">\r\n {{ t.actionLabel }}\r\n </button>\r\n }\r\n </div>\r\n <button\r\n type=\"button\"\r\n class=\"toast-host__close\"\r\n [attr.aria-label]=\"'Fechar notificação'\"\r\n (click)=\"dismiss(t.id)\"\r\n >\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n}\r\n","import { ChangeDetectionStrategy, Component, inject } from '@angular/core';\r\nimport { DIALOG_DATA } from '@angular/cdk/dialog';\r\nimport type { LoadingDialogData } from './loading-dialog-data.model';\r\n\r\nconst DEFAULT_MESSAGE = 'A carregar…';\r\n\r\n@Component({\r\n selector: 'app-loading-dialog',\r\n standalone: true,\r\n templateUrl: './loading-dialog.component.html',\r\n styleUrl: './loading-dialog.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class LoadingDialogComponent {\r\n private readonly data = inject<LoadingDialogData>(DIALOG_DATA);\r\n\r\n readonly titleId = `app-loading-dlg-${++LoadingDialogComponent.seq}`;\r\n\r\n readonly message =\r\n this.data?.message?.trim() || DEFAULT_MESSAGE;\r\n\r\n private static seq = 0;\r\n}\r\n","<div\r\n class=\"loading-dialog\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"titleId\"\r\n [attr.aria-busy]=\"true\"\r\n>\r\n <div class=\"loading-dialog__content\">\r\n <div class=\"loading-dialog__spinner\" aria-hidden=\"true\"></div>\r\n <p class=\"loading-dialog__message\" [id]=\"titleId\">{{ message }}</p>\r\n </div>\r\n</div>\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { Dialog, DialogRef } from '@angular/cdk/dialog';\r\nimport { AppThemeService } from '../../theme';\r\nimport { AppLibLightBlockScrollStrategy } from '../_utils/app-lib-light-block-scroll-strategy';\r\nimport { libDialogPanelClasses } from '../_utils/lib-dialog-panel-classes';\r\nimport { LoadingDialogComponent } from './loading-dialog.component';\r\nimport type { LoadingDialogData } from './loading-dialog-data.model';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class LoadingDialogService {\r\n private readonly dialog = inject(Dialog);\r\n private readonly theme = inject(AppThemeService);\r\n\r\n /**\r\n * Abre o diálogo de carregamento.\r\n * `disableClose: true` — não fecha com Escape nem clique fora; use `ref.close()` quando terminar.\r\n */\r\n open(data?: LoadingDialogData): DialogRef<void, LoadingDialogComponent> {\r\n return this.dialog.open(LoadingDialogComponent, {\r\n data: data ?? {},\r\n width: 'min(22rem, 90vw)',\r\n maxWidth: '92vw',\r\n disableClose: true,\r\n hasBackdrop: true,\r\n backdropClass: 'app-lib-dialog-backdrop',\r\n panelClass: libDialogPanelClasses(this.theme),\r\n autoFocus: false,\r\n ariaModal: true,\r\n scrollStrategy: new AppLibLightBlockScrollStrategy(),\r\n });\r\n }\r\n}\r\n","/**\r\n * Valida se um arquivo corresponde a um atributo `accept` (HTML) simples.\r\n * Ex.: `image/*`, `image/png`, `.pdf`, `image/*,.pdf`\r\n */\r\nexport function fileMatchesAccept(file: File, accept: string | undefined | null): boolean {\r\n if (accept == null || accept.trim() === '') {\r\n return true;\r\n }\r\n const tokens = accept\r\n .split(',')\r\n .map((s) => s.trim())\r\n .filter((s) => s.length > 0);\r\n for (const t of tokens) {\r\n if (t.startsWith('.')) {\r\n const end = t.toLowerCase();\r\n if (file.name.toLowerCase().endsWith(end)) {\r\n return true;\r\n }\r\n continue;\r\n }\r\n if (t.includes('/')) {\r\n if (t.endsWith('/*')) {\r\n const prefix = t.slice(0, -1);\r\n if (file.type && file.type.toLowerCase().startsWith(prefix.toLowerCase())) {\r\n return true;\r\n }\r\n } else if (file.type && file.type.toLowerCase() === t.toLowerCase()) {\r\n return true;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Diz se o ficheiro deve ser tratado como imagem (miniatura no upload).\r\n * Usa `type` e, se vazio, a extensão (útil com MIME vazio nalguns browsers / SO).\r\n */\r\nexport function fileIsLikelyImage(file: File): boolean {\r\n const t = file.type?.toLowerCase() ?? '';\r\n if (t.length > 0) {\r\n return t.startsWith('image/');\r\n }\r\n return /\\.(jpe?g|pjpeg|png|gif|webp|bmp|svg|avif|heic|heif)$/i.test(\r\n file.name,\r\n );\r\n}\r\n\r\n/** Indica o tipo de pré-visualização possível no painel a partir de um `File` local. */\r\nexport type FilePreviewKind = 'image' | 'pdf' | 'unsupported';\r\n\r\nexport const FILE_PREVIEW_UNAVAILABLE_MESSAGE =\r\n 'Não foi possível abrir a pré-visualização.';\r\n\r\n/**\r\n * Fragmento URL para o leitor de PDF do browser em `<iframe>` (p.ex. blob:).\r\n * Esconde o painel lateral (miniaturas), mantém a barra de cima e ajusta a área principal à largura\r\n * (parâmetros de abertura alinhados ao leitor do Chromium; outros browsers podem interpretar de forma aproximada).\r\n */\r\nexport const PDF_IFRAME_VIEWER_HASH = 'navpanes=0&toolbar=1&view=FitH';\r\n\r\n/**\r\n * Anexa ao fim de uma URL de recurso PDF o fragmento que pedia pré-visualização só com a área principal\r\n * (sem barra lateral). Se já existir `#`, devolve a URL inalterada.\r\n */\r\nexport function appendPdfIframeViewerParams(resourceUrl: string): string {\r\n if (resourceUrl.includes('#')) {\r\n return resourceUrl;\r\n }\r\n return `${resourceUrl}#${PDF_IFRAME_VIEWER_HASH}`;\r\n}\r\n\r\nexport function getFilePreviewKind(file: File): FilePreviewKind {\r\n if (fileIsLikelyImage(file)) {\r\n return 'image';\r\n }\r\n const t = file.type.toLowerCase();\r\n const n = file.name.toLowerCase();\r\n if (t === 'application/pdf' || t === 'application/x-pdf' || n.endsWith('.pdf')) {\r\n return 'pdf';\r\n }\r\n return 'unsupported';\r\n}\r\n\r\nexport function formatFileSizeBytes(bytes: number): string {\r\n if (!Number.isFinite(bytes) || bytes < 0) {\r\n return '0 B';\r\n }\r\n if (bytes < 1024) {\r\n return `${bytes} B`;\r\n }\r\n if (bytes < 1024 * 1024) {\r\n return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;\r\n }\r\n return `${(bytes / (1024 * 1024)).toFixed(2)} MB`;\r\n}\r\n\r\ntype AcceptDisplayCategory = 'imagens' | 'pdf' | 'word' | 'excel' | 'texto' | 'zip';\r\n\r\nconst ACCEPT_DISPLAY_ORDER: readonly AcceptDisplayCategory[] = [\r\n 'imagens',\r\n 'pdf',\r\n 'word',\r\n 'excel',\r\n 'texto',\r\n 'zip',\r\n];\r\n\r\nconst ACCEPT_LABEL: Readonly<Record<AcceptDisplayCategory, string>> = {\r\n imagens: 'Imagens',\r\n pdf: 'PDF',\r\n word: 'Word',\r\n excel: 'Excel',\r\n texto: 'Texto',\r\n zip: 'ZIP',\r\n};\r\n\r\nfunction acceptTokenToCategory(token: string): AcceptDisplayCategory | null {\r\n const t = token.trim().toLowerCase();\r\n if (t === 'image/*' || t.startsWith('image/')) {\r\n return 'imagens';\r\n }\r\n if (t === 'application/pdf' || t === '.pdf') {\r\n return 'pdf';\r\n }\r\n if (\r\n t === '.doc' ||\r\n t === '.docx' ||\r\n t === 'application/msword' ||\r\n (t.includes('wordprocessingml') && t.includes('document'))\r\n ) {\r\n return 'word';\r\n }\r\n if (\r\n t === '.xls' ||\r\n t === '.xlsx' ||\r\n t === 'application/vnd.ms-excel' ||\r\n (t.includes('spreadsheetml') && t.includes('sheet'))\r\n ) {\r\n return 'excel';\r\n }\r\n if (t === '.txt' || t === 'text/plain') {\r\n return 'texto';\r\n }\r\n if (\r\n t === '.zip' ||\r\n t === 'application/zip' ||\r\n t === 'application/x-zip-compressed'\r\n ) {\r\n return 'zip';\r\n }\r\n return null;\r\n}\r\n\r\nfunction acceptTokenFallbackLabel(token: string): string {\r\n const s = token.trim();\r\n if (s.length === 0) {\r\n return '';\r\n }\r\n if (s.startsWith('.')) {\r\n return s.length <= 8 ? s : `${s.slice(0, 6)}…`;\r\n }\r\n if (s.endsWith('/*')) {\r\n const prefix = s.slice(0, -2).toLowerCase();\r\n if (prefix === 'audio') {\r\n return 'Áudio';\r\n }\r\n if (prefix === 'video') {\r\n return 'Vídeo';\r\n }\r\n }\r\n return s.length > 36 ? `${s.slice(0, 33)}…` : s;\r\n}\r\n\r\n/**\r\n * Converte o valor do atributo `accept` (vírgulas, MIME, extensões) numa linha legível\r\n * (ex.: «Imagens · PDF · Word»), usada no rótulo de formatos do drop zone.\r\n */\r\nexport function formatAcceptForDisplay(accept: string | null | undefined): string {\r\n if (accept == null || accept.trim() === '') {\r\n return '';\r\n }\r\n const seen = new Set<AcceptDisplayCategory>();\r\n const extra: string[] = [];\r\n for (const token of accept.split(',').map((p) => p.trim()).filter((p) => p.length > 0)) {\r\n const category = acceptTokenToCategory(token);\r\n if (category) {\r\n seen.add(category);\r\n } else {\r\n const label = acceptTokenFallbackLabel(token);\r\n if (label && !extra.includes(label)) {\r\n extra.push(label);\r\n }\r\n }\r\n }\r\n const parts: string[] = [];\r\n for (const k of ACCEPT_DISPLAY_ORDER) {\r\n if (seen.has(k)) {\r\n parts.push(ACCEPT_LABEL[k]);\r\n }\r\n }\r\n for (const e of extra.sort((a, b) => a.localeCompare(b, 'pt'))) {\r\n parts.push(e);\r\n }\r\n if (parts.length === 0) {\r\n const t = accept.trim();\r\n return t.length > 80 ? `${t.slice(0, 77)}…` : t;\r\n }\r\n return parts.join(' · ');\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n numberAttribute,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n ViewChild,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { SkeletonFieldShellComponent } from '../../../loading/skeleton-loading';\r\nimport { ConfirmDialogService } from '../../../dialogs';\r\nimport { createAutoId } from '../../../shared/id/auto-id';\r\nimport {\r\n fileIsLikelyImage,\r\n fileMatchesAccept,\r\n formatAcceptForDisplay,\r\n formatFileSizeBytes,\r\n} from '../_utils/file-accept.util';\r\n\r\n@Component({\r\n selector: 'app-file-upload-field',\r\n standalone: true,\r\n imports: [SkeletonFieldShellComponent],\r\n templateUrl: './file-upload-field.component.html',\r\n styleUrl: './file-upload-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FileUploadFieldComponent implements AfterViewInit, OnChanges, OnDestroy {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly confirmDialog = inject(ConfirmDialogService);\r\n\r\n @Input() label? = '';\r\n @Input() id = '';\r\n @Input() hint? = '';\r\n @Input() accept? = '';\r\n /** Se definido, mostra-se no drop zone em vez do texto formatado a partir de `accept`. */\r\n @Input() acceptLabel? = '';\r\n @Input({ transform: numberAttribute }) maxSizeMb = 0;\r\n /**\r\n * Limite de arquivos no total (só aplica com `multiple`).\r\n * `0` = sem limite; ao exceder, o excedente é rejeitado e emite `fileRejected`.\r\n */\r\n @Input({ transform: numberAttribute }) maxFiles = 0;\r\n @Input({ transform: booleanAttribute }) disabled = false;\r\n /** Skeleton na zona de drop (sem interação até voltar a `false`). */\r\n @Input({ transform: booleanAttribute }) loading = false;\r\n /** Foca o `<input type=\"file\">` nativo quando a zona está visível (não em `loading`). */\r\n @Input({ transform: booleanAttribute }) autofocus = false;\r\n @Input({ transform: booleanAttribute }) multiple = false;\r\n @Input() value: File | File[] | null = null;\r\n /**\r\n * `false` desativa o `pointer` e a emissão de `fileItemClick` na linha, mesmo com o\r\n * evento ligado (ex. lista só com um ficheiro). Omissão = `true`.\r\n */\r\n @Input({ transform: booleanAttribute }) fileItemRowClickable = true;\r\n /**\r\n * Botão «Download» em cada linha. Omissão = `true`. Use `false` para esconder (ex.: anexos no form exemplo).\r\n */\r\n @Input() showFileDownload: boolean = true;\r\n\r\n @Output() readonly valueChange = new EventEmitter<File | File[] | null>();\r\n @Output() readonly fileRejected = new EventEmitter<{ file: File; reason: string }>();\r\n /**\r\n * Clique na linha da lista (ficheiro). Só aplica `cursor: pointer` com subscrição\r\n * a este evento e `fileItemRowClickable !== false`.\r\n */\r\n @Output() readonly fileItemClick = new EventEmitter<File>();\r\n\r\n @ViewChild('fileInput', { read: ElementRef })\r\n private fileInputRef?: ElementRef<HTMLInputElement>;\r\n\r\n private readonly autoId = createAutoId('str-file-upload-field');\r\n\r\n get fieldId(): string {\r\n const manual = this.id.trim();\r\n return manual.length > 0 ? manual : this.autoId;\r\n }\r\n\r\n get loadingAriaLabel(): string {\r\n const t = (this.label ?? '').trim();\r\n return t.length > 0 ? `A carregar ${t}` : 'A carregar área de arquivos';\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (!this.autofocus || this.disabled || this.loading) {\r\n return;\r\n }\r\n queueMicrotask(() => {\r\n this.fileInputRef?.nativeElement?.focus({ preventScroll: false });\r\n });\r\n }\r\n\r\n @HostBinding('attr.data-control-id')\r\n get hostDataControlId(): string {\r\n return this.fieldId;\r\n }\r\n isDragging = false;\r\n hasHover = false;\r\n private internalError: string | null = null;\r\n /** `URL.createObjectURL` por `File` ativo; revogado ao trocar valor ou destruir. */\r\n private readonly filePreviewObjectUrls = new Map<File, string>();\r\n\r\n ngOnChanges(c: SimpleChanges): void {\r\n if (c['value']) {\r\n this.internalError = null;\r\n this.syncFilePreviewObjectUrls();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.releaseAllFilePreviewObjectUrls();\r\n }\r\n\r\n get errorMessage(): string | null {\r\n return this.internalError;\r\n }\r\n\r\n /** Texto de formatos na zona: `acceptLabel` (opcional) ou `formatAcceptForDisplay(accept)`. */\r\n get acceptDisplayText(): string {\r\n const a = this.accept?.trim() ?? '';\r\n if (a.length === 0) {\r\n return '';\r\n }\r\n const over = this.acceptLabel?.trim();\r\n if (over && over.length > 0) {\r\n return over;\r\n }\r\n return formatAcceptForDisplay(this.accept!);\r\n }\r\n\r\n /**\r\n * Linha clicável para o painel externo (ex. pré-visualização) quando a app liga\r\n * `(fileItemClick)`; desligado, sem apontador nem emissão.\r\n */\r\n get fileItemClickActive(): boolean {\r\n if (this.disabled || !this.fileItemRowClickable) {\r\n return false;\r\n }\r\n return this.hasFileItemClickListeners;\r\n }\r\n\r\n private get hasFileItemClickListeners(): boolean {\r\n const s = this.fileItemClick as unknown as { observed?: boolean; observers?: unknown[] };\r\n if (s.observed === true) {\r\n return true;\r\n }\r\n if (s.observed === false) {\r\n return false;\r\n }\r\n return (s.observers?.length ?? 0) > 0;\r\n }\r\n\r\n onFileItemRowClick(event: MouseEvent, file: File): void {\r\n if (!this.hasFileItemClickListeners || this.disabled || !this.fileItemRowClickable) {\r\n return;\r\n }\r\n const t = event.target as HTMLElement | null;\r\n if (t && t.closest('button')) {\r\n return;\r\n }\r\n this.fileItemClick.emit(file);\r\n }\r\n\r\n /** `src` da miniatura, ou `null` se não for imagem / ainda sem URL. */\r\n imageListPreviewUrl(file: File): string | null {\r\n if (!fileIsLikelyImage(file)) {\r\n return null;\r\n }\r\n return this.filePreviewObjectUrls.get(file) ?? null;\r\n }\r\n\r\n get filesList(): { file: File; name: string; sizeLabel: string; typeLabel: string }[] {\r\n if (this.value == null) {\r\n return [];\r\n }\r\n if (this.multiple) {\r\n const arr = Array.isArray(this.value) ? this.value : [this.value as File];\r\n return arr.map((f) => ({\r\n file: f,\r\n name: f.name,\r\n sizeLabel: formatFileSizeBytes(f.size),\r\n typeLabel: f.type && f.type.length > 0 ? f.type : '—',\r\n }));\r\n }\r\n if (this.value instanceof File) {\r\n const f = this.value;\r\n return [\r\n {\r\n file: f,\r\n name: f.name,\r\n sizeLabel: formatFileSizeBytes(f.size),\r\n typeLabel: f.type && f.type.length > 0 ? f.type : '—',\r\n },\r\n ];\r\n }\r\n return [];\r\n }\r\n\r\n get hasValue(): boolean {\r\n if (this.value == null) {\r\n return false;\r\n }\r\n if (this.multiple) {\r\n return (Array.isArray(this.value) ? this.value : []).length > 0;\r\n }\r\n return this.value instanceof File;\r\n }\r\n\r\n /**\r\n * «Limpar tudo» só com mais do que um ficheiro; com um só, basta «Remover» na linha.\r\n */\r\n get showClearAllButton(): boolean {\r\n return this.filesList.length > 1;\r\n }\r\n\r\n private get selectedFileCountForClearConfirm(): number {\r\n if (this.value == null) {\r\n return 0;\r\n }\r\n if (this.multiple) {\r\n if (Array.isArray(this.value)) {\r\n return this.value.length;\r\n }\r\n return this.value instanceof File ? 1 : 0;\r\n }\r\n return this.value instanceof File ? 1 : 0;\r\n }\r\n\r\n private resetInputValue(): void {\r\n const el = this.fileInputRef?.nativeElement;\r\n if (el) {\r\n el.value = '';\r\n }\r\n }\r\n\r\n openSelector(ev?: Event): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n ev?.stopPropagation();\r\n this.fileInputRef?.nativeElement?.click();\r\n }\r\n\r\n onZoneEnter(): void {\r\n this.hasHover = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onZoneLeave(): void {\r\n this.hasHover = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onZoneKeydown(ev: KeyboardEvent): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.openSelector();\r\n }\r\n }\r\n\r\n onDragOver(ev: DragEvent): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.isDragging = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDragLeave(ev: DragEvent): void {\r\n ev.preventDefault();\r\n this.isDragging = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDrop(ev: DragEvent): void {\r\n if (this.disabled || this.loading) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.isDragging = false;\r\n const list = ev.dataTransfer?.files;\r\n if (list && list.length > 0) {\r\n this.processPickedArray(Array.from(list));\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onNativeChange(ev: Event): void {\r\n const el = ev.target as HTMLInputElement;\r\n if (el.files && el.files.length > 0) {\r\n this.processPickedArray(Array.from(el.files));\r\n } else {\r\n this.clearInternal();\r\n }\r\n this.resetInputValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onRemoveFile(index: number, ev: Event): void {\r\n ev.stopPropagation();\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.internalError = null;\r\n if (this.multiple) {\r\n const list = (Array.isArray(this.value) ? this.value : []).filter(\r\n (_, i) => i !== index,\r\n );\r\n this.valueChange.emit(list.length > 0 ? list : null);\r\n } else {\r\n this.valueChange.emit(null);\r\n }\r\n this.resetInputValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onDownloadFile(file: File, event: Event): void {\r\n event.stopPropagation();\r\n if (this.disabled) {\r\n return;\r\n }\r\n const url = URL.createObjectURL(file);\r\n const a = document.createElement('a');\r\n a.href = url;\r\n a.download = file.name;\r\n a.rel = 'noopener';\r\n a.setAttribute('aria-hidden', 'true');\r\n a.style.position = 'fixed';\r\n a.style.left = '-9999px';\r\n document.body.appendChild(a);\r\n a.click();\r\n document.body.removeChild(a);\r\n window.setTimeout(() => {\r\n URL.revokeObjectURL(url);\r\n }, 0);\r\n }\r\n\r\n async clearAll(ev: Event): Promise<void> {\r\n ev.stopPropagation();\r\n if (this.disabled) {\r\n return;\r\n }\r\n const n = this.selectedFileCountForClearConfirm;\r\n const message =\r\n n === 1\r\n ? 'Deseja remover o arquivo selecionado?'\r\n : `Deseja remover os ${String(n)} arquivos selecionados?`;\r\n const ok = await this.confirmDialog.confirm({\r\n title: 'Limpar tudo',\r\n message,\r\n confirmLabel: 'Sim, limpar',\r\n cancelLabel: 'Cancelar',\r\n variant: 'danger',\r\n });\r\n if (!ok) {\r\n return;\r\n }\r\n this.clearInternal();\r\n this.resetInputValue();\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private clearInternal(): void {\r\n this.internalError = null;\r\n this.valueChange.emit(null);\r\n }\r\n\r\n private msgAfterRejections(fileCountReject: boolean): string {\r\n return fileCountReject\r\n ? `Máximo de ${String(this.maxFiles)} arquivos.`\r\n : 'Arquivo(s) rejeitado(s) — verifique o tipo e o tamanho.';\r\n }\r\n\r\n private processPickedArray(files: File[]): void {\r\n this.internalError = null;\r\n const accept = this.accept?.trim() ? this.accept : undefined;\r\n const maxMb = this.maxSizeMb > 0 ? this.maxSizeMb : 0;\r\n const take = this.multiple ? files : [files[0]!].filter(Boolean);\r\n let anyRejected = false;\r\n let fileCountReject = false;\r\n const accepted: File[] = [];\r\n for (const file of take) {\r\n if (accept && !fileMatchesAccept(file, accept)) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: 'O tipo do arquivo não corresponde ao `accept` definido.',\r\n });\r\n anyRejected = true;\r\n continue;\r\n }\r\n if (maxMb > 0 && file.size > maxMb * 1024 * 1024) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: `Arquivo acima do tamanho máximo (${String(maxMb)} MB).`,\r\n });\r\n anyRejected = true;\r\n continue;\r\n }\r\n accepted.push(file);\r\n }\r\n\r\n if (this.multiple && this.maxFiles > 0) {\r\n const previousList = Array.isArray(this.value)\r\n ? this.value\r\n : this.value instanceof File\r\n ? [this.value]\r\n : [];\r\n const room = this.maxFiles - previousList.length;\r\n if (room <= 0) {\r\n for (const file of accepted) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: `Máximo de ${String(this.maxFiles)} arquivos.`,\r\n });\r\n }\r\n if (accepted.length > 0) {\r\n anyRejected = true;\r\n fileCountReject = true;\r\n }\r\n accepted.length = 0;\r\n } else if (accepted.length > room) {\r\n const overflow = accepted.splice(room);\r\n for (const file of overflow) {\r\n this.fileRejected.emit({\r\n file,\r\n reason: `Máximo de ${String(this.maxFiles)} arquivos.`,\r\n });\r\n }\r\n anyRejected = true;\r\n fileCountReject = true;\r\n }\r\n }\r\n\r\n if (accepted.length === 0) {\r\n if (anyRejected) {\r\n this.internalError = this.msgAfterRejections(fileCountReject);\r\n }\r\n return;\r\n }\r\n this.internalError = anyRejected ? this.msgAfterRejections(fileCountReject) : null;\r\n if (this.multiple) {\r\n const previous = Array.isArray(this.value)\r\n ? this.value\r\n : this.value instanceof File\r\n ? [this.value]\r\n : [];\r\n this.valueChange.emit([...previous, ...accepted]);\r\n } else {\r\n this.valueChange.emit(accepted[0]!);\r\n }\r\n }\r\n\r\n private allFilesInValue(): File[] {\r\n if (this.value == null) {\r\n return [];\r\n }\r\n if (this.multiple) {\r\n if (Array.isArray(this.value)) {\r\n return this.value;\r\n }\r\n return this.value instanceof File ? [this.value] : [];\r\n }\r\n return this.value instanceof File ? [this.value] : [];\r\n }\r\n\r\n private syncFilePreviewObjectUrls(): void {\r\n const files = this.allFilesInValue();\r\n for (const [f, url] of this.filePreviewObjectUrls) {\r\n if (!files.includes(f)) {\r\n URL.revokeObjectURL(url);\r\n this.filePreviewObjectUrls.delete(f);\r\n }\r\n }\r\n for (const file of files) {\r\n if (fileIsLikelyImage(file) && !this.filePreviewObjectUrls.has(file)) {\r\n this.filePreviewObjectUrls.set(file, URL.createObjectURL(file));\r\n }\r\n }\r\n }\r\n\r\n private releaseAllFilePreviewObjectUrls(): void {\r\n for (const url of this.filePreviewObjectUrls.values()) {\r\n URL.revokeObjectURL(url);\r\n }\r\n this.filePreviewObjectUrls.clear();\r\n }\r\n}\r\n","<div\r\n class=\"file-upload-field\"\r\n [class.file-upload-field--disabled]=\"disabled\"\r\n [class.file-upload-field--loading]=\"loading\"\r\n [class.file-upload-field--error]=\"errorMessage\"\r\n>\r\n @if (label && label.length > 0) {\r\n <label class=\"file-upload-field__label\" [attr.for]=\"fieldId\">\r\n {{ label }}\r\n </label>\r\n }\r\n @if (loading) {\r\n <div\r\n class=\"file-upload-field__zone file-upload-field__zone--loading\"\r\n aria-busy=\"true\"\r\n role=\"status\"\r\n [attr.aria-label]=\"loadingAriaLabel\"\r\n >\r\n <app-skeleton-field-shell [showLeadingIcon]=\"true\" />\r\n </div>\r\n } @else {\r\n <div\r\n class=\"file-upload-field__zone\"\r\n (click)=\"openSelector($event)\"\r\n (dragover)=\"onDragOver($event)\"\r\n (dragleave)=\"onDragLeave($event)\"\r\n (drop)=\"onDrop($event)\"\r\n (mouseenter)=\"onZoneEnter()\"\r\n (mouseleave)=\"onZoneLeave()\"\r\n [class.file-upload-field__zone--dragging]=\"isDragging\"\r\n [class.file-upload-field__zone--hover]=\"hasHover && !disabled\"\r\n [attr.aria-disabled]=\"disabled ? 'true' : null\"\r\n role=\"button\"\r\n [attr.tabindex]=\"disabled ? -1 : 0\"\r\n (keydown)=\"onZoneKeydown($event)\"\r\n >\r\n <input\r\n #fileInput\r\n [id]=\"fieldId\"\r\n type=\"file\"\r\n class=\"file-upload-field__native\"\r\n [attr.accept]=\"accept && accept.length ? accept : null\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n (change)=\"onNativeChange($event)\"\r\n />\r\n <div class=\"file-upload-field__zone-inner\">\r\n <i class=\"fa-solid fa-cloud-arrow-up file-upload-field__icon\" aria-hidden=\"true\"></i>\r\n <span class=\"file-upload-field__hint-main\">\r\n Arraste arquivos ou\r\n <span class=\"file-upload-field__hint-cta\">clique para procurar</span>\r\n </span>\r\n @if (acceptDisplayText) {\r\n <span class=\"file-upload-field__hint-accept\">{{ acceptDisplayText }}</span>\r\n }\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (hint && hint.length > 0) {\r\n <p class=\"file-upload-field__hint\" [id]=\"fieldId + '-hint'\">{{ hint }}</p>\r\n }\r\n\r\n @if (errorMessage) {\r\n <p class=\"file-upload-field__error\" role=\"alert\" [id]=\"fieldId + '-err'\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n @if (hasValue) {\r\n <ul class=\"file-upload-field__list\" [attr.aria-label]=\"'Arquivos selecionados'\">\r\n @for (row of filesList; track row.file) {\r\n <li\r\n class=\"file-upload-field__item\"\r\n [class.file-upload-field__item--with-image]=\"imageListPreviewUrl(row.file)\"\r\n [class.file-upload-field__item--selectable]=\"fileItemClickActive\"\r\n (click)=\"onFileItemRowClick($event, row.file)\"\r\n >\r\n @if (imageListPreviewUrl(row.file); as thumbSrc) {\r\n <div class=\"file-upload-field__thumb\" aria-hidden=\"true\">\r\n <img\r\n class=\"file-upload-field__thumb-img\"\r\n [src]=\"thumbSrc\"\r\n [alt]=\"'Pré-visualização: ' + row.name\"\r\n loading=\"lazy\"\r\n decoding=\"async\"\r\n />\r\n </div>\r\n }\r\n <div class=\"file-upload-field__item-meta\">\r\n <span class=\"file-upload-field__name\">{{ row.name }}</span>\r\n <span class=\"file-upload-field__size\">{{ row.sizeLabel }}</span>\r\n <span class=\"file-upload-field__type\">{{ row.typeLabel }}</span>\r\n </div>\r\n <div class=\"file-upload-field__item-actions\">\r\n @if (showFileDownload) {\r\n <button\r\n type=\"button\"\r\n class=\"file-upload-field__download\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Download ' + row.name\"\r\n (click)=\"onDownloadFile(row.file, $event)\"\r\n >\r\n <i class=\"fa-solid fa-download\" aria-hidden=\"true\"></i>\r\n <span class=\"file-upload-field__download-text\">Download</span>\r\n </button>\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"file-upload-field__remove\"\r\n [disabled]=\"disabled\"\r\n [attr.aria-label]=\"'Remover ' + row.name\"\r\n (click)=\"onRemoveFile($index, $event)\"\r\n >\r\n <i class=\"fa-solid fa-xmark\" aria-hidden=\"true\"></i>\r\n <span class=\"file-upload-field__remove-text\">Remover</span>\r\n </button>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n @if (showClearAllButton) {\r\n <button\r\n type=\"button\"\r\n class=\"file-upload-field__clear\"\r\n [disabled]=\"disabled\"\r\n (click)=\"clearAll($event)\"\r\n >\r\n Limpar tudo\r\n </button>\r\n }\r\n }\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n Output,\r\n SimpleChanges,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\r\nimport {\r\n ButtonComponent,\r\n ButtonType,\r\n ButtonVariant,\r\n} from '../../../buttons';\r\nimport { SkeletonBlockComponent } from '../../../loading/skeleton-loading';\r\nimport {\r\n FILE_PREVIEW_UNAVAILABLE_MESSAGE,\r\n appendPdfIframeViewerParams,\r\n getFilePreviewKind,\r\n type FilePreviewKind,\r\n} from '../_utils/file-accept.util';\r\n\r\n/**\r\n * Painel reutilizável de pré-visualização (imagem, PDF com blob, URL remota, vazio\r\n * ou aviso único se não for possível pré-visualizar).\r\n */\r\n@Component({\r\n selector: 'app-image-preview-panel',\r\n standalone: true,\r\n imports: [ButtonComponent, SkeletonBlockComponent],\r\n templateUrl: './image-preview-panel.component.html',\r\n styleUrl: './image-preview-panel.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ImagePreviewPanelComponent implements OnChanges, OnDestroy {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly sanitizer = inject(DomSanitizer);\r\n\r\n @Input() title? = '';\r\n @Input() subtitle? = '';\r\n @Input() imageUrl?: string | null;\r\n @Input() file?: File | null;\r\n @Input() emptyText? = 'Sem imagem';\r\n @Input({ transform: booleanAttribute }) loading = false;\r\n @Input({ transform: booleanAttribute }) rounded = false;\r\n @Input({ transform: booleanAttribute }) showImageActions = false;\r\n @Input() objectFit: 'cover' | 'contain' = 'cover';\r\n\r\n @Output() readonly remove = new EventEmitter<void>();\r\n @Output() readonly change = new EventEmitter<void>();\r\n /** Mensagem reutilizada: falha de carga, tipo não suportado, etc. */\r\n readonly previewUnavailableMessage = FILE_PREVIEW_UNAVAILABLE_MESSAGE;\r\n\r\n /** `blob:` a revogar ao trocar ou destruir. */\r\n private fileObjectUrl: string | null = null;\r\n\r\n /** Só `image` local ou `imageUrl` remota. */\r\n displaySrc: string | null = null;\r\n imageLoadError = false;\r\n /** Remote URL só entra como \"imagem visível\" após evento de load. */\r\n imageLoaded = false;\r\n\r\n /** PDF a partir de `File` (URL sanitizada). */\r\n safePdfUrl: SafeResourceUrl | null = null;\r\n pdfLoadError = false;\r\n\r\n /** `file` local: imagem, PDF ou não suportado; remoto vindo de `imageUrl` só. */\r\n fileKind: FilePreviewKind | 'remote' = 'remote';\r\n\r\n ngOnChanges(c: SimpleChanges): void {\r\n if (c['file'] || c['imageUrl']) {\r\n this.revokeFileObjectUrl();\r\n this.imageLoadError = false;\r\n this.imageLoaded = false;\r\n this.pdfLoadError = false;\r\n this.fileKind = 'remote';\r\n this.displaySrc = null;\r\n this.safePdfUrl = null;\r\n this.updateDisplaySource();\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.revokeFileObjectUrl();\r\n }\r\n\r\n onImgError(): void {\r\n this.imageLoadError = true;\r\n this.imageLoaded = false;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onImgLoad(): void {\r\n this.imageLoadError = false;\r\n this.imageLoaded = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onPdfFrameError(): void {\r\n this.pdfLoadError = true;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n onTrocar(): void {\r\n this.change.emit();\r\n }\r\n\r\n onRemover(): void {\r\n this.remove.emit();\r\n }\r\n\r\n get showImage(): boolean {\r\n if (this.loading || !this.displaySrc || this.imageLoadError) {\r\n return false;\r\n }\r\n if (this.fileKind === 'remote') {\r\n return this.imageLoaded;\r\n }\r\n return (\r\n this.fileKind === 'image'\r\n );\r\n }\r\n\r\n /**\r\n * Mantém o `<img>` montado (para disparar load/error) mesmo quando remoto ainda não terminou de carregar.\r\n * Evita flick de ações e permite cair no fallback amarelo quando a URL falha.\r\n */\r\n get shouldRenderImage(): boolean {\r\n return (\r\n !this.loading &&\r\n (this.fileKind === 'image' || this.fileKind === 'remote') &&\r\n !!this.displaySrc &&\r\n !this.imageLoadError\r\n );\r\n }\r\n\r\n get showPdf(): boolean {\r\n return (\r\n !this.loading &&\r\n this.fileKind === 'pdf' &&\r\n this.safePdfUrl != null &&\r\n !this.pdfLoadError\r\n );\r\n }\r\n\r\n get showPreviewFallback(): boolean {\r\n if (this.loading) {\r\n return false;\r\n }\r\n if (this.file && this.fileKind === 'unsupported') {\r\n return true;\r\n }\r\n if (this.imageLoadError && (this.fileKind === 'image' || this.fileKind === 'remote')) {\r\n return true;\r\n }\r\n if (this.fileKind === 'pdf' && this.pdfLoadError) {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n get showEmpty(): boolean {\r\n if (this.loading) {\r\n return false;\r\n }\r\n if (this.file) {\r\n return false;\r\n }\r\n return this.imageUrl == null || this.imageUrl.length === 0;\r\n }\r\n\r\n get showActions(): boolean {\r\n if (!this.showImageActions) {\r\n return false;\r\n }\r\n return this.showImage;\r\n }\r\n\r\n private updateDisplaySource(): void {\r\n if (this.file) {\r\n const kind = getFilePreviewKind(this.file);\r\n this.fileKind = kind;\r\n if (kind === 'unsupported') {\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n this.fileObjectUrl = URL.createObjectURL(this.file);\r\n if (kind === 'image') {\r\n this.displaySrc = this.fileObjectUrl;\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n if (kind === 'pdf') {\r\n this.safePdfUrl = this.sanitizer.bypassSecurityTrustResourceUrl(\r\n appendPdfIframeViewerParams(this.fileObjectUrl),\r\n );\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n }\r\n this.fileKind = 'remote';\r\n this.displaySrc =\r\n this.imageUrl && this.imageUrl.length > 0 ? this.imageUrl : null;\r\n this.cdr.markForCheck();\r\n }\r\n\r\n private revokeFileObjectUrl(): void {\r\n if (this.fileObjectUrl) {\r\n URL.revokeObjectURL(this.fileObjectUrl);\r\n this.fileObjectUrl = null;\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"image-preview-panel\"\r\n [class.image-preview-panel--rounded]=\"rounded\"\r\n [class.image-preview-panel--loading]=\"loading\"\r\n>\r\n @if (title && title.length > 0) {\r\n <h3 class=\"image-preview-panel__title\">{{ title }}</h3>\r\n }\r\n @if (subtitle && subtitle.length > 0) {\r\n <p class=\"image-preview-panel__subtitle\">{{ subtitle }}</p>\r\n }\r\n\r\n <div\r\n class=\"image-preview-panel__frame\"\r\n [class.image-preview-panel__frame--rounded]=\"rounded\"\r\n >\r\n @if (loading) {\r\n <div\r\n class=\"image-preview-panel__skeleton\"\r\n role=\"status\"\r\n aria-label=\"Carregando pré-visualização\"\r\n >\r\n <app-skeleton-block\r\n class=\"image-preview-panel__skeleton-poster\"\r\n width=\"100%\"\r\n height=\"100%\"\r\n radius=\"0\"\r\n />\r\n <div class=\"image-preview-panel__skeleton-lines\">\r\n <app-skeleton-block width=\"72%\" height=\"0.6rem\" radius=\"6px\" />\r\n <app-skeleton-block width=\"48%\" height=\"0.55rem\" radius=\"6px\" />\r\n </div>\r\n </div>\r\n } @else if (showEmpty) {\r\n <div class=\"image-preview-panel__empty\" role=\"img\" [attr.aria-label]=\"emptyText\">\r\n <i class=\"fa-regular fa-image image-preview-panel__empty-icon\" aria-hidden=\"true\"></i>\r\n <span class=\"image-preview-panel__empty-text\">{{ emptyText }}</span>\r\n </div>\r\n } @else {\r\n @if (showPreviewFallback) {\r\n <div\r\n class=\"image-preview-panel__preview-fallback\"\r\n role=\"status\"\r\n [attr.aria-label]=\"previewUnavailableMessage\"\r\n >\r\n <i\r\n class=\"fa-solid fa-triangle-exclamation image-preview-panel__preview-fallback-icon\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n <span class=\"image-preview-panel__preview-fallback-text\">{{ previewUnavailableMessage }}</span>\r\n </div>\r\n } @else if (showPdf) {\r\n <iframe\r\n class=\"image-preview-panel__pdf\"\r\n [src]=\"safePdfUrl\"\r\n title=\"Pré-visualização do PDF\"\r\n (error)=\"onPdfFrameError()\"\r\n ></iframe>\r\n } @else if (shouldRenderImage) {\r\n <img\r\n class=\"image-preview-panel__img\"\r\n [class.image-preview-panel__img--hidden]=\"!showImage\"\r\n [src]=\"displaySrc!\"\r\n [alt]=\"title || 'Pré-visualização'\"\r\n [style.object-fit]=\"objectFit\"\r\n (load)=\"onImgLoad()\"\r\n (error)=\"onImgError()\"\r\n />\r\n }\r\n }\r\n </div>\r\n\r\n @if (showActions) {\r\n <div class=\"image-preview-panel__actions\" role=\"group\" [attr.aria-label]=\"'Ações da imagem'\">\r\n <app-button\r\n type=\"button\"\r\n variant=\"secondary\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onTrocar()\"\r\n >\r\n Trocar\r\n </app-button>\r\n <app-button\r\n type=\"button\"\r\n variant=\"danger\"\r\n [fullWidth]=\"false\"\r\n (click)=\"onRemover()\"\r\n >\r\n Remover\r\n </app-button>\r\n </div>\r\n }\r\n</div>\r\n","/** Espaçamento entre itens da linha ou da pilha dentro de uma coluna. */\r\nexport const FormLayoutGap = {\r\n Xs: 'xs',\r\n Sm: 'sm',\r\n Md: 'md',\r\n Lg: 'lg',\r\n} as const;\r\nexport type FormLayoutGap = (typeof FormLayoutGap)[keyof typeof FormLayoutGap];\r\n\r\n/** Alinhamento no eixo cruzado (itens da linha). */\r\nexport const FormRowAlign = {\r\n Start: 'start',\r\n Center: 'center',\r\n End: 'end',\r\n Stretch: 'stretch',\r\n} as const;\r\nexport type FormRowAlign = (typeof FormRowAlign)[keyof typeof FormRowAlign];\r\n\r\n/** Distribuição no eixo principal. */\r\nexport const FormRowJustify = {\r\n Start: 'start',\r\n Center: 'center',\r\n End: 'end',\r\n Between: 'between',\r\n} as const;\r\nexport type FormRowJustify = (typeof FormRowJustify)[keyof typeof FormRowJustify];\r\n\r\n/** Variante visual do grupo. */\r\nexport enum FormGroupVariant {\r\n Default = 'default',\r\n Outlined = 'outlined',\r\n Subtle = 'subtle',\r\n}\r\n\r\n/** Alinhamento horizontal no eixo principal (`justify-content`) em `app-layout-stack`. */\r\nexport enum LayoutStackAlign {\r\n Start = 'start',\r\n Center = 'center',\r\n End = 'end',\r\n SpaceBetween = 'space-between',\r\n}\r\n\r\n/**\r\n * Eixo principal do flex em `app-layout-stack` (equivalente a `flex-direction` em CSS).\r\n *\r\n * - **`Row`** — `flex-direction: row`: filhos **lado a lado** na horizontal (é o que se costuma\r\n * querer para “várias colunas” no ecrã ou `form-row` + `form-col` na mesma linha).\r\n * - **`Column`** — `flex-direction: column`: filhos **uns por baixo dos outros** (pilha vertical).\r\n * **Não** é “colunas de grelha” ao lado uma da outra; para isso use **`Row`**.\r\n */\r\nexport enum LayoutStackDirection {\r\n Row = 'row',\r\n Column = 'column',\r\n}\r\n\r\n/** Alias legível: blocos lado a lado (= `LayoutStackDirection.Row`). */\r\nexport const LAYOUT_STACK_SIDE_BY_SIDE = LayoutStackDirection.Row;\r\n\r\n/** Alias legível: pilha vertical (= `LayoutStackDirection.Column`). */\r\nexport const LAYOUT_STACK_STACKED = LayoutStackDirection.Column;\r\n\r\n/** Alinhamento no eixo cruzado (`align-items` em `row`; largura/centragem em `column`). */\r\nexport enum LayoutStackItemAlign {\r\n Stretch = 'stretch',\r\n Start = 'start',\r\n Center = 'center',\r\n End = 'end',\r\n}\r\n\r\n/** Alinhamento em `app-form-actions` (barra de ações de formulário). */\r\nexport const FormActionsAlign = {\r\n Start: 'start',\r\n Center: 'center',\r\n End: 'end',\r\n SpaceBetween: 'space-between',\r\n} as const;\r\nexport type FormActionsAlign = (typeof FormActionsAlign)[keyof typeof FormActionsAlign];\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Linha separadora horizontal — mesmos tokens que `[divider]` em `app-form-actions`\r\n * e `[stackDivider]` em `app-layout-stack`.\r\n *\r\n * `tightTop`: sem `margin-top` extra (útil quando o `gap` do pai já separa o bloco anterior).\r\n */\r\n@Component({\r\n selector: 'app-divider',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './divider.component.html',\r\n styleUrl: './divider.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n role: 'separator',\r\n 'aria-orientation': 'horizontal',\r\n },\r\n})\r\nexport class DividerComponent {\r\n /**\r\n * Omite o `margin-top` de 0.25rem — alinhado ao antigo divisor interno de `app-layout-stack`\r\n * (evita duplicar respiro com o `gap` da secção em que a stack está).\r\n */\r\n @Input({ transform: booleanAttribute }) tightTop = false;\r\n\r\n @HostBinding('class')\r\n readonly hostClass = 'ui-divider';\r\n\r\n @HostBinding('class.ui-divider--tight-top')\r\n get tightTopClass(): boolean {\r\n return this.tightTop;\r\n }\r\n}\r\n","<!-- Separador (aparência em :host) -->\r\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n booleanAttribute,\n} from '@angular/core';\nimport {\n LayoutStackAlign,\n LayoutStackDirection,\n LayoutStackItemAlign,\n} from '../_models/form-layout.model';\nimport { DividerComponent } from '../divider/divider.component';\n\n/**\n * Faixa flexível com projeção de conteúdo.\n *\n * - `align` — eixo principal (`justify-content`: start / center / end / space-between).\n * Com `stackFill` activo, o `align` deixa de ser sobrescrito (antes era forçado `flex-start`).\n * - `direction` — igual a `flex-direction` em CSS:\n * - **`Row`** = filhos **na horizontal** (lado a lado). Use para “colunas” no ecrã ou `form-row` + `form-col` na mesma linha.\n * - **`Column`** = filhos **empilhados** (um por baixo do outro). **Não** coloca “colunas” lado a lado; para isso use **`Row`**.\n * `app-layout-stack` **aninhado** conserva o próprio `direction` (não herda regras de flex do pai em coluna).\n * Constantes: `LAYOUT_STACK_SIDE_BY_SIDE` e `LAYOUT_STACK_STACKED` no barrel `form-layout`.\n * - `itemAlign` — eixo cruzado (`align-items` em `row`: topo/meio/baixo; em `column`: alinhamento horizontal dos blocos).\n */\n@Component({\n selector: 'app-layout-stack',\n standalone: true,\n imports: [DividerComponent],\n templateUrl: './layout-stack.component.html',\n styleUrl: './layout-stack.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutStackComponent {\n /** Distribuição no eixo principal do contentor flex (`justify-content`). */\n @Input() align: LayoutStackAlign = LayoutStackAlign.End;\n\n /**\n * `Row` = lado a lado (horizontal). `Column` = pilha vertical (um por baixo do outro), **não** “várias colunas” no ecrã.\n */\n @Input() direction: LayoutStackDirection = LayoutStackDirection.Row;\n\n /**\n * Eixo cruzado: em `row` alinha no vertical (ex.: `start` = topo); em `column` alinha no horizontal.\n * Se não for definido: sem `stackFill` = eixo cruzado centrado; com `stackFill` em `row` = `flex-start` (altura = conteúdo).\n * Use `LayoutStackItemAlign.Stretch` se quiser todas as células da fila com a mesma altura.\n */\n @Input() itemAlign: LayoutStackItemAlign | null = null;\n\n /**\n * Em ecrãs &lt; `40rem` (o mesmo breakpoint que `app-form-row`), a faixa passa a **coluna**:\n * filhos em pilha, largura total, mesmo com `direction=\"row\"`. Desative para manter fila no telemóvel.\n */\n @Input({ transform: booleanAttribute }) stackOnMobile = true;\n\n /**\n * Linha separadora acima da faixa — renderiza {@link DividerComponent} (`app-divider`)\n * com `[tightTop]=\"true\"` (sem `margin-top` extra; o `gap` do contentor já separa o bloco anterior).\n */\n @Input({ transform: booleanAttribute }) stackDivider = false;\n\n /**\n * Quando `true` (por defeito), em **`Row`** os filhos repartem a **largura** (`flex: 1`).\n * Em **`Column`**, o preenchimento é só **largura total** (empilhamento natural de altura);\n * não se usa `flex-grow` na vertical para evitar colapso / sobreposição.\n */\n @Input({ transform: booleanAttribute }) stackFill = true;\n\n @HostBinding('class')\n get hostClass(): string {\n const parts = [\n 'layout-stack',\n `layout-stack--align-${this.align}`,\n `layout-stack--dir-${this.direction}`,\n ];\n if (this.itemAlign != null) {\n parts.push(`layout-stack--items-${this.itemAlign}`);\n }\n if (this.stackOnMobile) {\n parts.push('layout-stack--stack-mobile');\n }\n if (this.stackFill) {\n parts.push('layout-stack--fill');\n }\n return parts.join(' ');\n }\n}\n","@if (stackDivider) {\r\n <app-divider [tightTop]=\"true\" />\r\n}\r\n<div class=\"layout-stack__track\">\r\n <ng-content />\r\n</div>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n HostBinding,\n Input,\n booleanAttribute,\n} from '@angular/core';\nimport { FormActionsAlign, LayoutStackAlign } from '../_models/form-layout.model';\nimport { DividerComponent } from '../divider/divider.component';\nimport { LayoutStackComponent } from '../layout-stack/layout-stack.component';\n\n/** Barra de ações de formulário (Salvar, Cancelar, Adicionar, …). Projeção de conteúdo. */\n@Component({\n selector: 'app-form-actions',\n imports: [DividerComponent, LayoutStackComponent],\n templateUrl: './form-actions.component.html',\n styleUrl: './form-actions.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class FormActionsComponent {\n @Input() align: FormActionsAlign = 'end';\n @Input({ transform: booleanAttribute }) stackOnMobile = true;\n /**\n * Por omissão `true`: os botões repartem a largura da faixa (um botão ≈ 100%; vários repartem por igual).\n * Use `false` para faixa compacta (largura intrínseca, ex.: várias ações alinhadas à direita).\n */\n @Input({ transform: booleanAttribute }) fill = true;\n @Input({ transform: booleanAttribute }) divider = false;\n\n /** `FormActionsAlign` e `LayoutStackAlign` partilham os mesmos valores; delegação ao `app-layout-stack`. */\n get layoutAlign(): LayoutStackAlign {\n return this.align as unknown as LayoutStackAlign;\n }\n\n @HostBinding('class')\n get hostClass(): string {\n const parts = ['form-actions', `form-actions--align-${this.align}`];\n if (this.stackOnMobile) {\n parts.push('form-actions--stack-mobile');\n }\n if (this.fill) {\n parts.push('form-actions--fill');\n }\n return parts.join(' ');\n }\n}\n","@if (divider) {\n <app-divider />\n}\n<app-layout-stack\n class=\"form-actions__stack\"\n [align]=\"layoutAlign\"\n [stackOnMobile]=\"stackOnMobile\"\n [stackFill]=\"fill\"\n [stackDivider]=\"false\"\n>\n <ng-content />\n</app-layout-stack>\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n numberAttribute,\r\n} from '@angular/core';\r\nimport { FormRowAlign, FormLayoutGap, FormRowJustify } from '../_models/form-layout.model';\r\n\r\n/**\r\n * Coluna no sistema de 12 trilhos da {@link FormRowComponent}.\r\n * Breakpoints (min-width): sm 40rem, md 48rem, lg 64rem, xl 80rem.\r\n * Valores omitidos (ex.: só `xs` e `md`) propagam-se a partir do maior definido — ex.: `md` preenche `sm` quando `sm` não está definido.\r\n */\r\n@Component({\r\n selector: 'app-form-col',\r\n standalone: true,\r\n templateUrl: './form-col.component.html',\r\n styleUrl: './form-col.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormColComponent {\r\n /** Colunas ocupadas em &lt; `sm` (por defeito 12 = linha inteira). */\r\n @Input({ transform: numberAttribute }) xs = 12;\r\n\r\n @Input() sm?: number;\r\n @Input() md?: number;\r\n @Input() lg?: number;\r\n @Input() xl?: number;\r\n\r\n @Input({ transform: numberAttribute }) order?: number;\r\n\r\n /** Quando `true`, a coluna preenche o espaço horizontal restante na grelha (`auto / -1`). */\r\n @Input({ transform: booleanAttribute }) grow = false;\r\n\r\n /** Espaço entre elementos na pilha vertical — mesmo “passo” que o `column-gap` de {@link FormRowComponent} com o mesmo `gap`. */\r\n @Input() gap: FormLayoutGap = FormLayoutGap.Md;\r\n\r\n @Input() align: FormRowAlign = FormRowAlign.Stretch;\r\n\r\n /** No eixo vertical da pilha (`justify-content`). */\r\n @Input() justify: FormRowJustify = FormRowJustify.Start;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = [\r\n 'form-col',\r\n `form-col--gap-${this.gap}`,\r\n `form-col--align-${this.align}`,\r\n `form-col--justify-${this.justify}`,\r\n ];\r\n if (this.grow) {\r\n parts.push('form-col--grow');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n @HostBinding('attr.style')\r\n get hostVars(): string {\r\n const { xs, sm, md, lg, xl } = this.resolvedSpans();\r\n const parts = [\r\n `--form-col-xs:${xs}`,\r\n `--form-col-sm:${sm}`,\r\n `--form-col-md:${md}`,\r\n `--form-col-lg:${lg}`,\r\n `--form-col-xl:${xl}`,\r\n ];\r\n if (this.order != null && !Number.isNaN(this.order)) {\r\n parts.push(`order:${this.order}`);\r\n }\r\n return parts.join(';');\r\n }\r\n\r\n /**\r\n * Cada patamar herda do próximo **maior** explicitamente definido quando o intermédio falta\r\n * (ex.: só `xs` + `md` → `sm` usa `md`, evitando faixa 40–48rem presa em `xs`).\r\n */\r\n private resolvedSpans(): { xs: number; sm: number; md: number; lg: number; xl: number } {\r\n const xs = this.clampSpan(this.xs);\r\n const smIn = this.optionalSpan(this.sm);\r\n const mdIn = this.optionalSpan(this.md);\r\n const lgIn = this.optionalSpan(this.lg);\r\n const xlIn = this.optionalSpan(this.xl);\r\n\r\n const sm = this.clampSpan(this.firstDefined(smIn, mdIn, lgIn, xlIn, xs));\r\n const md = this.clampSpan(this.firstDefined(mdIn, lgIn, xlIn, sm, xs));\r\n const lg = this.clampSpan(this.firstDefined(lgIn, xlIn, md, sm, xs));\r\n const xl = this.clampSpan(this.firstDefined(xlIn, lg, md, sm, xs));\r\n return { xs, sm, md, lg, xl };\r\n }\r\n\r\n private optionalSpan(v: number | undefined): number | undefined {\r\n if (v == null || !Number.isFinite(v)) {\r\n return undefined;\r\n }\r\n return this.clampSpan(v);\r\n }\r\n\r\n private firstDefined(...candidates: (number | undefined)[]): number {\r\n for (const c of candidates) {\r\n if (c != null && Number.isFinite(c)) {\r\n return c;\r\n }\r\n }\r\n return 12;\r\n }\r\n\r\n private clampSpan(n: number): number {\r\n if (!Number.isFinite(n) || n < 1) {\r\n return 12;\r\n }\r\n return Math.min(12, Math.max(1, Math.round(n)));\r\n }\r\n}\r\n","<div class=\"form-col__inner\">\r\n <ng-content />\r\n</div>\r\n","import { ChangeDetectorRef, DestroyRef } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\nimport { Observable, Subscription, fromEvent, merge, timer } from 'rxjs';\nimport { debounceTime, switchMap } from 'rxjs/operators';\n\ntype RegistryEntry = {\n cdRefs: Set<ChangeDetectorRef>;\n sub: Subscription | null;\n};\n\n/**\n * Um `FormGroup` raiz partilhado por vários `app-form-group` com `formGroupPath`: uma única\n * subscrição agregada evita `merge` duplicados e garante `markForCheck` em todos os anfitriões.\n *\n * Usa-se só `valueChanges` / `statusChanges` do **raiz**: ao alterar um filho, o Angular propaga\n * `updateValueAndValidity` para os ascendentes e o raiz volta a emitir `statusChanges` / `valueChanges`\n * (comportamento de {@link AbstractControl#updateValueAndValidity}). Subscrever cada folho\n * multiplicava observables (dezenas por formulário) e deixava o runtime pesado em formulários grandes.\n */\nconst rootRefreshRegistry = new WeakMap<AbstractControl, RegistryEntry>();\n\nfunction markAllCdrs(entry: RegistryEntry): void {\n for (const c of entry.cdRefs) {\n c.markForCheck();\n }\n}\n\n/**\n * Mantém ícones / getters que dependem do estado reactivo actualizados com OnPush.\n * `markAllAsTouched()` pode não emitir `valueChanges` no raiz; o `submit` do `<form>` (após um tick)\n * cobre o caso de submissão — alinhado a {@link FormGroupComponent} `setupFormPathInvalidTracking`.\n */\nexport function subscribeMarkForCheckOnInvalidUiRefresh(\n rootCtrl: AbstractControl,\n hostElement: HTMLElement,\n cdr: ChangeDetectorRef,\n destroyRef: DestroyRef,\n): void {\n let entry = rootRefreshRegistry.get(rootCtrl);\n if (!entry) {\n entry = { cdRefs: new Set(), sub: null };\n rootRefreshRegistry.set(rootCtrl, entry);\n }\n entry.cdRefs.add(cdr);\n\n if (!entry.sub) {\n const streams: Observable<unknown>[] = [rootCtrl.valueChanges, rootCtrl.statusChanges];\n\n const formEl =\n hostElement.closest('form') ?? hostElement.querySelector('form');\n if (formEl) {\n streams.push(\n fromEvent(formEl, 'submit').pipe(switchMap(() => timer(0))),\n );\n }\n\n /** Agrupa rajadas síncronas (ex.: um `patchValue` que dispara valor + estado no mesmo turno). */\n entry.sub = merge(...streams)\n .pipe(debounceTime(0))\n .subscribe(() => markAllCdrs(entry!));\n }\n\n destroyRef.onDestroy(() => {\n const e = rootRefreshRegistry.get(rootCtrl);\n if (!e) {\n return;\n }\n e.cdRefs.delete(cdr);\n if (e.cdRefs.size === 0) {\n e.sub?.unsubscribe();\n e.sub = null;\n rootRefreshRegistry.delete(rootCtrl);\n }\n });\n}\n","import { AbstractControl, FormArray, FormControl, FormGroup } from '@angular/forms';\r\n\r\n/** Resolve `a.b.c` a partir da raiz do formulário (normalmente o `FormGroup` do `<form [formGroup]>`). */\r\nexport function resolveControlAtPath(\r\n root: AbstractControl,\r\n path: string,\r\n): AbstractControl | null {\r\n const segments = path\r\n .split('.')\r\n .map((s) => s.trim())\r\n .filter((s) => s.length > 0);\r\n let current: AbstractControl | null = root;\r\n for (const seg of segments) {\r\n if (current instanceof FormGroup) {\r\n const childCtrl: AbstractControl | null = current.get(seg);\r\n if (childCtrl === null) {\r\n return null;\r\n }\r\n current = childCtrl;\r\n } else if (current instanceof FormArray && /^\\d+$/.test(seg)) {\r\n current = current.at(Number(seg));\r\n } else {\r\n return null;\r\n }\r\n }\r\n return current;\r\n}\r\n\r\n/**\r\n * Há erro “visível” na subárvore: folho inválido e (`dirty` ou `formSubmitted`).\r\n * `formSubmitted` deve incluir o equivalente a «formulário já enviado» (ex.: `FormGroupDirective.submitted`\r\n * ou passo activo após o evento `submit` do `<form>` em `app-form-group`), para acender o ícone após\r\n * «Salvar» + `markAllAsTouched()` sem exigir `dirty` em cada campo.\r\n * Não usar `touched` sozinho: Tab/blur marca touched sem alterar valor e não deve acender o ícone.\r\n */\r\nexport function subtreeHasVisibleInvalid(\r\n control: AbstractControl,\r\n formSubmitted = false,\r\n): boolean {\r\n if (control instanceof FormControl) {\r\n return !!(control.invalid && (control.dirty || formSubmitted));\r\n }\r\n if (control instanceof FormGroup) {\r\n for (const key of Object.keys(control.controls)) {\r\n const ch = control.controls[key];\r\n if (ch && subtreeHasVisibleInvalid(ch, formSubmitted)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n if (control instanceof FormArray) {\r\n for (let i = 0; i < control.length; i++) {\r\n const ch = control.at(i);\r\n if (ch && subtreeHasVisibleInvalid(ch, formSubmitted)) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Critério alinhado ao ícone automático de `app-form-group` com `formGroupPath`\r\n * (e reutilizável para aviso por separador, ex. `app-form-tab` + `formGroupName`).\r\n */\r\nexport function sectionHasVisibleInvalid(\r\n root: AbstractControl,\r\n path: string,\r\n formSubmitted = false,\r\n): boolean {\r\n const c = resolveControlAtPath(root, path);\r\n return c ? subtreeHasVisibleInvalid(c, formSubmitted) : false;\r\n}\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n DoCheck,\r\n ElementRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormGroupDirective } from '@angular/forms';\r\nimport { fromEvent } from 'rxjs';\r\nimport { filter } from 'rxjs/operators';\r\nimport { FormGroupVariant } from '../_models/form-layout.model';\r\nimport { subscribeMarkForCheckOnInvalidUiRefresh } from './form-root-invalid-ui-refresh.util';\r\nimport { resolveControlAtPath, subtreeHasVisibleInvalid } from './form-path.utils';\r\n\r\n/** Par com `app-validation-summary` / foco em campo (expandir ancestrais antes do scroll). */\r\nconst UI_REQUEST_EXPAND_FORM_GROUP = 'ui-request-expand';\r\n\r\n@Component({\r\n selector: 'app-form-group',\r\n standalone: true,\r\n templateUrl: './form-group.component.html',\r\n styleUrl: './form-group.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormGroupComponent implements OnChanges, OnInit, DoCheck {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly hostRef = inject(ElementRef<HTMLElement>);\r\n private readonly rootFormDir = inject(FormGroupDirective, { optional: true });\r\n\r\n @Input({ required: true }) titulo!: string;\r\n @Input() subtitulo = '';\r\n\r\n @Input({ transform: booleanAttribute }) collapsible = true;\r\n /**\r\n * Quando `true` (padrão), o cabeçalho alterna aberto/fechado (respeita {@link collapsed}).\r\n * Quando `false`, o grupo permanece **sempre expandido** (não recolhe), a seta fica só indicativa **em cinza**\r\n * e o cabeçalho deixa de ser clicável — útil para seções obrigatórias sempre visíveis.\r\n */\r\n @Input({ transform: booleanAttribute }) foldable = true;\r\n /**\r\n * Com `collapsible`: `true` = grupo **fechado** (só cabeçalho visível), `false` = **aberto**.\r\n * O pai pode fixar o estado inicial e manter com `(collapsedChange)` ou `[collapsed]` ligado a uma variável.\r\n * Se {@link foldable} for `false`, o estado efectivo é sempre **aberto** (ignora-se `collapsed` para o corpo).\r\n */\r\n @Input({ transform: booleanAttribute }) collapsed = false;\r\n @Input({ transform: booleanAttribute }) disabled = false;\r\n /**\r\n * Modo só leitura de UX: o título e subtítulo do cabeçalho deixam de ser seleccionáveis\r\n * (p.ex. alinhado a secções cujo conteúdo é `[readonly]`). Não força o `FormGroup` a read-only.\r\n * Alias `readonly` para o template — `readOnly` evita edge cases com minificação / metadata.\r\n */\r\n @Input({ transform: booleanAttribute, alias: 'readonly' }) readOnly = false;\r\n @Input({ transform: booleanAttribute }) dense = false;\r\n @Input({ transform: booleanAttribute }) canMoveUp = false;\r\n @Input({ transform: booleanAttribute }) canMoveDown = false;\r\n @Input({ transform: booleanAttribute }) showHeader = true;\r\n @Input({ transform: booleanAttribute }) showDivider = false;\r\n @Input() variant: FormGroupVariant = FormGroupVariant.Default;\r\n /**\r\n * Com `collapsible` e `collapsed`: se `true`, o corpo **não** é criado no DOM enquanto o\r\n * grupo está fechado (após a primeira expansão pode voltar a fechar e voltar a desmontar).\r\n * Útil para blocos pesados inicialmente fechados; o `FormGroup` reactivo no ascendente\r\n * conserva valores — os `FormControlName` religam ao reabrir.\r\n */\r\n @Input({ transform: booleanAttribute }) destroyOnCollapse = false;\r\n /**\r\n * Quando `true`, o corpo não força `flex-direction: column` nos filhos projetados (ex.: conteúdo\r\n * próprio com grade ou `flex` em linha). O padrão `false` mantém o espaçamento vertical entre\r\n * várias `app-form-row` / wrapper com `formGroupName`.\r\n */\r\n @Input({ transform: booleanAttribute }) skipBodyChildStacking = false;\r\n /**\r\n * Quando `true`, mostra o ícone de aviso no cabeçalho. O pai deve refletir inválido **e** critério\r\n * de UX (ex. `dirty` ou formulário já submetido), não só `touched` — Tab/foco não deve acender sozinho.\r\n * Ignorado quando {@link formGroupPath} está definido (usa-se só o cálculo automático).\r\n */\r\n @Input({ transform: booleanAttribute }) groupInvalid = false;\r\n\r\n /**\r\n * Caminho no `FormGroup` raiz do `<form [formGroup]>` (ex.: `identificacao`, `endereco.morada`).\r\n * Quando preenchido, o ícone de aviso é calculado automaticamente a partir do estado reativo,\r\n * sem precisar de `[groupInvalid]` manual.\r\n */\r\n @Input() formGroupPath = '';\r\n\r\n /**\r\n * Quando `true`, o critério “já houve tentativa de envio” para o ícone automático (`formGroupPath`)\r\n * inclui este sinal (ex.: alinhar a `app-form-tabs` `[warning]` com `markAllAsTouched()` sem `submitted`\r\n * no `FormGroupDirective`, ou validação disparada por `(click)` em vez de `submit`).\r\n */\r\n @Input({ transform: booleanAttribute }) uxSubmittedPass = false;\r\n\r\n @Output() readonly collapsedChange = new EventEmitter<boolean>();\r\n @Output() readonly moveUp = new EventEmitter<void>();\r\n @Output() readonly moveDown = new EventEmitter<void>();\r\n\r\n /** Estado interno espelha o input (OnPush + alterações externas). */\r\n private collapsedInternal = false;\r\n /** Evita `scrollIntoView` duplo no mesmo ciclo (clique + `[collapsed]` do pai). */\r\n private scrollIntoViewCoalesce = false;\r\n /**\r\n * `FormGroupDirective.submitted` nem sempre fica `true` no ciclo do ícone com `[formGroup]` reactivo;\r\n * o `submit` nativo do `<form>` garante aviso nos filhos após «Salvar» + `markAllAsTouched()`.\r\n * Repõe-se quando o `FormGroup` raiz volta a `VALID`.\r\n */\r\n private formSubmitPassActive = false;\r\n\r\n /** Rastreia `rootFormDir.submitted` para repor {@link formSubmitPassActive} após `resetForm` com raiz ainda inválida. */\r\n private prevRootFormSubmitted: boolean | null = null;\r\n\r\n ngOnInit(): void {\r\n this.applyCollapsedFromInputs();\r\n this.setupFormPathInvalidTracking();\r\n this.setupExpandRequestListener();\r\n }\r\n\r\n /**\r\n * Permite expandir o grupo a partir do exterior (ex.: resumo de validação antes de focar um campo).\r\n * `CustomEvent` no host: `ui-request-expand` (sem bubbles).\r\n */\r\n private setupExpandRequestListener(): void {\r\n const host = this.hostRef.nativeElement;\r\n const onExpandRequest = (ev: Event): void => {\r\n ev.stopPropagation();\r\n if (\r\n !this.collapsible ||\r\n this.disabled ||\r\n !this.foldable ||\r\n !this.collapsedInternal\r\n ) {\r\n return;\r\n }\r\n // Síncrono: o resumo adia `navigateToFieldId` com `setTimeout`, fora do CD. Expandir já aqui\r\n // garante que o scroll/foco seguinte vê o grupo aberto (evita precisar de um segundo clique).\r\n this.setCollapsed(false, { skipScroll: true });\r\n };\r\n host.addEventListener(UI_REQUEST_EXPAND_FORM_GROUP, onExpandRequest);\r\n this.destroyRef.onDestroy(() =>\r\n host.removeEventListener(UI_REQUEST_EXPAND_FORM_GROUP, onExpandRequest),\r\n );\r\n }\r\n\r\n /** Ícone de aviso: automático com `formGroupPath`, senão `groupInvalid` manual. */\r\n get invalidFlagVisible(): boolean {\r\n const raw = this.formGroupPath?.trim();\r\n if (raw && this.rootFormDir?.control) {\r\n const target = resolveControlAtPath(this.rootFormDir.control, raw);\r\n if (!target?.invalid) {\r\n return false;\r\n }\r\n const formSubmitted =\r\n !!this.rootFormDir.submitted ||\r\n this.formSubmitPassActive ||\r\n this.uxSubmittedPass;\r\n return subtreeHasVisibleInvalid(target, formSubmitted);\r\n }\r\n return this.groupInvalid;\r\n }\r\n\r\n /**\r\n * `markAllAsTouched()` / `submitted` não passam sempre por `valueChanges`; com OnPush o getter\r\n * do ícone precisa do `submit` do `<form>` ancestral (após um tick) para atualizar.\r\n */\r\n private setupFormPathInvalidTracking(): void {\r\n const raw = this.formGroupPath?.trim();\r\n const rootCtrl = this.rootFormDir?.control;\r\n if (!raw || !rootCtrl) {\r\n return;\r\n }\r\n\r\n subscribeMarkForCheckOnInvalidUiRefresh(\r\n rootCtrl,\r\n this.hostRef.nativeElement,\r\n this.cdr,\r\n this.destroyRef,\r\n );\r\n\r\n const formEl = this.hostRef.nativeElement.closest('form');\r\n if (formEl) {\r\n fromEvent(formEl, 'submit', { capture: true })\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe(() => {\r\n this.formSubmitPassActive = true;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n rootCtrl.statusChanges\r\n .pipe(\r\n filter(() => rootCtrl.valid),\r\n takeUntilDestroyed(this.destroyRef),\r\n )\r\n .subscribe(() => {\r\n this.formSubmitPassActive = false;\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (\r\n changes['uxSubmittedPass'] ||\r\n changes['formGroupPath'] ||\r\n changes['groupInvalid'] ||\r\n changes['readOnly']\r\n ) {\r\n this.cdr.markForCheck();\r\n }\r\n if (changes['collapsed'] || changes['foldable']) {\r\n const c = changes['collapsed'];\r\n const wasCollapsed =\r\n !!c && !c.firstChange && c.previousValue === true;\r\n this.applyCollapsedFromInputs();\r\n const nowExpanded = !this.collapsedInternal;\r\n if (this.collapsible && this.foldable && wasCollapsed && nowExpanded) {\r\n this.scheduleScrollIntoView();\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n /** Estado interno de colapso: com `foldable === false` força sempre expandido. */\r\n private applyCollapsedFromInputs(): void {\r\n this.collapsedInternal = this.foldable ? this.collapsed : false;\r\n }\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = ['form-group', `form-group--${this.variant}`];\r\n if (this.dense) {\r\n parts.push('form-group--dense');\r\n }\r\n if (this.disabled) {\r\n parts.push('form-group--disabled');\r\n }\r\n if (this.readOnly) {\r\n parts.push('form-group--readonly');\r\n }\r\n if (this.showDivider) {\r\n parts.push('form-group--divider');\r\n }\r\n if (this.collapsible) {\r\n parts.push('form-group--collapsible');\r\n if (!this.foldable) {\r\n parts.push('form-group--fold-locked');\r\n }\r\n parts.push(\r\n this.collapsedInternal ? 'form-group--collapsed' : 'form-group--expanded',\r\n );\r\n } else {\r\n /* Sem colapso: o corpo está sempre “aberto” — `form-group--expanded` liga a moldura/padding\r\n * iguais ao grupo colapsável expandido (bordas cinza na lib e no consumo npm). */\r\n parts.push('form-group--expanded');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n get showHeaderBar(): boolean {\r\n if (!this.showHeader) {\r\n return false;\r\n }\r\n return (\r\n this.titulo.trim().length > 0 ||\r\n this.subtitulo.trim().length > 0 ||\r\n this.collapsible ||\r\n !this.collapsible /* seta + moldura com `collapsible=false` (prod/npm sem depender de FA) */ ||\r\n this.canMoveUp ||\r\n this.canMoveDown ||\r\n this.invalidFlagVisible\r\n );\r\n }\r\n\r\n get isCollapsed(): boolean {\r\n return this.collapsedInternal;\r\n }\r\n\r\n get renderBodyInDom(): boolean {\r\n if (this.destroyOnCollapse) {\r\n return !this.collapsedInternal;\r\n }\r\n return true;\r\n }\r\n\r\n get bodyVisuallyHidden(): boolean {\r\n return !this.destroyOnCollapse && this.collapsedInternal;\r\n }\r\n\r\n get headerIsInteractive(): boolean {\r\n return this.collapsible && !this.disabled && this.foldable;\r\n }\r\n\r\n onHeaderClick(): void {\r\n if (!this.headerIsInteractive) {\r\n return;\r\n }\r\n this.setCollapsed(!this.collapsedInternal);\r\n }\r\n\r\n onHeaderKeydown(ev: KeyboardEvent): void {\r\n if (!this.headerIsInteractive) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.setCollapsed(!this.collapsedInternal);\r\n }\r\n }\r\n\r\n onMoveUpClick(ev: Event): void {\r\n ev.stopPropagation();\r\n if (this.disabled || !this.canMoveUp) {\r\n return;\r\n }\r\n this.moveUp.emit();\r\n }\r\n\r\n onMoveDownClick(ev: Event): void {\r\n ev.stopPropagation();\r\n if (this.disabled || !this.canMoveDown) {\r\n return;\r\n }\r\n this.moveDown.emit();\r\n }\r\n\r\n private setCollapsed(\r\n next: boolean,\r\n options?: { skipScroll?: boolean },\r\n ): void {\r\n if (!this.foldable && next) {\r\n return;\r\n }\r\n const wasCollapsed = this.collapsedInternal;\r\n this.collapsedInternal = next;\r\n this.collapsedChange.emit(next);\r\n this.cdr.markForCheck();\r\n const skipScroll = options?.skipScroll === true;\r\n if (this.collapsible && this.foldable && wasCollapsed && !next && !skipScroll) {\r\n this.scheduleScrollIntoView();\r\n }\r\n }\r\n\r\n /**\r\n * `block: 'start'` aproxima o grupo ao bordo superior (mais do que o `nearest`), mas o\r\n * `scroll-margin-top` no :host (CSS) cria respiro para ainda se ver o contexto de cima\r\n * (separador, outra aba) sem ir ao cimo absoluto. Dois `rAF` pós-`markForCheck` (incl. aninhados).\r\n */\r\n private scheduleScrollIntoView(): void {\r\n if (this.scrollIntoViewCoalesce) {\r\n return;\r\n }\r\n this.scrollIntoViewCoalesce = true;\r\n const reduced = this.prefersReducedMotion();\r\n queueMicrotask(() => {\r\n requestAnimationFrame(() => {\r\n requestAnimationFrame(() => {\r\n this.scrollIntoViewCoalesce = false;\r\n this.hostRef.nativeElement.scrollIntoView({\r\n behavior: reduced ? 'auto' : 'smooth',\r\n block: 'start',\r\n inline: 'nearest',\r\n });\r\n });\r\n });\r\n });\r\n }\r\n\r\n private prefersReducedMotion(): boolean {\r\n if (typeof globalThis.matchMedia !== 'function') {\r\n return false;\r\n }\r\n return globalThis.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (!this.formGroupPath?.trim()) {\r\n return;\r\n }\r\n const submitted = !!this.rootFormDir?.submitted;\r\n if (this.prevRootFormSubmitted === true && submitted === false) {\r\n this.formSubmitPassActive = false;\r\n this.cdr.markForCheck();\r\n }\r\n this.prevRootFormSubmitted = submitted;\r\n }\r\n}\r\n","@if (showHeaderBar) {\n <div\n class=\"form-group__header\"\n [class.form-group__header--single-line]=\"!subtitulo.trim()\"\n [class.form-group__header--interactive]=\"headerIsInteractive\"\n [attr.role]=\"headerIsInteractive ? 'button' : null\"\n [attr.tabindex]=\"headerIsInteractive ? 0 : null\"\n [attr.aria-expanded]=\"headerIsInteractive ? !isCollapsed : null\"\n [attr.aria-disabled]=\"disabled ? true : null\"\n (click)=\"onHeaderClick()\"\n (keydown)=\"onHeaderKeydown($event)\"\n >\n <div\n class=\"form-group__header-main\"\n [class.form-group__header-main--single-line]=\"!subtitulo.trim()\"\n >\n <span\n class=\"form-group__chevron\"\n [class.form-group__chevron--locked]=\"!collapsible || !foldable\"\n aria-hidden=\"true\"\n >\n @if (collapsible && foldable && isCollapsed) {\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 320 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M310.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L242.7 256 73.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z\"\n />\n </svg>\n } @else {\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M233.4 406.6c12.5 12.5 32.8 12.5 45.3 0l192-192c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L256 338.7 86.6 169.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l192 192z\"\n />\n </svg>\n }\n </span>\n <div class=\"form-group__titles\">\n @if (titulo.trim()) {\n <h3 class=\"form-group__title\">{{ titulo }}</h3>\n }\n @if (subtitulo.trim()) {\n <p class=\"form-group__subtitle\">{{ subtitulo }}</p>\n }\n </div>\n </div>\n <div class=\"form-group__header-trailing\">\n <span\n class=\"form-group__invalid-flag\"\n [class.form-group__invalid-flag--visible]=\"invalidFlagVisible\"\n [attr.role]=\"invalidFlagVisible ? 'img' : null\"\n [attr.aria-label]=\"invalidFlagVisible ? 'Existem erros de validação neste grupo' : null\"\n [attr.aria-hidden]=\"invalidFlagVisible ? null : 'true'\"\n [attr.title]=\"invalidFlagVisible ? 'Existem erros de validação neste grupo' : null\"\n >\n <svg class=\"form-group__icon-svg form-group__icon-svg--warning\" viewBox=\"0 0 512 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480H40c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24V296c0 13.3 10.7 24 24 24s24-10.7 24-24V184c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z\"\n />\n </svg>\n </span>\n @if (canMoveUp || canMoveDown) {\n <div class=\"form-group__reorder\" (click)=\"$event.stopPropagation()\">\n @if (canMoveUp) {\n <button\n type=\"button\"\n class=\"form-group__reorder-btn\"\n [disabled]=\"disabled\"\n aria-label=\"Mover grupo para cima\"\n (click)=\"onMoveUpClick($event)\"\n >\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M214.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-160 160c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0L160 141.2V448c0 17.7 14.3 32 32 32s32-14.3 32-32V141.2L329.4 246.6c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3l-160-160z\"\n />\n </svg>\n </button>\n }\n @if (canMoveDown) {\n <button\n type=\"button\"\n class=\"form-group__reorder-btn\"\n [disabled]=\"disabled\"\n aria-label=\"Mover grupo para baixo\"\n (click)=\"onMoveDownClick($event)\"\n >\n <svg class=\"form-group__icon-svg\" viewBox=\"0 0 384 512\" aria-hidden=\"true\" focusable=\"false\">\n <path\n fill=\"currentColor\"\n d=\"M169.4 470.6c12.5 12.5 32.8 12.5 45.3 0l160-160c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0L224 370.8 224 64c0-17.7-14.3-32-32-32s-32 14.3-32 32l0 306.7L54.6 265.4c-12.5-12.5-32.8-12.5-45.3 0s-12.5 32.8 0 45.3l160 160z\"\n />\n </svg>\n </button>\n }\n </div>\n }\n </div>\n </div>\n}\n\n@if (renderBodyInDom) {\n <div class=\"form-group__body\" [class.form-group__body--collapsed-hidden]=\"bodyVisuallyHidden\">\n <div\n class=\"form-group__body-stack\"\n [class.form-group__body-stack--neutral]=\"skipBodyChildStacking\"\n >\n <ng-content />\n </div>\n </div>\n}\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { FormRowAlign, FormLayoutGap, FormRowJustify } from '../_models/form-layout.model';\r\n\r\n/**\r\n * Grelha de formulário: com `app-form-col` usa 12 trilhos; **sem** `app-form-col`, os filhos\r\n * directos repartem a largura em colunas iguais (comportamento por omissão).\r\n *\r\n * Por omissão: **`align=\"center\"`** e **`justify=\"between\"`** (equivalente a barra de ações).\r\n */\r\n@Component({\r\n selector: 'app-form-row',\r\n standalone: true,\r\n templateUrl: './form-row.component.html',\r\n styleUrl: './form-row.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormRowComponent {\r\n @Input() gap: FormLayoutGap = 'md';\r\n @Input() align: FormRowAlign = 'center';\r\n @Input() justify: FormRowJustify = 'between';\r\n /**\r\n * Quando `true`, cada filho que **não** é `app-form-col` ocupa uma linha inteira da grelha\r\n * (`grid-column: 1 / -1`). Sem `grow`, campos soltos já dividem a linha em partes iguais.\r\n */\r\n @Input({ transform: booleanAttribute }) grow = false;\r\n @Input({ transform: booleanAttribute }) wrap = true;\r\n @Input({ transform: booleanAttribute }) stackOnMobile = true;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = [\r\n 'form-row',\r\n `form-row--gap-${this.gap}`,\r\n `form-row--align-${this.align}`,\r\n `form-row--justify-${this.justify}`,\r\n ];\r\n if (this.grow) {\r\n parts.push('form-row--grow');\r\n }\r\n if (this.wrap) {\r\n parts.push('form-row--wrap');\r\n }\r\n if (this.stackOnMobile) {\r\n parts.push('form-row--stack-mobile');\r\n }\r\n return parts.join(' ');\r\n }\r\n}\r\n","<div class=\"form-row__grid\">\r\n <ng-content />\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\nexport const FormSectionVariant = {\r\n Plain: 'plain',\r\n Card: 'card',\r\n Panel: 'panel',\r\n} as const;\r\nexport type FormSectionVariant = (typeof FormSectionVariant)[keyof typeof FormSectionVariant];\r\n\r\nexport const FormSectionAlign = {\r\n Start: 'start',\r\n Center: 'center',\r\n} as const;\r\nexport type FormSectionAlign = (typeof FormSectionAlign)[keyof typeof FormSectionAlign];\r\n\r\nexport const FormSectionRadius = {\r\n None: 'none',\r\n Sm: 'sm',\r\n Md: 'md',\r\n Lg: 'lg',\r\n Xl: 'xl',\r\n} as const;\r\nexport type FormSectionRadius = (typeof FormSectionRadius)[keyof typeof FormSectionRadius];\r\n\r\n@Component({\r\n selector: 'app-form-section',\r\n standalone: true,\r\n templateUrl: './form-section.component.html',\r\n styleUrl: './form-section.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormSectionComponent {\r\n @Input({ required: true }) titulo!: string;\r\n @Input() subtitulo = '';\r\n\r\n @Input({ transform: booleanAttribute }) dense = false;\r\n @Input({ transform: booleanAttribute }) divider = false;\r\n @Input() variant: FormSectionVariant = 'plain';\r\n @Input() align: FormSectionAlign = 'start';\r\n @Input() maxWidth: string | null = null;\r\n @Input({ transform: booleanAttribute }) fullWidth = true;\r\n @Input() radius: FormSectionRadius = 'md';\r\n @Input({ transform: booleanAttribute }) elevated = false;\r\n\r\n @HostBinding('class')\r\n get hostClass(): string {\r\n const parts = ['form-section'];\r\n parts.push(`form-section--${this.variant}`);\r\n parts.push(`form-section--align-${this.align}`);\r\n if (this.usesSurfaceVariant) {\r\n parts.push(`form-section--radius-${this.radius}`);\r\n }\r\n if (this.dense) {\r\n parts.push('form-section--dense');\r\n }\r\n if (this.divider) {\r\n parts.push('form-section--divider');\r\n }\r\n if (!this.fullWidth) {\r\n parts.push('form-section--inline');\r\n }\r\n if (this.usesSurfaceVariant && this.elevated && this.variant === 'card') {\r\n parts.push('form-section--elevated');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n @HostBinding('style.max-width')\r\n get hostMaxWidth(): string | null {\r\n const value = this.maxWidth?.trim();\r\n return value ? value : null;\r\n }\r\n\r\n @HostBinding('style.margin-inline')\r\n get hostMarginInline(): string | null {\r\n return this.hostMaxWidth ? 'auto' : null;\r\n }\r\n\r\n get usesSurfaceVariant(): boolean {\r\n return this.variant === 'card' || this.variant === 'panel';\r\n }\r\n\r\n get showHeader(): boolean {\r\n return this.titulo.trim().length > 0 || this.subtitulo.trim().length > 0;\r\n }\r\n}\r\n","@if (showHeader) {\r\n<header class=\"form-section__header\">\r\n @if (titulo.trim()) {\r\n <h2 class=\"form-section__title\">{{ titulo }}</h2>\r\n }\r\n @if (subtitulo.trim()) {\r\n <p class=\"form-section__subtitle\">{{ subtitulo }}</p>\r\n }\r\n</header>\r\n}\r\n<div class=\"form-section__content form-section__body\">\r\n <ng-content />\r\n</div>","import { DOCUMENT } from '@angular/common';\nimport {\n ApplicationRef,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n Input,\n Injector,\n OnChanges,\n OnDestroy,\n Output,\n SimpleChanges,\n ViewChild,\n afterNextRender,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport type {\n ValidationSummaryItem,\n ValidationSummaryVariant,\n} from '../_models/validation-summary.model';\n\n/** Evento no host `app-form-group`: expandir grupo sem scroll próprio (navegação a partir do resumo). */\nconst UI_REQUEST_EXPAND_FORM_GROUP = 'ui-request-expand';\n\n@Component({\n selector: 'app-validation-summary',\n standalone: true,\n templateUrl: './validation-summary.component.html',\n styleUrl: './validation-summary.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ValidationSummaryComponent implements OnChanges, OnDestroy {\n private static nextTitleUid = 0;\n private static nextListRegionUid = 0;\n private static nextPanelDomId = 0;\n\n /** Troca de aba (`beforeItemActivate`) + `queueMicrotask` no `app-form-tabs` — o alvo pode ficar em `[hidden]` até o próximo CD. */\n private readonly navigateToFieldMaxAttempts = 28;\n\n private readonly appRef = inject(ApplicationRef);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n\n /**\n * Id estável do painel — quando o nó `pinned` passa a `document.body` (Safari iOS) o\n * `getElementById` permite reintegrá-lo no host antes do `@if` o destruir.\n */\n readonly panelDomId = `structra-vsum-p-${++ValidationSummaryComponent.nextPanelDomId}`;\n\n @ViewChild('panelRoot', { read: ElementRef })\n private panelRootRef?: ElementRef<HTMLElement>;\n\n /** `id` único para `aria-labelledby` quando há vários resumos na página. */\n readonly titleElementId = `validation-summary-title-${++ValidationSummaryComponent.nextTitleUid}`;\n\n /** `id` da região da lista (acessibilidade do botão recolher / expandir). */\n readonly listRegionId = `validation-summary-list-${++ValidationSummaryComponent.nextListRegionUid}`;\n\n /** Lista simples (retrocompatível). Ignorada se {@link items} tiver entradas. */\n @Input() messages: string[] | null = null;\n\n /** Lista rica com `fieldId` opcional para navegação até o controle. */\n @Input() items: ValidationSummaryItem[] | null = null;\n\n /**\n * Título do cabeçalho (`title=\"…\"` no template).\n * Não usar a propriedade `title` na classe: colide com `HTMLElement.title` no host e o\n * browser pode desenhar tooltip nativo / comportamentos estranhos.\n */\n @Input('title') summaryHeading = '';\n\n @Input({ transform: booleanAttribute }) visible = true;\n\n /**\n * `false` (padrão): fluxo em documento (ex.: no topo do formulário) — o consumidor pode fazer scroll até o painel.\n * `true`: painel `position: fixed` no topo do viewport, com fade-in **sem** reservar espaço no formulário\n * nem alterar o scroll da página (útil em formulários muito longos).\n */\n @Input({ transform: booleanAttribute }) pinned = false;\n\n /**\n * Com resumo em fluxo (`pinned === false`), após o painel passar a visível, rola o scrollport\n * (ex.: `main` com overflow) até alinhar o painel no topo — necessário além de `window.scrollTo`\n * quando o layout aplica scroll num contentor (docs, modais, etc.).\n * Com `pinned === true` não tem efeito.\n */\n @Input({ transform: booleanAttribute }) autoScrollOnReveal = true;\n\n /**\n * Incrementar a cada submissão com erros (ex.: `++validarComErroSeq`) para voltar a rolar\n * o painel **em fluxo** quando já está visível. Sem ligação, mantém-se só o scroll da\n * primeira revelação.\n */\n @Input() unpinnedScrollTick = 0;\n\n @Input() variant: ValidationSummaryVariant = 'error';\n\n @Input({ transform: booleanAttribute }) compact = false;\n\n /**\n * Altura máxima do painel da lista (ex.: `12rem`, `min(40vh, 14rem)`).\n * Quando definido, a lista obtém scroll vertical interno.\n */\n @Input() panelMaxHeight: string | null = null;\n\n /** Comportamento de scroll ao centrar o alvo na tela. */\n @Input() scrollBehavior: ScrollBehavior = 'smooth';\n\n /**\n * Chamado antes de localizar o elemento por `fieldId` (ex.: ativar a aba onde está o campo).\n * Mantém o contrato do resumo como fonte única de scroll/foco em `navigateToFieldId`.\n */\n @Input() beforeItemActivate?: (item: ValidationSummaryItem) => void;\n\n /** Mostra botão que apenas fecha o painel (não altera validação nem o formulário). */\n @Input({ transform: booleanAttribute }) showCloseButton = false;\n\n /**\n * Mostra o botão com setas (recolher / expandir) ao lado do título para esconder só a lista\n * e poupar espaço vertical sem fechar o painel.\n */\n @Input({ transform: booleanAttribute }) showListCollapseToggle = true;\n\n @Input() closeButtonLabel = 'Fechar';\n\n /** Texto da dica nativa (`title`) nas linhas com destino ao campo. */\n @Input() fieldNavigateHint = 'Clique para ir ao campo.';\n\n @Output() readonly panelClose = new EventEmitter<void>();\n\n /** Com `pinned`: breve fade-in após o painel passar a visível (sem deslocar o layout). */\n pinnedOpen = false;\n\n /** `true`: lista de erros visível; `false`: só cabeçalho + botões (menos altura). */\n panelBodyExpanded = true;\n\n private wasShown = false;\n\n /** Evita loop em {@link scrollHostIntoNearestBlockScrollport} se o host ainda não tiver medidas. */\n private unpinnedScrollMeasureAttempts = 0;\n\n @HostBinding('class')\n get hostClass(): string {\n const parts = [\n 'validation-summary',\n `validation-summary--${this.variant}`,\n ];\n if (this.compact) {\n parts.push('validation-summary--compact');\n }\n if (this.pinned && this.isShown) {\n parts.push('validation-summary--pinned-host');\n }\n return parts.join(' ');\n }\n\n ngOnChanges(c: SimpleChanges): void {\n if (!this.isShown) {\n this.repatriatePinnedPanelToHost();\n }\n const shown = this.isShown;\n if (this.pinned && shown && !this.wasShown) {\n this.pinnedOpen = false;\n this.cdr.markForCheck();\n requestAnimationFrame(() => {\n requestAnimationFrame(() => {\n this.pinnedOpen = true;\n this.cdr.markForCheck();\n });\n });\n } else if (!shown) {\n this.pinnedOpen = false;\n this.panelBodyExpanded = true;\n } else if (this.autoScrollOnReveal && !this.pinned && shown) {\n const tch = c['unpinnedScrollTick'];\n const tickBumped =\n !!tch &&\n tch.currentValue !== tch.previousValue &&\n (tch.previousValue !== undefined ||\n (typeof tch.currentValue === 'number' && tch.currentValue > 0));\n if (tickBumped || !this.wasShown) {\n this.scheduleUnpinnedRevealScroll();\n }\n }\n this.wasShown = shown;\n if (shown) {\n afterNextRender(\n () => this.syncPinnedBodyPlacement(),\n { injector: this.injector },\n );\n }\n }\n\n ngOnDestroy(): void {\n const el = this.getPanelElement();\n if (el && el.parentElement === this.document.body) {\n try {\n this.hostRef.nativeElement.appendChild(el);\n } catch {\n el.remove();\n }\n }\n }\n\n private getPanelElement(): HTMLElement | null {\n return (\n (this.document.getElementById(this.panelDomId) as HTMLElement | null) ??\n this.panelRootRef?.nativeElement ??\n null\n );\n }\n\n private repatriatePinnedPanelToHost(): void {\n const el = this.getPanelElement();\n if (!el || el.parentElement !== this.document.body) {\n return;\n }\n this.hostRef.nativeElement.appendChild(el);\n }\n\n /**\n * Safari iOS: `position: fixed` no painel, por baixo de scroll (`main`), fica abaixo do topbar\n * a não ser com `z-index` ardiloso — o painel anexa-se a `body` (fora de qualquer overflow).\n */\n private syncPinnedBodyPlacement(): void {\n if (!this.isShown) {\n return;\n }\n const el = this.getPanelElement();\n if (!el) {\n return;\n }\n if (this.pinned) {\n if (el.parentElement !== this.document.body) {\n this.document.body.appendChild(el);\n }\n return;\n }\n if (el.parentElement === this.document.body) {\n this.hostRef.nativeElement.appendChild(el);\n }\n }\n\n @HostBinding('attr.hidden')\n get hostHidden(): true | null {\n return this.isShown ? null : true;\n }\n\n get resolvedItems(): ValidationSummaryItem[] {\n const fromItems = (this.items ?? []).filter(\n (i) => i && typeof i.message === 'string' && i.message.trim().length > 0,\n );\n if (fromItems.length > 0) {\n return fromItems.map((i) => ({\n message: i.message.trim(),\n fieldId: i.fieldId?.trim() || undefined,\n }));\n }\n return (this.messages ?? [])\n .filter((m) => typeof m === 'string' && m.trim().length > 0)\n .map((message) => ({ message: message.trim() }));\n }\n\n get isShown(): boolean {\n return this.visible && this.resolvedItems.length > 0;\n }\n\n onCloseClick(): void {\n this.panelClose.emit();\n this.cdr.markForCheck();\n }\n\n toggleListBody(): void {\n this.panelBodyExpanded = !this.panelBodyExpanded;\n this.cdr.markForCheck();\n }\n\n /**\n * Chave estável para `@for` — `track $index` reutiliza mal nós quando a lista muda ao vivo\n * e o getter `resolvedItems` devolve novas referências a cada CD.\n */\n itemTrackKey(row: ValidationSummaryItem, index: number): string {\n const fid = row.fieldId?.trim();\n if (fid) {\n return fid;\n }\n return `msg-${index}-${row.message}`;\n }\n\n /**\n * Clique na linha com destino: primeiro alinha a linha no `list-wrap` com scroll\n * (itens parcialmente visíveis passam a ficar totalmente visíveis), depois navega.\n */\n onSummaryLinkActivate(ev: Event, item: ValidationSummaryItem): void {\n const el = ev.currentTarget as HTMLElement | null;\n if (el) {\n el.scrollIntoView({\n block: 'nearest',\n inline: 'nearest',\n behavior: 'auto',\n });\n }\n this.onItemActivate(item);\n }\n\n /** Navegação até o controle com `fieldId` (chamado após {@link onSummaryLinkActivate}). */\n onItemActivate(item: ValidationSummaryItem): void {\n const id = item.fieldId?.trim();\n if (!id) {\n return;\n }\n\n this.beforeItemActivate?.(item);\n\n // 1) `afterNextRender`: após o DOM refletir (ex.: mudança de aba em `beforeItemActivate`).\n // 2) `setTimeout(0)`: fora do ciclo de verificação — evita NG0100 ao expandir `app-form-group`.\n afterNextRender(\n () => {\n setTimeout(() => this.navigateToFieldId(id), 0);\n },\n { injector: this.injector },\n );\n }\n\n private navigateToFieldId(id: string, attempt = 0): void {\n const resolved = document.getElementById(id);\n if (!resolved || !(resolved instanceof HTMLElement)) {\n if (attempt < this.navigateToFieldMaxAttempts) {\n /*\n * Com `destroyOnCollapse`, o controle não existe no DOM enquanto o `app-form-group` está fechado;\n * `expandCollapsedFormGroupAncestors` nunca corre porque depende do elemento já existir.\n * Expandimos todos os grupos colapsados no `<form>` mais próximo e repetimos após um CD.\n */\n this.expandCollapsedFormGroupsInNearestForm();\n this.appRef.tick();\n queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));\n }\n return;\n }\n // Separadores inativos (`app-form-tab`) usam `[hidden]` — `getElementById` existe mas foco falha\n // até o painel estar visível; re-tenta após CD (ex.: demo Abas ao saltar de aba).\n if (resolved.closest('[hidden]')) {\n if (attempt < this.navigateToFieldMaxAttempts) {\n this.appRef.tick();\n queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));\n }\n return;\n }\n\n /**\n * Com `app-form-group` colapsado (corpo `display: none`), `getElementById` ainda encontra o alvo\n * mas o foco falha até o próximo CD — sem reintento parece que é preciso um segundo clique no resumo.\n */\n if (this.isInsideCollapsedFormGroupBody(resolved)) {\n this.expandCollapsedFormGroupAncestors(resolved);\n this.appRef.tick();\n if (attempt < this.navigateToFieldMaxAttempts) {\n queueMicrotask(() => this.navigateToFieldId(id, attempt + 1));\n }\n return;\n }\n\n this.expandCollapsedFormGroupAncestors(resolved);\n this.appRef.tick();\n this.scheduleScrollAndFocusAfterDomFlush(id);\n }\n\n /** Após `tick()`, garante um frame de pintura antes de scroll/foco (evita foco em ramo ainda oculto). */\n private scheduleScrollAndFocusAfterDomFlush(id: string): void {\n queueMicrotask(() => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => this.scrollAndFocusFieldById(id));\n });\n });\n }\n\n private isInsideCollapsedFormGroupBody(el: HTMLElement): boolean {\n let node: HTMLElement | null = el;\n while (node) {\n if (node.classList?.contains('form-group__body--collapsed-hidden')) {\n return true;\n }\n node = node.parentElement;\n }\n return false;\n }\n\n private scrollAndFocusFieldById(id: string): void {\n const el = document.getElementById(id);\n if (!el || !(el instanceof HTMLElement)) {\n return;\n }\n const focusable = this.resolveFocusable(el);\n focusable.scrollIntoView({\n behavior: this.scrollBehavior,\n block: 'center',\n inline: 'nearest',\n });\n queueMicrotask(() => {\n try {\n focusable.focus({ preventScroll: true });\n } catch {\n focusable.focus({ preventScroll: true });\n }\n });\n this.cdr.markForCheck();\n }\n\n /**\n * Dispara `ui-request-expand` em cada `app-form-group` colapsado do formulário que contém este resumo,\n * para montar campos com `destroyOnCollapse` antes de `getElementById(fieldId)`.\n * Ordem do DOM (pais antes dos filhos) alinha a expansão de grupos aninhados.\n */\n private expandCollapsedFormGroupsInNearestForm(): void {\n const form = this.hostRef.nativeElement.closest('form');\n if (!(form instanceof HTMLFormElement)) {\n return;\n }\n const hosts = Array.from(\n form.querySelectorAll('app-form-group.form-group--collapsed'),\n ) as HTMLElement[];\n for (const host of hosts) {\n host.dispatchEvent(\n new CustomEvent(UI_REQUEST_EXPAND_FORM_GROUP, {\n bubbles: false,\n cancelable: true,\n }),\n );\n }\n }\n\n /** Expande do mais externo para o mais interno para o conteúdo ficar visível. */\n private expandCollapsedFormGroupAncestors(start: HTMLElement): void {\n const hosts: HTMLElement[] = [];\n let node: HTMLElement | null = start.parentElement;\n while (node) {\n if (\n node.tagName.toLowerCase() === 'app-form-group' &&\n node.classList.contains('form-group--collapsed')\n ) {\n hosts.push(node);\n }\n node = node.parentElement;\n }\n for (let i = hosts.length - 1; i >= 0; i--) {\n hosts[i].dispatchEvent(\n new CustomEvent(UI_REQUEST_EXPAND_FORM_GROUP, {\n bubbles: false,\n cancelable: true,\n }),\n );\n }\n }\n\n private resolveFocusable(el: HTMLElement): HTMLElement {\n if (this.isFocusableElement(el)) {\n return el;\n }\n const inner = el.querySelector<HTMLElement>(\n 'input, select, textarea, button, [href], [tabindex]:not([tabindex=\"-1\"])',\n );\n return inner ?? el;\n }\n\n private scheduleUnpinnedRevealScroll(): void {\n this.unpinnedScrollMeasureAttempts = 0;\n afterNextRender(\n () => {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => this.scrollHostIntoNearestBlockScrollport());\n });\n },\n { injector: this.injector },\n );\n }\n\n /**\n * Rola o primeiro contentor com overflow (ex.: `main` da shell de docs) para mostrar o host.\n * `Element.scrollIntoView` em contentores aninhados é pouco fiável; usamos o rect do alvo\n * relativamente ao scrollport, como no foco a partir de um item.\n */\n private scrollHostIntoNearestBlockScrollport(): void {\n if (this.pinned) {\n return;\n }\n const el = this.hostRef.nativeElement;\n if (!el.isConnected) {\n return;\n }\n const { width, height } = el.getBoundingClientRect();\n if (width === 0 && height === 0) {\n if (this.unpinnedScrollMeasureAttempts++ < 5) {\n requestAnimationFrame(() => {\n requestAnimationFrame(() => this.scrollHostIntoNearestBlockScrollport());\n });\n }\n return;\n }\n const marginPx = 12;\n const scrollport =\n this.findFirstBlockScrollportAncestor(el) ??\n (document.scrollingElement as HTMLElement | null) ??\n document.documentElement;\n const elRect = el.getBoundingClientRect();\n const portRect = scrollport.getBoundingClientRect();\n const deltaY = elRect.top - portRect.top - marginPx;\n if (Math.abs(deltaY) < 2) {\n return;\n }\n const nextTop = scrollport.scrollTop + deltaY;\n const maxTop = Math.max(0, scrollport.scrollHeight - scrollport.clientHeight);\n const clamped = Math.max(0, Math.min(maxTop, nextTop));\n scrollport.scrollTo({ top: clamped, behavior: this.scrollBehavior });\n }\n\n private findFirstBlockScrollportAncestor(\n from: HTMLElement,\n ): HTMLElement | null {\n let node: HTMLElement | null = from.parentElement;\n let depth = 0;\n while (node && depth < 64) {\n if (node === document.body || node === document.documentElement) {\n return null;\n }\n const { overflowY } = getComputedStyle(node);\n if (\n (overflowY === 'auto' ||\n overflowY === 'scroll' ||\n overflowY === 'overlay') &&\n node.scrollHeight > node.clientHeight + 1\n ) {\n return node;\n }\n node = node.parentElement;\n depth += 1;\n }\n return null;\n }\n\n private isFocusableElement(el: HTMLElement): boolean {\n if (el.hasAttribute('disabled')) {\n return false;\n }\n const tag = el.tagName;\n if (\n tag === 'INPUT' ||\n tag === 'SELECT' ||\n tag === 'TEXTAREA' ||\n tag === 'BUTTON'\n ) {\n return true;\n }\n const tab = el.getAttribute('tabindex');\n return tab != null && tab !== '-1';\n }\n\n}\n","@if (isShown) {\r\n<div #panelRoot\r\n [attr.id]=\"panelDomId\"\r\n class=\"validation-summary__panel\" role=\"region\"\r\n [attr.aria-labelledby]=\"summaryHeading.trim() ? titleElementId : null\"\r\n [attr.aria-label]=\"summaryHeading.trim() ? null : 'Resumo de validação'\"\r\n [class.validation-summary__panel--pinned]=\"pinned\"\r\n [class.validation-summary__panel--pinned-open]=\"pinned && pinnedOpen\"\r\n [class.validation-summary__panel--list-collapsed]=\"!panelBodyExpanded\"\r\n [class.validation-summary__panel--surface-error]=\"variant === 'error'\"\r\n [class.validation-summary__panel--surface-warning]=\"variant === 'warning'\"\r\n [class.validation-summary__panel--surface-info]=\"variant === 'info'\"\r\n [class.validation-summary__panel--size-compact]=\"compact\">\r\n <div class=\"validation-summary__head\">\r\n @if (showListCollapseToggle) {\r\n <button type=\"button\" class=\"validation-summary__collapse-toggle\" (click)=\"toggleListBody()\"\r\n [attr.aria-expanded]=\"panelBodyExpanded\" [attr.aria-controls]=\"listRegionId\"\r\n [attr.aria-label]=\"panelBodyExpanded ? 'Recolher lista de erros' : 'Expandir lista de erros'\">\r\n <i class=\"fa-solid\" aria-hidden=\"true\" [class.fa-chevron-up]=\"panelBodyExpanded\"\r\n [class.fa-chevron-down]=\"!panelBodyExpanded\"></i>\r\n </button>\r\n }\r\n @if (summaryHeading.trim()) {\r\n <h3 class=\"validation-summary__title\" [id]=\"titleElementId\">\r\n {{ summaryHeading }}\r\n </h3>\r\n }\r\n @if (showCloseButton) {\r\n <button type=\"button\" class=\"validation-summary__close\" (click)=\"onCloseClick()\">\r\n {{ closeButtonLabel }}\r\n </button>\r\n }\r\n </div>\r\n <div class=\"validation-summary__list-wrap\" [id]=\"listRegionId\"\r\n [class.validation-summary__list-wrap--scrollable]=\"!!panelMaxHeight && panelBodyExpanded\"\r\n [class.validation-summary__list-wrap--collapsed]=\"!panelBodyExpanded\"\r\n [style.max-height]=\"panelBodyExpanded ? (panelMaxHeight || null) : null\" [attr.title]=\"fieldNavigateHint\">\r\n <ul class=\"validation-summary__list\" role=\"list\">\r\n @for (row of resolvedItems; track itemTrackKey(row, $index)) {\r\n <li class=\"validation-summary__item\" role=\"listitem\" (click)=\"onSummaryLinkActivate($event, row)\">\r\n @if (row.fieldId) {\r\n <button type=\"button\" class=\"validation-summary__link\" [attr.title]=\"fieldNavigateHint\">\r\n {{ row.message }}\r\n </button>\r\n } @else {\r\n <span class=\"validation-summary__text\">{{ row.message }}</span>\r\n }\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n</div>\r\n}","import {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n HostBinding,\n Input,\n OnChanges,\n SimpleChanges,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { FormTabsComponent } from '../form-tabs/form-tabs.component';\n\n@Component({\n selector: 'app-form-tab',\n standalone: true,\n templateUrl: './form-tab.component.html',\n styleUrl: './form-tab.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class FormTabComponent implements OnChanges {\n /** Sem `host: true`: o pai está no injetor normal (filho de `app-form-tabs`). */\n private readonly tabs = inject(FormTabsComponent, { optional: true });\n\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) key!: string;\n\n /**\n * Texto do separador na lista de abas.\n * Não usar o nome `title`: no host `<app-form-tab>` o atributo HTML `title` gera tooltip nativo\n * sobre o painel (ex.: ao passar o mouse sobre o conteúdo).\n */\n @Input({ required: true }) tabTitle!: string;\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n @Input({ transform: booleanAttribute }) warning = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n !this.tabs ||\n (!changes['warning'] && !changes['disabled'] && !changes['tabTitle'])\n ) {\n return;\n }\n this.tabs.onTabHeaderStateChanged();\n }\n\n get isActive(): boolean {\n if (!this.tabs) {\n return false;\n }\n return this.tabs.activeKey === this.key;\n }\n\n /**\n * Com `[keepAlive]=\"false\"` no `app-form-tabs` pai, painéis inactivos saem do DOM (menos\n * custo acumulado em ecrãs com muitas abas ou conteúdo pesado).\n */\n get detachInactivePanel(): boolean {\n return !!this.tabs && this.tabs.keepAlive === false;\n }\n\n /** Chamado por {@link FormTabsComponent} quando a aba ativa muda (OnPush). */\n refreshActiveState(): void {\n this.cdr.markForCheck();\n }\n\n @HostBinding('class')\n get hostClass(): string {\n return 'form-tab';\n }\n\n panelId(): string {\n return this.tabs ? this.tabs.panelIdFor(this.key) : `form-tab-panel-${this.key}`;\n }\n\n labelledById(): string {\n return this.tabs ? this.tabs.headerIdFor(this.key) : '';\n }\n}\n","<div\r\n class=\"form-tab__panel\"\r\n role=\"tabpanel\"\r\n [id]=\"panelId()\"\r\n [attr.aria-labelledby]=\"labelledById() || null\"\r\n [attr.aria-hidden]=\"!isActive\"\r\n [hidden]=\"!isActive\"\r\n [class.form-tab__panel--active]=\"isActive\"\r\n>\r\n @if (!detachInactivePanel || isActive) {\r\n <ng-content />\r\n }\r\n</div>\r\n","import {\r\n AfterContentInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChildren,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n QueryList,\r\n booleanAttribute,\r\n forwardRef,\r\n inject,\r\n} from '@angular/core';\r\nimport { FormTabComponent } from '../form-tab/form-tab.component';\r\nimport type { FormTabsVariant } from '../_models/form-tabs.model';\r\n\r\n@Component({\r\n selector: 'app-form-tabs',\r\n standalone: true,\r\n templateUrl: './form-tabs.component.html',\r\n styleUrl: './form-tabs.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FormTabsComponent implements AfterContentInit {\r\n private static nextUid = 0;\r\n\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n readonly uid = `ft-${++FormTabsComponent.nextUid}`;\r\n\r\n @ContentChildren(forwardRef(() => FormTabComponent), { descendants: false })\r\n tabQuery!: QueryList<FormTabComponent>;\r\n\r\n private _activeKey = '';\r\n\r\n @Input()\r\n set activeKey(v: string | undefined | null) {\r\n const next = (v ?? '').trim();\r\n if (next === this._activeKey) {\r\n return;\r\n }\r\n this._activeKey = next;\r\n queueMicrotask(() => this.refreshTabPanels());\r\n }\r\n get activeKey(): string {\r\n return this._activeKey;\r\n }\r\n\r\n @Output() readonly activeKeyChange = new EventEmitter<string>();\r\n\r\n /**\r\n * `true` (padrão): todos os painéis permanecem no DOM; inactivos usam `[hidden]` (útil para\r\n * preservar estado de UI puramente client-side dentro da aba).\r\n * `false`: só o painel da aba activa é montado — menos DOM/CD ao alternar; o modelo reactivo\r\n * (`FormGroup` no ascendente) mantém-se; ao voltar à aba, os campos remontam e religam-se.\r\n */\r\n @Input({ transform: booleanAttribute }) keepAlive = true;\r\n\r\n @Input({ transform: booleanAttribute }) stretch = false;\r\n\r\n @Input() variant: FormTabsVariant = 'default';\r\n\r\n /** Rótulo acessível para a lista de separadores (ex.: “Seções do formulário”). */\r\n @Input() tablistAriaLabel = 'Separadores do formulário';\r\n\r\n ngAfterContentInit(): void {\r\n this.syncInitialActiveKey();\r\n this.tabQuery.changes.subscribe(() => {\r\n this.syncInitialActiveKey();\r\n this.cdr.markForCheck();\r\n });\r\n }\r\n\r\n get tabs(): FormTabComponent[] {\r\n return this.tabQuery?.toArray() ?? [];\r\n }\r\n\r\n get hostClass(): string {\r\n const parts = ['form-tabs', `form-tabs--${this.variant}`];\r\n if (this.stretch) {\r\n parts.push('form-tabs--stretch');\r\n }\r\n return parts.join(' ');\r\n }\r\n\r\n baseId(): string {\r\n return `form-tabs-${this.uid}`;\r\n }\r\n\r\n headerIdFor(key: string): string {\r\n return `${this.baseId()}-tab-${key}`;\r\n }\r\n\r\n panelIdFor(key: string): string {\r\n return `${this.baseId()}-panel-${key}`;\r\n }\r\n\r\n selectTab(key: string): void {\r\n const tab = this.tabs.find((t) => t.key === key);\r\n if (!tab || tab.disabled) {\r\n return;\r\n }\r\n if (this._activeKey === key) {\r\n return;\r\n }\r\n this._activeKey = key;\r\n this.activeKeyChange.emit(key);\r\n this.cdr.markForCheck();\r\n this.refreshTabPanels();\r\n }\r\n\r\n private refreshTabPanels(): void {\r\n this.tabQuery?.forEach((tab) => tab.refreshActiveState());\r\n }\r\n\r\n /**\r\n * Chamado por {@link FormTabComponent} quando inputs que afetam o tablist (ex.: `warning`, `tabTitle`)\r\n * mudam — com OnPush o cabeçalho não voltava a desenhar só com alterações nos filhos projetados.\r\n */\r\n onTabHeaderStateChanged(): void {\r\n this.cdr.markForCheck();\r\n }\r\n\r\n isSelected(key: string): boolean {\r\n return this._activeKey === key;\r\n }\r\n\r\n private syncInitialActiveKey(): void {\r\n const list = this.tabs;\r\n if (!list.length) {\r\n return;\r\n }\r\n const hasActive =\r\n !!this._activeKey && list.some((t) => t.key === this._activeKey);\r\n if (hasActive) {\r\n return;\r\n }\r\n const firstEnabled = list.find((t) => !t.disabled) ?? list[0];\r\n if (firstEnabled) {\r\n this._activeKey = firstEnabled.key;\r\n this.activeKeyChange.emit(this._activeKey);\r\n this.refreshTabPanels();\r\n }\r\n }\r\n}\r\n","<div [class]=\"hostClass\">\n <div class=\"form-tabs__shell\">\n <div class=\"form-tabs__header-scroll\">\n <div\n class=\"form-tabs__tablist\"\n role=\"tablist\"\n [attr.aria-label]=\"tablistAriaLabel\"\n >\n @for (tab of tabs; track tab.key) {\n <button\n type=\"button\"\n class=\"form-tabs__tab\"\n role=\"tab\"\n [id]=\"headerIdFor(tab.key)\"\n [attr.aria-selected]=\"isSelected(tab.key)\"\n [attr.aria-controls]=\"panelIdFor(tab.key)\"\n [attr.tabindex]=\"isSelected(tab.key) ? 0 : -1\"\n [disabled]=\"tab.disabled\"\n [class.form-tabs__tab--active]=\"isSelected(tab.key)\"\n [class.form-tabs__tab--warn]=\"tab.warning\"\n (click)=\"selectTab(tab.key)\"\n >\n <span class=\"form-tabs__tab-label\">{{ tab.tabTitle }}</span>\n @if (tab.warning) {\n <span\n class=\"form-tabs__tab-warn-icon\"\n aria-hidden=\"true\"\n title=\"Existem erros nesta seção\"\n >\n <i class=\"fa-solid fa-triangle-exclamation\"></i>\n </span>\n }\n </button>\n }\n </div>\n </div>\n <div class=\"form-tabs__panels\">\n <ng-content select=\"app-form-tab\" />\n </div>\n </div>\n</div>\n","/**\r\n * HTML injetado no AG Grid (`overlayNoRowsTemplate`) — manter alinhado ao markup de {@link EmptyStateComponent}.\r\n */\r\nexport function escapeHtml(text: string): string {\r\n return text\r\n .replace(/&/g, '&amp;')\r\n .replace(/</g, '&lt;')\r\n .replace(/>/g, '&gt;')\r\n .replace(/\"/g, '&quot;')\r\n .replace(/'/g, '&#39;');\r\n}\r\n\r\nexport function buildEmptyStateOverlayHtml(message: string): string {\r\n const safe = escapeHtml(message);\r\n return (\r\n `<div class=\"empty-state empty-state--embed\" role=\"status\">` +\r\n `<span class=\"empty-state__icon\" aria-hidden=\"true\">` +\r\n `<i class=\"fa-solid fa-inbox\"></i></span>` +\r\n `<p class=\"empty-state__message\">${safe}</p></div>`\r\n );\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport type { ICellRendererAngularComp } from 'ag-grid-angular';\r\nimport type { GridApi, ICellRendererParams } from 'ag-grid-community';\r\n\r\n/** Contexto injetado pelo {@link DataGridComponent} (não exportado para consumidores). */\r\nexport interface DataGridActionsContext<T = unknown> {\r\n onEditRow: (row: T) => void;\r\n onRemoveRow: (row: T) => void;\r\n}\r\n\r\n@Component({\r\n selector: 'app-data-grid-actions-cell-renderer',\r\n standalone: true,\r\n templateUrl: './data-grid-actions-cell-renderer.component.html',\r\n styleUrl: './data-grid-actions-cell-renderer.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DataGridActionsCellRendererComponent\r\n implements ICellRendererAngularComp\r\n{\r\n params!: ICellRendererParams & { context?: DataGridActionsContext };\r\n\r\n agInit(params: ICellRendererParams): void {\r\n this.params = params as ICellRendererParams & {\r\n context?: DataGridActionsContext;\r\n };\r\n }\r\n\r\n refresh(): boolean {\r\n return false;\r\n }\r\n\r\n /** `params.context` nem sempre vem preenchido; o grid guarda o mesmo objeto em `gridOptions.context`. */\r\n private get actionsContext(): DataGridActionsContext | undefined {\r\n const p = this.params as ICellRendererParams & {\r\n context?: DataGridActionsContext;\r\n };\r\n if (p.context?.onEditRow && p.context?.onRemoveRow) {\r\n return p.context;\r\n }\r\n const api = p.api as GridApi | undefined;\r\n const fromGrid = api?.getGridOption?.('context') as\r\n | DataGridActionsContext\r\n | undefined;\r\n return fromGrid;\r\n }\r\n\r\n edit(): void {\r\n const row = this.params.data;\r\n const ctx = this.actionsContext;\r\n if (row != null && ctx) {\r\n ctx.onEditRow(row);\r\n }\r\n }\r\n\r\n remove(): void {\r\n const row = this.params.data;\r\n const ctx = this.actionsContext;\r\n if (row != null && ctx) {\r\n ctx.onRemoveRow(row);\r\n }\r\n }\r\n}\r\n","<div class=\"data-grid-actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"edit()\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-grid-actions__icon-btn data-grid-actions__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"remove()\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n</div>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n inject,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n OnInit,\n Output,\n SimpleChanges,\n numberAttribute,\n} from '@angular/core';\nimport { AgGridAngular } from 'ag-grid-angular';\nimport type {\n ColDef,\n GetRowIdParams,\n GridApi,\n GridReadyEvent,\n} from 'ag-grid-community';\nimport type { DataGridColumn } from '../_models/data-grid-column.model';\nimport { buildEmptyStateOverlayHtml } from '../empty-state/empty-state-overlay.util';\nimport {\n DataGridActionsCellRendererComponent,\n type DataGridActionsContext,\n} from './data-grid-actions-cell-renderer.component';\nimport { SkeletonTableComponent } from '../../loading/skeleton-loading';\n\nconst ACTIONS_RENDERER_NAME = 'dataGridActions';\n\n/** Emitido quando o usuário muda de página ou tamanho de página na grade paginada. */\nexport interface DataGridPaginationChangeEvent {\n /** Índice 0-based da página atual (API ag-Grid). */\n currentPage: number;\n newPage: boolean;\n newPageSize: boolean;\n}\n\n@Component({\n selector: 'app-data-grid',\n imports: [AgGridAngular, SkeletonTableComponent],\n templateUrl: './data-grid.component.html',\n styleUrl: './data-grid.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DataGridComponent<T = unknown> implements OnInit, OnChanges, OnDestroy {\n private readonly ngZone = inject(NgZone);\n private gridApi: GridApi<T> | null = null;\n private paginationChangedListener?: (event: unknown) => void;\n\n @Input({ required: true }) rows!: T[];\n @Input({ required: true }) columns!: DataGridColumn<T>[];\n\n @Input() pageSize = 15;\n @Input() loading = false;\n /**\n * Após remontar a grade (ex.: skeleton), volta a esta página (0-based).\n * Só aplicado em `gridReady` e quando o valor muda com a API já disponível.\n */\n @Input({ transform: numberAttribute }) initialPaginationPage = 0;\n @Input() height: string | null = '420px';\n @Input() emptyMessage = 'Sem registros para mostrar.';\n @Input() pagination = true;\n /** Se `false`, omite colunas com `type: 'actions'` (editar/remover). Por omissão `true`. */\n @Input() showActionsColumn = true;\n\n @Output() readonly edit = new EventEmitter<T>();\n @Output() readonly remove = new EventEmitter<T>();\n /** Reservado para evolução (seleção de linhas); não ligado na v1 para manter a UI minimal. */\n @Output() readonly selectionChange = new EventEmitter<T[]>();\n\n /** Paginação interna do ag-Grid: mudança de página ou de `pageSize`. */\n @Output() readonly paginationChanged =\n new EventEmitter<DataGridPaginationChangeEvent>();\n\n readonly frameworkComponents = {\n [ACTIONS_RENDERER_NAME]: DataGridActionsCellRendererComponent,\n };\n\n readonly paginationPageSizeChoices = [10, 15, 25, 50];\n\n /**\n * O AG Grid avisa se `paginationPageSize` não está em `paginationPageSizeSelector`.\n * Junta `pageSize` às opções base quando o consumidor usa um valor fora da lista (ex.: 8).\n */\n get effectivePaginationPageSizeSelector(): number[] {\n const size = Number(this.pageSize);\n const base = [...this.paginationPageSizeChoices];\n if (Number.isFinite(size) && size > 0 && !base.includes(size)) {\n base.push(size);\n base.sort((a, b) => a - b);\n }\n return base;\n }\n\n get skeletonColumnCount(): number {\n const n = this.columns?.length ?? 4;\n return Math.min(8, Math.max(2, n));\n }\n\n get skeletonRowCount(): number {\n return Math.min(14, Math.max(5, this.pageSize));\n }\n\n readonly defaultColDef: ColDef<T> = {\n sortable: true,\n resizable: true,\n flex: 1,\n minWidth: 120,\n };\n\n /**\n * O AG Grid corre muitos callbacks fora da `NgZone`; sem `run()`, o pai com `OnPush`\n * não volta a renderizar e editar/remover parece “morto”.\n */\n readonly actionsContext: DataGridActionsContext<T> = {\n onEditRow: (row: T) =>\n this.ngZone.run(() => {\n this.edit.emit(row);\n }),\n onRemoveRow: (row: T) =>\n this.ngZone.run(() => {\n this.remove.emit(row);\n }),\n };\n\n agColumnDefs: ColDef<T>[] = [];\n\n ngOnInit(): void {\n if (this.columns?.length) {\n this.agColumnDefs = this.mapColumnsToColDef(this.columns);\n }\n }\n\n /**\n * IDs estáveis por linha (evita `''` duplicado quando não existe `id` nos dados).\n * Tenta `id`, depois `sku` (comum em grades de produto), senão impressão digital do objeto.\n */\n readonly getRowId = (params: GetRowIdParams<T>): string => {\n const d = params.data as Record<string, unknown> | undefined;\n if (!d) {\n return '__no-row-data';\n }\n const idVal = d['id'];\n if (idVal !== undefined && idVal !== null && String(idVal).trim() !== '') {\n return String(idVal);\n }\n const skuVal = d['sku'];\n if (skuVal !== undefined && skuVal !== null && String(skuVal).trim() !== '') {\n return `sku:${String(skuVal)}`;\n }\n return `row:${this.stableRowFingerprint(d)}`;\n };\n\n /** Identificador determinístico e curto para linhas sem chave explícita. */\n private stableRowFingerprint(d: Record<string, unknown>): string {\n const keys = Object.keys(d).sort();\n const s = keys.map((k) => `${k}:${JSON.stringify(d[k])}`).join('|');\n let h = 2166136261;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 16777619);\n }\n return (h >>> 0).toString(36);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['loading'] && this.loading) {\n this.detachPaginationListenerIfLive();\n this.gridApi = null;\n }\n if (\n (changes['columns'] || changes['showActionsColumn']) &&\n this.columns?.length\n ) {\n this.agColumnDefs = this.mapColumnsToColDef(this.columns);\n }\n if (\n changes['emptyMessage'] &&\n this.gridApi &&\n !this.gridApi.isDestroyed() &&\n changes['emptyMessage'].previousValue !==\n changes['emptyMessage'].currentValue\n ) {\n this.gridApi.setGridOption(\n 'overlayNoRowsTemplate',\n this.emptyOverlayTemplate,\n );\n }\n if (\n changes['initialPaginationPage'] &&\n this.gridApi &&\n !this.gridApi.isDestroyed() &&\n !changes['initialPaginationPage'].firstChange\n ) {\n this.applyInitialPaginationPage(this.gridApi);\n }\n }\n\n ngOnDestroy(): void {\n this.detachPaginationListenerIfLive();\n this.gridApi = null;\n }\n\n get emptyOverlayTemplate(): string {\n return buildEmptyStateOverlayHtml(this.emptyMessage);\n }\n\n get hostHeight(): string {\n return (this.height && this.height.trim()) || '420px';\n }\n\n onGridReady(ev: GridReadyEvent<T>): void {\n this.detachPaginationListenerIfLive();\n\n this.gridApi = ev.api;\n ev.api.setGridOption('context', this.actionsContext);\n\n this.paginationChangedListener = (event: unknown) => {\n const e = event as { newPage?: boolean; newPageSize?: boolean };\n if (!e?.newPage && !e?.newPageSize) {\n return;\n }\n const currentPage = ev.api.paginationGetCurrentPage();\n this.ngZone.run(() => {\n this.paginationChanged.emit({\n currentPage,\n newPage: !!e.newPage,\n newPageSize: !!e.newPageSize,\n });\n });\n };\n ev.api.addEventListener('paginationChanged', this.paginationChangedListener);\n\n queueMicrotask(() => this.applyInitialPaginationPage(ev.api));\n }\n\n private applyInitialPaginationPage(api: GridApi<T>): void {\n if (api.isDestroyed()) {\n return;\n }\n const p = this.initialPaginationPage;\n if (p > 0 && api.paginationGetTotalPages() > p) {\n api.paginationGoToPage(p);\n }\n }\n\n /** Evita `removeEventListener` na API depois do grid destruído (ex.: `@if (loading)` remove o DOM). */\n private detachPaginationListenerIfLive(): void {\n const api = this.gridApi;\n const fn = this.paginationChangedListener;\n if (api && fn && !api.isDestroyed()) {\n api.removeEventListener('paginationChanged', fn);\n }\n this.paginationChangedListener = undefined;\n }\n\n private columnsForGrid(cols: DataGridColumn<T>[]): DataGridColumn<T>[] {\n if (this.showActionsColumn) {\n return cols;\n }\n return cols.filter((c) => c.type !== 'actions');\n }\n\n private mapColumnsToColDef(cols: DataGridColumn<T>[]): ColDef<T>[] {\n return this.columnsForGrid(cols).map((c) => {\n if (c.type === 'actions') {\n return {\n colId: String(c.key),\n headerName: c.header,\n sortable: false,\n filter: false,\n resizable: false,\n suppressMovable: true,\n cellRenderer: ACTIONS_RENDERER_NAME,\n cellClass: 'data-grid__actions-cell',\n width: c.width ?? 168,\n flex: c.flex,\n pinned: 'left',\n } as ColDef<T>;\n }\n const field = String(c.key);\n const def: ColDef<T> = {\n field: field as ColDef<T>['field'],\n headerName: c.header,\n sortable: c.sortable !== false,\n width: c.width,\n flex: c.flex,\n };\n if (c.type === 'number') {\n def.type = 'numericColumn';\n }\n return def;\n });\n }\n}\n","<div class=\"data-grid\" [style.height]=\"hostHeight\">\n @if (loading) {\n <div class=\"data-grid__skeleton\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\n <span class=\"visually-hidden\">A carregar grid...</span>\n <app-skeleton-table [columnCount]=\"skeletonColumnCount\" [rowCount]=\"skeletonRowCount\" [showPager]=\"pagination\" />\n </div>\n } @else {\n <ag-grid-angular\n class=\"data-grid__ag ag-theme-alpine\"\n [theme]=\"'legacy'\"\n [rowData]=\"rows\"\n [columnDefs]=\"agColumnDefs\"\n [components]=\"frameworkComponents\"\n [context]=\"actionsContext\"\n [defaultColDef]=\"defaultColDef\"\n [pagination]=\"pagination\"\n [paginationPageSize]=\"pageSize\"\n [paginationPageSizeSelector]=\"effectivePaginationPageSizeSelector\"\n [suppressCellFocus]=\"true\"\n [animateRows]=\"false\"\n [domLayout]=\"'normal'\"\n [overlayNoRowsTemplate]=\"emptyOverlayTemplate\"\n [getRowId]=\"getRowId\"\n (gridReady)=\"onGridReady($event)\"\n />\n }\n</div>\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n/** Barra de consulta: pesquisa, filtros, ações e contador (slots `toolbar-start` / `toolbar-end`). */\r\n@Component({\r\n selector: 'app-data-toolbar',\r\n standalone: true,\r\n templateUrl: './data-toolbar.component.html',\r\n styleUrl: './data-toolbar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DataToolbarComponent {}\r\n","<div class=\"data-toolbar\">\r\n <div class=\"data-toolbar__start\">\r\n <ng-content select=\"[toolbar-start]\"></ng-content>\r\n </div>\r\n <div class=\"data-toolbar__end\">\r\n <ng-content select=\"[toolbar-end]\"></ng-content>\r\n </div>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\n\r\n@Component({\r\n selector: 'app-data-card',\r\n standalone: true,\r\n templateUrl: './data-card.component.html',\r\n styleUrl: './data-card.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DataCardComponent {\r\n @Input({ required: true }) title!: string;\r\n @Input() subtitle?: string;\r\n /** 1–2 caracteres para o círculo de iniciais. */\r\n @Input() avatarText?: string;\r\n @Input() variant: 'default' = 'default';\r\n @Input() showActions = true;\r\n\r\n @Output() readonly edit = new EventEmitter<void>();\r\n @Output() readonly remove = new EventEmitter<void>();\r\n\r\n onEditClick(ev: Event): void {\r\n ev.stopPropagation();\r\n this.edit.emit();\r\n }\r\n\r\n onRemoveClick(ev: Event): void {\r\n ev.stopPropagation();\r\n this.remove.emit();\r\n }\r\n}\r\n","<article\r\n class=\"data-card\"\r\n [class.data-card--default]=\"variant === 'default'\"\r\n [attr.data-variant]=\"variant\"\r\n>\r\n <div class=\"data-card__row\">\r\n <div class=\"data-card__main\">\r\n @if (avatarText?.trim()) {\r\n <div class=\"data-card__avatar\" aria-hidden=\"true\">\r\n {{ avatarText!.trim().slice(0, 2) }}\r\n </div>\r\n }\r\n <div class=\"data-card__text\">\r\n <h4 class=\"data-card__title\">{{ title }}</h4>\r\n @if (subtitle?.trim()) {\r\n <p class=\"data-card__subtitle\">{{ subtitle }}</p>\r\n }\r\n </div>\r\n </div>\r\n @if (showActions) {\r\n <div class=\"data-card__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn\"\r\n title=\"Editar\"\r\n aria-label=\"Editar\"\r\n (click)=\"onEditClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-arrows-rotate\" aria-hidden=\"true\"></span>\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"data-card__icon-btn data-card__icon-btn--danger\"\r\n title=\"Remover\"\r\n aria-label=\"Remover\"\r\n (click)=\"onRemoveClick($event)\"\r\n >\r\n <span class=\"fa-solid fa-trash-can\" aria-hidden=\"true\"></span>\r\n </button>\r\n </div>\r\n }\r\n </div>\r\n</article>\r\n","import { ChangeDetectionStrategy, Component, Input, booleanAttribute } from '@angular/core';\n\n@Component({\n selector: 'app-empty-state',\n standalone: true,\n templateUrl: './empty-state.component.html',\n styleUrl: './empty-state.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyStateComponent {\n @Input({ required: true }) message!: string;\n @Input() description?: string;\n /** Classe Font Awesome do ícone (ex.: `fa-solid fa-inbox`). */\n @Input() iconClass = 'fa-solid fa-inbox';\n @Input() variant: 'default' = 'default';\n\n /** Padding reduzido (ex.: células de tabela, listas densas). */\n @Input({ transform: booleanAttribute }) embed = false;\n}\n","<div\n class=\"empty-state\"\n [class.empty-state--default]=\"variant === 'default'\"\n [class.empty-state--embed]=\"embed\"\n role=\"status\"\n>\n <span class=\"empty-state__icon\" aria-hidden=\"true\">\n <i [class]=\"iconClass\"></i>\n </span>\n <p class=\"empty-state__message\">{{ message }}</p>\n @if (description?.trim()) {\n <p class=\"empty-state__description\">{{ description }}</p>\n }\n</div>\n","import { NgStyle } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { DataCardComponent } from '../data-card/data-card.component';\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\nimport { SkeletonCardComponent } from '../../loading/skeleton-loading';\nimport type { CardItemView, CardListMapFn } from '../_models/card-item-view.model';\n\n/**\n * - **memory**: `items` tem a lista completa (ex.: 500 em memória); só se mostram\n * `scrollBatchSize` de cada vez até o usuário fazer scroll (fatia local).\n * - **remote**: `items` são só as linhas já devolvidas pela API; ao fim do scroll\n * emite `loadMore` para pedir a próxima página (SQL OFFSET/FETCH no backend).\n */\nexport type CardListDataMode = 'memory' | 'remote';\n\n@Component({\n selector: 'app-card-list',\n imports: [NgStyle, DataCardComponent, EmptyStateComponent, SkeletonCardComponent],\n templateUrl: './card-list.component.html',\n styleUrl: './card-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class CardListComponent<T = unknown> implements OnChanges {\n private readonly cdr = inject(ChangeDetectorRef);\n\n @Input({ required: true }) items!: T[];\n @Input() loading = false;\n /**\n * Com itens já visíveis: mostra **um** skeleton no fundo (próxima página remota)\n * para não saltar o scroll nem ocupar altura de vários cartões. O carregamento inicial\n * continua a usar só {@link loading} (lista vazia ou refresh completo com `loading` e sem `loadingMore`).\n */\n @Input({ transform: booleanAttribute }) loadingMore = false;\n @Input() emptyMessage = 'Sem itens para mostrar.';\n @Input() variant: 'default' = 'default';\n @Input({ required: true }) mapItem!: CardListMapFn<T>;\n @Input() showItemActions = true;\n @Input() trackByProp: keyof T | string = 'id' as keyof T;\n\n @Input() dataMode: CardListDataMode = 'memory';\n\n /** Em modo `memory`: quantos itens revelar por cada passo de scroll. Por omissão `10`. */\n @Input() scrollBatchSize = 10;\n @Input() scrollLoadThresholdPx = 80;\n /** Mostra o rodapé com o resumo (“X de Y”) e dica. Por omissão `true`; com `false` oculta o footer. */\n @Input() showFooter = true;\n @Input() scrollMaxHeight: string | null = 'min(28rem, 50vh)';\n\n /**\n * Modo **remote**: total de registros no servidor (ex.: COUNT SQL), para o texto “X de Y”.\n * Se `null`, usa `items.length`.\n */\n @Input() totalCountRemote: number | null = null;\n /** Modo **remote**: existe página seguinte para pedir ao backend. */\n @Input() hasNextPage = false;\n /** Modo **remote**: pedido de mais dados (próxima página). */\n @Output() readonly loadMore = new EventEmitter<void>();\n\n @Output() readonly edit = new EventEmitter<T>();\n @Output() readonly remove = new EventEmitter<T>();\n\n /** Modo memory: quantos cartões renderizar (fatia inicial = scrollBatchSize). */\n visibleCount = 0;\n\n private loadMorePending = false;\n\n /** Skeleton que ocupa a lista inteira (carregamento inicial / refresh com `loading`). */\n get showFullSkeleton(): boolean {\n return this.loading && !this.loadingMore;\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['items']) {\n this.loadMorePending = false;\n }\n if (\n changes['items'] ||\n changes['dataMode'] ||\n changes['scrollBatchSize']\n ) {\n this.resetVisibleWindow();\n }\n }\n\n get totalItemCount(): number {\n return this.items?.length ?? 0;\n }\n\n /** Total para o rodapé “X de Y”. */\n get totalForStatus(): number {\n if (this.dataMode === 'remote' && this.totalCountRemote != null) {\n return this.totalCountRemote;\n }\n return this.totalItemCount;\n }\n\n get visibleItems(): T[] {\n const list = this.items ?? [];\n if (this.dataMode === 'remote') {\n return list;\n }\n return list.slice(0, this.visibleCount);\n }\n\n get scrollStatusLabel(): string {\n if (this.totalForStatus === 0) {\n return '';\n }\n if (this.dataMode === 'remote') {\n const loaded = this.totalItemCount;\n return `${loaded} de ${this.totalForStatus} registro(s)`;\n }\n const shown = Math.min(this.visibleCount, this.totalItemCount);\n return `${shown} de ${this.totalForStatus} registro(s)`;\n }\n\n get scrollAreaStyle(): Record<string, string> {\n const h = this.scrollMaxHeight;\n if (h === null || h === undefined || h.trim() === '') {\n return {};\n }\n // Carregamento inicial (skeleton em lista vazia): sem barra de scroll; só com itens reais\n // é que `auto` entra em efeito se o conteúdo exceder `max-height`.\n return {\n 'max-height': h,\n 'overflow-y': this.showFullSkeleton ? 'hidden' : 'auto',\n 'overflow-x': 'hidden',\n };\n }\n\n /** Há mais linhas para mostrar (memória) ou para pedir à API (remote). */\n get hasMoreToReveal(): boolean {\n if (this.dataMode === 'remote') {\n return this.hasNextPage;\n }\n return (\n this.visibleCount < this.totalItemCount && this.totalItemCount > 0\n );\n }\n\n viewFor(item: T): CardItemView {\n return this.mapItem(item);\n }\n\n skeletonCardIndices(): number[] {\n const n = Math.min(8, Math.max(3, this.scrollBatchSize));\n return Array.from({ length: n }, (_, i) => i);\n }\n\n /** Um único cartão skeleton no fundo durante `loadingMore` (mantém o scroll estável). */\n skeletonTailIndices(): number[] {\n return [0];\n }\n\n trackFn = (index: number, item: T): unknown => {\n if (item != null && typeof item === 'object') {\n const key = this.trackByProp as string;\n if (key in (item as object)) {\n return (item as Record<string, unknown>)[key];\n }\n }\n return index;\n };\n\n onScroll(ev: Event): void {\n const el = ev.target as HTMLElement;\n const remaining = el.scrollHeight - el.scrollTop - el.clientHeight;\n if (remaining > this.scrollLoadThresholdPx) {\n return;\n }\n\n if (this.dataMode === 'remote') {\n this.requestRemotePage();\n return;\n }\n\n this.loadMoreMemoryChunk();\n }\n\n private requestRemotePage(): void {\n if (!this.hasNextPage || this.loading || this.loadingMore || this.loadMorePending) {\n return;\n }\n this.loadMorePending = true;\n this.loadMore.emit();\n this.cdr.markForCheck();\n }\n\n private loadMoreMemoryChunk(): void {\n if (this.visibleCount >= this.totalItemCount) {\n return;\n }\n this.visibleCount = Math.min(\n this.visibleCount + this.scrollBatchSize,\n this.totalItemCount,\n );\n this.cdr.markForCheck();\n }\n\n private resetVisibleWindow(): void {\n if (this.dataMode === 'remote') {\n this.visibleCount = this.totalItemCount;\n this.cdr.markForCheck();\n return;\n }\n const total = this.totalItemCount;\n this.visibleCount = Math.min(this.scrollBatchSize, total);\n this.cdr.markForCheck();\n }\n}\n","<div class=\"card-list\" [attr.data-variant]=\"variant\">\r\n @if (showFullSkeleton) {\r\n <div class=\"card-list__body\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"card-list__visually-hidden\">A carregar lista…</span>\r\n <div class=\"card-list__scroll\" [ngStyle]=\"scrollAreaStyle\">\r\n <div class=\"card-list__stack\">\r\n @for (_ of skeletonCardIndices(); track $index) {\r\n <app-skeleton-card [showActions]=\"showItemActions\" />\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (!showFullSkeleton && totalItemCount === 0 && !loadingMore) {\r\n <app-empty-state [message]=\"emptyMessage\" />\r\n }\r\n\r\n @if (!showFullSkeleton && totalItemCount > 0) {\r\n <div class=\"card-list__body\">\r\n <div class=\"card-list__scroll\" [ngStyle]=\"scrollAreaStyle\" (scroll)=\"onScroll($event)\"\r\n [attr.aria-busy]=\"loadingMore ? true : null\">\r\n <div class=\"card-list__stack\">\r\n @for (item of visibleItems; track trackFn($index, item)) {\r\n <app-data-card [title]=\"viewFor(item).title\" [subtitle]=\"viewFor(item).subtitle\"\r\n [avatarText]=\"viewFor(item).avatarText\" [variant]=\"variant\" [showActions]=\"showItemActions\"\r\n (edit)=\"edit.emit(item)\" (remove)=\"remove.emit(item)\" />\r\n }\r\n @if (loadingMore) {\r\n <span class=\"card-list__visually-hidden\">A carregar mais itens…</span>\r\n @for (_ of skeletonTailIndices(); track $index) {\r\n <app-skeleton-card [showActions]=\"showItemActions\" />\r\n }\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (showFooter) {\r\n <div class=\"card-list__status\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"card-list__status-text\">{{ scrollStatusLabel }}</span>\r\n </div>\r\n }\r\n </div>\r\n }\r\n</div>\r\n","import { BreakpointObserver } from '@angular/cdk/layout';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n EventEmitter,\n Input,\n OnInit,\n Output,\n inject,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { DataGridComponent } from '../data-grid/data-grid.component';\nimport { CardListComponent } from '../card-list/card-list.component';\nimport type { DataGridColumn } from '../_models/data-grid-column.model';\nimport type { CardListMapFn } from '../_models/card-item-view.model';\n\n/** Limite de largura para tratar como “mobile” na escolha grid vs card. */\nexport const ADAPTIVE_DATA_VIEW_MOBILE_QUERY = '(max-width: 767.98px)';\n\nexport type AdaptiveDataViewMode = 'grid' | 'card';\n\n/**\n * Escolhe **um** de `app-data-grid` ou `app-card-list` conforme breakpoint e preferências.\n * Nunca renderiza os dois em simultâneo.\n */\n@Component({\n selector: 'app-adaptive-data-view',\n imports: [DataGridComponent, CardListComponent],\n templateUrl: './adaptive-data-view.component.html',\n styleUrl: './adaptive-data-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AdaptiveDataViewComponent<T = unknown> implements OnInit {\n private readonly bp = inject(BreakpointObserver);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n\n @Input({ required: true }) items!: T[];\n @Input({ required: true }) gridColumns!: DataGridColumn<T>[];\n @Input({ required: true }) mapItem!: CardListMapFn<T>;\n\n @Input() pageSize = 15;\n @Input() gridHeight: string | null = 'min(28rem, 50vh)';\n @Input() cardScrollMaxHeight: string | null = 'min(28rem, 50vh)';\n @Input() emptyMessageGrid = 'Sem registros para mostrar.';\n @Input() emptyMessageCard = 'Sem itens para mostrar.';\n @Input() pagination = true;\n @Input() showActionsColumn = true;\n @Input() showCardItemActions = true;\n @Input() scrollBatchSize = 10;\n @Input() showCardFooter = false;\n /** Estado de carregamento reposto no grid ou na lista conforme a vista ativa. */\n @Input() loading = false;\n\n /**\n * Mostra uma linha de contagem **abaixo** da grade ou da lista (incluindo paginação interna).\n * Texto padrão em português; use `{count}` como marcador do número de linhas em `items`.\n */\n @Input() showResultCount = true;\n @Input() resultCountTemplate = '{count} registro(s)';\n\n /** Vista quando `ADAPTIVE_DATA_VIEW_MOBILE_QUERY` corresponde. Por padrão `card`. */\n @Input() mobileView: AdaptiveDataViewMode = 'card';\n /** Vista quando a tela é maior. Por padrão `grid`. */\n @Input() desktopView: AdaptiveDataViewMode = 'grid';\n\n @Output() readonly edit = new EventEmitter<T>();\n @Output() readonly remove = new EventEmitter<T>();\n @Output() readonly loadMore = new EventEmitter<void>();\n\n /** Corresponde ao breakpoint mobile. */\n isMobileLayout = false;\n\n ngOnInit(): void {\n this.bp\n .observe([ADAPTIVE_DATA_VIEW_MOBILE_QUERY])\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((state) => {\n this.isMobileLayout = state.matches;\n this.cdr.markForCheck();\n });\n }\n\n get effectiveKind(): AdaptiveDataViewMode {\n return this.isMobileLayout ? this.mobileView : this.desktopView;\n }\n\n get showGrid(): boolean {\n return this.effectiveKind === 'grid';\n }\n\n get showCard(): boolean {\n return this.effectiveKind === 'card';\n }\n\n get resultCountDisplay(): string {\n const tpl = (this.resultCountTemplate ?? '').trim();\n if (!tpl) {\n return '';\n }\n const n = this.items?.length ?? 0;\n return tpl.replaceAll('{count}', String(n));\n }\n}\n","<div class=\"adaptive-data-view\">\r\n <div class=\"adaptive-data-view__main\">\r\n @if (showGrid) {\r\n <app-data-grid\r\n [rows]=\"items\"\r\n [columns]=\"gridColumns\"\r\n [pageSize]=\"pageSize\"\r\n [pagination]=\"pagination\"\r\n [height]=\"gridHeight\"\r\n [emptyMessage]=\"emptyMessageGrid\"\r\n [showActionsColumn]=\"showActionsColumn\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n />\r\n }\r\n @if (showCard) {\r\n <app-card-list\r\n [items]=\"items\"\r\n [mapItem]=\"mapItem\"\r\n [scrollBatchSize]=\"scrollBatchSize\"\r\n [showItemActions]=\"showCardItemActions\"\r\n [showFooter]=\"showCardFooter\"\r\n [scrollMaxHeight]=\"cardScrollMaxHeight\"\r\n [emptyMessage]=\"emptyMessageCard\"\r\n [loading]=\"loading\"\r\n (edit)=\"edit.emit($event)\"\r\n (remove)=\"remove.emit($event)\"\r\n (loadMore)=\"loadMore.emit()\"\r\n />\r\n }\r\n </div>\r\n @if (showResultCount && resultCountDisplay) {\r\n <div class=\"adaptive-data-view__result-count\" aria-live=\"polite\">\r\n {{ resultCountDisplay }}\r\n </div>\r\n }\r\n</div>\r\n","import { NgClass } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport type { StatusBadgeSize, StatusBadgeVariant } from '../_models/data-display.models';\r\n\r\n/**\r\n * Etiqueta de estado (Ativo, Pendente, etc.) com fundo suave e cor semântica.\r\n */\r\n@Component({\n selector: 'app-status-badge',\n imports: [NgClass],\n templateUrl: './status-badge.component.html',\n styleUrl: './status-badge.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class StatusBadgeComponent {\r\n @Input({ required: true }) label!: string;\r\n\r\n @Input() variant: StatusBadgeVariant = 'neutral';\r\n\r\n /** Classes Font Awesome (ex.: `fa-solid fa-check`). */\r\n @Input() icon = '';\r\n\r\n @Input() size: StatusBadgeSize = 'md';\r\n\r\n @Input({ transform: booleanAttribute }) bordered = true;\r\n\r\n readonly variantClassMap: Record<StatusBadgeVariant, string> = {\r\n success: 'status-badge--success',\r\n error: 'status-badge--error',\r\n warning: 'status-badge--warning',\r\n info: 'status-badge--info',\r\n neutral: 'status-badge--neutral',\r\n };\r\n}\r\n","<span\r\n class=\"status-badge\"\r\n [ngClass]=\"variantClassMap[variant]\"\r\n [class.status-badge--sm]=\"size === 'sm'\"\r\n [class.status-badge--md]=\"size === 'md'\"\r\n [class.status-badge--bordered]=\"bordered\"\r\n [class.status-badge--no-border]=\"!bordered\"\r\n role=\"status\"\r\n>\r\n @if (icon.trim()) {\r\n <span class=\"status-badge__icon\" aria-hidden=\"true\">\r\n <i [attr.class]=\"icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n }\r\n <span class=\"status-badge__label\">{{ label }}</span>\r\n</span>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport { SkeletonTextComponent } from '../../loading/skeleton-loading';\r\nimport type { DetailsViewItem } from '../_models/data-display.models';\r\n\r\n/**\r\n * Lista de descrição (chave → valor) para detalhes, drawer ou resumo.\r\n * Modo **lista**: `[items]`; modo **composto**: projectar `app-details-field` no conteúdo.\r\n */\r\n@Component({\n selector: 'app-details-view',\n imports: [SkeletonTextComponent],\n templateUrl: './details-view.component.html',\n styleUrl: './details-view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class DetailsViewComponent {\r\n @Input() items: readonly DetailsViewItem[] = [];\r\n\r\n /**\r\n * Se `true`, ignora `items` e renderiza só `<ng-content />` dentro de um `<dl>`\r\n * (usar com `app-details-field` para valores ricos).\r\n */\r\n @Input({ transform: booleanAttribute }) projectionOnly = false;\r\n\r\n /** `2` ativa grade em dois tempos em telas largas. */\r\n @Input() columns: 1 | 2 = 1;\r\n\r\n @Input({ transform: booleanAttribute }) loading = false;\r\n\r\n /** Texto quando `items` está vazio, sem `loading` e sem `projectionOnly`. */\r\n @Input() emptyMessage = 'Sem dados para mostrar.';\r\n\r\n readonly emDash = '—';\r\n\r\n /** Linhas de skeleton em modo loading. */\r\n readonly skeletonPairs = [0, 1, 2, 3];\r\n}\r\n","<section\r\n class=\"details-view\"\r\n [class.details-view--2col]=\"columns === 2\"\r\n [attr.aria-busy]=\"loading ? true : null\"\r\n>\r\n @if (loading) {\r\n <div class=\"details-view__loading\" aria-live=\"polite\">\r\n @for (_ of skeletonPairs; track $index) {\r\n <div class=\"details-view__skeleton-pair\">\r\n <app-skeleton-text [lines]=\"1\" lineHeight=\"0.65rem\" lastLineWidthPct=\"28\" />\r\n <app-skeleton-text [lines]=\"1\" lineHeight=\"0.85rem\" lastLineWidthPct=\"72\" />\r\n </div>\r\n }\r\n </div>\r\n } @else if (projectionOnly) {\r\n <dl\r\n class=\"details-view__list\"\r\n [class.details-view__list--2col]=\"columns === 2\"\r\n >\r\n <ng-content />\r\n </dl>\r\n } @else if (items.length > 0) {\r\n <dl\r\n class=\"details-view__list\"\r\n [class.details-view__list--2col]=\"columns === 2\"\r\n >\r\n @for (item of items; track $index) {\r\n <div class=\"details-view__pair\">\r\n <dt class=\"details-view__term\">{{ item.label }}</dt>\r\n <dd class=\"details-view__def\">{{ item.value?.trim() ? item.value : emDash }}</dd>\r\n </div>\r\n }\r\n </dl>\r\n } @else {\r\n <p class=\"details-view__empty\">{{ emptyMessage }}</p>\r\n }\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\n/**\r\n * Uma linha chave → valor para usar **dentro** de `app-details-view` (projeção).\r\n * O host usa `display: contents` para manter `<dl>` > `<dt>`/`<dd>` válidos.\r\n */\r\n@Component({\r\n selector: 'app-details-field',\r\n standalone: true,\r\n templateUrl: './details-field.component.html',\r\n styleUrl: './details-field.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n class: 'details-field-host',\r\n style: 'display: contents',\r\n },\r\n})\r\nexport class DetailsFieldComponent {\r\n @Input({ required: true }) label!: string;\r\n}\r\n","<dt class=\"details-field__label\">{{ label }}</dt>\r\n<dd class=\"details-field__value\">\r\n <ng-content />\r\n</dd>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\nimport type { StatCardDeltaTone } from '../_models/data-display.models';\r\n\r\n/**\r\n * Cartão de métrica (KPI) com a **mesma superfície** que `app-data-card` (mixin SCSS `data-card-shell`).\r\n * Não usa o selector `app-data-card` (esse componente é para linhas de lista com ações).\r\n */\r\n@Component({\r\n selector: 'app-stat-card',\r\n standalone: true,\r\n templateUrl: './stat-card.component.html',\r\n styleUrl: './stat-card.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class StatCardComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input({ required: true }) value!: string;\r\n\r\n @Input() description = '';\r\n\r\n @Input() icon = '';\r\n\r\n /** Texto curto (ex.: +12% ou −3%). */\r\n @Input() delta = '';\r\n\r\n @Input() deltaTone: StatCardDeltaTone = 'neutral';\r\n\r\n @Input({ transform: booleanAttribute }) clickable = false;\r\n\r\n @Output() readonly cardActivate = new EventEmitter<void>();\r\n\r\n onActivate(ev: Event): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n ev.preventDefault();\r\n this.cardActivate.emit();\r\n }\r\n\r\n onKeydown(ev: KeyboardEvent): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.cardActivate.emit();\r\n }\r\n }\r\n}\r\n","<article\r\n class=\"stat-card\"\r\n [class.stat-card--clickable]=\"clickable\"\r\n [attr.role]=\"clickable ? 'button' : null\"\r\n [attr.tabindex]=\"clickable ? 0 : null\"\r\n (click)=\"onActivate($event)\"\r\n (keydown)=\"onKeydown($event)\"\r\n>\r\n <div class=\"stat-card__header\">\r\n @if (icon.trim()) {\r\n <span class=\"stat-card__icon\" aria-hidden=\"true\">\r\n <i [attr.class]=\"icon\" aria-hidden=\"true\"></i>\r\n </span>\r\n }\r\n <h3 class=\"stat-card__title\">{{ title }}</h3>\r\n </div>\r\n <p class=\"stat-card__value\">{{ value }}</p>\r\n @if (description.trim()) {\r\n <p class=\"stat-card__description\">{{ description }}</p>\r\n }\r\n @if (delta.trim()) {\r\n <p\r\n class=\"stat-card__delta\"\r\n [class.stat-card__delta--positive]=\"deltaTone === 'positive'\"\r\n [class.stat-card__delta--negative]=\"deltaTone === 'negative'\"\r\n [class.stat-card__delta--neutral]=\"deltaTone === 'neutral'\"\r\n >\r\n <span class=\"stat-card__delta-text\">{{ delta }}</span>\r\n </p>\r\n }\r\n</article>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n HostListener,\r\n Input,\r\n Output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Linha base para listas (`app-data-list`): texto, área de estado e ações projetadas.\r\n * Estrutura preparada para selecção futura (`selectable` apenas aplica classe visual).\r\n */\r\n@Component({\r\n selector: 'app-list-item',\r\n standalone: true,\r\n templateUrl: './list-item.component.html',\r\n styleUrl: './list-item.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ListItemComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input() subtitle = '';\r\n\r\n @Input({ transform: booleanAttribute }) clickable = false;\r\n\r\n /**\r\n * Reserva visual para selecção futura (sem lógica de modelo).\r\n */\r\n @Input({ transform: booleanAttribute }) selectable = false;\r\n\r\n @Output() readonly itemActivate = new EventEmitter<void>();\r\n\r\n @HostListener('keydown', ['$event'])\r\n onKeydown(ev: KeyboardEvent): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n if (ev.key === 'Enter' || ev.key === ' ') {\r\n ev.preventDefault();\r\n this.itemActivate.emit();\r\n }\r\n }\r\n\r\n onClick(ev: MouseEvent): void {\r\n if (!this.clickable) {\r\n return;\r\n }\r\n const el = ev.target as HTMLElement | null;\r\n if (el?.closest('.list-item__actions')) {\r\n return;\r\n }\r\n this.itemActivate.emit();\r\n }\r\n}\r\n","<div\r\n class=\"list-item\"\r\n [class.list-item--clickable]=\"clickable\"\r\n [class.list-item--selectable]=\"selectable\"\r\n role=\"listitem\"\r\n [attr.tabindex]=\"clickable ? 0 : null\"\r\n (click)=\"onClick($event)\"\r\n>\r\n <div class=\"list-item__main\">\r\n <h4 class=\"list-item__title\">{{ title }}</h4>\r\n @if (subtitle.trim()) {\r\n <p class=\"list-item__subtitle\">{{ subtitle }}</p>\r\n }\r\n <div class=\"list-item__extra\">\r\n <ng-content />\r\n </div>\r\n </div>\r\n <div class=\"list-item__status\">\r\n <ng-content select=\"[list-item-status]\" />\r\n </div>\r\n <div class=\"list-item__actions\">\r\n <ng-content select=\"[list-item-actions]\" />\r\n </div>\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input, booleanAttribute } from '@angular/core';\nimport { SkeletonListComponent } from '../../loading/skeleton-loading';\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\n\n/**\n * Lista vertical de registros com estados de loading e vazio padronizados.\n * O conteúdo de cada linha deve usar `app-list-item` (ou composição equivalente).\n */\n@Component({\n selector: 'app-data-list',\n imports: [SkeletonListComponent, EmptyStateComponent],\n templateUrl: './data-list.component.html',\n styleUrl: './data-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DataListComponent {\n @Input({ transform: booleanAttribute }) loading = false;\n\n @Input({ transform: booleanAttribute }) empty = false;\n\n @Input() emptyTitle = 'Sem registros';\n\n @Input() emptyDescription = '';\n\n @Input() emptyIconClass = 'fa-solid fa-inbox';\n\n /** Linhas de skeleton em modo loading. */\n @Input() skeletonRows = 5;\n}\n","<div class=\"data-list\" [attr.aria-busy]=\"loading ? true : null\">\r\n @if (loading) {\r\n <div class=\"data-list__loading\" role=\"status\" aria-live=\"polite\">\r\n <app-skeleton-list\r\n [rows]=\"skeletonRows\"\r\n [leading]=\"true\"\r\n rowGap=\"0.5rem\"\r\n lineHeight=\"0.85rem\"\r\n />\r\n </div>\r\n } @else if (empty) {\r\n <app-empty-state\r\n [message]=\"emptyTitle\"\r\n [description]=\"emptyDescription\"\r\n [iconClass]=\"emptyIconClass\"\r\n [embed]=\"true\"\r\n />\r\n } @else {\r\n <div class=\"data-list__items\" role=\"list\">\r\n <ng-content />\r\n </div>\r\n }\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\n\r\nlet dashboardSectionSeq = 0;\r\n\r\n/**\r\n * Bloco de dashboard: título, ações opcionais e conteúdo (stat-cards, listas, grades).\r\n * Superfície alinhada aos cartões da lib.\r\n */\r\n@Component({\r\n selector: 'app-dashboard-section',\r\n standalone: true,\r\n templateUrl: './dashboard-section.component.html',\r\n styleUrl: './dashboard-section.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class DashboardSectionComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input() subtitle = '';\r\n\r\n readonly titleId = `app-dashboard-section-title-${++dashboardSectionSeq}`;\r\n}\r\n","<section class=\"dashboard-section\" [attr.aria-labelledby]=\"titleId\">\r\n <header class=\"dashboard-section__header\">\r\n <div class=\"dashboard-section__headline\">\r\n <h2 class=\"dashboard-section__title\" [id]=\"titleId\">{{ title }}</h2>\r\n @if (subtitle.trim()) {\r\n <p class=\"dashboard-section__subtitle\">{{ subtitle }}</p>\r\n }\r\n </div>\r\n <div class=\"dashboard-section__actions\">\r\n <ng-content select=\"[dashboard-section-actions]\" />\r\n </div>\r\n </header>\r\n <div class=\"dashboard-section__body\">\r\n <ng-content />\r\n </div>\r\n</section>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { DataToolbarComponent } from '../data-toolbar/data-toolbar.component';\r\n\r\n/**\r\n * Barra auxiliar para tabelas / grades: envolve {@link DataToolbarComponent}\r\n * com áreas para pesquisa, contagem e ações.\r\n */\r\n@Component({\n selector: 'app-table-toolbar',\n imports: [DataToolbarComponent],\n templateUrl: './table-toolbar.component.html',\n styleUrl: './table-toolbar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class TableToolbarComponent {\r\n /** Ex.: `128 resultados` ou `Nenhum resultado`. */\r\n @Input() resultCountLabel = '';\r\n}\r\n","<app-data-toolbar class=\"table-toolbar__data-toolbar\">\r\n <div toolbar-start class=\"table-toolbar__start\">\r\n <div class=\"table-toolbar__search-filters\">\r\n <ng-content select=\"[tableToolbarSearch]\" />\r\n <ng-content select=\"[tableToolbarFilters]\" />\r\n </div>\r\n @if (resultCountLabel.trim()) {\r\n <p class=\"table-toolbar__count\" aria-live=\"polite\">{{ resultCountLabel }}</p>\r\n }\r\n </div>\r\n <div toolbar-end class=\"table-toolbar__end\">\r\n <ng-content select=\"[tableToolbarActions]\" />\r\n </div>\r\n</app-data-toolbar>\r\n","import { ChangeDetectionStrategy, Component, Input, booleanAttribute } from '@angular/core';\r\nimport { EmptyStateComponent } from '../empty-state/empty-state.component';\r\n\r\n/**\r\n * Estado vazio para tabelas ou listas densas — reutiliza {@link EmptyStateComponent}\r\n * e permite uma ação opcional (ex.: limpar filtros).\r\n */\r\n@Component({\n selector: 'app-table-empty-state',\n imports: [EmptyStateComponent],\n templateUrl: './table-empty-state.component.html',\n styleUrl: './table-empty-state.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class TableEmptyStateComponent {\r\n @Input({ required: true }) title!: string;\r\n\r\n @Input() description = '';\r\n\r\n @Input() iconClass = 'fa-solid fa-table';\r\n\r\n @Input({ transform: booleanAttribute }) embed = true;\r\n}\r\n","<div class=\"table-empty-state\">\r\n <app-empty-state\r\n [message]=\"title\"\r\n [description]=\"description\"\r\n [iconClass]=\"iconClass\"\r\n [embed]=\"embed\"\r\n />\r\n <div class=\"table-empty-state__action\">\r\n <ng-content select=\"[tableEmptyAction]\" />\r\n </div>\r\n</div>\r\n","import type { MenuNodeItem } from '../_models/menu-item.model';\r\n\r\n/** Remove marcas de acento (NFD) e passa a minúsculas — para pesquisa insensível a acentos e capitalização. */\r\nexport function normalizeSearchText(raw: string): string {\r\n const t = raw.trim().toLowerCase();\r\n return t.normalize('NFD').replace(/\\p{M}/gu, '');\r\n}\r\n\r\nfunction matchesQuery(\r\n qNormalized: string,\r\n ...parts: (string | undefined)[]\r\n): boolean {\r\n return parts.some((p) => normalizeSearchText(p ?? '').includes(qNormalized));\r\n}\r\n\r\n/**\r\n * Filtra a árvore de menu: grupo ou submenu mantém-se se o rótulo casar ou se algum descendente casar.\r\n * Divisores de primeiro nível são omitidos no resultado filtrado.\r\n */\r\nexport function filterMenuNodesByQuery<T>(\r\n nodes: readonly MenuNodeItem<T>[] | undefined,\r\n rawQuery: string,\r\n): MenuNodeItem<T>[] {\r\n const q = normalizeSearchText(rawQuery);\r\n if (!nodes?.length) {\r\n return [];\r\n }\r\n if (!q) {\r\n return [...nodes];\r\n }\r\n\r\n const out: MenuNodeItem<T>[] = [];\r\n for (const node of nodes) {\r\n const filtered = filterOneNode(node, q, rawQuery);\r\n if (filtered) {\r\n out.push(filtered);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nfunction filterOneNode<T>(\r\n node: MenuNodeItem<T>,\r\n qNormalized: string,\r\n rawQuery: string,\r\n): MenuNodeItem<T> | null {\r\n if (node.kind === 'divider') {\r\n return null;\r\n }\r\n if (node.kind === 'item') {\r\n return matchesQuery(qNormalized, node.label, node.description)\r\n ? node\r\n : null;\r\n }\r\n if (node.kind === 'submenu') {\r\n if (matchesQuery(qNormalized, node.label, node.description)) {\r\n return node;\r\n }\r\n const inner = filterMenuNodesByQuery(node.items, rawQuery);\r\n return inner.length > 0 ? { ...node, items: inner } : null;\r\n }\r\n if (node.kind === 'group') {\r\n if (node.label != null && matchesQuery(qNormalized, node.label)) {\r\n return node;\r\n }\r\n const inner = filterMenuNodesByQuery(node.items, rawQuery);\r\n return inner.length > 0 ? { ...node, items: inner } : null;\r\n }\r\n return null;\r\n}\r\n","import { FormsModule } from '@angular/forms';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n SimpleChanges,\n ViewChild,\n booleanAttribute,\n inject,\n input,\n} from '@angular/core';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\nimport type { AppTheme, StructraTheme } from '../../theme';\nimport { filterMenuNodesByQuery } from '../_utils/filter-menu-nodes.util';\nimport { TextFieldComponent } from '../../fields/input-fields';\nimport { MenuListBodyComponent } from './menu-list-body.component';\n\n@Component({\n selector: 'app-menu-list',\n templateUrl: './menu-list.component.html',\n styleUrl: './menu-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n hostDirectives: [CdkScrollable],\n imports: [FormsModule, TextFieldComponent, MenuListBodyComponent, CdkScrollable],\n})\nexport class MenuListComponent<T = string> implements OnChanges {\n private readonly cdr = inject(ChangeDetectorRef);\n\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input() menuId = 'app-menu';\n\n @Input({ transform: booleanAttribute }) dense = false;\n\n @Input({ transform: booleanAttribute }) nested = false;\n\n @Input() selectedItemId: T | null = null;\n\n @Input({ transform: booleanAttribute }) compressText = false;\n\n @Input() clickToOpen = true;\n\n @Input({ transform: booleanAttribute }) groupCollapsible = true;\n\n /** Repasse para {@link MenuListBodyComponent.groupDefaultExpansion}. */\n @Input() groupDefaultExpansion: 'all' | 'first' = 'all';\n\n @Input({ transform: booleanAttribute }) searchable = false;\n\n @Input() searchPlaceholder = 'Pesquisar';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n\n @Output() readonly closeRequest = new EventEmitter<void>();\n\n @Output() readonly submenuBack = new EventEmitter<void>();\n\n @ViewChild(MenuListBodyComponent) private body?: MenuListBodyComponent<T>;\n\n searchQuery = '';\n\n displayItems: MenuNodeItem<T>[] = [];\n\n get showSearchField(): boolean {\n return this.searchable && !this.nested && !this.compressText;\n }\n\n get expandAllGroupsWhenSearching(): boolean {\n return (\n this.searchable &&\n !this.nested &&\n !this.compressText &&\n this.groupCollapsible &&\n this.searchQuery.trim().length > 0\n );\n }\n\n get showSearchNoResults(): boolean {\n return (\n this.showSearchField &&\n this.searchQuery.trim().length > 0 &&\n this.displayItems.length === 0\n );\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (\n changes['items'] ||\n changes['searchable'] ||\n changes['compressText'] ||\n changes['nested']\n ) {\n this.syncDisplayItems();\n }\n if (\n changes['selectedItemId'] ||\n changes['items'] ||\n changes['searchable'] ||\n changes['compressText'] ||\n changes['dense'] ||\n changes['menuId'] ||\n changes['clickToOpen'] ||\n changes['groupCollapsible'] ||\n changes['groupDefaultExpansion']\n ) {\n this.cdr.markForCheck();\n }\n }\n\n onSearchQueryInput(value: string | null): void {\n this.searchQuery = value ?? '';\n this.body?.closeOpenSubmenu();\n this.syncDisplayItems();\n this.cdr.markForCheck();\n }\n\n resetHighlight(): void {\n this.body?.resetHighlight();\n }\n\n focusFirstOption(): void {\n this.body?.focusFirstOption();\n }\n\n private syncDisplayItems(): void {\n if (!this.searchable || this.nested || this.compressText) {\n this.displayItems = [...(this.items ?? [])];\n } else {\n this.displayItems = filterMenuNodesByQuery(this.items ?? [], this.searchQuery);\n }\n }\n}\n","<app-menu-list-body\n [items]=\"displayItems\"\n [menuId]=\"menuId\"\n [nested]=\"nested\"\n [dense]=\"dense\"\n [compressText]=\"compressText\"\n [groupCollapsible]=\"groupCollapsible\"\n [groupDefaultExpansion]=\"groupDefaultExpansion\"\n [clickToOpen]=\"clickToOpen\"\n [selectedItemId]=\"selectedItemId\"\n [appTheme]=\"appTheme()\"\n [expandAllGroupsInitially]=\"expandAllGroupsWhenSearching\"\n (itemSelect)=\"itemSelect.emit($event)\"\n (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"submenuBack.emit()\"\n>\n @if (showSearchField) {\n <div class=\"menu-list__search\" role=\"search\">\n <app-text-field\n class=\"menu-list__search-field\"\n [id]=\"menuId + '-search'\"\n [name]=\"menuId + '-menu-search'\"\n size=\"sm\"\n [ngModel]=\"searchQuery\"\n (ngModelChange)=\"onSearchQueryInput($event)\"\n [placeholder]=\"searchPlaceholder\"\n [label]=\"''\"\n [showPrefixIcon]=\"true\"\n prefixIcon=\"fa-solid fa-magnifying-glass\"\n [clearable]=\"true\"\n [autocomplete]=\"false\"\n />\n </div>\n }\n @if (showSearchNoResults) {\n <p class=\"menu-list__search-empty\">Nenhum item encontrado</p>\n }\n</app-menu-list-body>\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n Signal,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n booleanAttribute,\n computed,\n input,\n} from '@angular/core';\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { Subscription, fromEvent } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport {\n getThemeClassList,\n injectEffectiveThemeId,\n type AppTheme,\n type AppThemeId,\n type StructraTheme,\n} from '../../theme';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\nimport { MenuListComponent } from '../menu-list/menu-list.component';\n\nconst PANEL_MIN_W = 200;\nconst VIEWPORT_PAD = 8;\n\n@Component({\n selector: 'app-context-menu',\n imports: [MenuListComponent, NgClass],\n templateUrl: './context-menu.component.html',\n styleUrl: './context-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ContextMenuComponent<T = string> implements OnDestroy {\n private readonly overlay: Overlay;\n private readonly vcr: ViewContainerRef;\n private readonly cdr: ChangeDetectorRef;\n\n /** Igual a `[appTheme]` na lib; omitir = tema global. */\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n readonly effectiveThemeId: Signal<AppThemeId>;\n\n constructor(\n overlay: Overlay,\n vcr: ViewContainerRef,\n cdr: ChangeDetectorRef,\n ) {\n this.overlay = overlay;\n this.vcr = vcr;\n this.cdr = cdr;\n this.effectiveThemeId = injectEffectiveThemeId(this.appTheme);\n }\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input({ transform: booleanAttribute }) disabled = false;\n\n @Input() menuId = '';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n\n @ViewChild('menuTpl', { static: true }) menuTpl!: TemplateRef<unknown>;\n @ViewChild(MenuListComponent) private menuList?: MenuListComponent<T>;\n\n private overlayRef: OverlayRef | null = null;\n private escSub: Subscription | null = null;\n\n private readonly generatedId = `app-ctx-${Math.random().toString(36).slice(2, 9)}`;\n\n readonly panelThemeNgClass = computed(() => {\n const [base, token] = getThemeClassList(this.effectiveThemeId());\n return { [base]: true, [token]: true };\n });\n\n get resolvedMenuId(): string {\n return this.menuId.trim() || this.generatedId;\n }\n\n ngOnDestroy(): void {\n this.disposeOverlay();\n }\n\n onContextMenu(ev: MouseEvent): void {\n if (this.disabled) {\n return;\n }\n ev.preventDefault();\n ev.stopPropagation();\n this.openAt(ev.clientX, ev.clientY);\n }\n\n private openAt(clientX: number, clientY: number): void {\n this.disposeOverlay();\n\n const left = Math.min(\n clientX,\n window.innerWidth - PANEL_MIN_W - VIEWPORT_PAD,\n );\n const top = Math.min(\n clientY,\n window.innerHeight - VIEWPORT_PAD,\n );\n\n this.overlayRef = this.overlay.create({\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n panelClass: [...getThemeClassList(this.effectiveThemeId())],\n scrollStrategy: this.overlay.scrollStrategies.close(),\n positionStrategy: this.overlay\n .position()\n .global()\n .left(`${Math.max(VIEWPORT_PAD, left)}px`)\n .top(`${Math.max(VIEWPORT_PAD, top)}px`),\n });\n\n const portal = new TemplatePortal(this.menuTpl, this.vcr);\n this.overlayRef.attach(portal);\n\n this.overlayRef.backdropClick().subscribe(() => this.disposeOverlay());\n\n this.escSub = fromEvent<KeyboardEvent>(document, 'keydown')\n .pipe(filter((e) => e.key === 'Escape'))\n .subscribe(() => this.disposeOverlay());\n\n queueMicrotask(() => {\n this.menuList?.resetHighlight();\n this.cdr.markForCheck();\n });\n }\n\n private disposeOverlay(): void {\n this.escSub?.unsubscribe();\n this.escSub = null;\n if (this.overlayRef) {\n this.overlayRef.dispose();\n this.overlayRef = null;\n }\n }\n\n onItemSelect(id: T): void {\n this.itemSelect.emit(id);\n this.disposeOverlay();\n }\n\n onCloseRequest(): void {\n this.disposeOverlay();\n }\n}\n","<span class=\"context-menu__host\" (contextmenu)=\"onContextMenu($event)\">\r\n <ng-content />\r\n</span>\r\n\r\n<ng-template #menuTpl>\r\n <div class=\"context-menu__surface\" [ngClass]=\"panelThemeNgClass()\" (click)=\"$event.stopPropagation()\">\r\n <app-menu-list\r\n [appTheme]=\"effectiveThemeId()\"\r\n [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\r\n [clickToOpen]=\"false\"\r\n (itemSelect)=\"onItemSelect($event)\"\r\n (closeRequest)=\"onCloseRequest()\"\r\n />\r\n </div>\r\n</ng-template>\r\n","/** Lado de ancoragem do drawer. */\r\nexport enum DrawerSide {\r\n Left = 'left',\r\n Right = 'right',\r\n Bottom = 'bottom',\r\n}\r\n","/** Larguras padronizadas do painel lateral (drawer). */\r\nexport enum DrawerSize {\r\n Sm = 'sm',\r\n Md = 'md',\r\n Lg = 'lg',\r\n}\r\n","import { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n Injector,\n Input,\n OnChanges,\n OnDestroy,\n Output,\n Renderer2,\n SimpleChanges,\n ViewChild,\n afterNextRender,\n booleanAttribute,\n effect,\n inject,\n} from '@angular/core';\nimport { AppThemeService } from '../../theme/app-theme.service';\nimport { applyOptionalThemeHostClasses } from '../../theme/theme-host-apply';\nimport { DrawerSide } from '../_models/drawer-side.model';\nimport { DrawerSize } from '../_models/drawer-size.model';\n\nlet drawerTitleSeq = 0;\n\n@Component({\n selector: 'app-drawer',\n imports: [NgClass],\n templateUrl: './drawer.component.html',\n styleUrl: './drawer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'app-drawer-host',\n '[class.app-drawer-host--open]': 'open',\n }\n})\nexport class DrawerComponent implements OnChanges, OnDestroy {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly injector = inject(Injector);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n private readonly appTheme = inject(AppThemeService);\n\n @Input({ transform: booleanAttribute }) open = false;\n\n @Input() side: DrawerSide = DrawerSide.Right;\n\n @Input() size: DrawerSize = DrawerSize.Md;\n\n /** `title=\"…\"` no template — evita colisão com `HTMLElement.title` no host. */\n @Input('title') drawerHeading = '';\n\n @Input({ transform: booleanAttribute }) showCloseButton = true;\n\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n @ViewChild('panelRef') private panelRef?: ElementRef<HTMLElement>;\n\n readonly DrawerSide = DrawerSide;\n readonly DrawerSize = DrawerSize;\n\n readonly titleId = `app-drawer-title-${++drawerTitleSeq}`;\n\n private focusPreOpen: HTMLElement | null = null;\n\n constructor() {\n /**\n * O host pode ir para `document.body` ao abrir — sem isto, perde-se `.app-library-theme.theme-*`\n * herdado da app e os tokens voltam ao azul de `:root`.\n */\n effect(() => {\n const id = this.appTheme.activeThemeId();\n applyOptionalThemeHostClasses(this.renderer, this.hostEl.nativeElement, id);\n });\n }\n\n /** Igual ao `app-dialog`: backdrop + painel no `body` para `backdrop-filter` correcto. */\n private bodyRestoreParent: HTMLElement | null = null;\n private bodyRestoreNext: ChildNode | null = null;\n\n get panelClasses(): Record<string, boolean> {\n return {\n [`app-drawer__panel--side-${this.side}`]: true,\n [`app-drawer__panel--size-${this.size}`]: true,\n };\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['open']) {\n return;\n }\n if (this.open) {\n this.attachHostToBody();\n const a = document.activeElement;\n if (a instanceof HTMLElement && a !== document.body) {\n this.focusPreOpen = a;\n }\n /**\n * Garante CD na árvore projectada (sidebar / app-menu-list) com OnPush; sem isto, o\n * realce `option--selected` só surgia após p.ex. `mouseenter` na lista.\n */\n this.cdr.markForCheck();\n afterNextRender(\n () => {\n this.cdr.markForCheck();\n if (this.open) {\n this.panelRef?.nativeElement?.focus({ preventScroll: true });\n }\n },\n { injector: this.injector },\n );\n } else if (changes['open'].previousValue === true) {\n this.detachHostFromBody();\n this.restoreFocus();\n }\n }\n\n ngOnDestroy(): void {\n this.detachHostFromBody();\n }\n\n private attachHostToBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement === document.body) {\n return;\n }\n this.bodyRestoreParent = el.parentElement;\n this.bodyRestoreNext = el.nextSibling;\n document.body.appendChild(el);\n }\n\n private detachHostFromBody(): void {\n const el = this.hostEl.nativeElement;\n if (el.parentElement !== document.body) {\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n return;\n }\n const parent = this.bodyRestoreParent;\n const next = this.bodyRestoreNext;\n this.bodyRestoreParent = null;\n this.bodyRestoreNext = null;\n if (parent && document.body.contains(parent)) {\n if (next && next.parentNode === parent) {\n parent.insertBefore(el, next);\n return;\n }\n parent.appendChild(el);\n return;\n }\n const appRoot = document.querySelector('app-root');\n if (appRoot) {\n appRoot.appendChild(el);\n }\n }\n\n onBackdropClick(): void {\n this.requestClose();\n }\n\n onCloseClick(): void {\n this.requestClose();\n }\n\n onPanelKeydown(ev: KeyboardEvent): void {\n if (ev.key === 'Escape') {\n ev.preventDefault();\n this.requestClose();\n }\n }\n\n requestClose(): void {\n if (!this.open) {\n return;\n }\n this.openChange.emit(false);\n }\n\n private restoreFocus(): void {\n if (this.focusPreOpen && document.contains(this.focusPreOpen)) {\n this.focusPreOpen.focus({ preventScroll: true });\n }\n this.focusPreOpen = null;\n }\n}\n","@if (open) {\r\n <div\r\n class=\"app-drawer__backdrop\"\r\n role=\"presentation\"\r\n tabindex=\"-1\"\r\n (click)=\"onBackdropClick()\"\r\n ></div>\r\n\r\n <aside\r\n #panelRef\r\n class=\"app-drawer__panel\"\r\n [ngClass]=\"panelClasses\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n [attr.aria-labelledby]=\"drawerHeading.trim() ? titleId : null\"\r\n tabindex=\"-1\"\r\n (keydown)=\"onPanelKeydown($event)\"\r\n >\r\n <header\r\n class=\"app-drawer__header\"\r\n [class.app-drawer__header--no-title]=\"!drawerHeading.trim()\"\r\n >\r\n @if (drawerHeading.trim()) {\r\n <h2 class=\"app-drawer__title\" [id]=\"titleId\">{{ drawerHeading }}</h2>\r\n }\r\n @if (showCloseButton) {\r\n <button\r\n type=\"button\"\r\n class=\"app-drawer__close\"\r\n aria-label=\"Fechar painel\"\r\n (click)=\"onCloseClick()\"\r\n >\r\n <span class=\"app-drawer__close-x\" aria-hidden=\"true\">&times;</span>\r\n </button>\r\n }\r\n </header>\r\n\r\n <div class=\"app-drawer__body\">\r\n <ng-content />\r\n </div>\r\n\r\n <footer class=\"app-drawer__footer\">\r\n <ng-content select=\"[appDrawerFooter]\" />\r\n </footer>\r\n </aside>\r\n}\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\nimport { DropdownMenuComponent } from '../dropdown-menu/dropdown-menu.component';\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\n\n/**\n * Menu de ações padrão: mesmo comportamento do `dropdown-menu` com trigger «…» (overflow).\n * Mantém a API de itens existente (`MenuNodeItem`).\n */\n@Component({\n selector: 'app-action-menu',\n imports: [DropdownMenuComponent],\n templateUrl: './action-menu.component.html',\n styleUrl: './action-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class ActionMenuComponent<T = string> {\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\n\n @Input() minWidthPx = 200;\n\n @Input() menuId = '';\n\n /** Texto acessível do botão de gatilho. */\n @Input() triggerLabel = 'Mais ações';\n\n /** O painel não segue a largura do botão (ícone estreito). */\n @Input({ transform: booleanAttribute }) matchTriggerWidth = false;\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n readonly MenuDropdownPlacement = MenuDropdownPlacement;\n}\n","<app-dropdown-menu\r\n class=\"action-menu\"\r\n [items]=\"items\"\r\n [placement]=\"placement\"\r\n [minWidthPx]=\"minWidthPx\"\r\n [matchTriggerWidth]=\"matchTriggerWidth\"\r\n [menuId]=\"menuId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n (openChange)=\"openChange.emit($event)\"\r\n>\r\n <button type=\"button\" class=\"action-menu__trigger\" [attr.aria-label]=\"triggerLabel\">\r\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\r\n </button>\r\n</app-dropdown-menu>\r\n","import { NgClass, NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n TemplateRef,\n booleanAttribute,\n computed,\n inject,\n} from '@angular/core';\nimport {\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n Overlay,\n type ConnectedPosition,\n type ScrollStrategy,\n} from '@angular/cdk/overlay';\nimport { AppThemeService } from '../../theme';\n\n/**\n * Fundação reutilizável para painéis ancorados (tooltip, popover, autocomplete, datepicker, etc.).\n * Usa `CdkConnectedOverlay` + tema da lib.\n *\n * @see `DropdownBaseComponent` — overlay para painéis de **campo** (menus/select): backdrop e fecho por omissão\n * alinhados a esse caso; mantido separado para não quebrar contratos públicos.\n */\n@Component({\n selector: 'app-anchored-overlay',\n imports: [CdkConnectedOverlay, CdkOverlayOrigin, NgClass, NgTemplateOutlet],\n templateUrl: './anchored-overlay.component.html',\n styleUrl: './anchored-overlay.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AnchoredOverlayComponent {\n private readonly appTheme = inject(AppThemeService);\n private readonly overlay = inject(Overlay);\n\n @Input({ transform: booleanAttribute }) open = false;\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n @Input({ required: true }) panelTemplate!: TemplateRef<unknown>;\n\n @Input() connectedPositions: ConnectedPosition[] = [];\n\n @Input({ transform: booleanAttribute }) pushConnectedOverlay = true;\n\n @Input({ transform: booleanAttribute }) hasBackdrop = false;\n\n @Input({ transform: booleanAttribute }) closeOnEscape = true;\n\n /** Fecha ao clicar fora do painel e fora da âncora (popover, dialogs leves). */\n @Input({ transform: booleanAttribute }) closeOnOutsideClick = false;\n\n @Input() panelWidthPx: number | null = null;\n @Input() panelMinWidthPx: number | null = null;\n @Input() panelMaxWidthPx: number | null = null;\n\n /**\n * Estratégia de scroll (predefinição: reposicionar; `close` para fechar ao scroll em certos modais).\n */\n @Input() scrollStrategy: ScrollStrategy | null = null;\n\n readonly overlayPanelClasses = computed((): string[] => [\n ...this.appTheme.themeClassList(),\n 'anchored-overlay__pane',\n ]);\n\n readonly panelThemeNgClass = computed(() => this.appTheme.themeClassMap());\n\n readonly defaultScrollStrategy = this.overlay.scrollStrategies.reposition();\n\n get effectiveScrollStrategy(): ScrollStrategy {\n return this.scrollStrategy ?? this.defaultScrollStrategy;\n }\n\n get overlayWidthCss(): number | string | undefined {\n const w = this.panelWidthPx;\n if (w != null && w > 0) {\n return w;\n }\n return undefined;\n }\n\n get overlayMinWidthCss(): number | string | undefined {\n const w = this.panelMinWidthPx;\n if (w != null && w > 0) {\n return w;\n }\n return undefined;\n }\n\n onBackdropClick(): void {\n this.setOpen(false);\n }\n\n onOverlayOutsideClick(): void {\n if (!this.closeOnOutsideClick) {\n return;\n }\n this.setOpen(false);\n }\n\n onOverlayKeydown(ev: KeyboardEvent): void {\n if (this.closeOnEscape && ev.key === 'Escape') {\n ev.preventDefault();\n this.setOpen(false);\n }\n }\n\n onDetach(): void {\n this.setOpen(false);\n }\n\n setOpen(next: boolean): void {\n if (this.open === next) {\n return;\n }\n this.open = next;\n this.openChange.emit(next);\n }\n}\n","<div class=\"anchored-overlay\">\n <span class=\"anchored-overlay__origin\" cdkOverlayOrigin #anchorOrigin=\"cdkOverlayOrigin\">\n <ng-content />\n </span>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOpen]=\"open\"\n [cdkConnectedOverlayOrigin]=\"anchorOrigin\"\n [cdkConnectedOverlayPositions]=\"connectedPositions\"\n [cdkConnectedOverlayPush]=\"pushConnectedOverlay\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayScrollStrategy]=\"effectiveScrollStrategy\"\n [cdkConnectedOverlayHasBackdrop]=\"hasBackdrop\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayWidth]=\"$any(overlayWidthCss)\"\n [cdkConnectedOverlayMinWidth]=\"$any(overlayMinWidthCss)\"\n [cdkConnectedOverlayDisableClose]=\"false\"\n (backdropClick)=\"onBackdropClick()\"\n (overlayOutsideClick)=\"onOverlayOutsideClick()\"\n (overlayKeydown)=\"onOverlayKeydown($event)\"\n (detach)=\"onDetach()\"\n >\n <div\n class=\"anchored-overlay__surface\"\n [ngClass]=\"panelThemeNgClass()\"\n [style.max-width.px]=\"panelMaxWidthPx != null && panelMaxWidthPx > 0 ? panelMaxWidthPx : null\"\n role=\"presentation\"\n >\n <ng-container [ngTemplateOutlet]=\"panelTemplate\" />\n </div>\n </ng-template>\n</div>\n","/**\r\n * Posição preferencial do painel em relação à âncora (com fallbacks via CDK `push` / ordem de posições).\r\n */\r\nexport enum OverlayPlacement {\r\n Top = 'top',\r\n Bottom = 'bottom',\r\n Left = 'left',\r\n Right = 'right',\r\n}\r\n","import type { ConnectedPosition } from '@angular/cdk/overlay';\r\nimport { OverlayPlacement } from '../_models/overlay-placement.model';\r\n\r\nconst DEFAULT_GAP = 8;\r\n\r\n/**\r\n * Constrói posições CDK para overlay ancorado (tooltip, popover, autocomplete, etc.).\r\n * Inclui alternativas para inverter quando não há espaço (`push` no componente).\r\n *\r\n * Menus dropdown usam {@link menuConnectedPositions} em `menus/_utils` (alinhamento `start`, gap tipicamente menor).\r\n */\r\nexport function anchoredOverlayPositions(\r\n placement: OverlayPlacement,\r\n offsetPx = DEFAULT_GAP,\r\n): ConnectedPosition[] {\r\n const o = offsetPx;\r\n switch (placement) {\r\n case OverlayPlacement.Top:\r\n return [\r\n {\r\n originX: 'center',\r\n originY: 'top',\r\n overlayX: 'center',\r\n overlayY: 'bottom',\r\n offsetY: -o,\r\n },\r\n {\r\n originX: 'center',\r\n originY: 'bottom',\r\n overlayX: 'center',\r\n overlayY: 'top',\r\n offsetY: o,\r\n },\r\n ];\r\n case OverlayPlacement.Bottom:\r\n return [\r\n {\r\n originX: 'center',\r\n originY: 'bottom',\r\n overlayX: 'center',\r\n overlayY: 'top',\r\n offsetY: o,\r\n },\r\n {\r\n originX: 'center',\r\n originY: 'top',\r\n overlayX: 'center',\r\n overlayY: 'bottom',\r\n offsetY: -o,\r\n },\r\n ];\r\n case OverlayPlacement.Left:\r\n return [\r\n {\r\n originX: 'start',\r\n originY: 'center',\r\n overlayX: 'end',\r\n overlayY: 'center',\r\n offsetX: -o,\r\n },\r\n {\r\n originX: 'end',\r\n originY: 'center',\r\n overlayX: 'start',\r\n overlayY: 'center',\r\n offsetX: o,\r\n },\r\n ];\r\n case OverlayPlacement.Right:\r\n return [\r\n {\r\n originX: 'end',\r\n originY: 'center',\r\n overlayX: 'start',\r\n overlayY: 'center',\r\n offsetX: o,\r\n },\r\n {\r\n originX: 'start',\r\n originY: 'center',\r\n overlayX: 'end',\r\n overlayY: 'center',\r\n offsetX: -o,\r\n },\r\n ];\r\n default:\r\n return anchoredOverlayPositions(OverlayPlacement.Bottom, o);\r\n }\r\n}\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n/**\r\n * Marca um `ng-template` como conteúdo do painel do tooltip (em alternativa a `text`).\r\n */\r\n@Directive({\r\n selector: 'ng-template[appTooltipPanel]',\r\n standalone: true,\r\n})\r\nexport class TooltipPanelTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n Input,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { AnchoredOverlayComponent } from '../anchored-overlay/anchored-overlay.component';\r\nimport { OverlayPlacement } from '../_models/overlay-placement.model';\r\nimport { anchoredOverlayPositions } from '../_utils/anchored-overlay-positions.util';\r\nimport { TooltipPanelTemplateDirective } from './tooltip-panel-template.directive';\r\n\r\nlet tooltipSeq = 0;\r\n\r\n/**\r\n * Tooltip ancorado ao conteúdo projectado (trigger).\r\n * — Texto: `text` ou `ng-template` com `appTooltipPanel`.\r\n */\r\n@Component({\n selector: 'app-tooltip',\n imports: [AnchoredOverlayComponent, NgTemplateOutlet],\n templateUrl: './tooltip.component.html',\n styleUrl: './tooltip.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class TooltipComponent {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @Input() text = '';\r\n\r\n @Input() placement: OverlayPlacement = OverlayPlacement.Top;\r\n\r\n @Input() offsetPx = 8;\r\n\r\n @Input() showDelayMs = 200;\r\n @Input() hideDelayMs = 0;\r\n\r\n @Input({ transform: booleanAttribute }) disabled = false;\r\n\r\n @ContentChild(TooltipPanelTemplateDirective)\r\n private readonly panelDirective?: TooltipPanelTemplateDirective;\r\n\r\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\r\n\r\n readonly placementEnum = OverlayPlacement;\r\n\r\n readonly tooltipId = `app-tooltip-${++tooltipSeq}`;\r\n\r\n open = false;\r\n\r\n private showTimer: ReturnType<typeof setTimeout> | null = null;\r\n private hideTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n get panelContentTpl(): TemplateRef<unknown> | null {\r\n return this.panelDirective?.templateRef ?? null;\r\n }\r\n\r\n get positions() {\r\n return anchoredOverlayPositions(this.placement, this.offsetPx);\r\n }\r\n\r\n get describedByWhenOpen(): string | null {\r\n return this.open && !this.disabled ? this.tooltipId : null;\r\n }\r\n\r\n onTriggerMouseEnter(): void {\r\n this.scheduleShow();\r\n }\r\n\r\n onTriggerMouseLeave(): void {\r\n this.scheduleHide();\r\n }\r\n\r\n onTriggerFocusIn(): void {\r\n this.scheduleShow();\r\n }\r\n\r\n onTriggerFocusOut(): void {\r\n this.scheduleHide();\r\n }\r\n\r\n onPanelMouseEnter(): void {\r\n this.cancelHide();\r\n }\r\n\r\n onPanelMouseLeave(): void {\r\n this.scheduleHide();\r\n }\r\n\r\n private scheduleShow(): void {\r\n if (this.disabled) {\r\n return;\r\n }\r\n this.cancelHide();\r\n this.cancelShow();\r\n this.showTimer = setTimeout(() => {\r\n this.showTimer = null;\r\n this.open = true;\r\n this.cdr.markForCheck();\r\n }, this.showDelayMs);\r\n }\r\n\r\n private scheduleHide(): void {\r\n this.cancelShow();\r\n this.cancelHide();\r\n this.hideTimer = setTimeout(() => {\r\n this.hideTimer = null;\r\n this.open = false;\r\n this.cdr.markForCheck();\r\n }, this.hideDelayMs);\r\n }\r\n\r\n private cancelShow(): void {\r\n if (this.showTimer) {\r\n clearTimeout(this.showTimer);\r\n this.showTimer = null;\r\n }\r\n }\r\n\r\n private cancelHide(): void {\r\n if (this.hideTimer) {\r\n clearTimeout(this.hideTimer);\r\n this.hideTimer = null;\r\n }\r\n }\r\n\r\n onAnchoredOpenChange(next: boolean): void {\r\n this.open = next;\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-anchored-overlay\r\n [open]=\"open\"\r\n (openChange)=\"onAnchoredOpenChange($event)\"\r\n [panelTemplate]=\"panelTpl\"\r\n [connectedPositions]=\"positions\"\r\n [pushConnectedOverlay]=\"true\"\r\n [hasBackdrop]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n [closeOnOutsideClick]=\"false\"\r\n>\r\n <span\r\n class=\"tooltip__trigger\"\r\n [attr.aria-describedby]=\"describedByWhenOpen\"\r\n (mouseenter)=\"onTriggerMouseEnter()\"\r\n (mouseleave)=\"onTriggerMouseLeave()\"\r\n (focusin)=\"onTriggerFocusIn()\"\r\n (focusout)=\"onTriggerFocusOut()\"\r\n >\r\n <ng-content />\r\n </span>\r\n</app-anchored-overlay>\r\n\r\n<ng-template #panelTpl>\r\n <div\r\n class=\"tooltip__panel\"\r\n [id]=\"tooltipId\"\r\n role=\"tooltip\"\r\n (mouseenter)=\"onPanelMouseEnter()\"\r\n (mouseleave)=\"onPanelMouseLeave()\"\r\n >\r\n @if (panelContentTpl) {\r\n <ng-container [ngTemplateOutlet]=\"panelContentTpl\" />\r\n } @else {\r\n {{ text }}\r\n }\r\n </div>\r\n</ng-template>\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[appPopoverBody]',\r\n standalone: true,\r\n})\r\nexport class PopoverBodyTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n@Directive({\r\n selector: 'ng-template[appPopoverFooter]',\r\n standalone: true,\r\n})\r\nexport class PopoverFooterTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n TemplateRef,\r\n ViewChild,\r\n booleanAttribute,\r\n inject,\r\n} from '@angular/core';\r\nimport { AnchoredOverlayComponent } from '../anchored-overlay/anchored-overlay.component';\r\nimport { OverlayPlacement } from '../_models/overlay-placement.model';\r\nimport { anchoredOverlayPositions } from '../_utils/anchored-overlay-positions.util';\r\nimport { PopoverBodyTemplateDirective } from './popover-body-template.directive';\r\nimport { PopoverFooterTemplateDirective } from './popover-footer-template.directive';\r\n\r\nlet popoverSeq = 0;\r\n\r\n/**\r\n * Painel flutuante ancorado (ações contextuais, ajuda rica, mini-formulários).\r\n * Conteúdo: `ng-template appPopoverBody` obrigatório; `appPopoverFooter` opcional; trigger com `appPopoverTrigger`.\r\n */\r\n@Component({\n selector: 'app-popover',\n imports: [AnchoredOverlayComponent, NgTemplateOutlet],\n templateUrl: './popover.component.html',\n styleUrl: './popover.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class PopoverComponent {\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n\r\n @Input() title = '';\r\n\r\n /** Modo controlado: `open` + `openChange`. */\r\n @Input({ transform: booleanAttribute }) open = false;\r\n @Output() readonly openChange = new EventEmitter<boolean>();\r\n\r\n @Input() placement: OverlayPlacement = OverlayPlacement.Bottom;\r\n\r\n @Input() offsetPx = 8;\r\n\r\n @Input() minWidthPx = 220;\r\n\r\n @Input() maxWidthPx = 360;\r\n\r\n /** Rótulo acessível quando não há título visível. */\r\n @Input() ariaLabel = '';\r\n\r\n @ContentChild(PopoverBodyTemplateDirective)\r\n readonly bodyDirective?: PopoverBodyTemplateDirective;\r\n\r\n @ContentChild(PopoverFooterTemplateDirective)\r\n readonly footerDirective?: PopoverFooterTemplateDirective;\r\n\r\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\r\n\r\n readonly popoverId = `app-popover-${++popoverSeq}`;\r\n\r\n get bodyTpl(): TemplateRef<unknown> | null {\r\n return this.bodyDirective?.templateRef ?? null;\r\n }\r\n\r\n get footerTpl(): TemplateRef<unknown> | null {\r\n return this.footerDirective?.templateRef ?? null;\r\n }\r\n\r\n get positions() {\r\n return anchoredOverlayPositions(this.placement, this.offsetPx);\r\n }\r\n\r\n get titleId(): string {\r\n return `${this.popoverId}-title`;\r\n }\r\n\r\n get effectiveAriaLabel(): string | null {\r\n return this.ariaLabel?.trim() || this.title?.trim() || null;\r\n }\r\n\r\n onTriggerClick(ev: Event): void {\r\n ev.preventDefault();\r\n ev.stopPropagation();\r\n this.toggle();\r\n }\r\n\r\n toggle(): void {\r\n this.setOpen(!this.open);\r\n }\r\n\r\n /** Sincroniza com `app-anchored-overlay` e notifica o pai (`[(open)]`). */\r\n setOpen(next: boolean): void {\r\n if (this.open === next) {\r\n return;\r\n }\r\n this.openChange.emit(next);\r\n this.cdr.markForCheck();\r\n }\r\n}\r\n","<app-anchored-overlay\r\n [open]=\"open\"\r\n (openChange)=\"setOpen($event)\"\r\n [panelTemplate]=\"panelTpl\"\r\n [connectedPositions]=\"positions\"\r\n [pushConnectedOverlay]=\"true\"\r\n [hasBackdrop]=\"false\"\r\n [closeOnEscape]=\"true\"\r\n [closeOnOutsideClick]=\"true\"\r\n [panelMinWidthPx]=\"minWidthPx\"\r\n [panelMaxWidthPx]=\"maxWidthPx\"\r\n>\r\n <span class=\"popover__trigger-slot\" (click)=\"onTriggerClick($event)\">\r\n <ng-content select=\"[appPopoverTrigger]\" />\r\n </span>\r\n</app-anchored-overlay>\r\n\r\n<ng-template #panelTpl>\r\n <div\r\n class=\"popover__surface\"\r\n role=\"dialog\"\r\n [attr.aria-modal]=\"false\"\r\n [attr.aria-labelledby]=\"title.trim() ? titleId : null\"\r\n [attr.aria-label]=\"!title.trim() ? effectiveAriaLabel : null\"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n @if (title.trim()) {\r\n <header class=\"popover__header\" [id]=\"titleId\">{{ title }}</header>\r\n }\r\n <div class=\"popover__body\">\r\n @if (bodyTpl) {\r\n <ng-container [ngTemplateOutlet]=\"bodyTpl\" />\r\n }\r\n </div>\r\n @if (footerTpl) {\r\n <footer class=\"popover__footer\">\r\n <ng-container [ngTemplateOutlet]=\"footerTpl\" />\r\n </footer>\r\n }\r\n </div>\r\n</ng-template>\r\n","import { Directive } from '@angular/core';\r\n\r\n/** Marca o elemento que abre/fecha o popover ao clicar. */\r\n@Directive({\r\n selector: '[appPopoverTrigger]',\r\n standalone: true,\r\n})\r\nexport class PopoverTriggerDirective {}\r\n","/**\r\n * **Overlay (camada de UI flutuante)**\r\n *\r\n * - **`AnchoredOverlayComponent`**: primitives CDK (`CdkConnectedOverlay`) + tema (`AppThemeService`).\r\n * Usado por **tooltip** e **popover** (comportamento genérico: `open`/`openChange`, Escape, clique fora opcional).\r\n * - **Menus** (`app-dropdown-menu`, campos): usam **`DropdownBaseComponent`** em `fields/dropdown-fields` — contrato\r\n * estável (backdrop, fecho, largura de painel alinhada ao campo); não foi fundido com `AnchoredOverlay` para\r\n * não alterar comportamento dos formulários.\r\n * - **Enums**: `OverlayPlacement` (tooltip/popover, centro do trigger) vs `MenuDropdownPlacement` (menus alinhados\r\n * ao início do trigger, gap menor — ver `menu-connected-positions.util`).\r\n */\r\nexport { AnchoredOverlayComponent } from './anchored-overlay/anchored-overlay.component';\r\nexport { TooltipComponent } from './tooltip/tooltip.component';\r\nexport { TooltipPanelTemplateDirective } from './tooltip/tooltip-panel-template.directive';\r\nexport { PopoverComponent } from './popover/popover.component';\r\nexport { PopoverTriggerDirective } from './popover/popover-trigger.directive';\r\nexport { PopoverBodyTemplateDirective } from './popover/popover-body-template.directive';\r\nexport { PopoverFooterTemplateDirective } from './popover/popover-footer-template.directive';\r\n\r\nexport { OverlayPlacement } from './_models/overlay-placement.model';\r\nexport { anchoredOverlayPositions } from './_utils/anchored-overlay-positions.util';\r\n","/**\r\n * Duração da animação de largura da lateral (`flex-basis` / `width` / `padding`).\r\n * Manter alinhado com `$app-sidebar-layout-duration` em `_sidebar-reveal.scss`.\r\n */\r\nexport const APP_SIDEBAR_LAYOUT_DURATION_MS = 0;\r\n\r\n/** Folga após o layout, antes de revelar rótulos (evita texto a “comprimir”). */\r\nexport const APP_SIDEBAR_LABEL_REVEAL_LAG_MS = 48;\r\n\r\nexport const APP_SIDEBAR_NAV_REVEAL_TOTAL_MS =\r\n APP_SIDEBAR_LAYOUT_DURATION_MS + APP_SIDEBAR_LABEL_REVEAL_LAG_MS;\r\n","import { Directive, TemplateRef, inject } from '@angular/core';\r\n\r\n/**\r\n * Marca o `ng-template` cuja instância é projectada na barra lateral (desktop) e no `app-drawer` (mobile).\r\n *\r\n * ```html\r\n * <app-shell>\r\n * <ng-template appShellSidebar>\r\n * <app-sidebar ... />\r\n * </ng-template>\r\n * ...\r\n * </app-shell>\r\n * ```\r\n */\r\n@Directive({\r\n selector: 'ng-template[appShellSidebar]',\r\n standalone: true,\r\n})\r\nexport class AppShellSidebarTemplateDirective {\r\n readonly templateRef = inject(TemplateRef<unknown>);\r\n}\r\n","import { NgTemplateOutlet } from '@angular/common';\r\nimport { BreakpointObserver } from '@angular/cdk/layout';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ContentChild,\r\n DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n Input,\r\n OnInit,\r\n Output,\r\n Renderer2,\r\n TemplateRef,\r\n booleanAttribute,\r\n effect,\r\n inject,\r\n input,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ADAPTIVE_DATA_VIEW_MOBILE_QUERY } from '../data-display/adaptive-data-view/adaptive-data-view.component';\r\nimport { DrawerComponent } from '../menus/drawer/drawer.component';\r\nimport { DrawerSide } from '../menus/_models/drawer-side.model';\r\nimport { DrawerSize } from '../menus/_models/drawer-size.model';\r\nimport {\r\n applyOptionalThemeHostClasses,\r\n type AppTheme,\r\n type StructraTheme,\r\n} from '../theme';\r\nimport { AppShellSidebarTemplateDirective } from './app-shell-sidebar-template.directive';\r\n\r\n/**\r\n * Estrutura principal: barra lateral, topo e conteúdo. Em mobile a lateral projecta-se no `app-drawer`.\r\n *\r\n * Use `exportAs: 'appShell'` e `toggleMobileNav` / `toggleSidebarCollapsed` a partir da topbar.\r\n *\r\n * Tema no host opcional; sem ele, herda de ancestral com {@link ThemeDirective}.\r\n */\r\n@Component({\r\n selector: 'app-shell',\r\n exportAs: 'appShell',\r\n imports: [NgTemplateOutlet, DrawerComponent],\r\n templateUrl: './app-shell.component.html',\r\n styleUrl: './app-shell.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppShellComponent implements OnInit {\r\n private readonly bp = inject(BreakpointObserver);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly hostEl = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n\r\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\r\n\r\n constructor() {\r\n effect(() => {\r\n applyOptionalThemeHostClasses(\r\n this.renderer,\r\n this.hostEl.nativeElement,\r\n this.appTheme(),\r\n );\r\n });\r\n }\r\n\r\n @ContentChild(AppShellSidebarTemplateDirective)\r\n private readonly sidebarSlot?: AppShellSidebarTemplateDirective;\r\n\r\n /** Conteúdo lateral (obrigatório): `<ng-template appShellSidebar>...</ng-template>`. */\r\n get sidebarTemplate(): TemplateRef<unknown> | null {\r\n return this.sidebarSlot?.templateRef ?? null;\r\n }\r\n\r\n /** Barra lateral estreita (ícones + compressão de texto na lista). */\r\n @Input({ transform: booleanAttribute }) sidebarCollapsed = false;\r\n\r\n @Output() readonly sidebarCollapsedChange = new EventEmitter<boolean>();\r\n\r\n /** Estado do drawer mobile (usar `[(mobileNavOpen)]` para controlar o menu hamburger). */\r\n @Input({ transform: booleanAttribute }) mobileNavOpen = false;\r\n\r\n @Output() readonly mobileNavOpenChange = new EventEmitter<boolean>();\r\n\r\n /** Consulta CDK para modo mobile (por omissão igual à vista adaptativa). */\r\n @Input() mobileLayoutQuery = ADAPTIVE_DATA_VIEW_MOBILE_QUERY;\r\n\r\n isMobileLayout = false;\r\n\r\n readonly DrawerSide = DrawerSide;\r\n readonly DrawerSize = DrawerSize;\r\n\r\n ngOnInit(): void {\r\n this.bp\r\n .observe([this.mobileLayoutQuery])\r\n .pipe(takeUntilDestroyed(this.destroyRef))\r\n .subscribe((state) => {\r\n const next = state.matches;\r\n if (next !== this.isMobileLayout) {\r\n this.isMobileLayout = next;\r\n /**\r\n * Modo «rail» (só ícones) só faz sentido em desktop. No telemóvel o drawer deve mostrar\r\n * rótulos — repõe `sidebarCollapsed` para o pai não manter `compressText` na lista.\r\n */\r\n if (next && this.sidebarCollapsed) {\r\n this.sidebarCollapsedChange.emit(false);\r\n }\r\n if (!next && this.mobileNavOpen) {\r\n this.emitMobileNavOpen(false);\r\n }\r\n this.cdr.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n onMobileDrawerOpenChange(next: boolean): void {\r\n this.emitMobileNavOpen(next);\r\n }\r\n\r\n /** Emite alteração; com `[(mobileNavOpen)]` no pai o `@Input` actualiza o estado do drawer. */\r\n private emitMobileNavOpen(next: boolean): void {\r\n if (this.mobileNavOpen === next) {\r\n return;\r\n }\r\n this.mobileNavOpenChange.emit(next);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n toggleMobileNav(): void {\r\n const next = !this.mobileNavOpen;\r\n if (next && this.sidebarCollapsed) {\r\n this.sidebarCollapsedChange.emit(false);\r\n }\r\n this.emitMobileNavOpen(next);\r\n }\r\n\r\n toggleSidebarCollapsed(): void {\r\n this.sidebarCollapsedChange.emit(!this.sidebarCollapsed);\r\n this.cdr.markForCheck();\r\n }\r\n\r\n closeMobileNav(): void {\r\n if (this.mobileNavOpen) {\r\n this.emitMobileNavOpen(false);\r\n }\r\n }\r\n}\r\n","<div\r\n class=\"app-shell\"\r\n [class.app-shell--mobile]=\"isMobileLayout\"\r\n [class.app-shell--sidebar-collapsed]=\"sidebarCollapsed\"\r\n>\r\n @if (!isMobileLayout && sidebarTemplate) {\r\n <aside class=\"app-shell__sidebar\" aria-label=\"Navegação principal\">\r\n <ng-container [ngTemplateOutlet]=\"sidebarTemplate\" />\r\n </aside>\r\n }\r\n\r\n @if (isMobileLayout && sidebarTemplate) {\r\n <app-drawer\r\n [open]=\"mobileNavOpen\"\r\n (openChange)=\"onMobileDrawerOpenChange($event)\"\r\n [side]=\"DrawerSide.Left\"\r\n [size]=\"DrawerSize.Sm\"\r\n [showCloseButton]=\"true\"\r\n >\r\n <ng-container [ngTemplateOutlet]=\"sidebarTemplate\" />\r\n </app-drawer>\r\n }\r\n\r\n <div class=\"app-shell__main\">\r\n <ng-content select=\"[appShellTopbar]\" />\r\n <main class=\"app-shell__content\">\r\n <ng-content />\r\n </main>\r\n </div>\r\n</div>\r\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n DestroyRef,\n ElementRef,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n Renderer2,\n SimpleChanges,\n afterNextRender,\n booleanAttribute,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { CdkScrollable } from '@angular/cdk/scrolling';\nimport { MenuListComponent } from '../../menus/menu-list/menu-list.component';\nimport {\n applyOptionalThemeHostClasses,\n type AppTheme,\n type StructraTheme,\n} from '../../theme';\nimport type { MenuNodeItem } from '../../menus/_models/menu-item.model';\nimport { APP_SIDEBAR_NAV_REVEAL_TOTAL_MS } from '../sidebar-reveal.constants';\n\n/**\n * Navegação lateral com o mesmo modelo `MenuNodeItem` dos menus da lib (grupos, submenus, teclado).\n * Com `collapsed`, `app-menu-list` usa `compressText`: rótulos de grupo (ex. «Principal») ficam ocultos;\n * itens mostram só ícones com `title` / `aria-label` para acessibilidade.\n *\n * Tema: `[appTheme]` opcional no host; sem ele, herda paleta de um ancestral com {@link ThemeDirective}\n * (ex.: `<div appTheme=\"purple\">`). Com input explícito, aplica as classes no host.\n */\n@Component({\n selector: 'app-sidebar',\n imports: [CdkScrollable, MenuListComponent],\n templateUrl: './sidebar.component.html',\n styleUrl: './sidebar.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class AppSidebarComponent<T extends string = string>\n implements OnChanges, AfterViewInit\n{\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly hostEl = inject(ElementRef<HTMLElement>);\n private readonly renderer = inject(Renderer2);\n\n /** Igual a `[appTheme]` / {@link ThemeDirective}: paleta explícita no host; omitir = herdar / serviço. */\n readonly appTheme = input<StructraTheme | AppTheme | undefined>();\n\n @Input({ required: true }) items!: readonly MenuNodeItem<T>[];\n\n @Input() menuId = 'app-shell-sidebar';\n\n /** Sincronizar com o item de navegação activo (realce persistente). */\n @Input() selectedItemId: T | null = null;\n\n /** Modo estreito: só ícones + `compressText` na lista (rótulos via `title` / `aria-label`). */\n @Input({ transform: booleanAttribute }) collapsed = false;\n\n /** Repassado a {@link MenuListComponent.searchable}: campo de pesquisa na lista da lateral. */\n @Input({ transform: booleanAttribute }) searchable = false;\n\n /**\n * Repassado a {@link MenuListComponent.clickToOpen}: submenus na lateral abrem por **clique** (`true`, omissão)\n * ou por **hover** (`false`).\n */\n @Input() clickToOpen = true;\n\n /**\n * Repassado a {@link MenuListComponent.groupCollapsible}: `false` desactiva expandir/recolher nas secções.\n */\n @Input({ transform: booleanAttribute }) groupCollapsible = true;\n\n /**\n * Repassado a {@link MenuListComponent.groupDefaultExpansion}: omissão de `expanded` nos grupos.\n * Com `'first'` e primeiro grupo `alwaysExpanded`, use `expanded: true` no grupo que deve abrir ao carregar.\n */\n @Input() groupDefaultExpansion: 'all' | 'first' = 'all';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n\n /**\n * Valor efectivo de `compressText` em `app-menu-list`: ao expandir a partir do modo rail,\n * mantém-se comprimido até a animação de largura terminar (evita flicker de texto).\n * Começa em `false` para a primeira pintura com lateral já expandida corresponder ao estado real\n * e o `menu-list` aplicar bem `expanded` nos grupos.\n */\n readonly listCompressText = signal(false);\n\n private listRevealTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n constructor() {\n this.destroyRef.onDestroy(() => this.clearListRevealTimeout());\n effect(() => {\n applyOptionalThemeHostClasses(\n this.renderer,\n this.hostEl.nativeElement,\n this.appTheme(),\n );\n });\n /**\n * CSS global no host (ex. flex utilitários com `!important`) pode sobrepor estilos encapsulados\n * e centrar o grupo marca+botão. `setProperty(..., 'important')` no DOM ganha na cascata.\n */\n afterNextRender(() => this.scheduleSidebarHeadLayoutGuards());\n }\n\n ngAfterViewInit(): void {\n this.scheduleSidebarHeadLayoutGuards();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['selectedItemId'] || changes['items']) {\n this.cdr.markForCheck();\n }\n if (changes['collapsed']) {\n this.scheduleSidebarHeadLayoutGuards();\n }\n\n const collapsedCh = changes['collapsed'];\n if (!collapsedCh) {\n return;\n }\n this.clearListRevealTimeout();\n\n if (collapsedCh.firstChange) {\n this.listCompressText.set(this.collapsed);\n return;\n }\n\n if (this.collapsed) {\n this.listCompressText.set(true);\n return;\n }\n\n this.listCompressText.set(true);\n this.listRevealTimeoutId = setTimeout(() => {\n this.listRevealTimeoutId = null;\n this.listCompressText.set(false);\n }, APP_SIDEBAR_NAV_REVEAL_TOTAL_MS);\n }\n\n private clearListRevealTimeout(): void {\n if (this.listRevealTimeoutId !== null) {\n clearTimeout(this.listRevealTimeoutId);\n this.listRevealTimeoutId = null;\n }\n }\n\n private scheduleSidebarHeadLayoutGuards(): void {\n queueMicrotask(() => this.applySidebarHeadLayoutGuards());\n }\n\n private applySidebarHeadLayoutGuards(): void {\n const root = this.hostEl.nativeElement;\n const head = root.querySelector('[data-app-sidebar-head]') as HTMLElement | null;\n if (!head) {\n return;\n }\n\n head.style.setProperty('flex-direction', 'row', 'important');\n head.style.setProperty('direction', 'ltr', 'important');\n\n if (this.collapsed) {\n head.style.setProperty('justify-content', 'center', 'important');\n } else {\n head.style.setProperty('justify-content', 'flex-start', 'important');\n }\n\n const brand = root.querySelector('.app-sidebar__brand') as HTMLElement | null;\n if (brand) {\n /** Colapsado: não forçar `display:flex` — isso anulava o `display:none` do modo rail no SCSS. */\n if (this.collapsed) {\n brand.style.setProperty('display', 'none', 'important');\n } else {\n brand.style.setProperty('display', 'flex', 'important');\n /** Reforço flex: evita consumidores/utilitários a empurrarem o título para a direita. */\n brand.style.setProperty('flex', '1 1 0%', 'important');\n brand.style.setProperty('min-width', '0', 'important');\n }\n brand.style.setProperty('text-align', 'start', 'important');\n brand.style.setProperty('justify-content', 'flex-start', 'important');\n brand.style.setProperty('align-items', 'center', 'important');\n }\n\n /** Projectado com `[appSidebarBrand]`: Tailwind (`ms-auto`, `justify-end`) ganha em prod sem isto. */\n const brandSlot = root.querySelector('[appSidebarBrand]') as HTMLElement | null;\n if (brandSlot && !this.collapsed) {\n brandSlot.style.setProperty('display', 'inline-flex', 'important');\n brandSlot.style.setProperty('justify-content', 'flex-start', 'important');\n brandSlot.style.setProperty('align-items', 'center', 'important');\n brandSlot.style.setProperty('align-self', 'flex-start', 'important');\n brandSlot.style.setProperty('margin-inline-start', '0', 'important');\n brandSlot.style.setProperty('margin-inline-end', 'auto', 'important');\n brandSlot.style.setProperty('text-align', 'start', 'important');\n brandSlot.style.setProperty('width', 'auto', 'important');\n brandSlot.style.setProperty('max-width', '100%', 'important');\n brandSlot.style.setProperty('flex', '1 1 0%', 'important');\n brandSlot.style.setProperty('min-width', '0', 'important');\n }\n\n const toolbar = root.querySelector('.app-sidebar__toolbar') as HTMLElement | null;\n if (!toolbar || toolbar.children.length === 0) {\n return;\n }\n\n if (this.collapsed) {\n toolbar.style.setProperty('margin-inline-start', '0', 'important');\n } else {\n toolbar.style.setProperty('margin-inline-start', 'auto', 'important');\n }\n }\n}\n","<nav class=\"app-sidebar app-nav-surface\" [class.app-sidebar--collapsed]=\"collapsed\"\r\n [attr.aria-label]=\"'Navegação principal'\">\r\n <div class=\"app-sidebar__head\" data-app-sidebar-head=\"\" translate=\"no\">\r\n <div class=\"app-sidebar__brand\"><ng-content select=\"[appSidebarBrand]\" /></div>\r\n <div class=\"app-sidebar__toolbar\"><ng-content select=\"[appSidebarToolbar]\" /></div>\r\n </div>\r\n <!-- `cdkScrollable` no elemento nativo que faz overflow — o CDK reposiciona submenus ao scroll (custom elements como host falhavam). -->\r\n <div class=\"app-sidebar__scroll\" cdkScrollable>\r\n <app-menu-list\r\n class=\"app-sidebar__list\"\r\n [appTheme]=\"appTheme()\"\r\n [items]=\"items\"\r\n [menuId]=\"menuId\"\r\n [dense]=\"collapsed\"\r\n [compressText]=\"listCompressText()\"\r\n [searchable]=\"searchable\"\r\n [clickToOpen]=\"clickToOpen\"\r\n [groupCollapsible]=\"groupCollapsible\"\r\n [groupDefaultExpansion]=\"groupDefaultExpansion\"\r\n [selectedItemId]=\"selectedItemId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n />\r\n </div>\r\n</nav>\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marca **só** o botão recolher/expandir no topo da sidebar (slot direito).\r\n * O **título/marca** deve usar `[appSidebarBrand]` como irmão — não envolver título + toggle num único\r\n * `[appSidebarToolbar]`: no drawer mobile do `app-shell` isso pode esconder o título ou criar layout estranho.\r\n *\r\n * ```html\r\n * <app-sidebar [items]=\"nav\">\r\n * <span appSidebarBrand>Minha aplicação</span>\r\n * <app-shell-sidebar-toggle appSidebarToolbar [collapsed]=\"collapsed\" (toggle)=\"onToggle()\" />\r\n * </app-sidebar>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[appSidebarToolbar]',\r\n standalone: true,\r\n})\r\nexport class AppSidebarToolbarDirective {}\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marca o título no topo da lateral: **na mesma linha** que o botão recolher (à esquerda);\r\n * oculto no modo rail (só ícones).\r\n *\r\n * **Importante:** o título **tem** de usar `[appSidebarBrand]` no próprio nó de texto (ou wrapper só da marca).\r\n * Não dependa só de um `span` dentro de um `div [appSidebarToolbar]` — em mobile o drawer só oculta o toggle,\r\n * mas o padrão correcto é marca + toolbar como **irmãos** projectados (evita cabeçalho vazio se o CSS do host mudar).\r\n *\r\n * ```html\r\n * <app-sidebar [items]=\"nav\">\r\n * <span appSidebarBrand>Minha aplicação</span>\r\n * <app-shell-sidebar-toggle appSidebarToolbar … />\r\n * </app-sidebar>\r\n * ```\r\n */\r\n@Directive({\r\n selector: '[appSidebarBrand]',\r\n standalone: true,\r\n})\r\nexport class AppSidebarBrandDirective {}\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n Output,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Botão só ícone (setas «abrir/fechar») para recolher/expandir a largura da lateral.\r\n * Na demo, usar com `appSidebarToolbar` projectado em `app-sidebar`.\r\n */\r\n@Component({\r\n selector: 'app-shell-sidebar-toggle',\r\n standalone: true,\r\n templateUrl: './shell-sidebar-toggle.component.html',\r\n styleUrl: './shell-sidebar-toggle.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppShellSidebarToggleComponent {\r\n /** `true` quando a lateral está estreita / recolhida. */\r\n @Input({ transform: booleanAttribute }) collapsed = false;\r\n\r\n /** Rótulos acessíveis quando `collapsed` é `true` (accção: expandir). */\r\n @Input() expandLabel = 'Expandir navegação';\r\n\r\n /** Rótulos quando `collapsed` é `false` (accção: recolher). */\r\n @Input() collapseLabel = 'Recolher navegação';\r\n\r\n @Output() readonly toggle = new EventEmitter<void>();\r\n\r\n onClick(): void {\r\n this.toggle.emit();\r\n }\r\n}\r\n","<button\r\n type=\"button\"\r\n class=\"app-shell-sidebar-toggle__btn\"\r\n [attr.aria-pressed]=\"collapsed\"\r\n [attr.aria-expanded]=\"!collapsed\"\r\n [attr.aria-label]=\"collapsed ? expandLabel : collapseLabel\"\r\n [attr.title]=\"collapsed ? expandLabel : collapseLabel\"\r\n (click)=\"onClick()\"\r\n>\r\n <i\r\n class=\"fa-solid\"\r\n [class.fa-angles-left]=\"!collapsed\"\r\n [class.fa-angles-right]=\"collapsed\"\r\n aria-hidden=\"true\"\r\n ></i>\r\n</button>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n/**\r\n * Barra superior com três zonas de projeção: início (ex.: menu), título, fim (ex.: usuário).\r\n */\r\n@Component({\r\n selector: 'app-topbar',\r\n standalone: true,\r\n templateUrl: './topbar.component.html',\r\n styleUrl: './topbar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AppTopbarComponent {}\r\n","<div class=\"app-topbar\" role=\"banner\">\r\n <div class=\"app-topbar__start\">\r\n <ng-content select=\"[appTopbarStart]\" />\r\n </div>\r\n <div class=\"app-topbar__title\">\r\n <ng-content select=\"[appTopbarTitle]\" />\r\n </div>\r\n <div class=\"app-topbar__end\">\r\n <ng-content select=\"[appTopbarEnd]\" />\r\n </div>\r\n</div>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n EventEmitter,\n Input,\n Output,\n booleanAttribute,\n} from '@angular/core';\nimport { DropdownMenuComponent } from '../../menus/dropdown-menu/dropdown-menu.component';\nimport { MenuDropdownPlacement } from '../../menus/_models/menu-dropdown-placement.model';\nimport type { MenuNodeItem } from '../../menus/_models/menu-item.model';\n\n/**\n * Menu do usuário: `app-dropdown-menu` com gatilho personalizado (avatar ou ícone).\n */\n@Component({\n selector: 'app-user-menu',\n imports: [DropdownMenuComponent],\n templateUrl: './user-menu.component.html',\n styleUrl: './user-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class AppUserMenuComponent<T extends string = string> {\n @Input({ required: true }) items!: readonly MenuNodeItem<T>[];\n\n @Input() menuId = 'app-user-menu';\n\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\n\n @Input() minWidthPx = 220;\n\n /** Texto junto ao avatar (oculto em ecrãs muito estreitos via CSS). */\n @Input() displayName = '';\n\n /** URL de imagem para avatar; sem valor usa ícone genérico. */\n @Input() avatarUrl = '';\n\n @Input() triggerLabel = 'Menu do usuário';\n\n @Input({ transform: booleanAttribute }) showName = true;\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n readonly MenuDropdownPlacement = MenuDropdownPlacement;\n}\n","<app-dropdown-menu\r\n class=\"user-menu__dropdown\"\r\n [items]=\"items\"\r\n [placement]=\"placement\"\r\n [minWidthPx]=\"minWidthPx\"\r\n [matchTriggerWidth]=\"false\"\r\n [menuId]=\"menuId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n (openChange)=\"openChange.emit($event)\"\r\n>\r\n <button type=\"button\" class=\"user-menu__trigger\" [attr.aria-label]=\"triggerLabel\">\r\n @if (avatarUrl.trim()) {\r\n <img class=\"user-menu__avatar\" [src]=\"avatarUrl\" alt=\"\" width=\"32\" height=\"32\" />\r\n } @else {\r\n <span class=\"user-menu__avatar-fallback\" aria-hidden=\"true\">\r\n <i class=\"fa-solid fa-user\"></i>\r\n </span>\r\n }\r\n @if (showName && displayName.trim()) {\r\n <span class=\"user-menu__name\">{{ displayName }}</span>\r\n }\r\n </button>\r\n</app-dropdown-menu>\r\n","import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\r\nimport { RouterLink } from '@angular/router';\r\nimport type { BreadcrumbItem } from '../_models/breadcrumb-item.model';\r\n\r\n/**\r\n * Filo hierárquico com `nav` + lista ordenada; último segmento com `aria-current=\"page\"`.\r\n */\r\n@Component({\n selector: 'app-breadcrumb',\n imports: [RouterLink],\n templateUrl: './breadcrumb.component.html',\n styleUrl: './breadcrumb.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class AppBreadcrumbComponent {\r\n @Input({ required: true }) items!: readonly BreadcrumbItem[];\r\n}\r\n","@if (items.length) {\r\n <nav class=\"app-breadcrumb\" aria-label=\"Navegação em filo\">\r\n <ol class=\"app-breadcrumb__list\">\r\n @for (item of items; track $index; let last = $last) {\r\n <li class=\"app-breadcrumb__item\" [class.app-breadcrumb__item--current]=\"last\">\r\n @if (last) {\r\n <span class=\"app-breadcrumb__text app-breadcrumb__text--current\" aria-current=\"page\">\r\n {{ item.label }}\r\n </span>\r\n } @else if (item.route != null) {\r\n <a class=\"app-breadcrumb__link\" [routerLink]=\"$any(item.route)\">{{ item.label }}</a>\r\n <span class=\"app-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n } @else if (item.href?.trim()) {\r\n <a class=\"app-breadcrumb__link\" [href]=\"item.href!.trim()\">{{ item.label }}</a>\r\n <span class=\"app-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n } @else {\r\n <span class=\"app-breadcrumb__text\">{{ item.label }}</span>\r\n <span class=\"app-breadcrumb__sep\" aria-hidden=\"true\">/</span>\r\n }\r\n </li>\r\n }\r\n </ol>\r\n </nav>\r\n}\r\n","/**\r\n * **App Shell & Navigation** — estrutura de aplicação (barra lateral, topo, filo, usuário).\r\n *\r\n * - **`AppShellComponent`**: grade principal; em viewports estreitos a sidebar projeta-se em `app-drawer` (`menus/`).\r\n * - **`AppSidebarComponent`**: delega em `app-menu-list` (`MenuNodeItem`, teclado, submenus); `[appSidebarToolbar]` + **`AppShellSidebarToggleComponent`** no topo (recolher).\r\n * - **`AppTopbarComponent`**: projeção por zonas (`appTopbarStart` / `appTopbarTitle` / `appTopbarEnd`).\r\n * - **`AppUserMenuComponent`**: `app-dropdown-menu` com gatilho avatar/nome (sem menu duplicado).\r\n * - **`AppBreadcrumbComponent`**: `nav` + lista; segmentos com `route` ou `href`.\r\n */\r\nexport {\r\n APP_SIDEBAR_LAYOUT_DURATION_MS,\r\n APP_SIDEBAR_LABEL_REVEAL_LAG_MS,\r\n APP_SIDEBAR_NAV_REVEAL_TOTAL_MS,\r\n} from './sidebar-reveal.constants';\r\nexport { AppShellComponent } from './app-shell.component';\r\nexport { AppShellSidebarTemplateDirective } from './app-shell-sidebar-template.directive';\r\nexport { AppSidebarComponent } from './sidebar/sidebar.component';\r\nexport { AppSidebarToolbarDirective } from './sidebar/app-sidebar-toolbar.directive';\r\nexport { AppSidebarBrandDirective } from './sidebar/app-sidebar-brand.directive';\r\nexport { AppShellSidebarToggleComponent } from './sidebar/shell-sidebar-toggle.component';\r\nexport { AppTopbarComponent } from './topbar/topbar.component';\r\nexport { AppUserMenuComponent } from './user-menu/user-menu.component';\r\nexport { AppBreadcrumbComponent } from './breadcrumb/breadcrumb.component';\r\nexport type { BreadcrumbItem } from './_models/breadcrumb-item.model';\r\n","/**\n * Entrada do pacote npm `structra-ui` (ng-packagr).\n * Mantém `rootDir` em `src/` para compilar a árvore de imports sem erros NG3004.\n */\n\nexport { STRUCTRA_UI } from './structra-version';\n\nexport * from './app/alert';\nexport * from './app/buttons';\nexport * from './app/fields/input-fields';\nexport * from './app/fields/checkbox-fields';\nexport * from './app/fields/dropdown-fields';\nexport * from './app/fields/file-upload-fields';\nexport * from './app/form-layout';\nexport * from './app/loading/skeleton-loading';\nexport * from './app/data-display';\nexport * from './app/dialogs';\nexport * from './app/menus';\nexport * from './app/overlay';\nexport * from './app/app-shell';\nexport * from './app/theme';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './structra-public-api';\n"],"names":["i1.AppThemeService","i1","UI_REQUEST_EXPAND_FORM_GROUP","i2"],"mappings":"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"}