structra-ui 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/structra-ui.mjs +418 -246
- package/fesm2022/structra-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/structra-ui.d.ts +96 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structra-ui.mjs","sources":["../../../src/structra-version.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/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/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/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/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.component.ts","../../../src/app/menus/menu-list/menu-list.component.html","../../../src/app/menus/_utils/menu-connected-positions.util.ts","../../../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/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/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} 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/** Mantido por compatibilidade; o layout do skeleton é único para todos os campos. */\r\nexport type SkeletonFieldShellVariant = 'text' | 'select';\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({\n selector: 'app-skeleton-field-shell',\n imports: [SkeletonBlockComponent],\n templateUrl: './skeleton-field-shell.component.html',\n styleUrl: './skeleton-field-shell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\r\nexport class SkeletonFieldShellComponent {\r\n /** @deprecated Ignorado: todos os campos usam o mesmo layout. */\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 class=\"skeleton-field-shell\" [class.skeleton-field-shell--bar-only]=\"!showLeadingIcon\" aria-hidden=\"true\">\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 <app-skeleton-block class=\"skeleton-field-shell__value\" width=\"100%\" height=\"1.35em\" radius=\"6px\"\r\n [animate]=\"animate\" />\r\n</div>\r\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostBinding,\n Input,\n ViewChild,\n booleanAttribute,\n} from '@angular/core';\nimport { SkeletonBlockComponent } from '../../loading/skeleton-loading';\n\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: [SkeletonBlockComponent],\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 /** Placeholder de carregamento (skeleton no lugar do rótulo). */\n @Input({ transform: booleanAttribute }) loading = false;\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","@if (!loading) {\r\n<button\r\n #nativeBtn\r\n class=\"base-button__native\"\r\n [attr.type]=\"type\"\r\n [disabled]=\"disabled || readonly\"\r\n [attr.aria-readonly]=\"readonly ? true : null\"\r\n>\r\n <ng-content />\r\n</button>\r\n} @else {\r\n<div class=\"base-button__native base-button__native--skeleton\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\"\r\n aria-label=\"A carregar\">\r\n <app-skeleton-block width=\"40%\" height=\"0.7rem\" radius=\"8px\" />\r\n</div>\r\n}\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { SkeletonBlockComponent } from '../../loading/skeleton-loading';\r\nimport { BaseButtonComponent } from '../base-button/base-button.component';\r\n\r\n/**\r\n * Botão público da library (`app-button`). Comportamento e API iguais a {@link BaseButtonComponent};\r\n * use sempre este componente em templates — a base permanece interna ao pacote.\r\n */\r\n@Component({\r\n selector: 'app-button',\r\n standalone: true,\r\n imports: [SkeletonBlockComponent],\r\n templateUrl: '../base-button/base-button.component.html',\r\n styleUrl: '../base-button/base-button.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ButtonComponent extends BaseButtonComponent {}\r\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';\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 @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 @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 * 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","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, inject } from '@angular/core';\r\nimport { AppTheme } from './app-theme.service';\r\nimport { APP_THEME_BASE_CLASS, getThemeTokenClass } 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 elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n\r\n private readonly themeTokenClasses = STRUCTRA_THEME_IDS.map((themeId) => `theme-${themeId}`);\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 }\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 type ConnectedPosition,\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\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 * `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 [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 { 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 {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Cabeçalho opcional de grupo — alinhado a `MenuItemGroup` (`kind: 'group'`).\r\n * Os itens do grupo continuam a ser renderizados pelo `menu-list` (renderização única).\r\n */\r\n@Component({\r\n selector: 'app-menu-group',\r\n standalone: true,\r\n template: `\r\n @if (label?.trim() && !hideLabel) {\r\n <div class=\"menu-list__group-label\" role=\"presentation\">{{ label }}</div>\r\n }\r\n `,\r\n styleUrl: './menu-group.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MenuGroupComponent {\r\n @Input() label?: string;\r\n\r\n /** Quando `true`, não mostra o título (ex.: sidebar colapsada só com ícones). */\r\n @Input({ transform: booleanAttribute }) hideLabel = false;\r\n}\r\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}\n\nexport interface MenuRowDivider {\n kind: 'divider';\n}\n\nexport interface MenuRowGroup {\n kind: 'group';\n label?: string;\n}\n\nexport interface MenuRowSubmenu<T = string> {\n kind: 'submenu';\n item: MenuItemSubmenu<T>;\n focusIndex: 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\n const addLeaf = (leaf: MenuLeafItem<T>): void => {\n if (leaf.kind === 'divider') {\n rows.push({ kind: 'divider' });\n return;\n }\n const focusIndex = leaf.disabled ? null : focusCounter++;\n rows.push({ kind: 'action', item: leaf, focusIndex });\n };\n\n const addNode = (n: MenuNodeItem<T>): void => {\n if (n.kind === 'divider') {\n rows.push({ kind: 'divider' });\n return;\n }\n if (n.kind === 'submenu') {\n const focusIndex = n.disabled ? null : focusCounter++;\n rows.push({ kind: 'submenu', item: n, focusIndex });\n return;\n }\n if (n.kind === 'group') {\n rows.push({ kind: 'group', label: n.label });\n for (const child of n.items) {\n addNode(child);\n }\n return;\n }\n addLeaf(n);\n };\n\n for (const n of nodes) {\n addNode(n);\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 SimpleChanges,\n ViewChildren,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n} from '@angular/core';\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport type { MenuItemAction, MenuNodeItem } from '../_models/menu-item.model';\nimport { AppThemeService } from '../../theme';\nimport { MenuDividerComponent } from '../menu-divider/menu-divider.component';\nimport { MenuGroupComponent } from '../menu-group/menu-group.component';\nimport {\n type MenuRow,\n buildMenuRows,\n focusableActionCount,\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',\n templateUrl: './menu-list.component.html',\n styleUrl: './menu-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n forwardRef(() => MenuListComponent),\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n MenuDividerComponent,\n MenuGroupComponent,\n ]\n})\nexport class MenuListComponent<T = string> implements OnChanges {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly appTheme = inject(AppThemeService);\n readonly hostRef = inject(ElementRef<HTMLElement>);\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 @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly closeRequest = new EventEmitter<void>();\n @Output() readonly submenuBack = new EventEmitter<void>();\n\n @ViewChildren(MenuListComponent)\n private nestedLists?: QueryList<MenuListComponent<T>>;\n\n rows: MenuRow<T>[] = [];\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(() => this.appTheme.themeClassMap());\n\n overlayPanelClasses(): string[] {\n return [...this.appTheme.themeClassList(), 'menu-submenu__cdk-panel'];\n }\n\n onNestedItemSelect(id: T): void {\n this.closeOpenSubmenu();\n this.itemSelect.emit(id);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['items']) {\n this.rows = buildMenuRows(this.items ?? []);\n this.focusableCount = focusableActionCount(this.rows);\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = -1;\n }\n }\n if (\n changes['selectedItemId'] ||\n changes['items'] ||\n changes['compressText'] ||\n changes['dense'] ||\n changes['menuId']\n ) {\n this.cdr.markForCheck();\n }\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 onSubmenuTriggerEnter(row: MenuRow<T>, index: number): void {\n if (row.kind !== 'submenu' || row.item.disabled) {\n return;\n }\n this.cancelSubmenuCloseTimer();\n this.cancelSubmenuOpenTimer();\n if (row.focusIndex !== null) {\n this.activeIndex = row.focusIndex;\n }\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 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.rows[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 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.rows[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 @HostListener('keydown', ['$event'])\n onKeydown(ev: KeyboardEvent): void {\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.rows.length; i++) {\n const r = this.rows[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.rows.length; i++) {\n const r = this.rows[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\n class=\"menu-list\"\n [class.menu-list--dense]=\"dense\"\n [class.menu-list--compress-text]=\"compressText\"\n role=\"menu\"\n [attr.aria-labelledby]=\"null\"\n tabindex=\"-1\"\n (mouseleave)=\"onMenuSurfaceLeave()\"\n>\n @for (row of rows; track idx; let idx = $index) {\n @switch (row.kind) {\n @case ('divider') {\n <app-menu-divider />\n }\n @case ('group') {\n <app-menu-group [label]=\"row.label\" [hideLabel]=\"compressText\" />\n }\n @case ('submenu') {\n <div\n class=\"menu-list__submenu-wrap\"\n cdkOverlayOrigin\n #subOrigin=\"cdkOverlayOrigin\"\n (mouseenter)=\"onSubmenuTriggerEnter(row, idx)\"\n (mouseleave)=\"onSubmenuTriggerLeave(row, idx)\"\n >\n <div\n class=\"menu-list__option menu-list__option--submenu\"\n role=\"menuitem\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-expanded]=\"isSubmenuOpen(row, idx)\"\n [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\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onSubmenuRowClick($event, row, idx)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\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\">›</span>\n </div>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"subOrigin\"\n [cdkConnectedOverlayOpen]=\"isSubmenuOpen(row, idx)\"\n [cdkConnectedOverlayPositions]=\"submenuPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayMinWidth]=\"200\"\n (overlayOutsideClick)=\"onSubmenuOutsideClick(row, idx)\"\n >\n <div\n class=\"menu-submenu__panel\"\n [ngClass]=\"panelThemeNgClass()\"\n (mouseenter)=\"onSubmenuPanelEnter()\"\n (mouseleave)=\"onSubmenuPanelLeave(row, idx)\"\n (click)=\"$event.stopPropagation()\"\n >\n <app-menu-list\n [items]=\"row.item.items\"\n [menuId]=\"submenuMenuId(row)\"\n [nested]=\"true\"\n [dense]=\"dense\"\n [compressText]=\"compressText\"\n [selectedItemId]=\"selectedItemId\"\n (itemSelect)=\"onNestedItemSelect($event)\"\n (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"closeOpenSubmenu()\"\n />\n </div>\n </ng-template>\n </div>\n }\n @case ('action') {\n <div\n class=\"menu-list__option\"\n role=\"menuitem\"\n [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\"\n [attr.aria-busy]=\"row.item.loading ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--loading]=\"row.item.loading\"\n [class.menu-list__option--danger]=\"row.item.danger\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onItemClick($event, row.item)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\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","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 {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n TemplateRef,\n ViewChild,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { DropdownBaseComponent } from '../../fields/dropdown-fields/_base/dropdown-base/dropdown-base.component';\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\nimport { MenuListComponent } from '../menu-list/menu-list.component';\nimport { menuConnectedPositions } from '../_utils/menu-connected-positions.util';\n\n@Component({\n selector: 'app-dropdown-menu',\n imports: [DropdownBaseComponent, MenuListComponent],\n templateUrl: './dropdown-menu.component.html',\n styleUrl: './dropdown-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DropdownMenuComponent<T = string> {\n private readonly host = inject(ElementRef<HTMLElement>);\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\n\n /** Largura mínima do painel em px (o painel pode alargar ao conteúdo). */\n @Input() minWidthPx = 200;\n\n /** Se `true`, a largura do painel segue a do trigger. */\n @Input({ transform: booleanAttribute }) matchTriggerWidth = true;\n\n @Input() menuId = '';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\n @ViewChild(MenuListComponent) private menuList?: MenuListComponent<T>;\n\n open = false;\n\n private readonly generatedId = `app-dd-${Math.random().toString(36).slice(2, 9)}`;\n\n get resolvedMenuId(): string {\n return this.menuId.trim() || this.generatedId;\n }\n\n /** Largura do painel no overlay (mínimo garantido; pode igualar ao trigger). */\n get effectivePanelWidth(): number {\n if (this.matchTriggerWidth) {\n const w = this.host.nativeElement.getBoundingClientRect().width;\n return Math.max(this.minWidthPx, Math.ceil(w));\n }\n return this.minWidthPx;\n }\n\n get connectedPositions() {\n return menuConnectedPositions(this.placement);\n }\n\n onTriggerClick(ev: Event): void {\n ev.preventDefault();\n this.toggle();\n }\n\n toggle(): void {\n this.setOpen(!this.open);\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 if (next) {\n queueMicrotask(() => this.menuList?.resetHighlight());\n }\n }\n\n onBaseOpenChange(next: boolean): void {\n if (this.open === next) {\n return;\n }\n this.open = next;\n this.openChange.emit(next);\n if (next) {\n queueMicrotask(() => this.menuList?.resetHighlight());\n }\n }\n\n onItemSelect(id: T): void {\n this.itemSelect.emit(id);\n this.setOpen(false);\n }\n\n onCloseRequest(): void {\n this.setOpen(false);\n }\n}\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\r\n [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\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';\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 @Input() filled = false;\n @Input() disabled = false;\n @Input() readonly = false;\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--invalid]=\"invalid\" [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 @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\">×</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 ChangeDetectionStrategy,\r\n Component,\r\n forwardRef,\r\n Input,\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({\n selector: 'app-text-field',\n imports: [BaseFieldComponent],\n templateUrl: './text-field.component.html',\n styleUrl: './text-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class TextFieldComponent extends NgControlFieldDirective<string | null> {\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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n OnInit,\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 OnInit\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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 ChangeDetectionStrategy,\r\n Component,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n SimpleChanges,\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({\n selector: 'app-textarea-field',\n imports: [BaseFieldComponent],\n templateUrl: './textarea-field.component.html',\n styleUrl: './textarea-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => TextareaFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class TextareaFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements OnChanges, OnInit\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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 ChangeDetectionStrategy,\r\n Component,\r\n Input,\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({\n selector: 'app-integer-field',\n imports: [BaseFieldComponent],\n templateUrl: './integer-field.component.html',\n styleUrl: './integer-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => IntegerFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class IntegerFieldComponent extends NgControlFieldDirective<number | null> {\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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 ChangeDetectionStrategy,\r\n Component,\r\n Input,\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({\n selector: 'app-decimal-field',\n imports: [BaseFieldComponent],\n templateUrl: './decimal-field.component.html',\n styleUrl: './decimal-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DecimalFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class DecimalFieldComponent extends NgControlFieldDirective<number | null> {\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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 ChangeDetectionStrategy,\r\n Component,\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({\n selector: 'app-date-field',\n imports: [\n BaseFieldComponent,\n FormsModule,\n MatDatepickerModule,\n MatInputModule,\n MatNativeDateModule,\n ],\n templateUrl: './date-field.component.html',\n styleUrl: './date-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DateFieldComponent),\n multi: true,\n },\n { provide: MAT_DATE_LOCALE, useValue: 'pt-BR' },\n ]\n})\r\nexport class DateFieldComponent\r\n extends NgControlFieldDirective<string | null>\r\n implements OnChanges\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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 { Directive, Input } 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 extends NgControlFieldDirective<\r\n string | null\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 /**\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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\"\n [invalid]=\"uiInvalid\" [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 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 ChangeDetectionStrategy,\r\n Component,\r\n forwardRef,\r\n HostBinding,\r\n Input,\r\n booleanAttribute,\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 extends BooleanFieldDirective {\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 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 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 ChangeDetectionStrategy,\r\n Component,\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({\n selector: 'app-switch-field',\n imports: [SkeletonBlockComponent],\n templateUrl: './switch-field.component.html',\n styleUrl: './switch-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SwitchFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class SwitchFieldComponent extends BooleanFieldDirective {\r\n get labelId(): string {\r\n return `${this.controlId}-switch-label`;\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 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 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({\n selector: 'app-select-field',\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\n templateUrl: './select-field.component.html',\n styleUrl: './select-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SelectFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class SelectFieldComponent\r\n extends DropdownOptionFieldBase\r\n implements 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 panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\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 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 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({\n selector: 'app-multiselect-field',\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\n templateUrl: './multiselect-field.component.html',\n styleUrl: './multiselect-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => MultiselectFieldComponent),\n multi: true,\n },\n ]\n})\r\nexport class MultiselectFieldComponent\r\n extends DropdownMultiOptionFieldBase\r\n implements 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 panelOpen = false;\r\n panelOverlayWidth = 0;\r\n private scrollLoadTimer: ReturnType<typeof setTimeout> | null = null;\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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\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 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 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({\n selector: 'app-dropdown-search-field',\n imports: [BaseFieldComponent, DropdownBaseComponent, SkeletonListComponent],\n templateUrl: './dropdown-search-field.component.html',\n styleUrl: './dropdown-search-field.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DropdownSearchFieldComponent),\n multi: true,\n },\n ]\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 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 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 [loading]=\"loading\"\n [errorMessage]=\"uiErrorMessage\" [required]=\"uiRequiredEffective\" [showRequiredMark]=\"showRequiredMark\" [invalid]=\"uiInvalid\"\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 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\">×</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\">×</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\">×</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 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 { 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: [],\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 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 @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 @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) {\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) {\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) {\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) {\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--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 <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 @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 < `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 < `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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n booleanAttribute,\n computed,\n inject,\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 { AppThemeService } 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 = inject(Overlay);\n private readonly vcr = inject(ViewContainerRef);\n private readonly appTheme = inject(AppThemeService);\n private readonly cdr = inject(ChangeDetectorRef);\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(() => this.appTheme.themeClassMap());\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: [...this.appTheme.themeClassList()],\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 [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\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 SimpleChanges,\n ViewChild,\n afterNextRender,\n booleanAttribute,\n inject,\n} from '@angular/core';\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\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 /** 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 class=\"app-drawer__header\">\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\">×</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 EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnInit,\r\n Output,\r\n TemplateRef,\r\n booleanAttribute,\r\n inject,\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 { AppThemeService } 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@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 theme = inject(AppThemeService);\r\n\r\n @HostBinding('class')\r\n protected get hostThemeClasses(): string {\r\n return this.theme.getTheme();\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 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 this.emitMobileNavOpen(!this.mobileNavOpen);\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 title=\"Navegação\"\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 {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n booleanAttribute,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\nimport { MenuListComponent } from '../../menus/menu-list/menu-list.component';\r\nimport { AppThemeService } from '../../theme';\r\nimport type { MenuNodeItem } from '../../menus/_models/menu-item.model';\r\nimport { APP_SIDEBAR_NAV_REVEAL_TOTAL_MS } from '../sidebar-reveal.constants';\r\n\r\n/**\r\n * Navegação lateral com o mesmo modelo `MenuNodeItem` dos menus da lib (grupos, submenus, teclado).\r\n * Com `collapsed`, `app-menu-list` usa `compressText`: rótulos de grupo (ex. «Principal») ficam ocultos;\r\n * itens mostram só ícones com `title` / `aria-label` para acessibilidade.\r\n */\r\n@Component({\r\n selector: 'app-sidebar',\r\n imports: [MenuListComponent],\r\n templateUrl: './sidebar.component.html',\r\n styleUrl: './sidebar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class AppSidebarComponent<T extends string = string> implements OnChanges {\r\n private readonly theme = inject(AppThemeService);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Garante `.app-library-theme` + `theme-*` no host para tokens `--app-color-nav-*` e lista\r\n * herdarem a paleta activa (útil fora da demo ou sem antepassado tematizado).\r\n */\r\n @HostBinding('class')\r\n protected get hostThemeClasses(): string {\r\n return this.theme.getTheme();\r\n }\r\n\r\n @Input({ required: true }) items!: readonly MenuNodeItem<T>[];\r\n\r\n @Input() menuId = 'app-shell-sidebar';\r\n\r\n /** Sincronizar com o item de navegação activo (realce persistente). */\r\n @Input() selectedItemId: T | null = null;\r\n\r\n /** Modo estreito: só ícones + `compressText` na lista (rótulos via `title` / `aria-label`). */\r\n @Input({ transform: booleanAttribute }) collapsed = false;\r\n\r\n @Output() readonly itemSelect = new EventEmitter<T>();\r\n\r\n /**\r\n * Valor efectivo de `compressText` em `app-menu-list`: ao expandir, mantém-se comprimido\r\n * até a lateral terminar a animação de largura (evita flicker de texto).\r\n */\r\n readonly listCompressText = signal(true);\r\n\r\n private listRevealTimeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.clearListRevealTimeout());\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['selectedItemId'] || changes['items']) {\r\n this.cdr.markForCheck();\r\n }\r\n const collapsedCh = changes['collapsed'];\r\n if (!collapsedCh) {\r\n return;\r\n }\r\n this.clearListRevealTimeout();\r\n\r\n if (collapsedCh.firstChange) {\r\n this.listCompressText.set(this.collapsed);\r\n return;\r\n }\r\n\r\n if (this.collapsed) {\r\n this.listCompressText.set(true);\r\n return;\r\n }\r\n\r\n this.listCompressText.set(true);\r\n this.listRevealTimeoutId = setTimeout(() => {\r\n this.listRevealTimeoutId = null;\r\n this.listCompressText.set(false);\r\n }, APP_SIDEBAR_NAV_REVEAL_TOTAL_MS);\r\n }\r\n\r\n private clearListRevealTimeout(): void {\r\n if (this.listRevealTimeoutId !== null) {\r\n clearTimeout(this.listRevealTimeoutId);\r\n this.listRevealTimeoutId = null;\r\n }\r\n }\r\n}\r\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__toolbar\"><ng-content select=\"[appSidebarToolbar]\" /></div>\r\n <app-menu-list\r\n class=\"app-sidebar__list\"\r\n [items]=\"items\"\r\n [menuId]=\"menuId\"\r\n [dense]=\"collapsed\"\r\n [compressText]=\"listCompressText()\"\r\n [selectedItemId]=\"selectedItemId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n />\r\n</nav>\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marca conteúdo a projectar no topo da sidebar (ex.: botão recolher/expandir).\r\n *\r\n * ```html\r\n * <app-sidebar [items]=\"nav\">\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 {\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 { 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","/**\r\n * Entrada do pacote npm `structra-ui` (ng-packagr).\r\n * Mantém `rootDir` em `src/` para compilar a árvore de imports sem erros NG3004.\r\n */\r\n\r\nexport { STRUCTRA_UI } from './structra-version';\r\n\r\nexport * from './app/buttons';\r\nexport * from './app/fields/input-fields';\r\nexport * from './app/fields/checkbox-fields';\r\nexport * from './app/fields/dropdown-fields';\r\nexport * from './app/fields/file-upload-fields';\r\nexport * from './app/form-layout';\r\nexport * from './app/loading/skeleton-loading';\r\nexport * from './app/data-display';\r\nexport * from './app/dialogs';\r\nexport * from './app/menus';\r\nexport * from './app/overlay';\r\nexport * from './app/app-shell';\r\nexport * from './app/theme';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './structra-public-api';\n"],"names":["UI_REQUEST_EXPAND_FORM_GROUP"],"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/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/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.component.ts","../../../src/app/menus/menu-list/menu-list.component.html","../../../src/app/menus/_utils/menu-connected-positions.util.ts","../../../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/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/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 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 @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\">×</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 }\n <ng-content />\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';\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 @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, inject } from '@angular/core';\r\nimport { AppTheme } from './app-theme.service';\r\nimport { APP_THEME_BASE_CLASS, getThemeTokenClass } 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 elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly renderer = inject(Renderer2);\r\n\r\n private readonly themeTokenClasses = STRUCTRA_THEME_IDS.map((themeId) => `theme-${themeId}`);\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 }\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 type ConnectedPosition,\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\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 * `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 [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 { 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 {\r\n ChangeDetectionStrategy,\r\n Component,\r\n Input,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\n/**\r\n * Cabeçalho opcional de grupo — alinhado a `MenuItemGroup` (`kind: 'group'`).\r\n * Os itens do grupo continuam a ser renderizados pelo `menu-list` (renderização única).\r\n */\r\n@Component({\r\n selector: 'app-menu-group',\r\n standalone: true,\r\n template: `\r\n @if (label?.trim() && !hideLabel) {\r\n <div class=\"menu-list__group-label\" role=\"presentation\">{{ label }}</div>\r\n }\r\n `,\r\n styleUrl: './menu-group.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class MenuGroupComponent {\r\n @Input() label?: string;\r\n\r\n /** Quando `true`, não mostra o título (ex.: sidebar colapsada só com ícones). */\r\n @Input({ transform: booleanAttribute }) hideLabel = false;\r\n}\r\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}\n\nexport interface MenuRowDivider {\n kind: 'divider';\n}\n\nexport interface MenuRowGroup {\n kind: 'group';\n label?: string;\n}\n\nexport interface MenuRowSubmenu<T = string> {\n kind: 'submenu';\n item: MenuItemSubmenu<T>;\n focusIndex: 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\n const addLeaf = (leaf: MenuLeafItem<T>): void => {\n if (leaf.kind === 'divider') {\n rows.push({ kind: 'divider' });\n return;\n }\n const focusIndex = leaf.disabled ? null : focusCounter++;\n rows.push({ kind: 'action', item: leaf, focusIndex });\n };\n\n const addNode = (n: MenuNodeItem<T>): void => {\n if (n.kind === 'divider') {\n rows.push({ kind: 'divider' });\n return;\n }\n if (n.kind === 'submenu') {\n const focusIndex = n.disabled ? null : focusCounter++;\n rows.push({ kind: 'submenu', item: n, focusIndex });\n return;\n }\n if (n.kind === 'group') {\n rows.push({ kind: 'group', label: n.label });\n for (const child of n.items) {\n addNode(child);\n }\n return;\n }\n addLeaf(n);\n };\n\n for (const n of nodes) {\n addNode(n);\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 SimpleChanges,\n ViewChildren,\n booleanAttribute,\n computed,\n forwardRef,\n inject,\n} from '@angular/core';\nimport { CdkConnectedOverlay, CdkOverlayOrigin } from '@angular/cdk/overlay';\nimport type { MenuItemAction, MenuNodeItem } from '../_models/menu-item.model';\nimport { AppThemeService } from '../../theme';\nimport { MenuDividerComponent } from '../menu-divider/menu-divider.component';\nimport { MenuGroupComponent } from '../menu-group/menu-group.component';\nimport {\n type MenuRow,\n buildMenuRows,\n focusableActionCount,\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',\n templateUrl: './menu-list.component.html',\n styleUrl: './menu-list.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n NgClass,\n forwardRef(() => MenuListComponent),\n CdkConnectedOverlay,\n CdkOverlayOrigin,\n MenuDividerComponent,\n MenuGroupComponent,\n ]\n})\nexport class MenuListComponent<T = string> implements OnChanges {\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly appTheme = inject(AppThemeService);\n readonly hostRef = inject(ElementRef<HTMLElement>);\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 @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly closeRequest = new EventEmitter<void>();\n @Output() readonly submenuBack = new EventEmitter<void>();\n\n @ViewChildren(MenuListComponent)\n private nestedLists?: QueryList<MenuListComponent<T>>;\n\n rows: MenuRow<T>[] = [];\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(() => this.appTheme.themeClassMap());\n\n overlayPanelClasses(): string[] {\n return [...this.appTheme.themeClassList(), 'menu-submenu__cdk-panel'];\n }\n\n onNestedItemSelect(id: T): void {\n this.closeOpenSubmenu();\n this.itemSelect.emit(id);\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes['items']) {\n this.rows = buildMenuRows(this.items ?? []);\n this.focusableCount = focusableActionCount(this.rows);\n if (this.focusableCount === 0) {\n this.activeIndex = -1;\n } else if (this.activeIndex >= this.focusableCount) {\n this.activeIndex = -1;\n }\n }\n if (\n changes['selectedItemId'] ||\n changes['items'] ||\n changes['compressText'] ||\n changes['dense'] ||\n changes['menuId']\n ) {\n this.cdr.markForCheck();\n }\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 onSubmenuTriggerEnter(row: MenuRow<T>, index: number): void {\n if (row.kind !== 'submenu' || row.item.disabled) {\n return;\n }\n this.cancelSubmenuCloseTimer();\n this.cancelSubmenuOpenTimer();\n if (row.focusIndex !== null) {\n this.activeIndex = row.focusIndex;\n }\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 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.rows[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 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.rows[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 @HostListener('keydown', ['$event'])\n onKeydown(ev: KeyboardEvent): void {\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.rows.length; i++) {\n const r = this.rows[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.rows.length; i++) {\n const r = this.rows[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\n class=\"menu-list\"\n [class.menu-list--dense]=\"dense\"\n [class.menu-list--compress-text]=\"compressText\"\n role=\"menu\"\n [attr.aria-labelledby]=\"null\"\n tabindex=\"-1\"\n (mouseleave)=\"onMenuSurfaceLeave()\"\n>\n @for (row of rows; track idx; let idx = $index) {\n @switch (row.kind) {\n @case ('divider') {\n <app-menu-divider />\n }\n @case ('group') {\n <app-menu-group [label]=\"row.label\" [hideLabel]=\"compressText\" />\n }\n @case ('submenu') {\n <div\n class=\"menu-list__submenu-wrap\"\n cdkOverlayOrigin\n #subOrigin=\"cdkOverlayOrigin\"\n (mouseenter)=\"onSubmenuTriggerEnter(row, idx)\"\n (mouseleave)=\"onSubmenuTriggerLeave(row, idx)\"\n >\n <div\n class=\"menu-list__option menu-list__option--submenu\"\n role=\"menuitem\"\n [attr.aria-haspopup]=\"'true'\"\n [attr.aria-expanded]=\"isSubmenuOpen(row, idx)\"\n [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\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onSubmenuRowClick($event, row, idx)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\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\">›</span>\n </div>\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"subOrigin\"\n [cdkConnectedOverlayOpen]=\"isSubmenuOpen(row, idx)\"\n [cdkConnectedOverlayPositions]=\"submenuPositions\"\n [cdkConnectedOverlayPush]=\"true\"\n [cdkConnectedOverlayPanelClass]=\"overlayPanelClasses()\"\n [cdkConnectedOverlayMinWidth]=\"200\"\n (overlayOutsideClick)=\"onSubmenuOutsideClick(row, idx)\"\n >\n <div\n class=\"menu-submenu__panel\"\n [ngClass]=\"panelThemeNgClass()\"\n (mouseenter)=\"onSubmenuPanelEnter()\"\n (mouseleave)=\"onSubmenuPanelLeave(row, idx)\"\n (click)=\"$event.stopPropagation()\"\n >\n <app-menu-list\n [items]=\"row.item.items\"\n [menuId]=\"submenuMenuId(row)\"\n [nested]=\"true\"\n [dense]=\"dense\"\n [compressText]=\"compressText\"\n [selectedItemId]=\"selectedItemId\"\n (itemSelect)=\"onNestedItemSelect($event)\"\n (closeRequest)=\"closeRequest.emit()\"\n (submenuBack)=\"closeOpenSubmenu()\"\n />\n </div>\n </ng-template>\n </div>\n }\n @case ('action') {\n <div\n class=\"menu-list__option\"\n role=\"menuitem\"\n [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\"\n [attr.aria-busy]=\"row.item.loading ? true : null\"\n [attr.title]=\"compressText ? row.item.label : null\"\n [attr.aria-label]=\"compressText ? row.item.label : null\"\n [class.menu-list__option--disabled]=\"row.item.disabled\"\n [class.menu-list__option--loading]=\"row.item.loading\"\n [class.menu-list__option--danger]=\"row.item.danger\"\n [class.menu-list__option--active]=\"isActiveRow(row)\"\n [class.menu-list__option--selected]=\"isRowSelected(row)\"\n (click)=\"onItemClick($event, row.item)\"\n (mouseenter)=\"onRowMouseEnter(row)\"\n >\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","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 {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n Input,\n Output,\n TemplateRef,\n ViewChild,\n booleanAttribute,\n inject,\n} from '@angular/core';\nimport { DropdownBaseComponent } from '../../fields/dropdown-fields/_base/dropdown-base/dropdown-base.component';\nimport { MenuDropdownPlacement } from '../_models/menu-dropdown-placement.model';\nimport type { MenuNodeItem } from '../_models/menu-item.model';\nimport { MenuListComponent } from '../menu-list/menu-list.component';\nimport { menuConnectedPositions } from '../_utils/menu-connected-positions.util';\n\n@Component({\n selector: 'app-dropdown-menu',\n imports: [DropdownBaseComponent, MenuListComponent],\n templateUrl: './dropdown-menu.component.html',\n styleUrl: './dropdown-menu.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class DropdownMenuComponent<T = string> {\n private readonly host = inject(ElementRef<HTMLElement>);\n\n @Input({ required: true }) items: readonly MenuNodeItem<T>[] = [];\n\n @Input() placement: MenuDropdownPlacement = MenuDropdownPlacement.Below;\n\n /** Largura mínima do painel em px (o painel pode alargar ao conteúdo). */\n @Input() minWidthPx = 200;\n\n /** Se `true`, a largura do painel segue a do trigger. */\n @Input({ transform: booleanAttribute }) matchTriggerWidth = true;\n\n @Input() menuId = '';\n\n @Output() readonly itemSelect = new EventEmitter<T>();\n @Output() readonly openChange = new EventEmitter<boolean>();\n\n @ViewChild('panelTpl', { static: true }) panelTpl!: TemplateRef<unknown>;\n @ViewChild(MenuListComponent) private menuList?: MenuListComponent<T>;\n\n open = false;\n\n private readonly generatedId = `app-dd-${Math.random().toString(36).slice(2, 9)}`;\n\n get resolvedMenuId(): string {\n return this.menuId.trim() || this.generatedId;\n }\n\n /** Largura do painel no overlay (mínimo garantido; pode igualar ao trigger). */\n get effectivePanelWidth(): number {\n if (this.matchTriggerWidth) {\n const w = this.host.nativeElement.getBoundingClientRect().width;\n return Math.max(this.minWidthPx, Math.ceil(w));\n }\n return this.minWidthPx;\n }\n\n get connectedPositions() {\n return menuConnectedPositions(this.placement);\n }\n\n onTriggerClick(ev: Event): void {\n ev.preventDefault();\n this.toggle();\n }\n\n toggle(): void {\n this.setOpen(!this.open);\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 if (next) {\n queueMicrotask(() => this.menuList?.resetHighlight());\n }\n }\n\n onBaseOpenChange(next: boolean): void {\n if (this.open === next) {\n return;\n }\n this.open = next;\n this.openChange.emit(next);\n if (next) {\n queueMicrotask(() => this.menuList?.resetHighlight());\n }\n }\n\n onItemSelect(id: T): void {\n this.itemSelect.emit(id);\n this.setOpen(false);\n }\n\n onCloseRequest(): void {\n this.setOpen(false);\n }\n}\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\r\n [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\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';\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 @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--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 @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\">×</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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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 [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\">×</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\">×</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\">×</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 < `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 < `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, '&')\r\n .replace(/</g, '<')\r\n .replace(/>/g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\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 { NgClass } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n booleanAttribute,\n computed,\n inject,\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 { AppThemeService } 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 = inject(Overlay);\n private readonly vcr = inject(ViewContainerRef);\n private readonly appTheme = inject(AppThemeService);\n private readonly cdr = inject(ChangeDetectorRef);\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(() => this.appTheme.themeClassMap());\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: [...this.appTheme.themeClassList()],\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 [items]=\"items\"\r\n [menuId]=\"resolvedMenuId\"\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 SimpleChanges,\n ViewChild,\n afterNextRender,\n booleanAttribute,\n inject,\n} from '@angular/core';\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\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 /** 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 class=\"app-drawer__header\">\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\">×</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 EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnInit,\r\n Output,\r\n TemplateRef,\r\n booleanAttribute,\r\n inject,\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 { AppThemeService } 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@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 theme = inject(AppThemeService);\r\n\r\n @HostBinding('class')\r\n protected get hostThemeClasses(): string {\r\n return this.theme.getTheme();\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 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 this.emitMobileNavOpen(!this.mobileNavOpen);\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 title=\"Navegação\"\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 {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n DestroyRef,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n OnChanges,\r\n Output,\r\n SimpleChanges,\r\n booleanAttribute,\r\n inject,\r\n signal,\r\n} from '@angular/core';\r\nimport { MenuListComponent } from '../../menus/menu-list/menu-list.component';\r\nimport { AppThemeService } from '../../theme';\r\nimport type { MenuNodeItem } from '../../menus/_models/menu-item.model';\r\nimport { APP_SIDEBAR_NAV_REVEAL_TOTAL_MS } from '../sidebar-reveal.constants';\r\n\r\n/**\r\n * Navegação lateral com o mesmo modelo `MenuNodeItem` dos menus da lib (grupos, submenus, teclado).\r\n * Com `collapsed`, `app-menu-list` usa `compressText`: rótulos de grupo (ex. «Principal») ficam ocultos;\r\n * itens mostram só ícones com `title` / `aria-label` para acessibilidade.\r\n */\r\n@Component({\r\n selector: 'app-sidebar',\r\n imports: [MenuListComponent],\r\n templateUrl: './sidebar.component.html',\r\n styleUrl: './sidebar.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush\r\n})\r\nexport class AppSidebarComponent<T extends string = string> implements OnChanges {\r\n private readonly theme = inject(AppThemeService);\r\n private readonly cdr = inject(ChangeDetectorRef);\r\n private readonly destroyRef = inject(DestroyRef);\r\n\r\n /**\r\n * Garante `.app-library-theme` + `theme-*` no host para tokens `--app-color-nav-*` e lista\r\n * herdarem a paleta activa (útil fora da demo ou sem antepassado tematizado).\r\n */\r\n @HostBinding('class')\r\n protected get hostThemeClasses(): string {\r\n return this.theme.getTheme();\r\n }\r\n\r\n @Input({ required: true }) items!: readonly MenuNodeItem<T>[];\r\n\r\n @Input() menuId = 'app-shell-sidebar';\r\n\r\n /** Sincronizar com o item de navegação activo (realce persistente). */\r\n @Input() selectedItemId: T | null = null;\r\n\r\n /** Modo estreito: só ícones + `compressText` na lista (rótulos via `title` / `aria-label`). */\r\n @Input({ transform: booleanAttribute }) collapsed = false;\r\n\r\n @Output() readonly itemSelect = new EventEmitter<T>();\r\n\r\n /**\r\n * Valor efectivo de `compressText` em `app-menu-list`: ao expandir, mantém-se comprimido\r\n * até a lateral terminar a animação de largura (evita flicker de texto).\r\n */\r\n readonly listCompressText = signal(true);\r\n\r\n private listRevealTimeoutId: ReturnType<typeof setTimeout> | null = null;\r\n\r\n constructor() {\r\n this.destroyRef.onDestroy(() => this.clearListRevealTimeout());\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['selectedItemId'] || changes['items']) {\r\n this.cdr.markForCheck();\r\n }\r\n const collapsedCh = changes['collapsed'];\r\n if (!collapsedCh) {\r\n return;\r\n }\r\n this.clearListRevealTimeout();\r\n\r\n if (collapsedCh.firstChange) {\r\n this.listCompressText.set(this.collapsed);\r\n return;\r\n }\r\n\r\n if (this.collapsed) {\r\n this.listCompressText.set(true);\r\n return;\r\n }\r\n\r\n this.listCompressText.set(true);\r\n this.listRevealTimeoutId = setTimeout(() => {\r\n this.listRevealTimeoutId = null;\r\n this.listCompressText.set(false);\r\n }, APP_SIDEBAR_NAV_REVEAL_TOTAL_MS);\r\n }\r\n\r\n private clearListRevealTimeout(): void {\r\n if (this.listRevealTimeoutId !== null) {\r\n clearTimeout(this.listRevealTimeoutId);\r\n this.listRevealTimeoutId = null;\r\n }\r\n }\r\n}\r\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__toolbar\"><ng-content select=\"[appSidebarToolbar]\" /></div>\r\n <app-menu-list\r\n class=\"app-sidebar__list\"\r\n [items]=\"items\"\r\n [menuId]=\"menuId\"\r\n [dense]=\"collapsed\"\r\n [compressText]=\"listCompressText()\"\r\n [selectedItemId]=\"selectedItemId\"\r\n (itemSelect)=\"itemSelect.emit($event)\"\r\n />\r\n</nav>\r\n","import { Directive } from '@angular/core';\r\n\r\n/**\r\n * Marca conteúdo a projectar no topo da sidebar (ex.: botão recolher/expandir).\r\n *\r\n * ```html\r\n * <app-sidebar [items]=\"nav\">\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 {\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 { 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":["UI_REQUEST_EXPAND_FORM_GROUP"],"mappings":"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"}
|