structra-ui 0.1.15 → 0.1.16

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.
Files changed (149) hide show
  1. package/esm2022/app/_utils/date-pt-br.utils.mjs +82 -0
  2. package/esm2022/app/_utils/decimal-br.utils.mjs +154 -0
  3. package/esm2022/app/_utils/estados-br.data.mjs +37 -0
  4. package/esm2022/app/_utils/integer-br.utils.mjs +48 -0
  5. package/esm2022/app/_utils/integer-value.utils.mjs +19 -0
  6. package/esm2022/app/_utils/scroll/body-scroll-lock.util.mjs +97 -0
  7. package/esm2022/app/app-shell/_models/breadcrumb-item.model.mjs +2 -0
  8. package/esm2022/app/app-shell/app-shell-sidebar-template.directive.mjs +29 -0
  9. package/esm2022/app/app-shell/app-shell.component.mjs +105 -0
  10. package/esm2022/app/app-shell/breadcrumb/breadcrumb.component.mjs +18 -0
  11. package/esm2022/app/app-shell/index.mjs +19 -0
  12. package/esm2022/app/app-shell/sidebar/app-sidebar-toolbar.directive.mjs +23 -0
  13. package/esm2022/app/app-shell/sidebar/shell-sidebar-toggle.component.mjs +36 -0
  14. package/esm2022/app/app-shell/sidebar/sidebar.component.mjs +84 -0
  15. package/esm2022/app/app-shell/sidebar-reveal.constants.mjs +9 -0
  16. package/esm2022/app/app-shell/topbar/topbar.component.mjs +14 -0
  17. package/esm2022/app/app-shell/user-menu/user-menu.component.mjs +52 -0
  18. package/esm2022/app/buttons/base-button/base-button.component.mjs +97 -0
  19. package/esm2022/app/buttons/index.mjs +2 -0
  20. package/esm2022/app/data-display/_models/card-item-view.model.mjs +2 -0
  21. package/esm2022/app/data-display/_models/data-display.models.mjs +2 -0
  22. package/esm2022/app/data-display/_models/data-grid-column.model.mjs +2 -0
  23. package/esm2022/app/data-display/_models/index.mjs +2 -0
  24. package/esm2022/app/data-display/adaptive-data-view/adaptive-data-view.component.mjs +124 -0
  25. package/esm2022/app/data-display/card-list/card-list.component.mjs +208 -0
  26. package/esm2022/app/data-display/dashboard-section/dashboard-section.component.mjs +25 -0
  27. package/esm2022/app/data-display/data-card/data-card.component.mjs +40 -0
  28. package/esm2022/app/data-display/data-grid/data-grid-actions-cell-renderer.component.mjs +41 -0
  29. package/esm2022/app/data-display/data-grid/data-grid.component.mjs +253 -0
  30. package/esm2022/app/data-display/data-list/data-list.component.mjs +40 -0
  31. package/esm2022/app/data-display/data-toolbar/data-toolbar.component.mjs +12 -0
  32. package/esm2022/app/data-display/details-field/details-field.component.mjs +21 -0
  33. package/esm2022/app/data-display/details-view/details-view.component.mjs +44 -0
  34. package/esm2022/app/data-display/empty-state/empty-state-overlay.util.mjs +19 -0
  35. package/esm2022/app/data-display/empty-state/empty-state.component.mjs +30 -0
  36. package/esm2022/app/data-display/index.mjs +19 -0
  37. package/esm2022/app/data-display/list-item/list-item.component.mjs +59 -0
  38. package/esm2022/app/data-display/stat-card/stat-card.component.mjs +59 -0
  39. package/esm2022/app/data-display/status-badge/status-badge.component.mjs +41 -0
  40. package/esm2022/app/data-display/table-empty-state/table-empty-state.component.mjs +31 -0
  41. package/esm2022/app/data-display/table-toolbar/table-toolbar.component.mjs +22 -0
  42. package/esm2022/app/dialogs/_models/lib-dialog-size.model.mjs +8 -0
  43. package/esm2022/app/dialogs/_utils/app-lib-light-block-scroll-strategy.mjs +22 -0
  44. package/esm2022/app/dialogs/_utils/lib-dialog-panel-classes.mjs +6 -0
  45. package/esm2022/app/dialogs/app-dialog/app-dialog.component.mjs +200 -0
  46. package/esm2022/app/dialogs/app-dialog/dialog-footer.directive.mjs +15 -0
  47. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog-data.model.mjs +2 -0
  48. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.component.mjs +36 -0
  49. package/esm2022/app/dialogs/confirm-dialog/confirm-dialog.service.mjs +47 -0
  50. package/esm2022/app/dialogs/index.mjs +12 -0
  51. package/esm2022/app/dialogs/loading-dialog/loading-dialog-data.model.mjs +2 -0
  52. package/esm2022/app/dialogs/loading-dialog/loading-dialog.component.mjs +19 -0
  53. package/esm2022/app/dialogs/loading-dialog/loading-dialog.service.mjs +38 -0
  54. package/esm2022/app/dialogs/toast/toast-host.component.mjs +65 -0
  55. package/esm2022/app/dialogs/toast/toast.models.mjs +2 -0
  56. package/esm2022/app/dialogs/toast/toast.service.mjs +76 -0
  57. package/esm2022/app/fields/checkbox-fields/_base/boolean-field.directive.mjs +158 -0
  58. package/esm2022/app/fields/checkbox-fields/checkbox-field/checkbox-field.component.mjs +36 -0
  59. package/esm2022/app/fields/checkbox-fields/index.mjs +4 -0
  60. package/esm2022/app/fields/checkbox-fields/switch-field/switch-field.component.mjs +35 -0
  61. package/esm2022/app/fields/dropdown-fields/_base/dropdown-base/dropdown-base.component.mjs +117 -0
  62. package/esm2022/app/fields/dropdown-fields/_base/dropdown-multi-option-field.base.mjs +152 -0
  63. package/esm2022/app/fields/dropdown-fields/_base/dropdown-option-field.base.mjs +149 -0
  64. package/esm2022/app/fields/dropdown-fields/_base/dropdown-trigger-blur.util.mjs +32 -0
  65. package/esm2022/app/fields/dropdown-fields/_models/dropdown-list-bindings.model.mjs +2 -0
  66. package/esm2022/app/fields/dropdown-fields/_models/dropdown-search-page-requested.model.mjs +2 -0
  67. package/esm2022/app/fields/dropdown-fields/_models/index.mjs +2 -0
  68. package/esm2022/app/fields/dropdown-fields/_models/select-option.model.mjs +2 -0
  69. package/esm2022/app/fields/dropdown-fields/_models/select-pagination.model.mjs +2 -0
  70. package/esm2022/app/fields/dropdown-fields/dropdown-search-field/dropdown-search-field.component.mjs +520 -0
  71. package/esm2022/app/fields/dropdown-fields/index.mjs +7 -0
  72. package/esm2022/app/fields/dropdown-fields/multiselect-field/multiselect-field.component.mjs +379 -0
  73. package/esm2022/app/fields/dropdown-fields/select-field/select-field.component.mjs +359 -0
  74. package/esm2022/app/fields/input-fields/_base/base-field.component.mjs +151 -0
  75. package/esm2022/app/fields/input-fields/_base/base-field.directive.mjs +224 -0
  76. package/esm2022/app/fields/input-fields/_base/masked-text-field.base.mjs +135 -0
  77. package/esm2022/app/fields/input-fields/_base/ng-control-field.directive.mjs +127 -0
  78. package/esm2022/app/fields/input-fields/_models/field-common-inputs.model.mjs +2 -0
  79. package/esm2022/app/fields/input-fields/_models/index.mjs +2 -0
  80. package/esm2022/app/fields/input-fields/_utils/mask-complete.validators.mjs +61 -0
  81. package/esm2022/app/fields/input-fields/_utils/mask-format.utils.mjs +40 -0
  82. package/esm2022/app/fields/input-fields/cep-field/cep-field.component.mjs +48 -0
  83. package/esm2022/app/fields/input-fields/cpf-cnpj-field/cpf-cnpj-field.component.mjs +61 -0
  84. package/esm2022/app/fields/input-fields/date-field/date-field.component.mjs +147 -0
  85. package/esm2022/app/fields/input-fields/decimal-field/decimal-field.component.mjs +166 -0
  86. package/esm2022/app/fields/input-fields/index.mjs +22 -0
  87. package/esm2022/app/fields/input-fields/input-mask-field/input-mask-field.component.mjs +52 -0
  88. package/esm2022/app/fields/input-fields/integer-field/integer-field.component.mjs +143 -0
  89. package/esm2022/app/fields/input-fields/password-field/password-field.component.mjs +130 -0
  90. package/esm2022/app/fields/input-fields/phone-field/phone-field.component.mjs +66 -0
  91. package/esm2022/app/fields/input-fields/text-field/text-field.component.mjs +90 -0
  92. package/esm2022/app/fields/input-fields/textarea-field/textarea-field.component.mjs +125 -0
  93. package/esm2022/app/form-layout/_models/form-layout.model.mjs +48 -0
  94. package/esm2022/app/form-layout/_models/form-tabs.model.mjs +2 -0
  95. package/esm2022/app/form-layout/_models/index.mjs +2 -0
  96. package/esm2022/app/form-layout/_models/validation-summary.model.mjs +2 -0
  97. package/esm2022/app/form-layout/form-actions/form-actions.component.mjs +55 -0
  98. package/esm2022/app/form-layout/form-col/form-col.component.mjs +76 -0
  99. package/esm2022/app/form-layout/form-group/form-group.component.mjs +358 -0
  100. package/esm2022/app/form-layout/form-group/form-path.utils.mjs +65 -0
  101. package/esm2022/app/form-layout/form-group/form-root-invalid-ui-refresh.util.mjs +54 -0
  102. package/esm2022/app/form-layout/form-row/form-row.component.mjs +49 -0
  103. package/esm2022/app/form-layout/form-section/form-section.component.mjs +43 -0
  104. package/esm2022/app/form-layout/form-tab/form-tab.component.mjs +67 -0
  105. package/esm2022/app/form-layout/form-tabs/form-tabs.component.mjs +126 -0
  106. package/esm2022/app/form-layout/index.mjs +14 -0
  107. package/esm2022/app/form-layout/layout-stack/layout-stack.component.mjs +56 -0
  108. package/esm2022/app/form-layout/validation-summary/validation-summary.component.mjs +343 -0
  109. package/esm2022/app/loading/skeleton-loading/index.mjs +7 -0
  110. package/esm2022/app/loading/skeleton-loading/skeleton-block/skeleton-block.component.mjs +43 -0
  111. package/esm2022/app/loading/skeleton-loading/skeleton-card/skeleton-card.component.mjs +23 -0
  112. package/esm2022/app/loading/skeleton-loading/skeleton-field-shell/skeleton-field-shell.component.mjs +34 -0
  113. package/esm2022/app/loading/skeleton-loading/skeleton-list/skeleton-list.component.mjs +38 -0
  114. package/esm2022/app/loading/skeleton-loading/skeleton-table/skeleton-table.component.mjs +37 -0
  115. package/esm2022/app/loading/skeleton-loading/skeleton-text/skeleton-text.component.mjs +45 -0
  116. package/esm2022/app/menus/_models/drawer-side.model.mjs +8 -0
  117. package/esm2022/app/menus/_models/drawer-size.model.mjs +8 -0
  118. package/esm2022/app/menus/_models/menu-dropdown-placement.model.mjs +12 -0
  119. package/esm2022/app/menus/_models/menu-item.model.mjs +6 -0
  120. package/esm2022/app/menus/_utils/menu-connected-positions.util.mjs +41 -0
  121. package/esm2022/app/menus/_utils/menu-rows.util.mjs +39 -0
  122. package/esm2022/app/menus/_utils/submenu-connected-positions.util.mjs +23 -0
  123. package/esm2022/app/menus/action-menu/action-menu.component.mjs +48 -0
  124. package/esm2022/app/menus/context-menu/context-menu.component.mjs +112 -0
  125. package/esm2022/app/menus/drawer/drawer.component.mjs +142 -0
  126. package/esm2022/app/menus/dropdown-menu/dropdown-menu.component.mjs +99 -0
  127. package/esm2022/app/menus/index.mjs +11 -0
  128. package/esm2022/app/menus/menu-divider/menu-divider.component.mjs +14 -0
  129. package/esm2022/app/menus/menu-group/menu-group.component.mjs +32 -0
  130. package/esm2022/app/menus/menu-list/menu-list.component.mjs +399 -0
  131. package/esm2022/app/overlay/_models/overlay-placement.model.mjs +11 -0
  132. package/esm2022/app/overlay/_utils/anchored-overlay-positions.util.mjs +84 -0
  133. package/esm2022/app/overlay/anchored-overlay/anchored-overlay.component.mjs +121 -0
  134. package/esm2022/app/overlay/index.mjs +21 -0
  135. package/esm2022/app/overlay/popover/popover-body-template.directive.mjs +17 -0
  136. package/esm2022/app/overlay/popover/popover-footer-template.directive.mjs +17 -0
  137. package/esm2022/app/overlay/popover/popover-trigger.directive.mjs +15 -0
  138. package/esm2022/app/overlay/popover/popover.component.mjs +93 -0
  139. package/esm2022/app/overlay/tooltip/tooltip-panel-template.directive.mjs +20 -0
  140. package/esm2022/app/overlay/tooltip/tooltip.component.mjs +118 -0
  141. package/esm2022/app/theme/app-theme.service.mjs +49 -0
  142. package/esm2022/app/theme/index.mjs +2 -0
  143. package/esm2022/structra-public-api.mjs +18 -0
  144. package/esm2022/structra-ui.mjs +5 -0
  145. package/esm2022/structra-version.mjs +3 -0
  146. package/fesm2022/structra-ui.mjs +8971 -0
  147. package/fesm2022/structra-ui.mjs.map +1 -0
  148. package/index.d.ts +5 -0
  149. package/package.json +15 -6
@@ -0,0 +1,151 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, booleanAttribute, } from '@angular/core';
2
+ import { SkeletonFieldShellComponent, } from '../../../loading/skeleton-loading';
3
+ import { DropdownMenuComponent } from '../../../menus/dropdown-menu/dropdown-menu.component';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Base visual do campo: caixa com label flutuante, prefixo opcional e erro.
7
+ * Usada dentro dos componentes de campo (texto, inteiro, decimal).
8
+ */
9
+ export class BaseFieldComponent {
10
+ constructor() {
11
+ this.label = '';
12
+ this.errorMessage = '';
13
+ this.required = false;
14
+ /** Asterisco visual do obrigatório no label (validação HTML `required` inalterada); por defeito `false`. */
15
+ this.showRequiredMark = false;
16
+ this.invalid = false;
17
+ this.filled = false;
18
+ this.disabled = false;
19
+ this.readonly = false;
20
+ this.inputId = '';
21
+ this.errorId = '';
22
+ this.showPrefixIcon = false;
23
+ /** Classes Font Awesome (ex.: `fa-solid fa-user`). Usado com `showPrefixIcon`. */
24
+ this.prefixIcon = '';
25
+ this.clearable = true;
26
+ this.clearAriaLabel = 'Limpar campo';
27
+ /**
28
+ * Quando `true`, renderiza `ng-content` com `[appFieldSuffix]` à direita do input
29
+ * (antes do botão limpar, se houver).
30
+ */
31
+ this.showSuffixSlot = false;
32
+ /** Alinha o texto do valor à direita no input projetado. */
33
+ this.valueAlignEnd = false;
34
+ this.loading = false;
35
+ /** Variante do skeleton quando {@link loading} é `true`. */
36
+ this.skeletonVariant = 'text';
37
+ this.mostrarMenuContexto = false;
38
+ this.contextMenuItems = [];
39
+ /** Sufixo do `id` do menu (ex.: `meuCampo-ctx`); por defeito deriva-se de {@link inputId}. */
40
+ this.contextMenuId = '';
41
+ this.clear = new EventEmitter();
42
+ this.contextMenuSelect = new EventEmitter();
43
+ /** Derivados do template (actualizados em `ngOnChanges`, não getters por CD). */
44
+ this.showErrorTpl = false;
45
+ this.showFloatTpl = false;
46
+ this.showFaTpl = false;
47
+ this.prefixIconClassTpl = '';
48
+ this.showClearTpl = false;
49
+ this.showCtxMenuTpl = false;
50
+ this.showSuffixTpl = false;
51
+ }
52
+ get resolvedContextMenuId() {
53
+ const t = this.contextMenuId.trim();
54
+ if (t.length > 0) {
55
+ return t;
56
+ }
57
+ const base = this.inputId.trim();
58
+ return base.length > 0 ? `${base}-ctx` : 'app-field-ctx-menu';
59
+ }
60
+ ngOnInit() {
61
+ this.refreshTplFlags();
62
+ }
63
+ ngOnChanges(_changes) {
64
+ this.refreshTplFlags();
65
+ }
66
+ refreshTplFlags() {
67
+ const labelTrim = this.label.trim();
68
+ this.showFloatTpl = labelTrim.length > 0;
69
+ this.showErrorTpl = this.invalid && !!this.errorMessage;
70
+ const iconTrim = this.prefixIcon.trim();
71
+ this.showFaTpl = this.showPrefixIcon && iconTrim.length > 0;
72
+ this.prefixIconClassTpl = `base-field__prefix-icon ${iconTrim}`.trim();
73
+ this.showClearTpl =
74
+ !this.loading &&
75
+ this.clearable &&
76
+ this.filled &&
77
+ !this.disabled &&
78
+ !this.readonly;
79
+ this.showCtxMenuTpl =
80
+ !this.loading &&
81
+ !this.disabled &&
82
+ !this.readonly &&
83
+ this.mostrarMenuContexto &&
84
+ (this.contextMenuItems?.length ?? 0) > 0;
85
+ /* Com `loading`, mantém coluna de sufixo (ex.: toggle senha) para não encolher a caixa. */
86
+ this.showSuffixTpl = this.loading
87
+ ? this.showSuffixSlot
88
+ : this.showSuffixSlot || this.showClearTpl || this.showCtxMenuTpl;
89
+ }
90
+ onClearClick() {
91
+ this.clear.emit();
92
+ }
93
+ onContextMenuItemSelect(id) {
94
+ this.contextMenuSelect.emit(id);
95
+ }
96
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
97
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BaseFieldComponent, isStandalone: true, selector: "app-base-field", inputs: { label: "label", errorMessage: "errorMessage", required: "required", showRequiredMark: "showRequiredMark", invalid: "invalid", filled: "filled", disabled: "disabled", readonly: "readonly", inputId: "inputId", errorId: "errorId", showPrefixIcon: "showPrefixIcon", prefixIcon: "prefixIcon", clearable: "clearable", clearAriaLabel: "clearAriaLabel", showSuffixSlot: "showSuffixSlot", valueAlignEnd: "valueAlignEnd", loading: ["loading", "loading", booleanAttribute], skeletonVariant: "skeletonVariant", mostrarMenuContexto: ["mostrarMenuContexto", "mostrarMenuContexto", booleanAttribute], contextMenuItems: "contextMenuItems", contextMenuId: "contextMenuId" }, outputs: { clear: "clear", contextMenuSelect: "contextMenuSelect" }, usesOnChanges: true, ngImport: i0, template: "<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\u00E7\u00F5es\" tabindex=\"-1\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n </app-dropdown-menu>\n }\n @if (showSuffixSlot) {\n <ng-content select=\"[appFieldSuffix]\" />\n }\n @if (showClearTpl) {\n <button type=\"button\" class=\"base-field__clear\" tabindex=\"-1\" [attr.aria-label]=\"clearAriaLabel\"\n (click)=\"onClearClick()\">\n <span class=\"base-field__clear-x\" aria-hidden=\"true\">&times;</span>\n </button>\n }\n } @else if (loading && showSuffixSlot) {\n <span class=\"base-field__suffix-reserve\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n </div>\n\n @if (!loading && showErrorTpl) {\n <p class=\"base-field__error\" [id]=\"errorId || null\" role=\"alert\">\n {{ errorMessage }}\n </p>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box}.base-field{display:flex;flex-direction:column;gap:.35rem;width:100%;max-width:100%;box-sizing:border-box}.base-field--loading .base-field__box{pointer-events:none}.base-field--loading .base-field__field{justify-content:center}.base-field--loading .base-field__control{display:flex;align-items:center;width:100%;min-height:0}.base-field__box{display:flex;align-items:stretch;width:100%;min-width:0;border:1px solid var(--ui-field-float-border);border-radius:var(--ui-field-float-border-radius);background:var(--ui-field-float-bg);transition:border-color .1s ease,box-shadow .1s ease;contain:layout}.base-field:not(.base-field--invalid):not(.base-field--disabled):not(.base-field--readonly) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}.base-field--readonly:not(.base-field--disabled) .base-field__box{background:var(--ui-field-readonly-bg);border-color:var(--ui-field-readonly-border)}.base-field--readonly:not(.base-field--disabled):not(.base-field--invalid) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}.base-field--invalid .base-field__box{border-color:var(--ui-field-input-invalid-border);box-shadow:none;background:var(--ui-field-invalid-input-bg, #fef2f2)}.base-field--readonly.base-field--invalid:not(.base-field--disabled) .base-field__box{background:var(--ui-field-invalid-input-bg, #fef2f2)}.base-field--invalid:not(.base-field--disabled):not(.base-field--readonly) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.base-field--disabled .base-field__box{opacity:var(--ui-field-input-disabled-opacity)}.base-field__prefix{display:flex;align-items:center;justify-content:center;flex-shrink:0;padding-left:.75rem;color:var(--ui-field-float-prefix-color);user-select:none;-webkit-user-select:none}.base-field__prefix:empty{display:none}.base-field__prefix-icon{font-style:normal;font-size:1rem;line-height:1;color:var(--ui-field-float-prefix-color)}.base-field__prefix-icon--loading-dim{opacity:.34;pointer-events:none}.base-field__suffix{display:flex;align-items:center;justify-content:center;flex-shrink:0;padding-right:.4rem;padding-left:.1rem}.base-field__ctx-dropdown{display:inline-flex;flex-shrink:0;align-items:center;max-width:100%}.base-field__ctx-trigger{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.base-field__ctx-trigger:hover{background:var(--app-color-prefix-hover-bg, rgba(90, 127, 163, .15));color:var(--ui-field-float-label-top-color)}.base-field__ctx-trigger:focus,.base-field__ctx-trigger:focus-visible{outline:none}.base-field__clear{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.base-field__clear:hover{background:var(--app-color-prefix-hover-bg, rgba(90, 127, 163, .15));color:var(--ui-field-float-label-top-color)}.base-field__clear:focus,.base-field__clear:focus-visible{outline:none}.base-field__clear-x{font-size:1.35rem;line-height:1;font-weight:300}.base-field--invalid .base-field__prefix,.base-field--invalid .base-field__prefix-icon{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid .base-field__prefix-icon:before{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid .base-field__suffix,.base-field--invalid .base-field__clear,.base-field--invalid .base-field__ctx-trigger{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid .base-field__clear:hover,.base-field--invalid .base-field__ctx-trigger:hover{background:var(--app-color-error-bg-subtle, rgba(185, 28, 28, .12));color:var(--ui-field-float-label-invalid-color)}.base-field__field{position:relative;flex:1;min-width:0;display:flex;flex-direction:column;justify-content:flex-start;contain:layout style}.base-field__float-label{position:absolute;left:.75rem;right:.75rem;top:.45rem;transform:translate3d(0,calc((1.8rem + 1.35em)/2 - .45rem - .6em),0) scale(1);transform-origin:left top;font-size:1rem;font-weight:400;line-height:1.2;color:var(--ui-field-float-label-color);pointer-events:none;user-select:none;-webkit-user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:transform .11s cubic-bezier(.4,0,.2,1),color .11s ease}@media (prefers-reduced-motion: reduce){.base-field__float-label{transition:none}}.base-field__box:focus-within .base-field__float-label,.base-field--filled .base-field__float-label{transform:translateZ(0) scale(.75);font-weight:500;color:var(--ui-field-float-label-top-color)}.base-field--invalid .base-field__float-label{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid.base-field--filled .base-field__float-label,.base-field--invalid .base-field__box:focus-within .base-field__float-label{color:var(--ui-field-float-label-invalid-color)}.base-field__required{color:var(--ui-field-required-mark-color);margin-left:.15rem}.base-field--invalid .base-field__required{color:var(--ui-field-float-label-invalid-color)}.base-field__control{display:block;width:100%;min-width:0}.base-field__suffix-reserve{display:block;flex-shrink:0;width:2rem;height:2rem;margin:0 .1rem;box-sizing:border-box}.base-field__control--value-end :where(input){text-align:right}.base-field--readonly:not(.base-field--disabled) .base-field__float-label{color:var(--ui-field-readonly-label-color)}.base-field--readonly.base-field--filled .base-field__float-label,.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within .base-field__float-label{color:var(--ui-field-readonly-label-top-color)}.base-field--readonly:not(.base-field--disabled) .base-field__prefix,.base-field--readonly:not(.base-field--disabled) .base-field__prefix-icon{color:var(--ui-field-readonly-prefix-color)}.base-field--readonly:not(.base-field--disabled) .base-field__control :where(input,textarea){color:var(--ui-field-readonly-input-text)}.base-field--invalid.base-field--readonly .base-field__float-label,.base-field--invalid.base-field--readonly.base-field--filled .base-field__float-label,.base-field--invalid.base-field--readonly .base-field__box:focus-within .base-field__float-label{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__prefix,.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__prefix-icon{color:var(--ui-field-float-label-invalid-color)}.base-field__error{margin:0;padding-left:.15rem;font-size:.75rem;color:var(--ui-field-error-text-color);user-select:none;-webkit-user-select:none}\n"], dependencies: [{ kind: "component", type: SkeletonFieldShellComponent, selector: "app-skeleton-field-shell", inputs: ["variant", "animate", "showLeadingIcon"] }, { kind: "component", type: DropdownMenuComponent, selector: "app-dropdown-menu", inputs: ["items", "placement", "minWidthPx", "matchTriggerWidth", "menuId"], outputs: ["itemSelect", "openChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
98
+ }
99
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFieldComponent, decorators: [{
100
+ type: Component,
101
+ args: [{ selector: 'app-base-field', standalone: true, imports: [SkeletonFieldShellComponent, DropdownMenuComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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\u00E7\u00F5es\" tabindex=\"-1\">\n <i class=\"fa-solid fa-ellipsis\" aria-hidden=\"true\"></i>\n </button>\n </app-dropdown-menu>\n }\n @if (showSuffixSlot) {\n <ng-content select=\"[appFieldSuffix]\" />\n }\n @if (showClearTpl) {\n <button type=\"button\" class=\"base-field__clear\" tabindex=\"-1\" [attr.aria-label]=\"clearAriaLabel\"\n (click)=\"onClearClick()\">\n <span class=\"base-field__clear-x\" aria-hidden=\"true\">&times;</span>\n </button>\n }\n } @else if (loading && showSuffixSlot) {\n <span class=\"base-field__suffix-reserve\" aria-hidden=\"true\"></span>\n }\n </div>\n }\n </div>\n\n @if (!loading && showErrorTpl) {\n <p class=\"base-field__error\" [id]=\"errorId || null\" role=\"alert\">\n {{ errorMessage }}\n </p>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;width:100%;box-sizing:border-box}.base-field{display:flex;flex-direction:column;gap:.35rem;width:100%;max-width:100%;box-sizing:border-box}.base-field--loading .base-field__box{pointer-events:none}.base-field--loading .base-field__field{justify-content:center}.base-field--loading .base-field__control{display:flex;align-items:center;width:100%;min-height:0}.base-field__box{display:flex;align-items:stretch;width:100%;min-width:0;border:1px solid var(--ui-field-float-border);border-radius:var(--ui-field-float-border-radius);background:var(--ui-field-float-bg);transition:border-color .1s ease,box-shadow .1s ease;contain:layout}.base-field:not(.base-field--invalid):not(.base-field--disabled):not(.base-field--readonly) .base-field__box:focus-within{border-color:var(--ui-field-float-border-focus);box-shadow:0 0 0 3px var(--ui-field-float-focus-ring)}.base-field--readonly:not(.base-field--disabled) .base-field__box{background:var(--ui-field-readonly-bg);border-color:var(--ui-field-readonly-border)}.base-field--readonly:not(.base-field--disabled):not(.base-field--invalid) .base-field__box:focus-within{border-color:var(--ui-field-readonly-border-focus);box-shadow:0 0 0 3px var(--ui-field-readonly-focus-ring)}.base-field--invalid .base-field__box{border-color:var(--ui-field-input-invalid-border);box-shadow:none;background:var(--ui-field-invalid-input-bg, #fef2f2)}.base-field--readonly.base-field--invalid:not(.base-field--disabled) .base-field__box{background:var(--ui-field-invalid-input-bg, #fef2f2)}.base-field--invalid:not(.base-field--disabled):not(.base-field--readonly) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within{border-color:var(--ui-field-input-invalid-border);box-shadow:0 0 0 3px var(--ui-field-input-invalid-focus-halo)}.base-field--disabled .base-field__box{opacity:var(--ui-field-input-disabled-opacity)}.base-field__prefix{display:flex;align-items:center;justify-content:center;flex-shrink:0;padding-left:.75rem;color:var(--ui-field-float-prefix-color);user-select:none;-webkit-user-select:none}.base-field__prefix:empty{display:none}.base-field__prefix-icon{font-style:normal;font-size:1rem;line-height:1;color:var(--ui-field-float-prefix-color)}.base-field__prefix-icon--loading-dim{opacity:.34;pointer-events:none}.base-field__suffix{display:flex;align-items:center;justify-content:center;flex-shrink:0;padding-right:.4rem;padding-left:.1rem}.base-field__ctx-dropdown{display:inline-flex;flex-shrink:0;align-items:center;max-width:100%}.base-field__ctx-trigger{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.base-field__ctx-trigger:hover{background:var(--app-color-prefix-hover-bg, rgba(90, 127, 163, .15));color:var(--ui-field-float-label-top-color)}.base-field__ctx-trigger:focus,.base-field__ctx-trigger:focus-visible{outline:none}.base-field__clear{display:flex;align-items:center;justify-content:center;width:2rem;height:2rem;margin:0;padding:0;border:none;border-radius:8px;background:transparent;color:var(--ui-field-float-prefix-color);cursor:pointer;user-select:none;-webkit-user-select:none;transition:background .15s ease,color .15s ease}.base-field__clear:hover{background:var(--app-color-prefix-hover-bg, rgba(90, 127, 163, .15));color:var(--ui-field-float-label-top-color)}.base-field__clear:focus,.base-field__clear:focus-visible{outline:none}.base-field__clear-x{font-size:1.35rem;line-height:1;font-weight:300}.base-field--invalid .base-field__prefix,.base-field--invalid .base-field__prefix-icon{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid .base-field__prefix-icon:before{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid .base-field__suffix,.base-field--invalid .base-field__clear,.base-field--invalid .base-field__ctx-trigger{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid .base-field__clear:hover,.base-field--invalid .base-field__ctx-trigger:hover{background:var(--app-color-error-bg-subtle, rgba(185, 28, 28, .12));color:var(--ui-field-float-label-invalid-color)}.base-field__field{position:relative;flex:1;min-width:0;display:flex;flex-direction:column;justify-content:flex-start;contain:layout style}.base-field__float-label{position:absolute;left:.75rem;right:.75rem;top:.45rem;transform:translate3d(0,calc((1.8rem + 1.35em)/2 - .45rem - .6em),0) scale(1);transform-origin:left top;font-size:1rem;font-weight:400;line-height:1.2;color:var(--ui-field-float-label-color);pointer-events:none;user-select:none;-webkit-user-select:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:transform .11s cubic-bezier(.4,0,.2,1),color .11s ease}@media (prefers-reduced-motion: reduce){.base-field__float-label{transition:none}}.base-field__box:focus-within .base-field__float-label,.base-field--filled .base-field__float-label{transform:translateZ(0) scale(.75);font-weight:500;color:var(--ui-field-float-label-top-color)}.base-field--invalid .base-field__float-label{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid.base-field--filled .base-field__float-label,.base-field--invalid .base-field__box:focus-within .base-field__float-label{color:var(--ui-field-float-label-invalid-color)}.base-field__required{color:var(--ui-field-required-mark-color);margin-left:.15rem}.base-field--invalid .base-field__required{color:var(--ui-field-float-label-invalid-color)}.base-field__control{display:block;width:100%;min-width:0}.base-field__suffix-reserve{display:block;flex-shrink:0;width:2rem;height:2rem;margin:0 .1rem;box-sizing:border-box}.base-field__control--value-end :where(input){text-align:right}.base-field--readonly:not(.base-field--disabled) .base-field__float-label{color:var(--ui-field-readonly-label-color)}.base-field--readonly.base-field--filled .base-field__float-label,.base-field--readonly:not(.base-field--disabled) .base-field__box:focus-within .base-field__float-label{color:var(--ui-field-readonly-label-top-color)}.base-field--readonly:not(.base-field--disabled) .base-field__prefix,.base-field--readonly:not(.base-field--disabled) .base-field__prefix-icon{color:var(--ui-field-readonly-prefix-color)}.base-field--readonly:not(.base-field--disabled) .base-field__control :where(input,textarea){color:var(--ui-field-readonly-input-text)}.base-field--invalid.base-field--readonly .base-field__float-label,.base-field--invalid.base-field--readonly.base-field--filled .base-field__float-label,.base-field--invalid.base-field--readonly .base-field__box:focus-within .base-field__float-label{color:var(--ui-field-float-label-invalid-color)}.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__prefix,.base-field--invalid.base-field--readonly:not(.base-field--disabled) .base-field__prefix-icon{color:var(--ui-field-float-label-invalid-color)}.base-field__error{margin:0;padding-left:.15rem;font-size:.75rem;color:var(--ui-field-error-text-color);user-select:none;-webkit-user-select:none}\n"] }]
102
+ }], propDecorators: { label: [{
103
+ type: Input
104
+ }], errorMessage: [{
105
+ type: Input
106
+ }], required: [{
107
+ type: Input
108
+ }], showRequiredMark: [{
109
+ type: Input
110
+ }], invalid: [{
111
+ type: Input
112
+ }], filled: [{
113
+ type: Input
114
+ }], disabled: [{
115
+ type: Input
116
+ }], readonly: [{
117
+ type: Input
118
+ }], inputId: [{
119
+ type: Input
120
+ }], errorId: [{
121
+ type: Input
122
+ }], showPrefixIcon: [{
123
+ type: Input
124
+ }], prefixIcon: [{
125
+ type: Input
126
+ }], clearable: [{
127
+ type: Input
128
+ }], clearAriaLabel: [{
129
+ type: Input
130
+ }], showSuffixSlot: [{
131
+ type: Input
132
+ }], valueAlignEnd: [{
133
+ type: Input
134
+ }], loading: [{
135
+ type: Input,
136
+ args: [{ transform: booleanAttribute }]
137
+ }], skeletonVariant: [{
138
+ type: Input
139
+ }], mostrarMenuContexto: [{
140
+ type: Input,
141
+ args: [{ transform: booleanAttribute }]
142
+ }], contextMenuItems: [{
143
+ type: Input
144
+ }], contextMenuId: [{
145
+ type: Input
146
+ }], clear: [{
147
+ type: Output
148
+ }], contextMenuSelect: [{
149
+ type: Output
150
+ }] } });
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWVsZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2ZpZWxkcy9pbnB1dC1maWVsZHMvX2Jhc2UvYmFzZS1maWVsZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2ZpZWxkcy9pbnB1dC1maWVsZHMvX2Jhc2UvYmFzZS1maWVsZC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFTixnQkFBZ0IsR0FDakIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNMLDJCQUEyQixHQUU1QixNQUFNLG1DQUFtQyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHNEQUFzRCxDQUFDOztBQUc3Rjs7O0dBR0c7QUFTSCxNQUFNLE9BQU8sa0JBQWtCO0lBUi9CO1FBU1csVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDMUIsNEdBQTRHO1FBQ25HLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQUN6QixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFDZixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLFlBQU8sR0FBRyxFQUFFLENBQUM7UUFFYixtQkFBYyxHQUFHLEtBQUssQ0FBQztRQUNoQyxrRkFBa0Y7UUFDekUsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLG1CQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3pDOzs7V0FHRztRQUNNLG1C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Z0JBQWdCO3NCQUF4QixLQUFLO2dCQUVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRUksS0FBSztzQkFBZCxNQUFNO2dCQUNHLGlCQUFpQjtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgU2tlbGV0b25GaWVsZFNoZWxsQ29tcG9uZW50LFxuICB0eXBlIFNrZWxldG9uRmllbGRTaGVsbFZhcmlhbnQsXG59IGZyb20gJy4uLy4uLy4uL2xvYWRpbmcvc2tlbGV0b24tbG9hZGluZyc7XG5pbXBvcnQgeyBEcm9wZG93bk1lbnVDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi9tZW51cy9kcm9wZG93bi1tZW51L2Ryb3Bkb3duLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgTWVudU5vZGVJdGVtIH0gZnJvbSAnLi4vLi4vLi4vbWVudXMvX21vZGVscy9tZW51LWl0ZW0ubW9kZWwnO1xuXG4vKipcbiAqIEJhc2UgdmlzdWFsIGRvIGNhbXBvOiBjYWl4YSBjb20gbGFiZWwgZmx1dHVhbnRlLCBwcmVmaXhvIG9wY2lvbmFsIGUgZXJyby5cbiAqIFVzYWRhIGRlbnRybyBkb3MgY29tcG9uZW50ZXMgZGUgY2FtcG8gKHRleHRvLCBpbnRlaXJvLCBkZWNpbWFsKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtZmllbGQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbU2tlbGV0b25GaWVsZFNoZWxsQ29tcG9uZW50LCBEcm9wZG93bk1lbnVDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vYmFzZS1maWVsZC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9iYXNlLWZpZWxkLmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEJhc2VGaWVsZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlID0gJyc7XG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XG4gIC8qKiBBc3RlcmlzY28gdmlzdWFsIGRvIG9icmlnYXTDs3JpbyBubyBsYWJlbCAodmFsaWRhw6fDo28gSFRNTCBgcmVxdWlyZWRgIGluYWx0ZXJhZGEpOyBwb3IgZGVmZWl0byBgZmFsc2VgLiAqL1xuICBASW5wdXQoKSBzaG93UmVxdWlyZWRNYXJrID0gZmFsc2U7XG4gIEBJbnB1dCgpIGludmFsaWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZmlsbGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHJlYWRvbmx5ID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlucHV0SWQgPSAnJztcbiAgQElucHV0KCkgZXJyb3JJZCA9ICcnO1xuXG4gIEBJbnB1dCgpIHNob3dQcmVmaXhJY29uID0gZmFsc2U7XG4gIC8qKiBDbGFzc2VzIEZvbnQgQXdlc29tZSAoZXguOiBgZmEtc29saWQgZmEtdXNlcmApLiBVc2FkbyBjb20gYHNob3dQcmVmaXhJY29uYC4gKi9cbiAgQElucHV0KCkgcHJlZml4SWNvbiA9ICcnO1xuICBASW5wdXQoKSBjbGVhcmFibGUgPSB0cnVlO1xuICBASW5wdXQoKSBjbGVhckFyaWFMYWJlbCA9ICdMaW1wYXIgY2FtcG8nO1xuICAvKipcbiAgICogUXVhbmRvIGB0cnVlYCwgcmVuZGVyaXphIGBuZy1jb250ZW50YCBjb20gYFthcHBGaWVsZFN1ZmZpeF1gIMOgIGRpcmVpdGEgZG8gaW5wdXRcbiAgICogKGFudGVzIGRvIGJvdMOjbyBsaW1wYXIsIHNlIGhvdXZlcikuXG4gICAqL1xuICBASW5wdXQoKSBzaG93U3VmZml4U2xvdCA9IGZhbHNlO1xuICAvKiogQWxpbmhhIG8gdGV4dG8gZG8gdmFsb3Igw6AgZGlyZWl0YSBubyBpbnB1dCBwcm9qZXRhZG8uICovXG4gIEBJbnB1dCgpIHZhbHVlQWxpZ25FbmQgPSBmYWxzZTtcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbG9hZGluZyA9IGZhbHNlO1xuICAvKiogVmFyaWFudGUgZG8gc2tlbGV0b24gcXVhbmRvIHtAbGluayBsb2FkaW5nfSDDqSBgdHJ1ZWAuICovXG4gIEBJbnB1dCgpIHNrZWxldG9uVmFyaWFudDogU2tlbGV0b25GaWVsZFNoZWxsVmFyaWFudCA9ICd0ZXh0JztcblxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbW9zdHJhck1lbnVDb250ZXh0byA9IGZhbHNlO1xuICBASW5wdXQoKSBjb250ZXh0TWVudUl0ZW1zOiByZWFkb25seSBNZW51Tm9kZUl0ZW08c3RyaW5nPltdID0gW107XG4gIC8qKiBTdWZpeG8gZG8gYGlkYCBkbyBtZW51IChleC46IGBtZXVDYW1wby1jdHhgKTsgcG9yIGRlZmVpdG8gZGVyaXZhLXNlIGRlIHtAbGluayBpbnB1dElkfS4gKi9cbiAgQElucHV0KCkgY29udGV4dE1lbnVJZCA9ICcnO1xuXG4gIEBPdXRwdXQoKSBjbGVhciA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNvbnRleHRNZW51U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgLyoqIERlcml2YWRvcyBkbyB0ZW1wbGF0ZSAoYWN0dWFsaXphZG9zIGVtIGBuZ09uQ2hhbmdlc2AsIG7Do28gZ2V0dGVycyBwb3IgQ0QpLiAqL1xuICBzaG93RXJyb3JUcGwgPSBmYWxzZTtcbiAgc2hvd0Zsb2F0VHBsID0gZmFsc2U7XG4gIHNob3dGYVRwbCA9IGZhbHNlO1xuICBwcmVmaXhJY29uQ2xhc3NUcGwgPSAnJztcbiAgc2hvd0NsZWFyVHBsID0gZmFsc2U7XG4gIHNob3dDdHhNZW51VHBsID0gZmFsc2U7XG4gIHNob3dTdWZmaXhUcGwgPSBmYWxzZTtcblxuICBnZXQgcmVzb2x2ZWRDb250ZXh0TWVudUlkKCk6IHN0cmluZyB7XG4gICAgY29uc3QgdCA9IHRoaXMuY29udGV4dE1lbnVJZC50cmltKCk7XG4gICAgaWYgKHQubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuICAgIGNvbnN0IGJhc2UgPSB0aGlzLmlucHV0SWQudHJpbSgpO1xuICAgIHJldHVybiBiYXNlLmxlbmd0aCA+IDAgPyBgJHtiYXNlfS1jdHhgIDogJ2FwcC1maWVsZC1jdHgtbWVudSc7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hUcGxGbGFncygpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoX2NoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICB0aGlzLnJlZnJlc2hUcGxGbGFncygpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoVHBsRmxhZ3MoKTogdm9pZCB7XG4gICAgY29uc3QgbGFiZWxUcmltID0gdGhpcy5sYWJlbC50cmltKCk7XG4gICAgdGhpcy5zaG93RmxvYXRUcGwgPSBsYWJlbFRyaW0ubGVuZ3RoID4gMDtcbiAgICB0aGlzLnNob3dFcnJvclRwbCA9IHRoaXMuaW52YWxpZCAmJiAhIXRoaXMuZXJyb3JNZXNzYWdlO1xuICAgIGNvbnN0IGljb25UcmltID0gdGhpcy5wcmVmaXhJY29uLnRyaW0oKTtcbiAgICB0aGlzLnNob3dGYVRwbCA9IHRoaXMuc2hvd1ByZWZpeEljb24gJiYgaWNvblRyaW0ubGVuZ3RoID4gMDtcbiAgICB0aGlzLnByZWZpeEljb25DbGFzc1RwbCA9IGBiYXNlLWZpZWxkX19wcmVmaXgtaWNvbiAke2ljb25UcmltfWAudHJpbSgpO1xuICAgIHRoaXMuc2hvd0NsZWFyVHBsID1cbiAgICAgICF0aGlzLmxvYWRpbmcgJiZcbiAgICAgIHRoaXMuY2xlYXJhYmxlICYmXG4gICAgICB0aGlzLmZpbGxlZCAmJlxuICAgICAgIXRoaXMuZGlzYWJsZWQgJiZcbiAgICAgICF0aGlzLnJlYWRvbmx5O1xuICAgIHRoaXMuc2hvd0N0eE1lbnVUcGwgPVxuICAgICAgIXRoaXMubG9hZGluZyAmJlxuICAgICAgIXRoaXMuZGlzYWJsZWQgJiZcbiAgICAgICF0aGlzLnJlYWRvbmx5ICYmXG4gICAgICB0aGlzLm1vc3RyYXJNZW51Q29udGV4dG8gJiZcbiAgICAgICh0aGlzLmNvbnRleHRNZW51SXRlbXM/Lmxlbmd0aCA/PyAwKSA+IDA7XG4gICAgLyogQ29tIGBsb2FkaW5nYCwgbWFudMOpbSBjb2x1bmEgZGUgc3VmaXhvIChleC46IHRvZ2dsZSBzZW5oYSkgcGFyYSBuw6NvIGVuY29saGVyIGEgY2FpeGEuICovXG4gICAgdGhpcy5zaG93U3VmZml4VHBsID0gdGhpcy5sb2FkaW5nXG4gICAgICA/IHRoaXMuc2hvd1N1ZmZpeFNsb3RcbiAgICAgIDogdGhpcy5zaG93U3VmZml4U2xvdCB8fCB0aGlzLnNob3dDbGVhclRwbCB8fCB0aGlzLnNob3dDdHhNZW51VHBsO1xuICB9XG5cbiAgb25DbGVhckNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXIuZW1pdCgpO1xuICB9XG5cbiAgb25Db250ZXh0TWVudUl0ZW1TZWxlY3QoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dE1lbnVTZWxlY3QuZW1pdChpZCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJiYXNlLWZpZWxkXCIgW2NsYXNzLmJhc2UtZmllbGQtLWludmFsaWRdPVwiaW52YWxpZFwiIFtjbGFzcy5iYXNlLWZpZWxkLS1maWxsZWRdPVwiZmlsbGVkXCJcbiAgW2NsYXNzLmJhc2UtZmllbGQtLWRpc2FibGVkXT1cImRpc2FibGVkXCIgW2NsYXNzLmJhc2UtZmllbGQtLXJlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgW2NsYXNzLmJhc2UtZmllbGQtLWxvYWRpbmddPVwibG9hZGluZ1wiIFthdHRyLmFyaWEtYnVzeV09XCJsb2FkaW5nID8gdHJ1ZSA6IG51bGxcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImxvYWRpbmcgJiYgc2hvd0Zsb2F0VHBsID8gbGFiZWwgOiBudWxsXCI+XG4gIDxkaXYgY2xhc3M9XCJiYXNlLWZpZWxkX19ib3hcIj5cbiAgICA8ZGl2IGNsYXNzPVwiYmFzZS1maWVsZF9fcHJlZml4XCI+XG4gICAgICBAaWYgKCFsb2FkaW5nKSB7XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwRmllbGRQcmVmaXhdXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoc2hvd0ZhVHBsKSB7XG4gICAgICA8aSBbYXR0ci5jbGFzc109XCJwcmVmaXhJY29uQ2xhc3NUcGwgKyAobG9hZGluZyA/ICcgYmFzZS1maWVsZF9fcHJlZml4LWljb24tLWxvYWRpbmctZGltJyA6ICcnKVwiXG4gICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgIH1cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJiYXNlLWZpZWxkX19maWVsZFwiPlxuICAgICAgQGlmIChzaG93RmxvYXRUcGwgJiYgIWxvYWRpbmcpIHtcbiAgICAgIDxsYWJlbCBjbGFzcz1cImJhc2UtZmllbGRfX2Zsb2F0LWxhYmVsXCIgW2F0dHIuZm9yXT1cImlucHV0SWQgfHwgbnVsbFwiPlxuICAgICAgICB7eyBsYWJlbCB9fVxuICAgICAgICBAaWYgKHJlcXVpcmVkICYmIHNob3dSZXF1aXJlZE1hcmspIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJiYXNlLWZpZWxkX19yZXF1aXJlZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPio8L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvbGFiZWw+XG4gICAgICB9XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJiYXNlLWZpZWxkX19jb250cm9sXCIgW2NsYXNzLmJhc2UtZmllbGRfX2NvbnRyb2wtLXZhbHVlLWVuZF09XCJ2YWx1ZUFsaWduRW5kXCI+XG4gICAgICAgIEBpZiAoIWxvYWRpbmcpIHtcbiAgICAgICAgPG5nLWNvbnRlbnQgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDxhcHAtc2tlbGV0b24tZmllbGQtc2hlbGwgW3ZhcmlhbnRdPVwic2tlbGV0b25WYXJpYW50XCIgW3Nob3dMZWFkaW5nSWNvbl09XCIhc2hvd0ZhVHBsXCIgLz5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICBAaWYgKHNob3dTdWZmaXhUcGwpIHtcbiAgICA8ZGl2IGNsYXNzPVwiYmFzZS1maWVsZF9fc3VmZml4XCIgW2NsYXNzLmJhc2UtZmllbGRfX3N1ZmZpeC0tbG9hZGluZ109XCJsb2FkaW5nXCI+XG4gICAgICBAaWYgKCFsb2FkaW5nKSB7XG4gICAgICBAaWYgKHNob3dDdHhNZW51VHBsKSB7XG4gICAgICA8YXBwLWRyb3Bkb3duLW1lbnVcbiAgICAgICAgY2xhc3M9XCJiYXNlLWZpZWxkX19jdHgtZHJvcGRvd25cIlxuICAgICAgICBbaXRlbXNdPVwiY29udGV4dE1lbnVJdGVtc1wiXG4gICAgICAgIFttaW5XaWR0aFB4XT1cIjIwMFwiXG4gICAgICAgIFttYXRjaFRyaWdnZXJXaWR0aF09XCJmYWxzZVwiXG4gICAgICAgIFttZW51SWRdPVwicmVzb2x2ZWRDb250ZXh0TWVudUlkXCJcbiAgICAgICAgKGl0ZW1TZWxlY3QpPVwib25Db250ZXh0TWVudUl0ZW1TZWxlY3QoJGV2ZW50KVwiXG4gICAgICA+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYmFzZS1maWVsZF9fY3R4LXRyaWdnZXJcIiBhcmlhLWxhYmVsPVwiTWFpcyBvcMOnw7Vlc1wiIHRhYmluZGV4PVwiLTFcIj5cbiAgICAgICAgICA8aSBjbGFzcz1cImZhLXNvbGlkIGZhLWVsbGlwc2lzXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvYXBwLWRyb3Bkb3duLW1lbnU+XG4gICAgICB9XG4gICAgICBAaWYgKHNob3dTdWZmaXhTbG90KSB7XG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXBwRmllbGRTdWZmaXhdXCIgLz5cbiAgICAgIH1cbiAgICAgIEBpZiAoc2hvd0NsZWFyVHBsKSB7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJhc2UtZmllbGRfX2NsZWFyXCIgdGFiaW5kZXg9XCItMVwiIFthdHRyLmFyaWEtbGFiZWxdPVwiY2xlYXJBcmlhTGFiZWxcIlxuICAgICAgICAoY2xpY2spPVwib25DbGVhckNsaWNrKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJiYXNlLWZpZWxkX19jbGVhci14XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cbiAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuICAgICAgfSBAZWxzZSBpZiAobG9hZGluZyAmJiBzaG93U3VmZml4U2xvdCkge1xuICAgICAgPHNwYW4gY2xhc3M9XCJiYXNlLWZpZWxkX19zdWZmaXgtcmVzZXJ2ZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICB9XG4gIDwvZGl2PlxuXG4gIEBpZiAoIWxvYWRpbmcgJiYgc2hvd0Vycm9yVHBsKSB7XG4gIDxwIGNsYXNzPVwiYmFzZS1maWVsZF9fZXJyb3JcIiBbaWRdPVwiZXJyb3JJZCB8fCBudWxsXCIgcm9sZT1cImFsZXJ0XCI+XG4gICAge3sgZXJyb3JNZXNzYWdlIH19XG4gIDwvcD5cbiAgfVxuPC9kaXY+XG4iXX0=
@@ -0,0 +1,224 @@
1
+ import { ChangeDetectorRef, DestroyRef, Directive, EventEmitter, Injector, Input, Output, booleanAttribute, inject, } from '@angular/core';
2
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
3
+ import { FormGroupDirective, NgForm, Validators, } from '@angular/forms';
4
+ import * as i0 from "@angular/core";
5
+ let fieldControlAutoId = 0;
6
+ /**
7
+ * Diretiva base abstrata: CVA, valor interno, disabled, touched e inputs comuns.
8
+ * Sem UI; os campos concretos envolvem o input com `BaseFieldComponent`.
9
+ */
10
+ export class BaseFieldDirective {
11
+ constructor() {
12
+ this.cdr = inject(ChangeDetectorRef);
13
+ this.injector = inject(Injector);
14
+ this.destroyRef = inject(DestroyRef);
15
+ this.formGroupDir = undefined;
16
+ this.ngFormDir = undefined;
17
+ /** Identificador estável para a11y quando `id` não é informado */
18
+ this.autoId = `app-field-${++fieldControlAutoId}`;
19
+ this.id = '';
20
+ this.name = '';
21
+ this.label = '';
22
+ this.placeholder = '';
23
+ this.errorMessage = '';
24
+ /** Se `true`, exibe o parágrafo de erro; por defeito `false` (só estado inválido na borda/label). */
25
+ this.showErrorMessage = false;
26
+ this.required = false;
27
+ /** Se `true` e `required`, exibe o asterisco no label (`BaseFieldComponent`); por defeito `false`. */
28
+ this.showRequiredMark = false;
29
+ this.readonly = false;
30
+ /** Exibe ícone à esquerda (classes Font Awesome, ex.: `fa-solid fa-user`). */
31
+ this.showPrefixIcon = false;
32
+ this.prefixIcon = '';
33
+ /** Exibe botão à direita para limpar o valor quando houver texto. */
34
+ this.clearable = true;
35
+ this.clearAriaLabel = 'Limpar campo';
36
+ /**
37
+ * Se `true`, o navegador pode exibir sugestões de preenchimento automático.
38
+ * Padrão `false` (`autocomplete="off"` em todos os campos).
39
+ */
40
+ this.autocomplete = false;
41
+ /** Placeholder de carregamento no `app-base-field` (skeleton). */
42
+ this.loading = false;
43
+ /**
44
+ * Mostra botão «…» no sufixo que abre menu de ações (dropdown com os itens em {@link contextMenuItems}).
45
+ * Por defeito `false`.
46
+ */
47
+ this.mostrarMenuContexto = false;
48
+ /** Itens do menu de contexto (rótulos, divisores, grupos); só o botão é mostrado se a lista não for vazia. */
49
+ this.contextMenuItems = [];
50
+ /** `id` do menu (acessibilidade); por defeito `{id do campo}-ctx`. */
51
+ this.contextMenuId = '';
52
+ this.contextMenuSelect = new EventEmitter();
53
+ this.internalValue = null;
54
+ this.disabled = false;
55
+ this.onChange = () => { };
56
+ this.onTouched = () => { };
57
+ }
58
+ /** Alias de {@link prefixIcon} (API alinhada a “ícone à esquerda”). */
59
+ set iconLeft(value) {
60
+ this.prefixIcon = value ?? '';
61
+ }
62
+ get controlId() {
63
+ return this.id || this.autoId;
64
+ }
65
+ /** Valor do atributo HTML `autocomplete` derivado de {@link autocomplete}. */
66
+ get autocompleteAttr() {
67
+ return this.autocomplete ? 'on' : 'off';
68
+ }
69
+ /**
70
+ * Mensagem exibida quando inválido: `errorMessage` se preenchido;
71
+ * senão, se obrigatório, o padrão "Campo obrigatório".
72
+ * Campos não obrigatórios não exibem mensagem de erro da lib.
73
+ */
74
+ getErrorMessage() {
75
+ if (!this.showErrorMessage || !this.isEffectiveRequired(this.resolveControlForRequired())) {
76
+ return '';
77
+ }
78
+ const custom = this.errorMessage.trim();
79
+ if (custom.length > 0) {
80
+ return custom;
81
+ }
82
+ return 'Campo obrigatório';
83
+ }
84
+ /**
85
+ * Obrigatório efetivo para UI: {@link required} ou `Validators.required` no `FormControl`.
86
+ * Usado no asterisco do label e no atributo HTML `required`.
87
+ */
88
+ get requiredEffective() {
89
+ return this.isEffectiveRequired(this.resolveControlForRequired());
90
+ }
91
+ /**
92
+ * `true` se `[required]="true"` **ou** o control tiver `Validators.required`.
93
+ */
94
+ isEffectiveRequired(control) {
95
+ if (this.required) {
96
+ return true;
97
+ }
98
+ if (!control) {
99
+ return false;
100
+ }
101
+ return (control.hasValidator(Validators.required) ||
102
+ control.hasValidator(Validators.requiredTrue));
103
+ }
104
+ /** Sobrescrito em campos com `NgControl` para ler o `FormControl`. */
105
+ resolveControlForRequired() {
106
+ return undefined;
107
+ }
108
+ /**
109
+ * Estado visual de erro (borda/label): obrigatório efetivo + control inválido +
110
+ * só após interação com o valor (`dirty`) ou envio do formulário (`submitted`).
111
+ * Não usar `touched` sozinho: blur/tab marca touched sem alterar o valor e não deve mostrar erro.
112
+ */
113
+ controlInvalidUi(control) {
114
+ if (!this.isEffectiveRequired(control)) {
115
+ return false;
116
+ }
117
+ return (!!control &&
118
+ control.invalid &&
119
+ (control.dirty || this.isParentFormSubmitted()));
120
+ }
121
+ /** Reactive: `FormGroupDirective` no `<form [formGroup]>`; template-driven: `NgForm`. */
122
+ isParentFormSubmitted() {
123
+ if (this.formGroupDir === undefined) {
124
+ this.formGroupDir =
125
+ this.injector.get(FormGroupDirective, null, { optional: true }) ?? null;
126
+ }
127
+ if (this.ngFormDir === undefined) {
128
+ this.ngFormDir = this.injector.get(NgForm, null, { optional: true }) ?? null;
129
+ }
130
+ return !!(this.formGroupDir?.submitted || this.ngFormDir?.submitted);
131
+ }
132
+ /**
133
+ * Campos OnPush precisam reavaliar `baseInvalid` após o submit do form
134
+ * (mudança de `submitted` não passa por `statusChanges`).
135
+ */
136
+ registerFormSubmitRecheck() {
137
+ const fg = this.injector.get(FormGroupDirective, null, { optional: true });
138
+ const nf = this.injector.get(NgForm, null, { optional: true });
139
+ const mark = () => this.cdr.markForCheck();
140
+ fg?.ngSubmit
141
+ ?.pipe(takeUntilDestroyed(this.destroyRef))
142
+ .subscribe(mark);
143
+ nf?.ngSubmit
144
+ ?.pipe(takeUntilDestroyed(this.destroyRef))
145
+ .subscribe(mark);
146
+ }
147
+ writeValue(value) {
148
+ this.internalValue = value;
149
+ this.afterWriteValue(value);
150
+ this.cdr.markForCheck();
151
+ }
152
+ /** Sincroniza exibição/DOM após writeValue ou reset do form. */
153
+ afterWriteValue(_value) { }
154
+ registerOnChange(fn) {
155
+ this.onChange = fn;
156
+ }
157
+ registerOnTouched(fn) {
158
+ this.onTouched = fn;
159
+ }
160
+ setDisabledState(isDisabled) {
161
+ this.disabled = isDisabled;
162
+ this.cdr.markForCheck();
163
+ }
164
+ emitModelValue(value) {
165
+ if (this.disabled) {
166
+ return;
167
+ }
168
+ this.internalValue = value;
169
+ this.onChange(value);
170
+ }
171
+ notifyTouched() {
172
+ this.onTouched();
173
+ this.cdr.markForCheck();
174
+ }
175
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFieldDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
176
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "17.3.12", type: BaseFieldDirective, inputs: { id: "id", name: "name", label: "label", placeholder: "placeholder", errorMessage: "errorMessage", showErrorMessage: "showErrorMessage", required: "required", showRequiredMark: "showRequiredMark", readonly: "readonly", showPrefixIcon: "showPrefixIcon", prefixIcon: "prefixIcon", iconLeft: "iconLeft", clearable: "clearable", clearAriaLabel: "clearAriaLabel", autocomplete: "autocomplete", loading: ["loading", "loading", booleanAttribute], mostrarMenuContexto: ["mostrarMenuContexto", "mostrarMenuContexto", booleanAttribute], contextMenuItems: "contextMenuItems", contextMenuId: "contextMenuId" }, outputs: { contextMenuSelect: "contextMenuSelect" }, ngImport: i0 }); }
177
+ }
178
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseFieldDirective, decorators: [{
179
+ type: Directive
180
+ }], propDecorators: { id: [{
181
+ type: Input
182
+ }], name: [{
183
+ type: Input
184
+ }], label: [{
185
+ type: Input
186
+ }], placeholder: [{
187
+ type: Input
188
+ }], errorMessage: [{
189
+ type: Input
190
+ }], showErrorMessage: [{
191
+ type: Input
192
+ }], required: [{
193
+ type: Input
194
+ }], showRequiredMark: [{
195
+ type: Input
196
+ }], readonly: [{
197
+ type: Input
198
+ }], showPrefixIcon: [{
199
+ type: Input
200
+ }], prefixIcon: [{
201
+ type: Input
202
+ }], iconLeft: [{
203
+ type: Input,
204
+ args: ['iconLeft']
205
+ }], clearable: [{
206
+ type: Input
207
+ }], clearAriaLabel: [{
208
+ type: Input
209
+ }], autocomplete: [{
210
+ type: Input
211
+ }], loading: [{
212
+ type: Input,
213
+ args: [{ transform: booleanAttribute }]
214
+ }], mostrarMenuContexto: [{
215
+ type: Input,
216
+ args: [{ transform: booleanAttribute }]
217
+ }], contextMenuItems: [{
218
+ type: Input
219
+ }], contextMenuId: [{
220
+ type: Input
221
+ }], contextMenuSelect: [{
222
+ type: Output
223
+ }] } });
224
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1maWVsZC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2ZpZWxkcy9pbnB1dC1maWVsZHMvX2Jhc2UvYmFzZS1maWVsZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixVQUFVLEVBQ1YsU0FBUyxFQUNULFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUNMLE1BQU0sRUFDTixnQkFBZ0IsRUFDaEIsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsTUFBTSxFQUNOLFVBQVUsR0FDWCxNQUFNLGdCQUFnQixDQUFDOztBQUV4QixJQUFJLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQUUzQjs7O0dBR0c7QUFFSCxNQUFNLE9BQWdCLGtCQUFrQjtJQUR4QztRQUVxQixRQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDaEMsYUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QixlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTNDLGlCQUFZLEdBQTBDLFNBQVMsQ0FBQztRQUNoRSxjQUFTLEdBQThCLFNBQVMsQ0FBQztRQUV6RCxrRUFBa0U7UUFDL0MsV0FBTSxHQUFHLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBRXZELE9BQUUsR0FBRyxFQUFFLENBQUM7UUFDUixTQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ1YsVUFBSyxHQUFHLEVBQUUsQ0FBQztRQUNYLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBQzNCLHFHQUFxRztRQUM1RixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFD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QUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7K0dBbE1tQixrQkFBa0I7bUdBQWxCLGtCQUFrQixnYkF5Q2xCLGdCQUFnQix1RUFNaEIsZ0JBQWdCOzs0RkEvQ2hCLGtCQUFrQjtrQkFEdkMsU0FBUzs4QkFZQyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUlGLFFBQVE7c0JBRFgsS0FBSzt1QkFBQyxVQUFVO2dCQUtSLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdrQyxPQUFPO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU1FLG1CQUFtQjtzQkFBMUQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFHN0IsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBRWEsaUJBQWlCO3NCQUFuQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERlc3Ryb3lSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3RvcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgaW5qZWN0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB0eXBlIHsgTWVudU5vZGVJdGVtIH0gZnJvbSAnLi4vLi4vLi4vbWVudXMvX21vZGVscy9tZW51LWl0ZW0ubW9kZWwnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgRm9ybUdyb3VwRGlyZWN0aXZlLFxuICBOZ0Zvcm0sXG4gIFZhbGlkYXRvcnMsXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxubGV0IGZpZWxkQ29udHJvbEF1dG9JZCA9IDA7XG5cbi8qKlxuICogRGlyZXRpdmEgYmFzZSBhYnN0cmF0YTogQ1ZBLCB2YWxvciBpbnRlcm5vLCBkaXNhYmxlZCwgdG91Y2hlZCBlIGlucHV0cyBjb211bnMuXG4gKiBTZW0gVUk7IG9zIGNhbXBvcyBjb25jcmV0b3MgZW52b2x2ZW0gbyBpbnB1dCBjb20gYEJhc2VGaWVsZENvbXBvbmVudGAuXG4gKi9cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VGaWVsZERpcmVjdGl2ZTxUPiBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIHByaXZhdGUgZm9ybUdyb3VwRGlyOiBGb3JtR3JvdXBEaXJlY3RpdmUgfCBudWxsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIG5nRm9ybURpcjogTmdGb3JtIHwgbnVsbCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAvKiogSWRlbnRpZmljYWRvciBlc3TDoXZlbCBwYXJhIGExMXkgcXVhbmRvIGBpZGAgbsOjbyDDqSBpbmZvcm1hZG8gKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF1dG9JZCA9IGBhcHAtZmllbGQtJHsrK2ZpZWxkQ29udHJvbEF1dG9JZH1gO1xuXG4gIEBJbnB1dCgpIGlkID0gJyc7XG4gIEBJbnB1dCgpIG5hbWUgPSAnJztcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnJztcbiAgQElucHV0KCkgZXJyb3JNZXNzYWdlID0gJyc7XG4gIC8qKiBTZSBgdHJ1ZWAsIGV4aWJlIG8gcGFyw6FncmFmbyBkZSBlcnJvOyBwb3IgZGVmZWl0byBgZmFsc2VgIChzw7MgZXN0YWRvIGludsOhbGlkbyBuYSBib3JkYS9sYWJlbCkuICovXG4gIEBJbnB1dCgpIHNob3dFcnJvck1lc3NhZ2UgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVxdWlyZWQgPSBmYWxzZTtcbiAgLyoqIFNlIGB0cnVlYCBlIGByZXF1aXJlZGAsIGV4aWJlIG8gYXN0ZXJpc2NvIG5vIGxhYmVsIChgQmFzZUZpZWxkQ29tcG9uZW50YCk7IHBvciBkZWZlaXRvIGBmYWxzZWAuICovXG4gIEBJbnB1dCgpIHNob3dSZXF1aXJlZE1hcmsgPSBmYWxzZTtcbiAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgLyoqIEV4aWJlIMOtY29uZSDDoCBlc3F1ZXJkYSAoY2xhc3NlcyBGb250IEF3ZXNvbWUsIGV4LjogYGZhLXNvbGlkIGZhLXVzZXJgKS4gKi9cbiAgQElucHV0KCkgc2hvd1ByZWZpeEljb24gPSBmYWxzZTtcbiAgQElucHV0KCkgcHJlZml4SWNvbiA9ICcnO1xuXG4gIC8qKiBBbGlhcyBkZSB7QGxpbmsgcHJlZml4SWNvbn0gKEFQSSBhbGluaGFkYSBhIOKAnMOtY29uZSDDoCBlc3F1ZXJkYeKAnSkuICovXG4gIEBJbnB1dCgnaWNvbkxlZnQnKVxuICBzZXQgaWNvbkxlZnQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMucHJlZml4SWNvbiA9IHZhbHVlID8/ICcnO1xuICB9XG4gIC8qKiBFeGliZSBib3TDo28gw6AgZGlyZWl0YSBwYXJhIGxpbXBhciBvIHZhbG9yIHF1YW5kbyBob3V2ZXIgdGV4dG8uICovXG4gIEBJbnB1dCgpIGNsZWFyYWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIGNsZWFyQXJpYUxhYmVsID0gJ0xpbXBhciBjYW1wbyc7XG4gIC8qKlxuICAgKiBTZSBgdHJ1ZWAsIG8gbmF2ZWdhZG9yIHBvZGUgZXhpYmlyIHN1Z2VzdMO1ZXMgZGUgcHJlZW5jaGltZW50byBhdXRvbcOhdGljby5cbiAgICogUGFkcsOjbyBgZmFsc2VgIChgYXV0b2NvbXBsZXRlPVwib2ZmXCJgIGVtIHRvZG9zIG9zIGNhbXBvcykuXG4gICAqL1xuICBASW5wdXQoKSBhdXRvY29tcGxldGUgPSBmYWxzZTtcblxuICAvKiogUGxhY2Vob2xkZXIgZGUgY2FycmVnYW1lbnRvIG5vIGBhcHAtYmFzZS1maWVsZGAgKHNrZWxldG9uKS4gKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGxvYWRpbmcgPSBmYWxzZTtcblxuICAvKipcbiAgICogTW9zdHJhIGJvdMOjbyDCq+KApsK7IG5vIHN1Zml4byBxdWUgYWJyZSBtZW51IGRlIGHDp8O1ZXMgKGRyb3Bkb3duIGNvbSBvcyBpdGVucyBlbSB7QGxpbmsgY29udGV4dE1lbnVJdGVtc30pLlxuICAgKiBQb3IgZGVmZWl0byBgZmFsc2VgLlxuICAgKi9cbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIG1vc3RyYXJNZW51Q29udGV4dG8gPSBmYWxzZTtcblxuICAvKiogSXRlbnMgZG8gbWVudSBkZSBjb250ZXh0byAocsOzdHVsb3MsIGRpdmlzb3JlcywgZ3J1cG9zKTsgc8OzIG8gYm90w6NvIMOpIG1vc3RyYWRvIHNlIGEgbGlzdGEgbsOjbyBmb3IgdmF6aWEuICovXG4gIEBJbnB1dCgpIGNvbnRleHRNZW51SXRlbXM6IHJlYWRvbmx5IE1lbnVOb2RlSXRlbTxzdHJpbmc+W10gPSBbXTtcblxuICAvKiogYGlkYCBkbyBtZW51IChhY2Vzc2liaWxpZGFkZSk7IHBvciBkZWZlaXRvIGB7aWQgZG8gY2FtcG99LWN0eGAuICovXG4gIEBJbnB1dCgpIGNvbnRleHRNZW51SWQgPSAnJztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgY29udGV4dE1lbnVTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcm90ZWN0ZWQgaW50ZXJuYWxWYWx1ZTogVCB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIG9uQ2hhbmdlOiAodmFsdWU6IFQgfCBudWxsKSA9PiB2b2lkID0gKCkgPT4geyB9O1xuICBwcml2YXRlIG9uVG91Y2hlZDogKCkgPT4gdm9pZCA9ICgpID0+IHsgfTtcblxuICBnZXQgY29udHJvbElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaWQgfHwgdGhpcy5hdXRvSWQ7XG4gIH1cblxuICAvKiogVmFsb3IgZG8gYXRyaWJ1dG8gSFRNTCBgYXV0b2NvbXBsZXRlYCBkZXJpdmFkbyBkZSB7QGxpbmsgYXV0b2NvbXBsZXRlfS4gKi9cbiAgZ2V0IGF1dG9jb21wbGV0ZUF0dHIoKTogJ29uJyB8ICdvZmYnIHtcbiAgICByZXR1cm4gdGhpcy5hdXRvY29tcGxldGUgPyAnb24nIDogJ29mZic7XG4gIH1cblxuICAvKipcbiAgICogTWVuc2FnZW0gZXhpYmlkYSBxdWFuZG8gaW52w6FsaWRvOiBgZXJyb3JNZXNzYWdlYCBzZSBwcmVlbmNoaWRvO1xuICAgKiBzZW7Do28sIHNlIG9icmlnYXTDs3JpbywgbyBwYWRyw6NvIFwiQ2FtcG8gb2JyaWdhdMOzcmlvXCIuXG4gICAqIENhbXBvcyBuw6NvIG9icmlnYXTDs3Jpb3MgbsOjbyBleGliZW0gbWVuc2FnZW0gZGUgZXJybyBkYSBsaWIuXG4gICAqL1xuICBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2hvd0Vycm9yTWVzc2FnZSB8fCAhdGhpcy5pc0VmZmVjdGl2ZVJlcXVpcmVkKHRoaXMucmVzb2x2ZUNvbnRyb2xGb3JSZXF1aXJlZCgpKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBjdXN0b20gPSB0aGlzLmVycm9yTWVzc2FnZS50cmltKCk7XG4gICAgaWYgKGN1c3RvbS5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gY3VzdG9tO1xuICAgIH1cbiAgICByZXR1cm4gJ0NhbXBvIG9icmlnYXTDs3Jpbyc7XG4gIH1cblxuICAvKipcbiAgICogT2JyaWdhdMOzcmlvIGVmZXRpdm8gcGFyYSBVSToge0BsaW5rIHJlcXVpcmVkfSBvdSBgVmFsaWRhdG9ycy5yZXF1aXJlZGAgbm8gYEZvcm1Db250cm9sYC5cbiAgICogVXNhZG8gbm8gYXN0ZXJpc2NvIGRvIGxhYmVsIGUgbm8gYXRyaWJ1dG8gSFRNTCBgcmVxdWlyZWRgLlxuICAgKi9cbiAgZ2V0IHJlcXVpcmVkRWZmZWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRWZmZWN0aXZlUmVxdWlyZWQodGhpcy5yZXNvbHZlQ29udHJvbEZvclJlcXVpcmVkKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIGB0cnVlYCBzZSBgW3JlcXVpcmVkXT1cInRydWVcImAgKipvdSoqIG8gY29udHJvbCB0aXZlciBgVmFsaWRhdG9ycy5yZXF1aXJlZGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNFZmZlY3RpdmVSZXF1aXJlZChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWNvbnRyb2wpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIGNvbnRyb2wuaGFzVmFsaWRhdG9yKFZhbGlkYXRvcnMucmVxdWlyZWQpIHx8XG4gICAgICBjb250cm9sLmhhc1ZhbGlkYXRvcihWYWxpZGF0b3JzLnJlcXVpcmVkVHJ1ZSlcbiAgICApO1xuICB9XG5cbiAgLyoqIFNvYnJlc2NyaXRvIGVtIGNhbXBvcyBjb20gYE5nQ29udHJvbGAgcGFyYSBsZXIgbyBgRm9ybUNvbnRyb2xgLiAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZUNvbnRyb2xGb3JSZXF1aXJlZCgpOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFkbyB2aXN1YWwgZGUgZXJybyAoYm9yZGEvbGFiZWwpOiBvYnJpZ2F0w7NyaW8gZWZldGl2byArIGNvbnRyb2wgaW52w6FsaWRvICtcbiAgICogc8OzIGFww7NzIGludGVyYcOnw6NvIGNvbSBvIHZhbG9yIChgZGlydHlgKSBvdSBlbnZpbyBkbyBmb3JtdWzDoXJpbyAoYHN1Ym1pdHRlZGApLlxuICAgKiBOw6NvIHVzYXIgYHRvdWNoZWRgIHNvemluaG86IGJsdXIvdGFiIG1hcmNhIHRvdWNoZWQgc2VtIGFsdGVyYXIgbyB2YWxvciBlIG7Do28gZGV2ZSBtb3N0cmFyIGVycm8uXG4gICAqL1xuICBwcm90ZWN0ZWQgY29udHJvbEludmFsaWRVaShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmlzRWZmZWN0aXZlUmVxdWlyZWQoY29udHJvbCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgICEhY29udHJvbCAmJlxuICAgICAgY29udHJvbC5pbnZhbGlkICYmXG4gICAgICAoY29udHJvbC5kaXJ0eSB8fCB0aGlzLmlzUGFyZW50Rm9ybVN1Ym1pdHRlZCgpKVxuICAgICk7XG4gIH1cblxuICAvKiogUmVhY3RpdmU6IGBGb3JtR3JvdXBEaXJlY3RpdmVgIG5vIGA8Zm9ybSBbZm9ybUdyb3VwXT5gOyB0ZW1wbGF0ZS1kcml2ZW46IGBOZ0Zvcm1gLiAqL1xuICBwcm90ZWN0ZWQgaXNQYXJlbnRGb3JtU3VibWl0dGVkKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmZvcm1Hcm91cERpciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvcm1Hcm91cERpciA9XG4gICAgICAgIHRoaXMuaW5qZWN0b3IuZ2V0KEZvcm1Hcm91cERpcmVjdGl2ZSwgbnVsbCwgeyBvcHRpb25hbDogdHJ1ZSB9KSA/PyBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5uZ0Zvcm1EaXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5uZ0Zvcm1EaXIgPSB0aGlzLmluamVjdG9yLmdldChOZ0Zvcm0sIG51bGwsIHsgb3B0aW9uYWw6IHRydWUgfSkgPz8gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuICEhKHRoaXMuZm9ybUdyb3VwRGlyPy5zdWJtaXR0ZWQgfHwgdGhpcy5uZ0Zvcm1EaXI/LnN1Ym1pdHRlZCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FtcG9zIE9uUHVzaCBwcmVjaXNhbSByZWF2YWxpYXIgYGJhc2VJbnZhbGlkYCBhcMOzcyBvIHN1Ym1pdCBkbyBmb3JtXG4gICAqIChtdWRhbsOnYSBkZSBgc3VibWl0dGVkYCBuw6NvIHBhc3NhIHBvciBgc3RhdHVzQ2hhbmdlc2ApLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlZ2lzdGVyRm9ybVN1Ym1pdFJlY2hlY2soKTogdm9pZCB7XG4gICAgY29uc3QgZmcgPSB0aGlzLmluamVjdG9yLmdldChGb3JtR3JvdXBEaXJlY3RpdmUsIG51bGwsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgY29uc3QgbmYgPSB0aGlzLmluamVjdG9yLmdldChOZ0Zvcm0sIG51bGwsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gICAgY29uc3QgbWFyayA9ICgpOiB2b2lkID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIGZnPy5uZ1N1Ym1pdFxuICAgICAgPy5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZShtYXJrKTtcbiAgICBuZj8ubmdTdWJtaXRcbiAgICAgID8ucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUobWFyayk7XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBUIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuYWZ0ZXJXcml0ZVZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKiBTaW5jcm9uaXphIGV4aWJpw6fDo28vRE9NIGFww7NzIHdyaXRlVmFsdWUgb3UgcmVzZXQgZG8gZm9ybS4gKi9cbiAgcHJvdGVjdGVkIGFmdGVyV3JpdGVWYWx1ZShfdmFsdWU6IFQgfCBudWxsKTogdm9pZCB7IH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IFQgfCBudWxsKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdE1vZGVsVmFsdWUodmFsdWU6IFQgfCBudWxsKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5pbnRlcm5hbFZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbm90aWZ5VG91Y2hlZCgpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,135 @@
1
+ import { Directive, Input } from '@angular/core';
2
+ import { NgControlFieldDirective } from './ng-control-field.directive';
3
+ import { formatMaskDigits, maskDigitCount, stripToDigits, } from '../_utils/mask-format.utils';
4
+ import * as i0 from "@angular/core";
5
+ /**
6
+ * Campo de texto com máscara visual; valor do modelo = **apenas dígitos** (string), sem máscara.
7
+ */
8
+ export class MaskedTextFieldBase extends NgControlFieldDirective {
9
+ constructor() {
10
+ super(...arguments);
11
+ /** Padrão com `#` para cada dígito (ex.: `#####-###`). Subclasses podem sobrescrever {@link pattern}. */
12
+ this.maskPattern = '#####-###';
13
+ this.inputText = '';
14
+ /** Preenchido (só dígitos) para o label flutuante; actualizado com o texto mascarado. */
15
+ this.filledUi = false;
16
+ }
17
+ /** Padrão efetivo (permite CEP/telefone fixarem máscaras em subclasses). */
18
+ get pattern() {
19
+ return this.maskPattern;
20
+ }
21
+ /**
22
+ * Padrão de formatação para o valor digitado (só dígitos).
23
+ * Sobrescrever para máscara dinâmica (ex.: CPF até 11 dígitos, CNPJ depois).
24
+ */
25
+ maskPatternFromDigits(digitsOnly) {
26
+ return this.pattern;
27
+ }
28
+ refreshMaskFilledUi() {
29
+ this.filledUi = stripToDigits(this.inputText).length > 0;
30
+ }
31
+ afterWriteValue(value) {
32
+ const incoming = stripToDigits(value ?? '');
33
+ const pat = this.maskPatternFromDigits(incoming);
34
+ const max = maskDigitCount(pat);
35
+ const d = incoming.slice(0, max);
36
+ this.inputText = formatMaskDigits(d, pat);
37
+ if (incoming !== d) {
38
+ queueMicrotask(() => this.emitModelValue(d.length ? d : null));
39
+ }
40
+ this.refreshMaskFilledUi();
41
+ if (this.ngControl?.control) {
42
+ this.syncControlUi();
43
+ }
44
+ else {
45
+ this.cdr.markForCheck();
46
+ }
47
+ }
48
+ /**
49
+ * Dígitos abaixo do tamanho da máscara actual (fixa ou dinâmica, ex. CPF/CNPJ), com valor parcial.
50
+ * Aplica-se também sem obrigatório: máscara incompleta deve mostrar erro na UI (alinhado a `maskIncomplete`).
51
+ * Mesma regra temporal que {@link BaseFieldDirective.controlInvalidUi}: `dirty` ou submit (não só `touched`).
52
+ */
53
+ isMaskIncompleteForUi() {
54
+ const control = this.ngControl?.control;
55
+ if (!control ||
56
+ !(control.dirty || this.isParentFormSubmitted())) {
57
+ return false;
58
+ }
59
+ const digits = stripToDigits(this.inputText);
60
+ if (digits.length === 0) {
61
+ return false;
62
+ }
63
+ const pat = this.maskPatternFromDigits(digits);
64
+ const max = maskDigitCount(pat);
65
+ return digits.length < max;
66
+ }
67
+ get baseInvalid() {
68
+ if (this.isMaskIncompleteForUi()) {
69
+ return true;
70
+ }
71
+ return super.baseInvalid;
72
+ }
73
+ getErrorMessage() {
74
+ if (!this.showErrorMessage) {
75
+ return '';
76
+ }
77
+ if (this.isMaskIncompleteForUi()) {
78
+ const custom = this.errorMessage.trim();
79
+ if (custom.length > 0) {
80
+ return custom;
81
+ }
82
+ return 'Campo obrigatório';
83
+ }
84
+ return super.getErrorMessage();
85
+ }
86
+ onMaskedInput(event) {
87
+ if (this.disabled || this.readonly) {
88
+ return;
89
+ }
90
+ const el = event.target;
91
+ const incoming = stripToDigits(el.value);
92
+ const pat = this.maskPatternFromDigits(incoming);
93
+ const max = maskDigitCount(pat);
94
+ const d = incoming.slice(0, max);
95
+ const display = formatMaskDigits(d, pat);
96
+ if (el.value !== display) {
97
+ el.value = display;
98
+ }
99
+ this.inputText = display;
100
+ this.emitModelValue(d.length ? d : null);
101
+ this.refreshMaskFilledUi();
102
+ if (this.ngControl?.control) {
103
+ this.syncControlUi();
104
+ }
105
+ else {
106
+ this.cdr.markForCheck();
107
+ }
108
+ }
109
+ onMaskedBlur() {
110
+ this.notifyTouched();
111
+ }
112
+ onMaskedClear() {
113
+ if (this.disabled || this.readonly) {
114
+ return;
115
+ }
116
+ this.inputText = '';
117
+ this.emitModelValue(null);
118
+ this.notifyTouched();
119
+ this.refreshMaskFilledUi();
120
+ if (this.ngControl?.control) {
121
+ this.syncControlUi();
122
+ }
123
+ else {
124
+ this.cdr.markForCheck();
125
+ }
126
+ }
127
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MaskedTextFieldBase, deps: null, target: i0.ɵɵFactoryTarget.Directive }); }
128
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: MaskedTextFieldBase, inputs: { maskPattern: "maskPattern" }, usesInheritance: true, ngImport: i0 }); }
129
+ }
130
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MaskedTextFieldBase, decorators: [{
131
+ type: Directive
132
+ }], propDecorators: { maskPattern: [{
133
+ type: Input
134
+ }] } });
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFza2VkLXRleHQtZmllbGQuYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZmllbGRzL2lucHV0LWZpZWxkcy9fYmFzZS9tYXNrZWQtdGV4dC1maWVsZC5iYXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3ZFLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsY0FBYyxFQUNkLGFBQWEsR0FDZCxNQUFNLDZCQUE2QixDQUFDOztBQUVyQzs7R0FFRztBQUVILE1BQU0sT0FBZ0IsbUJBQW9CLFNBQVEsdUJBRWpEO0lBSEQ7O1FBSUUseUdBQXlHO1FBQ2hHLGdCQUFXLEdBQUcsV0FBVyxDQUFDO1FBRW5DLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZix5RkFBeUY7UUFDekYsYUFBUSxHQUFHLEtBQUssQ0FBQztLQXdIbEI7SUF0SEMsNEVBQTRFO0lBQzVFLElBQWMsT0FBTztRQUNuQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7T0FHRztJQUNPLHFCQUFxQixDQUFDLFVBQWtCO1FBQ2hELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRVMsbUJBQW1CO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFFa0IsZUFBZSxDQUFDLEtBQW9CO1FBQ3JELE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDNUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pE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LElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7K0dBaEltQixtQkFBbUI7bUdBQW5CLG1CQUFtQjs7NEZBQW5CLG1CQUFtQjtrQkFEeEMsU0FBUzs4QkFLQyxXQUFXO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBOZ0NvbnRyb2xGaWVsZERpcmVjdGl2ZSB9IGZyb20gJy4vbmctY29udHJvbC1maWVsZC5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge1xyXG4gIGZvcm1hdE1hc2tEaWdpdHMsXHJcbiAgbWFza0RpZ2l0Q291bnQsXHJcbiAgc3RyaXBUb0RpZ2l0cyxcclxufSBmcm9tICcuLi9fdXRpbHMvbWFzay1mb3JtYXQudXRpbHMnO1xyXG5cclxuLyoqXHJcbiAqIENhbXBvIGRlIHRleHRvIGNvbSBtw6FzY2FyYSB2aXN1YWw7IHZhbG9yIGRvIG1vZGVsbyA9ICoqYXBlbmFzIGTDrWdpdG9zKiogKHN0cmluZyksIHNlbSBtw6FzY2FyYS5cclxuICovXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWFza2VkVGV4dEZpZWxkQmFzZSBleHRlbmRzIE5nQ29udHJvbEZpZWxkRGlyZWN0aXZlPFxyXG4gIHN0cmluZyB8IG51bGxcclxuPiB7XHJcbiAgLyoqIFBhZHLDo28gY29tIGAjYCBwYXJhIGNhZGEgZMOtZ2l0byAoZXguOiBgIyMjIyMtIyMjYCkuIFN1YmNsYXNzZXMgcG9kZW0gc29icmVzY3JldmVyIHtAbGluayBwYXR0ZXJufS4gKi9cclxuICBASW5wdXQoKSBtYXNrUGF0dGVybiA9ICcjIyMjIy0jIyMnO1xyXG5cclxuICBpbnB1dFRleHQgPSAnJztcclxuXHJcbiAgLyoqIFByZWVuY2hpZG8gKHPDsyBkw61naXRvcykgcGFyYSBvIGxhYmVsIGZsdXR1YW50ZTsgYWN0dWFsaXphZG8gY29tIG8gdGV4dG8gbWFzY2FyYWRvLiAqL1xyXG4gIGZpbGxlZFVpID0gZmFsc2U7XHJcblxyXG4gIC8qKiBQYWRyw6NvIGVmZXRpdm8gKHBlcm1pdGUgQ0VQL3RlbGVmb25lIGZpeGFyZW0gbcOhc2NhcmFzIGVtIHN1YmNsYXNzZXMpLiAqL1xyXG4gIHByb3RlY3RlZCBnZXQgcGF0dGVybigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMubWFza1BhdHRlcm47XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBQYWRyw6NvIGRlIGZvcm1hdGHDp8OjbyBwYXJhIG8gdmFsb3IgZGlnaXRhZG8gKHPDsyBkw61naXRvcykuXHJcbiAgICogU29icmVzY3JldmVyIHBhcmEgbcOhc2NhcmEgZGluw6JtaWNhIChleC46IENQRiBhdMOpIDExIGTDrWdpdG9zLCBDTlBKIGRlcG9pcykuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIG1hc2tQYXR0ZXJuRnJvbURpZ2l0cyhkaWdpdHNPbmx5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMucGF0dGVybjtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWZyZXNoTWFza0ZpbGxlZFVpKCk6IHZvaWQge1xyXG4gICAgdGhpcy5maWxsZWRVaSA9IHN0cmlwVG9EaWdpdHModGhpcy5pbnB1dFRleHQpLmxlbmd0aCA+IDA7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYWZ0ZXJXcml0ZVZhbHVlKHZhbHVlOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbmNvbWluZyA9IHN0cmlwVG9EaWdpdHModmFsdWUgPz8gJycpO1xyXG4gICAgY29uc3QgcGF0ID0gdGhpcy5tYXNrUGF0dGVybkZyb21EaWdpdHMoaW5jb21pbmcpO1xyXG4gICAgY29uc3QgbWF4ID0gbWFza0RpZ2l0Q291bnQocGF0KTtcclxuICAgIGNvbnN0IGQgPSBpbmNvbWluZy5zbGljZSgwLCBtYXgpO1xyXG4gICAgdGhpcy5pbnB1dFRleHQgPSBmb3JtYXRNYXNrRGlnaXRzKGQsIHBhdCk7XHJcbiAgICBpZiAoaW5jb21pbmcgIT09IGQpIHtcclxuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gdGhpcy5lbWl0TW9kZWxWYWx1ZShkLmxlbmd0aCA/IGQgOiBudWxsKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZnJlc2hNYXNrRmlsbGVkVWkoKTtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbD8uY29udHJvbCkge1xyXG4gICAgICB0aGlzLnN5bmNDb250cm9sVWkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRMOtZ2l0b3MgYWJhaXhvIGRvIHRhbWFuaG8gZGEgbcOhc2NhcmEgYWN0dWFsIChmaXhhIG91IGRpbsOibWljYSwgZXguIENQRi9DTlBKKSwgY29tIHZhbG9yIHBhcmNpYWwuXHJcbiAgICogQXBsaWNhLXNlIHRhbWLDqW0gc2VtIG9icmlnYXTDs3JpbzogbcOhc2NhcmEgaW5jb21wbGV0YSBkZXZlIG1vc3RyYXIgZXJybyBuYSBVSSAoYWxpbmhhZG8gYSBgbWFza0luY29tcGxldGVgKS5cclxuICAgKiBNZXNtYSByZWdyYSB0ZW1wb3JhbCBxdWUge0BsaW5rIEJhc2VGaWVsZERpcmVjdGl2ZS5jb250cm9sSW52YWxpZFVpfTogYGRpcnR5YCBvdSBzdWJtaXQgKG7Do28gc8OzIGB0b3VjaGVkYCkuXHJcbiAgICovXHJcbiAgcHJvdGVjdGVkIGlzTWFza0luY29tcGxldGVGb3JVaSgpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLm5nQ29udHJvbD8uY29udHJvbDtcclxuICAgIGlmIChcclxuICAgICAgIWNvbnRyb2wgfHxcclxuICAgICAgIShjb250cm9sLmRpcnR5IHx8IHRoaXMuaXNQYXJlbnRGb3JtU3VibWl0dGVkKCkpXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlnaXRzID0gc3RyaXBUb0RpZ2l0cyh0aGlzLmlucHV0VGV4dCk7XHJcbiAgICBpZiAoZGlnaXRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXQgPSB0aGlzLm1hc2tQYXR0ZXJuRnJvbURpZ2l0cyhkaWdpdHMpO1xyXG4gICAgY29uc3QgbWF4ID0gbWFza0RpZ2l0Q291bnQocGF0KTtcclxuICAgIHJldHVybiBkaWdpdHMubGVuZ3RoIDwgbWF4O1xyXG4gIH1cclxuXHJcbiAgb3ZlcnJpZGUgZ2V0IGJhc2VJbnZhbGlkKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNNYXNrSW5jb21wbGV0ZUZvclVpKCkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIuYmFzZUludmFsaWQ7XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBnZXRFcnJvck1lc3NhZ2UoKTogc3RyaW5nIHtcclxuICAgIGlmICghdGhpcy5zaG93RXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmlzTWFza0luY29tcGxldGVGb3JVaSgpKSB7XHJcbiAgICAgIGNvbnN0IGN1c3RvbSA9IHRoaXMuZXJyb3JNZXNzYWdlLnRyaW0oKTtcclxuICAgICAgaWYgKGN1c3RvbS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgcmV0dXJuIGN1c3RvbTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gJ0NhbXBvIG9icmlnYXTDs3Jpbyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25NYXNrZWRJbnB1dChldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZWwgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgIGNvbnN0IGluY29taW5nID0gc3RyaXBUb0RpZ2l0cyhlbC52YWx1ZSk7XHJcbiAgICBjb25zdCBwYXQgPSB0aGlzLm1hc2tQYXR0ZXJuRnJvbURpZ2l0cyhpbmNvbWluZyk7XHJcbiAgICBjb25zdCBtYXggPSBtYXNrRGlnaXRDb3VudChwYXQpO1xyXG4gICAgY29uc3QgZCA9IGluY29taW5nLnNsaWNlKDAsIG1heCk7XHJcbiAgICBjb25zdCBkaXNwbGF5ID0gZm9ybWF0TWFza0RpZ2l0cyhkLCBwYXQpO1xyXG4gICAgaWYgKGVsLnZhbHVlICE9PSBkaXNwbGF5KSB7XHJcbiAgICAgIGVsLnZhbHVlID0gZGlzcGxheTtcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRUZXh0ID0gZGlzcGxheTtcclxuICAgIHRoaXMuZW1pdE1vZGVsVmFsdWUoZC5sZW5ndGggPyBkIDogbnVsbCk7XHJcbiAgICB0aGlzLnJlZnJlc2hNYXNrRmlsbGVkVWkoKTtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbD8uY29udHJvbCkge1xyXG4gICAgICB0aGlzLnN5bmNDb250cm9sVWkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uTWFza2VkQmx1cigpOiB2b2lkIHtcclxuICAgIHRoaXMubm90aWZ5VG91Y2hlZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uTWFza2VkQ2xlYXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaW5wdXRUZXh0ID0gJyc7XHJcbiAgICB0aGlzLmVtaXRNb2RlbFZhbHVlKG51bGwpO1xyXG4gICAgdGhpcy5ub3RpZnlUb3VjaGVkKCk7XHJcbiAgICB0aGlzLnJlZnJlc2hNYXNrRmlsbGVkVWkoKTtcclxuICAgIGlmICh0aGlzLm5nQ29udHJvbD8uY29udHJvbCkge1xyXG4gICAgICB0aGlzLnN5bmNDb250cm9sVWkoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=