structra-ui 0.1.15 → 0.1.17

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,97 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, Input, ViewChild, booleanAttribute, } from '@angular/core';
2
+ import { SkeletonBlockComponent } from '../../loading/skeleton-loading';
3
+ import * as i0 from "@angular/core";
4
+ export var BaseButtonVariant;
5
+ (function (BaseButtonVariant) {
6
+ BaseButtonVariant["Primary"] = "primary";
7
+ BaseButtonVariant["Secondary"] = "secondary";
8
+ /** Texto/ícone sem caixa — navegação secundária, “link” com aparência de botão acessível. */
9
+ BaseButtonVariant["Ghost"] = "ghost";
10
+ })(BaseButtonVariant || (BaseButtonVariant = {}));
11
+ export var BaseButtonType;
12
+ (function (BaseButtonType) {
13
+ BaseButtonType["Button"] = "button";
14
+ BaseButtonType["Submit"] = "submit";
15
+ BaseButtonType["Reset"] = "reset";
16
+ })(BaseButtonType || (BaseButtonType = {}));
17
+ export class BaseButtonComponent {
18
+ constructor() {
19
+ /** `submit` envia o `<form>` ancestral; use `button` para ações sem submit. */
20
+ this.type = BaseButtonType.Button;
21
+ this.disabled = false;
22
+ /**
23
+ * Não interage (como `disabled`), mas com aparência em cinza (tema somente leitura),
24
+ * distinta do estado desabilitado genérico.
25
+ */
26
+ this.readonly = false;
27
+ /**
28
+ * `true` (por defeito): estica à largura do contentor (útil em `app-layout-stack` com `fill`).
29
+ * `false`: largura só ao conteúdo (texto + padding).
30
+ */
31
+ this.fullWidth = true;
32
+ /** Placeholder de carregamento (skeleton no lugar do rótulo). */
33
+ this.loading = false;
34
+ /** Estilo visual base; pode ser estendido no SCSS do projeto. */
35
+ this.variant = BaseButtonVariant.Primary;
36
+ }
37
+ /** Alias de {@link variant} (nome comum em design systems). */
38
+ set appearance(value) {
39
+ if (value === BaseButtonVariant.Primary ||
40
+ value === BaseButtonVariant.Secondary ||
41
+ value === BaseButtonVariant.Ghost) {
42
+ this.variant = value;
43
+ }
44
+ }
45
+ get hostClasses() {
46
+ const parts = ['base-button', `base-button--${this.variant}`];
47
+ if (this.disabled) {
48
+ parts.push('base-button--disabled');
49
+ }
50
+ if (this.readonly) {
51
+ parts.push('base-button--readonly');
52
+ }
53
+ if (this.fullWidth) {
54
+ parts.push('base-button--full-width');
55
+ }
56
+ if (this.loading) {
57
+ parts.push('base-button--loading');
58
+ }
59
+ return parts.join(' ');
60
+ }
61
+ /** Foca o `<button>` nativo (o host do componente não é focável). */
62
+ focusNative(options) {
63
+ this.nativeBtn?.nativeElement?.focus(options);
64
+ }
65
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
66
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: BaseButtonComponent, isStandalone: true, selector: "app-base-button", inputs: { type: "type", disabled: ["disabled", "disabled", booleanAttribute], readonly: ["readonly", "readonly", booleanAttribute], fullWidth: ["fullWidth", "fullWidth", booleanAttribute], loading: ["loading", "loading", booleanAttribute], variant: "variant", appearance: "appearance" }, host: { properties: { "class": "this.hostClasses" } }, viewQueries: [{ propertyName: "nativeBtn", first: true, predicate: ["nativeBtn"], descendants: true, read: ElementRef }], ngImport: i0, template: "@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", styles: ["@charset \"UTF-8\";:host{display:inline-block;width:fit-content;max-width:100%;box-sizing:border-box;vertical-align:middle}.base-button__native{-webkit-appearance:none;appearance:none;display:flex;width:auto;min-width:5rem;align-items:center;justify-content:center;text-align:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1.25rem;margin:0;border:1px solid transparent;border-radius:var(--ui-field-float-border-radius, 14px);font:inherit;font-size:.9375rem;font-weight:600;line-height:1.25;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease}:host(.base-button--full-width){display:block;width:auto;min-width:0;max-width:100%;box-sizing:border-box}:host(.base-button--full-width) .base-button__native{width:100%;min-width:0}.base-button__native:focus-visible{outline:none;box-shadow:0 0 0 3px var(--ui-field-float-focus-ring, rgba(43, 127, 217, .35))}:host(.base-button--primary) .base-button__native{color:var(--app-color-primary-contrast, #ffffff);background:var(--ui-field-float-border-focus, #2b7fd9);border-color:var(--ui-field-float-border-focus, #2b7fd9)}:host(.base-button--primary) .base-button__native:hover:not(:disabled){filter:brightness(.95)}:host(.base-button--secondary) .base-button__native{color:var(--ui-field-float-label-top-color, #4a6d8c);background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--secondary) .base-button__native:hover:not(:disabled){background:var(--app-color-button-secondary-hover-bg, #e8f0fa)}:host(.base-button--ghost) .base-button__native{color:var(--app-color-text-primary, #1a2f45);background:transparent;border-color:transparent;min-width:0;min-height:2.25rem;padding:.35rem .5rem;border-radius:8px;font-size:.95rem;font-weight:600;justify-content:flex-start;gap:.45rem}:host(.base-button--ghost) .base-button__native:hover:not(:disabled){color:var(--app-color-nav-link);background:color-mix(in srgb,var(--app-color-primary) 6%,transparent)}:host(.base-button--disabled:not(.base-button--readonly)) .base-button__native,.base-button__native:disabled:not([aria-readonly=true]){cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity, .65)}:host(.base-button--readonly) .base-button__native{cursor:default;opacity:1;color:var(--ui-field-readonly-button-text, #37474f);background:var(--ui-field-readonly-button-bg, #cfd8dc);border-color:var(--ui-field-readonly-button-border, #90a4ae)}:host(.base-button--readonly) .base-button__native:hover:not(:disabled){filter:brightness(.97)}:host(.base-button--readonly) .base-button__native:focus-visible{box-shadow:0 0 0 3px var(--ui-field-readonly-button-focus-ring, rgba(96, 125, 139, .35))}.base-button__native--skeleton{pointer-events:none;cursor:default}:host(.base-button--primary.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff);border-color:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff)}:host(.base-button--secondary.base-button--loading) .base-button__native--skeleton{background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--ghost.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--app-color-text-primary, #1a2f45) 8%,transparent);border-color:transparent}\n"], dependencies: [{ kind: "component", type: SkeletonBlockComponent, selector: "app-skeleton-block", inputs: ["width", "height", "radius", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
67
+ }
68
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: BaseButtonComponent, decorators: [{
69
+ type: Component,
70
+ args: [{ selector: 'app-base-button', standalone: true, imports: [SkeletonBlockComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@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", styles: ["@charset \"UTF-8\";:host{display:inline-block;width:fit-content;max-width:100%;box-sizing:border-box;vertical-align:middle}.base-button__native{-webkit-appearance:none;appearance:none;display:flex;width:auto;min-width:5rem;align-items:center;justify-content:center;text-align:center;gap:.5rem;min-height:2.5rem;padding:.5rem 1.25rem;margin:0;border:1px solid transparent;border-radius:var(--ui-field-float-border-radius, 14px);font:inherit;font-size:.9375rem;font-weight:600;line-height:1.25;cursor:pointer;user-select:none;-webkit-user-select:none;transition:background-color .15s ease,border-color .15s ease,box-shadow .15s ease,opacity .15s ease}:host(.base-button--full-width){display:block;width:auto;min-width:0;max-width:100%;box-sizing:border-box}:host(.base-button--full-width) .base-button__native{width:100%;min-width:0}.base-button__native:focus-visible{outline:none;box-shadow:0 0 0 3px var(--ui-field-float-focus-ring, rgba(43, 127, 217, .35))}:host(.base-button--primary) .base-button__native{color:var(--app-color-primary-contrast, #ffffff);background:var(--ui-field-float-border-focus, #2b7fd9);border-color:var(--ui-field-float-border-focus, #2b7fd9)}:host(.base-button--primary) .base-button__native:hover:not(:disabled){filter:brightness(.95)}:host(.base-button--secondary) .base-button__native{color:var(--ui-field-float-label-top-color, #4a6d8c);background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--secondary) .base-button__native:hover:not(:disabled){background:var(--app-color-button-secondary-hover-bg, #e8f0fa)}:host(.base-button--ghost) .base-button__native{color:var(--app-color-text-primary, #1a2f45);background:transparent;border-color:transparent;min-width:0;min-height:2.25rem;padding:.35rem .5rem;border-radius:8px;font-size:.95rem;font-weight:600;justify-content:flex-start;gap:.45rem}:host(.base-button--ghost) .base-button__native:hover:not(:disabled){color:var(--app-color-nav-link);background:color-mix(in srgb,var(--app-color-primary) 6%,transparent)}:host(.base-button--disabled:not(.base-button--readonly)) .base-button__native,.base-button__native:disabled:not([aria-readonly=true]){cursor:not-allowed;opacity:var(--ui-field-input-disabled-opacity, .65)}:host(.base-button--readonly) .base-button__native{cursor:default;opacity:1;color:var(--ui-field-readonly-button-text, #37474f);background:var(--ui-field-readonly-button-bg, #cfd8dc);border-color:var(--ui-field-readonly-button-border, #90a4ae)}:host(.base-button--readonly) .base-button__native:hover:not(:disabled){filter:brightness(.97)}:host(.base-button--readonly) .base-button__native:focus-visible{box-shadow:0 0 0 3px var(--ui-field-readonly-button-focus-ring, rgba(96, 125, 139, .35))}.base-button__native--skeleton{pointer-events:none;cursor:default}:host(.base-button--primary.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff);border-color:color-mix(in srgb,var(--ui-field-float-border-focus, #2b7fd9) 82%,#ffffff)}:host(.base-button--secondary.base-button--loading) .base-button__native--skeleton{background:var(--ui-field-float-bg, #f3f7fb);border-color:var(--ui-field-float-border, #b6cce5)}:host(.base-button--ghost.base-button--loading) .base-button__native--skeleton{color:transparent;background:color-mix(in srgb,var(--app-color-text-primary, #1a2f45) 8%,transparent);border-color:transparent}\n"] }]
71
+ }], propDecorators: { nativeBtn: [{
72
+ type: ViewChild,
73
+ args: ['nativeBtn', { read: ElementRef }]
74
+ }], type: [{
75
+ type: Input
76
+ }], disabled: [{
77
+ type: Input,
78
+ args: [{ transform: booleanAttribute }]
79
+ }], readonly: [{
80
+ type: Input,
81
+ args: [{ transform: booleanAttribute }]
82
+ }], fullWidth: [{
83
+ type: Input,
84
+ args: [{ transform: booleanAttribute }]
85
+ }], loading: [{
86
+ type: Input,
87
+ args: [{ transform: booleanAttribute }]
88
+ }], variant: [{
89
+ type: Input
90
+ }], appearance: [{
91
+ type: Input,
92
+ args: ['appearance']
93
+ }], hostClasses: [{
94
+ type: HostBinding,
95
+ args: ['class']
96
+ }] } });
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1idXR0b24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9idXR0b25zL2Jhc2UtYnV0dG9uL2Jhc2UtYnV0dG9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvYnV0dG9ucy9iYXNlLWJ1dHRvbi9iYXNlLWJ1dHRvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxTQUFTLEVBQ1QsZ0JBQWdCLEdBQ2pCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDOztBQUV4RSxNQUFNLENBQU4sSUFBWSxpQkFLWDtBQUxELFdBQVksaUJBQWlCO0lBQzNCLHdDQUFtQixDQUFBO0lBQ25CLDRDQUF1QixDQUFBO0lBQ3ZCLDZGQUE2RjtJQUM3RixvQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFMVyxpQkFBaUIsS0FBakIsaUJBQWlCLFFBSzVCO0FBRUQsTUFBTSxDQUFOLElBQVksY0FJWDtBQUpELFdBQVksY0FBYztJQUN4QixtQ0FBaUIsQ0FBQTtJQUNqQixtQ0FBaUIsQ0FBQTtJQUNqQixpQ0FBZSxDQUFBO0FBQ2pCLENBQUMsRUFKVyxjQUFjLEtBQWQsY0FBYyxRQUl6QjtBQVVELE1BQU0sT0FBTyxtQkFBbUI7SUFSaEM7UUFZRSwrRUFBK0U7UUFDdEUsU0FBSSxHQUFtQixjQUFjLENBQUMsTUFBTSxDQUFDO1FBRWQsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV6RDs7O1dBR0c7UUFDcUMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUV6RDs7O1dBR0c7UUFDcUMsY0FBUyxHQUFHLElBQUksQ0FBQztRQUV6RCxpRUFBaUU7UUFDekIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUV4RCxpRUFBaUU7UUFDeEQsWUFBTyxHQUFzQixpQkFBaUIsQ0FBQyxPQUFPLENBQUM7S0FvQ2pFO0lBbENDLCtEQUErRDtJQUMvRCxJQUNJLFVBQVUsQ0FBQyxLQUF3QjtRQUNyQyxJQUNFLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxPQUFPO1lBQ25DLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxTQUFTO1lBQ3JDLEtBQUssS0FBSyxpQkFBaUIsQ0FBQyxLQUFLLEVBQ2pDLENBQUM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQ0ksV0FBVztRQUNiLE1BQU0sS0FBSyxHQUFHLENBQUMsYUFBYSxFQUFFLGdCQUFnQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixLQUFLLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUN0QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDckMsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsQ0FBQzsrR0E1RFUsbUJBQW1CO21HQUFuQixtQkFBbUIsOEdBT1YsZ0JBQWdCLHNDQU1oQixnQkFBZ0IseUNBTWhCLGdCQUFnQixtQ0FHaEIsZ0JBQWdCLHFOQXJCSixVQUFVLDZCQ2pDNUMscWZBZ0JBLGc5R0RXWSxzQkFBc0I7OzRGQUtyQixtQkFBbUI7a0JBUi9CLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQLENBQUMsc0JBQXNCLENBQUMsbUJBR2hCLHVCQUF1QixDQUFDLE1BQU07OEJBSXZDLFNBQVM7c0JBRGhCLFNBQVM7dUJBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFJbkMsSUFBSTtzQkFBWixLQUFLO2dCQUVrQyxRQUFRO3NCQUEvQyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQU1FLFFBQVE7c0JBQS9DLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBTUUsU0FBUztzQkFBaEQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFHRSxPQUFPO3NCQUE5QyxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUc3QixPQUFPO3NCQUFmLEtBQUs7Z0JBSUYsVUFBVTtzQkFEYixLQUFLO3VCQUFDLFlBQVk7Z0JBWWYsV0FBVztzQkFEZCxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIENvbXBvbmVudCxcclxuICBFbGVtZW50UmVmLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIElucHV0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBib29sZWFuQXR0cmlidXRlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTa2VsZXRvbkJsb2NrQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbG9hZGluZy9za2VsZXRvbi1sb2FkaW5nJztcclxuXHJcbmV4cG9ydCBlbnVtIEJhc2VCdXR0b25WYXJpYW50IHtcclxuICBQcmltYXJ5ID0gJ3ByaW1hcnknLFxyXG4gIFNlY29uZGFyeSA9ICdzZWNvbmRhcnknLFxyXG4gIC8qKiBUZXh0by/DrWNvbmUgc2VtIGNhaXhhIOKAlCBuYXZlZ2HDp8OjbyBzZWN1bmTDoXJpYSwg4oCcbGlua+KAnSBjb20gYXBhcsOqbmNpYSBkZSBib3TDo28gYWNlc3PDrXZlbC4gKi9cclxuICBHaG9zdCA9ICdnaG9zdCcsXHJcbn1cclxuXHJcbmV4cG9ydCBlbnVtIEJhc2VCdXR0b25UeXBlIHtcclxuICBCdXR0b24gPSAnYnV0dG9uJyxcclxuICBTdWJtaXQgPSAnc3VibWl0JyxcclxuICBSZXNldCA9ICdyZXNldCcsXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWJhc2UtYnV0dG9uJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtTa2VsZXRvbkJsb2NrQ29tcG9uZW50XSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYmFzZS1idXR0b24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9iYXNlLWJ1dHRvbi5jb21wb25lbnQuc2NzcycsXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBCYXNlQnV0dG9uQ29tcG9uZW50IHtcclxuICBAVmlld0NoaWxkKCduYXRpdmVCdG4nLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSlcclxuICBwcml2YXRlIG5hdGl2ZUJ0bj86IEVsZW1lbnRSZWY8SFRNTEJ1dHRvbkVsZW1lbnQ+O1xyXG5cclxuICAvKiogYHN1Ym1pdGAgZW52aWEgbyBgPGZvcm0+YCBhbmNlc3RyYWw7IHVzZSBgYnV0dG9uYCBwYXJhIGHDp8O1ZXMgc2VtIHN1Ym1pdC4gKi9cclxuICBASW5wdXQoKSB0eXBlOiBCYXNlQnV0dG9uVHlwZSA9IEJhc2VCdXR0b25UeXBlLkJ1dHRvbjtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pIGRpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIE7Do28gaW50ZXJhZ2UgKGNvbW8gYGRpc2FibGVkYCksIG1hcyBjb20gYXBhcsOqbmNpYSBlbSBjaW56YSAodGVtYSBzb21lbnRlIGxlaXR1cmEpLFxyXG4gICAqIGRpc3RpbnRhIGRvIGVzdGFkbyBkZXNhYmlsaXRhZG8gZ2Vuw6lyaWNvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSByZWFkb25seSA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBgdHJ1ZWAgKHBvciBkZWZlaXRvKTogZXN0aWNhIMOgIGxhcmd1cmEgZG8gY29udGVudG9yICjDunRpbCBlbSBgYXBwLWxheW91dC1zdGFja2AgY29tIGBmaWxsYCkuXHJcbiAgICogYGZhbHNlYDogbGFyZ3VyYSBzw7MgYW8gY29udGXDumRvICh0ZXh0byArIHBhZGRpbmcpLlxyXG4gICAqL1xyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBmdWxsV2lkdGggPSB0cnVlO1xyXG5cclxuICAvKiogUGxhY2Vob2xkZXIgZGUgY2FycmVnYW1lbnRvIChza2VsZXRvbiBubyBsdWdhciBkbyByw7N0dWxvKS4gKi9cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSkgbG9hZGluZyA9IGZhbHNlO1xyXG5cclxuICAvKiogRXN0aWxvIHZpc3VhbCBiYXNlOyBwb2RlIHNlciBlc3RlbmRpZG8gbm8gU0NTUyBkbyBwcm9qZXRvLiAqL1xyXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IEJhc2VCdXR0b25WYXJpYW50ID0gQmFzZUJ1dHRvblZhcmlhbnQuUHJpbWFyeTtcclxuXHJcbiAgLyoqIEFsaWFzIGRlIHtAbGluayB2YXJpYW50fSAobm9tZSBjb211bSBlbSBkZXNpZ24gc3lzdGVtcykuICovXHJcbiAgQElucHV0KCdhcHBlYXJhbmNlJylcclxuICBzZXQgYXBwZWFyYW5jZSh2YWx1ZTogQmFzZUJ1dHRvblZhcmlhbnQpIHtcclxuICAgIGlmIChcclxuICAgICAgdmFsdWUgPT09IEJhc2VCdXR0b25WYXJpYW50LlByaW1hcnkgfHxcclxuICAgICAgdmFsdWUgPT09IEJhc2VCdXR0b25WYXJpYW50LlNlY29uZGFyeSB8fFxyXG4gICAgICB2YWx1ZSA9PT0gQmFzZUJ1dHRvblZhcmlhbnQuR2hvc3RcclxuICAgICkge1xyXG4gICAgICB0aGlzLnZhcmlhbnQgPSB2YWx1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGdldCBob3N0Q2xhc3NlcygpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcGFydHMgPSBbJ2Jhc2UtYnV0dG9uJywgYGJhc2UtYnV0dG9uLS0ke3RoaXMudmFyaWFudH1gXTtcclxuICAgIGlmICh0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHBhcnRzLnB1c2goJ2Jhc2UtYnV0dG9uLS1kaXNhYmxlZCcpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucmVhZG9ubHkpIHtcclxuICAgICAgcGFydHMucHVzaCgnYmFzZS1idXR0b24tLXJlYWRvbmx5Jyk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5mdWxsV2lkdGgpIHtcclxuICAgICAgcGFydHMucHVzaCgnYmFzZS1idXR0b24tLWZ1bGwtd2lkdGgnKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmxvYWRpbmcpIHtcclxuICAgICAgcGFydHMucHVzaCgnYmFzZS1idXR0b24tLWxvYWRpbmcnKTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJ0cy5qb2luKCcgJyk7XHJcbiAgfVxyXG5cclxuICAvKiogRm9jYSBvIGA8YnV0dG9uPmAgbmF0aXZvIChvIGhvc3QgZG8gY29tcG9uZW50ZSBuw6NvIMOpIGZvY8OhdmVsKS4gKi9cclxuICBmb2N1c05hdGl2ZShvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XHJcbiAgICB0aGlzLm5hdGl2ZUJ0bj8ubmF0aXZlRWxlbWVudD8uZm9jdXMob3B0aW9ucyk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoIWxvYWRpbmcpIHtcclxuPGJ1dHRvblxyXG4gICNuYXRpdmVCdG5cclxuICBjbGFzcz1cImJhc2UtYnV0dG9uX19uYXRpdmVcIlxyXG4gIFthdHRyLnR5cGVdPVwidHlwZVwiXHJcbiAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5XCJcclxuICBbYXR0ci5hcmlhLXJlYWRvbmx5XT1cInJlYWRvbmx5ID8gdHJ1ZSA6IG51bGxcIlxyXG4+XHJcbiAgPG5nLWNvbnRlbnQgLz5cclxuPC9idXR0b24+XHJcbn0gQGVsc2Uge1xyXG48ZGl2IGNsYXNzPVwiYmFzZS1idXR0b25fX25hdGl2ZSBiYXNlLWJ1dHRvbl9fbmF0aXZlLS1za2VsZXRvblwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIiBhcmlhLWJ1c3k9XCJ0cnVlXCJcclxuICBhcmlhLWxhYmVsPVwiQSBjYXJyZWdhclwiPlxyXG4gIDxhcHAtc2tlbGV0b24tYmxvY2sgd2lkdGg9XCI0MCVcIiBoZWlnaHQ9XCIwLjdyZW1cIiByYWRpdXM9XCI4cHhcIiAvPlxyXG48L2Rpdj5cclxufVxyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export { BaseButtonComponent, BaseButtonType, BaseButtonVariant, } from './base-button/base-button.component';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2J1dHRvbnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsaUJBQWlCLEdBQ2xCLE1BQU0scUNBQXFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge1xyXG4gIEJhc2VCdXR0b25Db21wb25lbnQsXHJcbiAgQmFzZUJ1dHRvblR5cGUsXHJcbiAgQmFzZUJ1dHRvblZhcmlhbnQsXHJcbn0gZnJvbSAnLi9iYXNlLWJ1dHRvbi9iYXNlLWJ1dHRvbi5jb21wb25lbnQnO1xyXG4iXX0=
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1pdGVtLXZpZXcubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RhdGEtZGlzcGxheS9fbW9kZWxzL2NhcmQtaXRlbS12aWV3Lm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogVmlzdGEgbWFwZWFkYSBwb3IgaXRlbSBwYXJhIHtAbGluayBDYXJkTGlzdENvbXBvbmVudH0uICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2FyZEl0ZW1WaWV3IHtcclxuICB0aXRsZTogc3RyaW5nO1xyXG4gIHN1YnRpdGxlPzogc3RyaW5nO1xyXG4gIC8qKiBUZXh0byBjdXJ0byBwYXJhIG8gYXZhdGFyIChleC46IGluaWNpYWlzKS4gKi9cclxuICBhdmF0YXJUZXh0Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgdHlwZSBDYXJkTGlzdE1hcEZuPFQ+ID0gKGl0ZW06IFQpID0+IENhcmRJdGVtVmlldztcclxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1kaXNwbGF5Lm1vZGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L19tb2RlbHMvZGF0YS1kaXNwbGF5Lm1vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFZhcmlhbnRlcyB2aXN1YWlzIGRvIGBhcHAtc3RhdHVzLWJhZGdlYCAoY29yZXMgc2Vtw6JudGljYXMgZGEgbGliKS4gKi9cclxuZXhwb3J0IHR5cGUgU3RhdHVzQmFkZ2VWYXJpYW50ID1cclxuICB8ICdzdWNjZXNzJ1xyXG4gIHwgJ2Vycm9yJ1xyXG4gIHwgJ3dhcm5pbmcnXHJcbiAgfCAnaW5mbydcclxuICB8ICduZXV0cmFsJztcclxuXHJcbi8qKiBUYW1hbmhvIGRvIGBhcHAtc3RhdHVzLWJhZGdlYC4gKi9cclxuZXhwb3J0IHR5cGUgU3RhdHVzQmFkZ2VTaXplID0gJ3NtJyB8ICdtZCc7XHJcblxyXG4vKiogTGluaGEgY2hhdmUg4oaSIHZhbG9yIHBhcmEgYGFwcC1kZXRhaWxzLXZpZXdgIChtb2RvIGxpc3RhKS4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxzVmlld0l0ZW0ge1xyXG4gIGxhYmVsOiBzdHJpbmc7XHJcbiAgdmFsdWU/OiBzdHJpbmcgfCBudWxsO1xyXG59XHJcblxyXG4vKiogVG9tIGRhIHZhcmlhw6fDo28gb3BjaW9uYWwgbm8gYGFwcC1zdGF0LWNhcmRgIChleC46ICsxMiUgdnMgbcOqcyBhbnRlcmlvcikuICovXHJcbmV4cG9ydCB0eXBlIFN0YXRDYXJkRGVsdGFUb25lID0gJ3Bvc2l0aXZlJyB8ICduZWdhdGl2ZScgfCAnbmV1dHJhbCc7XHJcbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS1ncmlkLWNvbHVtbi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L19tb2RlbHMvZGF0YS1ncmlkLWNvbHVtbi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWd1cmHDp8OjbyBkZSBjb2x1bmEgZGEgbGliIOKAlCBjb252ZXJ0aWRhIGludGVybmFtZW50ZSBwYXJhIGBDb2xEZWZgIGRvIEFHIEdyaWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUdyaWRDb2x1bW48VCA9IHVua25vd24+IHtcbiAgLyoqIENhbXBvIG5vIHJlZ2lzdHJvIG91IGlkZW50aWZpY2Fkb3IgbMOzZ2ljbyAoZXguOiBgX19hY3Rpb25zYCBwYXJhIGNvbHVuYSBkZSBhw6fDtWVzKS4gKi9cbiAga2V5OiBrZXlvZiBUIHwgc3RyaW5nO1xuICBoZWFkZXI6IHN0cmluZztcbiAgd2lkdGg/OiBudW1iZXI7XG4gIGZsZXg/OiBudW1iZXI7XG4gIHR5cGU/OiAndGV4dCcgfCAnbnVtYmVyJyB8ICdhY3Rpb25zJztcbiAgLyoqIFBvciBvbWlzc8OjbyBgdHJ1ZWAgcGFyYSB0ZXh0by9uw7ptZXJvOyBpZ25vcmFkbyBwYXJhIGBhY3Rpb25zYC4gKi9cbiAgc29ydGFibGU/OiBib29sZWFuO1xufVxuIl19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RhdGEtZGlzcGxheS9fbW9kZWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IERhdGFHcmlkQ29sdW1uIH0gZnJvbSAnLi9kYXRhLWdyaWQtY29sdW1uLm1vZGVsJztcbmV4cG9ydCB0eXBlIHsgQ2FyZEl0ZW1WaWV3LCBDYXJkTGlzdE1hcEZuIH0gZnJvbSAnLi9jYXJkLWl0ZW0tdmlldy5tb2RlbCc7XG4iXX0=
@@ -0,0 +1,124 @@
1
+ import { BreakpointObserver } from '@angular/cdk/layout';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, DestroyRef, EventEmitter, Input, Output, inject, } from '@angular/core';
3
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
+ import { DataGridComponent } from '../data-grid/data-grid.component';
5
+ import { CardListComponent } from '../card-list/card-list.component';
6
+ import * as i0 from "@angular/core";
7
+ /** Limite de largura para tratar como “mobile” na escolha grid vs card. */
8
+ export const ADAPTIVE_DATA_VIEW_MOBILE_QUERY = '(max-width: 767.98px)';
9
+ /**
10
+ * Escolhe **um** de `app-data-grid` ou `app-card-list` conforme breakpoint e preferências.
11
+ * Nunca renderiza os dois em simultâneo.
12
+ */
13
+ export class AdaptiveDataViewComponent {
14
+ constructor() {
15
+ this.bp = inject(BreakpointObserver);
16
+ this.cdr = inject(ChangeDetectorRef);
17
+ this.destroyRef = inject(DestroyRef);
18
+ this.pageSize = 15;
19
+ this.gridHeight = 'min(28rem, 50vh)';
20
+ this.cardScrollMaxHeight = 'min(28rem, 50vh)';
21
+ this.emptyMessageGrid = 'Sem registros para mostrar.';
22
+ this.emptyMessageCard = 'Sem itens para mostrar.';
23
+ this.pagination = true;
24
+ this.showActionsColumn = true;
25
+ this.showCardItemActions = true;
26
+ this.scrollBatchSize = 10;
27
+ this.showCardFooter = false;
28
+ /** Estado de carregamento reposto no grid ou na lista conforme a vista ativa. */
29
+ this.loading = false;
30
+ /**
31
+ * Mostra uma linha de contagem **abaixo** da grade ou da lista (incluindo paginação interna).
32
+ * Texto padrão em português; use `{count}` como marcador do número de linhas em `items`.
33
+ */
34
+ this.showResultCount = true;
35
+ this.resultCountTemplate = '{count} registro(s)';
36
+ /** Vista quando `ADAPTIVE_DATA_VIEW_MOBILE_QUERY` corresponde. Por padrão `card`. */
37
+ this.mobileView = 'card';
38
+ /** Vista quando a tela é maior. Por padrão `grid`. */
39
+ this.desktopView = 'grid';
40
+ this.edit = new EventEmitter();
41
+ this.remove = new EventEmitter();
42
+ this.loadMore = new EventEmitter();
43
+ /** Corresponde ao breakpoint mobile. */
44
+ this.isMobileLayout = false;
45
+ }
46
+ ngOnInit() {
47
+ this.bp
48
+ .observe([ADAPTIVE_DATA_VIEW_MOBILE_QUERY])
49
+ .pipe(takeUntilDestroyed(this.destroyRef))
50
+ .subscribe((state) => {
51
+ this.isMobileLayout = state.matches;
52
+ this.cdr.markForCheck();
53
+ });
54
+ }
55
+ get effectiveKind() {
56
+ return this.isMobileLayout ? this.mobileView : this.desktopView;
57
+ }
58
+ get showGrid() {
59
+ return this.effectiveKind === 'grid';
60
+ }
61
+ get showCard() {
62
+ return this.effectiveKind === 'card';
63
+ }
64
+ get resultCountDisplay() {
65
+ const tpl = (this.resultCountTemplate ?? '').trim();
66
+ if (!tpl) {
67
+ return '';
68
+ }
69
+ const n = this.items?.length ?? 0;
70
+ return tpl.replaceAll('{count}', String(n));
71
+ }
72
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AdaptiveDataViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
73
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: AdaptiveDataViewComponent, isStandalone: true, selector: "app-adaptive-data-view", inputs: { items: "items", gridColumns: "gridColumns", mapItem: "mapItem", pageSize: "pageSize", gridHeight: "gridHeight", cardScrollMaxHeight: "cardScrollMaxHeight", emptyMessageGrid: "emptyMessageGrid", emptyMessageCard: "emptyMessageCard", pagination: "pagination", showActionsColumn: "showActionsColumn", showCardItemActions: "showCardItemActions", scrollBatchSize: "scrollBatchSize", showCardFooter: "showCardFooter", loading: "loading", showResultCount: "showResultCount", resultCountTemplate: "resultCountTemplate", mobileView: "mobileView", desktopView: "desktopView" }, outputs: { edit: "edit", remove: "remove", loadMore: "loadMore" }, ngImport: i0, template: "<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", styles: [":host{display:block;width:100%;min-width:0}.adaptive-data-view{display:flex;flex-direction:column;align-items:stretch;gap:.5rem;width:100%;min-width:0}.adaptive-data-view__main{display:block;flex:1 1 auto;min-width:0;min-height:0}.adaptive-data-view__result-count{flex:0 0 auto;width:100%;box-sizing:border-box;font-size:.875rem;line-height:1.35;color:#525252}\n"], dependencies: [{ kind: "component", type: DataGridComponent, selector: "app-data-grid", inputs: ["rows", "columns", "pageSize", "loading", "initialPaginationPage", "height", "emptyMessage", "pagination", "showActionsColumn"], outputs: ["edit", "remove", "selectionChange", "paginationChanged"] }, { kind: "component", type: CardListComponent, selector: "app-card-list", inputs: ["items", "loading", "loadingMore", "emptyMessage", "variant", "mapItem", "showItemActions", "trackByProp", "dataMode", "scrollBatchSize", "scrollLoadThresholdPx", "showFooter", "scrollMaxHeight", "totalCountRemote", "hasNextPage"], outputs: ["loadMore", "edit", "remove"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
74
+ }
75
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AdaptiveDataViewComponent, decorators: [{
76
+ type: Component,
77
+ args: [{ selector: 'app-adaptive-data-view', standalone: true, imports: [DataGridComponent, CardListComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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", styles: [":host{display:block;width:100%;min-width:0}.adaptive-data-view{display:flex;flex-direction:column;align-items:stretch;gap:.5rem;width:100%;min-width:0}.adaptive-data-view__main{display:block;flex:1 1 auto;min-width:0;min-height:0}.adaptive-data-view__result-count{flex:0 0 auto;width:100%;box-sizing:border-box;font-size:.875rem;line-height:1.35;color:#525252}\n"] }]
78
+ }], propDecorators: { items: [{
79
+ type: Input,
80
+ args: [{ required: true }]
81
+ }], gridColumns: [{
82
+ type: Input,
83
+ args: [{ required: true }]
84
+ }], mapItem: [{
85
+ type: Input,
86
+ args: [{ required: true }]
87
+ }], pageSize: [{
88
+ type: Input
89
+ }], gridHeight: [{
90
+ type: Input
91
+ }], cardScrollMaxHeight: [{
92
+ type: Input
93
+ }], emptyMessageGrid: [{
94
+ type: Input
95
+ }], emptyMessageCard: [{
96
+ type: Input
97
+ }], pagination: [{
98
+ type: Input
99
+ }], showActionsColumn: [{
100
+ type: Input
101
+ }], showCardItemActions: [{
102
+ type: Input
103
+ }], scrollBatchSize: [{
104
+ type: Input
105
+ }], showCardFooter: [{
106
+ type: Input
107
+ }], loading: [{
108
+ type: Input
109
+ }], showResultCount: [{
110
+ type: Input
111
+ }], resultCountTemplate: [{
112
+ type: Input
113
+ }], mobileView: [{
114
+ type: Input
115
+ }], desktopView: [{
116
+ type: Input
117
+ }], edit: [{
118
+ type: Output
119
+ }], remove: [{
120
+ type: Output
121
+ }], loadMore: [{
122
+ type: Output
123
+ }] } });
124
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhcHRpdmUtZGF0YS12aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L2FkYXB0aXZlLWRhdGEtdmlldy9hZGFwdGl2ZS1kYXRhLXZpZXcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvYWRhcHRpdmUtZGF0YS12aWV3L2FkYXB0aXZlLWRhdGEtdmlldy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7QUFJckUsMkVBQTJFO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLHVCQUF1QixDQUFDO0FBSXZFOzs7R0FHRztBQVNILE1BQU0sT0FBTyx5QkFBeUI7SUFSdEM7UUFTbUIsT0FBRSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2hDLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNoQyxlQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBTXhDLGFBQVEsR0FBRyxFQUFFLENBQUM7UUFDZCxlQUFVLEdBQWtCLGtCQUFrQixDQUFDO1FBQy9DLHdCQUFtQixHQUFrQixrQkFBa0IsQ0FBQztR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Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQU1HLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUdHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFFYSxJQUFJO3NCQUF0QixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJyZWFrcG9pbnRPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9sYXlvdXQnO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIERlc3Ryb3lSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBpbmplY3QsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICcuLi9kYXRhLWdyaWQvZGF0YS1ncmlkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDYXJkTGlzdENvbXBvbmVudCB9IGZyb20gJy4uL2NhcmQtbGlzdC9jYXJkLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB0eXBlIHsgRGF0YUdyaWRDb2x1bW4gfSBmcm9tICcuLi9fbW9kZWxzL2RhdGEtZ3JpZC1jb2x1bW4ubW9kZWwnO1xuaW1wb3J0IHR5cGUgeyBDYXJkTGlzdE1hcEZuIH0gZnJvbSAnLi4vX21vZGVscy9jYXJkLWl0ZW0tdmlldy5tb2RlbCc7XG5cbi8qKiBMaW1pdGUgZGUgbGFyZ3VyYSBwYXJhIHRyYXRhciBjb21vIOKAnG1vYmlsZeKAnSBuYSBlc2NvbGhhIGdyaWQgdnMgY2FyZC4gKi9cbmV4cG9ydCBjb25zdCBBREFQVElWRV9EQVRBX1ZJRVdfTU9CSUxFX1FVRVJZID0gJyhtYXgtd2lkdGg6IDc2Ny45OHB4KSc7XG5cbmV4cG9ydCB0eXBlIEFkYXB0aXZlRGF0YVZpZXdNb2RlID0gJ2dyaWQnIHwgJ2NhcmQnO1xuXG4vKipcbiAqIEVzY29saGUgKip1bSoqIGRlIGBhcHAtZGF0YS1ncmlkYCBvdSBgYXBwLWNhcmQtbGlzdGAgY29uZm9ybWUgYnJlYWtwb2ludCBlIHByZWZlcsOqbmNpYXMuXG4gKiBOdW5jYSByZW5kZXJpemEgb3MgZG9pcyBlbSBzaW11bHTDom5lby5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLWFkYXB0aXZlLWRhdGEtdmlldycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtEYXRhR3JpZENvbXBvbmVudCwgQ2FyZExpc3RDb21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vYWRhcHRpdmUtZGF0YS12aWV3LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2FkYXB0aXZlLWRhdGEtdmlldy5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBBZGFwdGl2ZURhdGFWaWV3Q29tcG9uZW50PFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYnAgPSBpbmplY3QoQnJlYWtwb2ludE9ic2VydmVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBjZHIgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgaXRlbXMhOiBUW107XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGdyaWRDb2x1bW5zITogRGF0YUdyaWRDb2x1bW48VD5bXTtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgbWFwSXRlbSE6IENhcmRMaXN0TWFwRm48VD47XG5cbiAgQElucHV0KCkgcGFnZVNpemUgPSAxNTtcbiAgQElucHV0KCkgZ3JpZEhlaWdodDogc3RyaW5nIHwgbnVsbCA9ICdtaW4oMjhyZW0sIDUwdmgpJztcbiAgQElucHV0KCkgY2FyZFNjcm9sbE1heEhlaWdodDogc3RyaW5nIHwgbnVsbCA9ICdtaW4oMjhyZW0sIDUwdmgpJztcbiAgQElucHV0KCkgZW1wdHlNZXNzYWdlR3JpZCA9ICdTZW0gcmVnaXN0cm9zIHBhcmEgbW9zdHJhci4nO1xuICBASW5wdXQoKSBlbXB0eU1lc3NhZ2VDYXJkID0gJ1NlbSBpdGVucyBwYXJhIG1vc3RyYXIuJztcbiAgQElucHV0KCkgcGFnaW5hdGlvbiA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dBY3Rpb25zQ29sdW1uID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0NhcmRJdGVtQWN0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIHNjcm9sbEJhdGNoU2l6ZSA9IDEwO1xuICBASW5wdXQoKSBzaG93Q2FyZEZvb3RlciA9IGZhbHNlO1xuICAvKiogRXN0YWRvIGRlIGNhcnJlZ2FtZW50byByZXBvc3RvIG5vIGdyaWQgb3UgbmEgbGlzdGEgY29uZm9ybWUgYSB2aXN0YSBhdGl2YS4gKi9cbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNb3N0cmEgdW1hIGxpbmhhIGRlIGNvbnRhZ2VtICoqYWJhaXhvKiogZGEgZ3JhZGUgb3UgZGEgbGlzdGEgKGluY2x1aW5kbyBwYWdpbmHDp8OjbyBpbnRlcm5hKS5cbiAgICogVGV4dG8gcGFkcsOjbyBlbSBwb3J0dWd1w6pzOyB1c2UgYHtjb3VudH1gIGNvbW8gbWFyY2Fkb3IgZG8gbsO6bWVybyBkZSBsaW5oYXMgZW0gYGl0ZW1zYC5cbiAgICovXG4gIEBJbnB1dCgpIHNob3dSZXN1bHRDb3VudCA9IHRydWU7XG4gIEBJbnB1dCgpIHJlc3VsdENvdW50VGVtcGxhdGUgPSAne2NvdW50fSByZWdpc3RybyhzKSc7XG5cbiAgLyoqIFZpc3RhIHF1YW5kbyBgQURBUFRJVkVfREFUQV9WSUVXX01PQklMRV9RVUVSWWAgY29ycmVzcG9uZGUuIFBvciBwYWRyw6NvIGBjYXJkYC4gKi9cbiAgQElucHV0KCkgbW9iaWxlVmlldzogQWRhcHRpdmVEYXRhVmlld01vZGUgPSAnY2FyZCc7XG4gIC8qKiBWaXN0YSBxdWFuZG8gYSB0ZWxhIMOpIG1haW9yLiBQb3IgcGFkcsOjbyBgZ3JpZGAuICovXG4gIEBJbnB1dCgpIGRlc2t0b3BWaWV3OiBBZGFwdGl2ZURhdGFWaWV3TW9kZSA9ICdncmlkJztcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgZWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHJlbW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8VD4oKTtcbiAgQE91dHB1dCgpIHJlYWRvbmx5IGxvYWRNb3JlID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIC8qKiBDb3JyZXNwb25kZSBhbyBicmVha3BvaW50IG1vYmlsZS4gKi9cbiAgaXNNb2JpbGVMYXlvdXQgPSBmYWxzZTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmJwXG4gICAgICAub2JzZXJ2ZShbQURBUFRJVkVfREFUQV9WSUVXX01PQklMRV9RVUVSWV0pXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcbiAgICAgIC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG4gICAgICAgIHRoaXMuaXNNb2JpbGVMYXlvdXQgPSBzdGF0ZS5tYXRjaGVzO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZ2V0IGVmZmVjdGl2ZUtpbmQoKTogQWRhcHRpdmVEYXRhVmlld01vZGUge1xuICAgIHJldHVybiB0aGlzLmlzTW9iaWxlTGF5b3V0ID8gdGhpcy5tb2JpbGVWaWV3IDogdGhpcy5kZXNrdG9wVmlldztcbiAgfVxuXG4gIGdldCBzaG93R3JpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5lZmZlY3RpdmVLaW5kID09PSAnZ3JpZCc7XG4gIH1cblxuICBnZXQgc2hvd0NhcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZWZmZWN0aXZlS2luZCA9PT0gJ2NhcmQnO1xuICB9XG5cbiAgZ2V0IHJlc3VsdENvdW50RGlzcGxheSgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHRwbCA9ICh0aGlzLnJlc3VsdENvdW50VGVtcGxhdGUgPz8gJycpLnRyaW0oKTtcbiAgICBpZiAoIXRwbCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBjb25zdCBuID0gdGhpcy5pdGVtcz8ubGVuZ3RoID8/IDA7XG4gICAgcmV0dXJuIHRwbC5yZXBsYWNlQWxsKCd7Y291bnR9JywgU3RyaW5nKG4pKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImFkYXB0aXZlLWRhdGEtdmlld1wiPlxyXG4gIDxkaXYgY2xhc3M9XCJhZGFwdGl2ZS1kYXRhLXZpZXdfX21haW5cIj5cclxuICAgIEBpZiAoc2hvd0dyaWQpIHtcclxuICAgIDxhcHAtZGF0YS1ncmlkXHJcbiAgICAgIFtyb3dzXT1cIml0ZW1zXCJcclxuICAgICAgW2NvbHVtbnNdPVwiZ3JpZENvbHVtbnNcIlxyXG4gICAgICBbcGFnZVNpemVdPVwicGFnZVNpemVcIlxyXG4gICAgICBbcGFnaW5hdGlvbl09XCJwYWdpbmF0aW9uXCJcclxuICAgICAgW2hlaWdodF09XCJncmlkSGVpZ2h0XCJcclxuICAgICAgW2VtcHR5TWVzc2FnZV09XCJlbXB0eU1lc3NhZ2VHcmlkXCJcclxuICAgICAgW3Nob3dBY3Rpb25zQ29sdW1uXT1cInNob3dBY3Rpb25zQ29sdW1uXCJcclxuICAgICAgW2xvYWRpbmddPVwibG9hZGluZ1wiXHJcbiAgICAgIChlZGl0KT1cImVkaXQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgKHJlbW92ZSk9XCJyZW1vdmUuZW1pdCgkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgICB9XHJcbiAgICBAaWYgKHNob3dDYXJkKSB7XHJcbiAgICA8YXBwLWNhcmQtbGlzdFxyXG4gICAgICBbaXRlbXNdPVwiaXRlbXNcIlxyXG4gICAgICBbbWFwSXRlbV09XCJtYXBJdGVtXCJcclxuICAgICAgW3Njcm9sbEJhdGNoU2l6ZV09XCJzY3JvbGxCYXRjaFNpemVcIlxyXG4gICAgICBbc2hvd0l0ZW1BY3Rpb25zXT1cInNob3dDYXJkSXRlbUFjdGlvbnNcIlxyXG4gICAgICBbc2hvd0Zvb3Rlcl09XCJzaG93Q2FyZEZvb3RlclwiXHJcbiAgICAgIFtzY3JvbGxNYXhIZWlnaHRdPVwiY2FyZFNjcm9sbE1heEhlaWdodFwiXHJcbiAgICAgIFtlbXB0eU1lc3NhZ2VdPVwiZW1wdHlNZXNzYWdlQ2FyZFwiXHJcbiAgICAgIFtsb2FkaW5nXT1cImxvYWRpbmdcIlxyXG4gICAgICAoZWRpdCk9XCJlZGl0LmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgIChyZW1vdmUpPVwicmVtb3ZlLmVtaXQoJGV2ZW50KVwiXHJcbiAgICAgIChsb2FkTW9yZSk9XCJsb2FkTW9yZS5lbWl0KClcIlxyXG4gICAgLz5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuICBAaWYgKHNob3dSZXN1bHRDb3VudCAmJiByZXN1bHRDb3VudERpc3BsYXkpIHtcclxuICA8ZGl2IGNsYXNzPVwiYWRhcHRpdmUtZGF0YS12aWV3X19yZXN1bHQtY291bnRcIiBhcmlhLWxpdmU9XCJwb2xpdGVcIj5cclxuICAgIHt7IHJlc3VsdENvdW50RGlzcGxheSB9fVxyXG4gIDwvZGl2PlxyXG4gIH1cclxuPC9kaXY+XHJcbiJdfQ==
@@ -0,0 +1,208 @@
1
+ import { NgStyle } from '@angular/common';
2
+ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output, booleanAttribute, inject, } from '@angular/core';
3
+ import { DataCardComponent } from '../data-card/data-card.component';
4
+ import { EmptyStateComponent } from '../empty-state/empty-state.component';
5
+ import { SkeletonCardComponent } from '../../loading/skeleton-loading';
6
+ import * as i0 from "@angular/core";
7
+ export class CardListComponent {
8
+ constructor() {
9
+ this.cdr = inject(ChangeDetectorRef);
10
+ this.loading = false;
11
+ /**
12
+ * Com itens já visíveis: mostra **um** skeleton no fundo (próxima página remota)
13
+ * para não saltar o scroll nem ocupar altura de vários cartões. O carregamento inicial
14
+ * continua a usar só {@link loading} (lista vazia ou refresh completo com `loading` e sem `loadingMore`).
15
+ */
16
+ this.loadingMore = false;
17
+ this.emptyMessage = 'Sem itens para mostrar.';
18
+ this.variant = 'default';
19
+ this.showItemActions = true;
20
+ this.trackByProp = 'id';
21
+ this.dataMode = 'memory';
22
+ /** Em modo `memory`: quantos itens revelar por cada passo de scroll. Por omissão `10`. */
23
+ this.scrollBatchSize = 10;
24
+ this.scrollLoadThresholdPx = 80;
25
+ /** Mostra o rodapé com o resumo (“X de Y”) e dica. Por omissão `true`; com `false` oculta o footer. */
26
+ this.showFooter = true;
27
+ this.scrollMaxHeight = 'min(28rem, 50vh)';
28
+ /**
29
+ * Modo **remote**: total de registros no servidor (ex.: COUNT SQL), para o texto “X de Y”.
30
+ * Se `null`, usa `items.length`.
31
+ */
32
+ this.totalCountRemote = null;
33
+ /** Modo **remote**: existe página seguinte para pedir ao backend. */
34
+ this.hasNextPage = false;
35
+ /** Modo **remote**: pedido de mais dados (próxima página). */
36
+ this.loadMore = new EventEmitter();
37
+ this.edit = new EventEmitter();
38
+ this.remove = new EventEmitter();
39
+ /** Modo memory: quantos cartões renderizar (fatia inicial = scrollBatchSize). */
40
+ this.visibleCount = 0;
41
+ this.loadMorePending = false;
42
+ this.trackFn = (index, item) => {
43
+ if (item != null && typeof item === 'object') {
44
+ const key = this.trackByProp;
45
+ if (key in item) {
46
+ return item[key];
47
+ }
48
+ }
49
+ return index;
50
+ };
51
+ }
52
+ /** Skeleton que ocupa a lista inteira (carregamento inicial / refresh com `loading`). */
53
+ get showFullSkeleton() {
54
+ return this.loading && !this.loadingMore;
55
+ }
56
+ ngOnChanges(changes) {
57
+ if (changes['items']) {
58
+ this.loadMorePending = false;
59
+ }
60
+ if (changes['items'] ||
61
+ changes['dataMode'] ||
62
+ changes['scrollBatchSize']) {
63
+ this.resetVisibleWindow();
64
+ }
65
+ }
66
+ get totalItemCount() {
67
+ return this.items?.length ?? 0;
68
+ }
69
+ /** Total para o rodapé “X de Y”. */
70
+ get totalForStatus() {
71
+ if (this.dataMode === 'remote' && this.totalCountRemote != null) {
72
+ return this.totalCountRemote;
73
+ }
74
+ return this.totalItemCount;
75
+ }
76
+ get visibleItems() {
77
+ const list = this.items ?? [];
78
+ if (this.dataMode === 'remote') {
79
+ return list;
80
+ }
81
+ return list.slice(0, this.visibleCount);
82
+ }
83
+ get scrollStatusLabel() {
84
+ if (this.totalForStatus === 0) {
85
+ return '';
86
+ }
87
+ if (this.dataMode === 'remote') {
88
+ const loaded = this.totalItemCount;
89
+ return `${loaded} de ${this.totalForStatus} registro(s)`;
90
+ }
91
+ const shown = Math.min(this.visibleCount, this.totalItemCount);
92
+ return `${shown} de ${this.totalForStatus} registro(s)`;
93
+ }
94
+ get scrollAreaStyle() {
95
+ const h = this.scrollMaxHeight;
96
+ if (h === null || h === undefined || h.trim() === '') {
97
+ return {};
98
+ }
99
+ // Carregamento inicial (skeleton em lista vazia): sem barra de scroll; só com itens reais
100
+ // é que `auto` entra em efeito se o conteúdo exceder `max-height`.
101
+ return {
102
+ 'max-height': h,
103
+ 'overflow-y': this.showFullSkeleton ? 'hidden' : 'auto',
104
+ 'overflow-x': 'hidden',
105
+ };
106
+ }
107
+ /** Há mais linhas para mostrar (memória) ou para pedir à API (remote). */
108
+ get hasMoreToReveal() {
109
+ if (this.dataMode === 'remote') {
110
+ return this.hasNextPage;
111
+ }
112
+ return (this.visibleCount < this.totalItemCount && this.totalItemCount > 0);
113
+ }
114
+ viewFor(item) {
115
+ return this.mapItem(item);
116
+ }
117
+ skeletonCardIndices() {
118
+ const n = Math.min(8, Math.max(3, this.scrollBatchSize));
119
+ return Array.from({ length: n }, (_, i) => i);
120
+ }
121
+ /** Um único cartão skeleton no fundo durante `loadingMore` (mantém o scroll estável). */
122
+ skeletonTailIndices() {
123
+ return [0];
124
+ }
125
+ onScroll(ev) {
126
+ const el = ev.target;
127
+ const remaining = el.scrollHeight - el.scrollTop - el.clientHeight;
128
+ if (remaining > this.scrollLoadThresholdPx) {
129
+ return;
130
+ }
131
+ if (this.dataMode === 'remote') {
132
+ this.requestRemotePage();
133
+ return;
134
+ }
135
+ this.loadMoreMemoryChunk();
136
+ }
137
+ requestRemotePage() {
138
+ if (!this.hasNextPage || this.loading || this.loadingMore || this.loadMorePending) {
139
+ return;
140
+ }
141
+ this.loadMorePending = true;
142
+ this.loadMore.emit();
143
+ this.cdr.markForCheck();
144
+ }
145
+ loadMoreMemoryChunk() {
146
+ if (this.visibleCount >= this.totalItemCount) {
147
+ return;
148
+ }
149
+ this.visibleCount = Math.min(this.visibleCount + this.scrollBatchSize, this.totalItemCount);
150
+ this.cdr.markForCheck();
151
+ }
152
+ resetVisibleWindow() {
153
+ if (this.dataMode === 'remote') {
154
+ this.visibleCount = this.totalItemCount;
155
+ this.cdr.markForCheck();
156
+ return;
157
+ }
158
+ const total = this.totalItemCount;
159
+ this.visibleCount = Math.min(this.scrollBatchSize, total);
160
+ this.cdr.markForCheck();
161
+ }
162
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CardListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
163
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: CardListComponent, isStandalone: true, selector: "app-card-list", inputs: { items: "items", loading: "loading", loadingMore: ["loadingMore", "loadingMore", booleanAttribute], emptyMessage: "emptyMessage", variant: "variant", mapItem: "mapItem", showItemActions: "showItemActions", trackByProp: "trackByProp", dataMode: "dataMode", scrollBatchSize: "scrollBatchSize", scrollLoadThresholdPx: "scrollLoadThresholdPx", showFooter: "showFooter", scrollMaxHeight: "scrollMaxHeight", totalCountRemote: "totalCountRemote", hasNextPage: "hasNextPage" }, outputs: { loadMore: "loadMore", edit: "edit", remove: "remove" }, usesOnChanges: true, ngImport: i0, template: "<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\u2026</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\u2026</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", styles: [":host{display:block;width:100%;min-width:0}.card-list{position:relative;width:100%;min-height:5rem;box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));background:var(--app-color-surface, #fff);overflow:hidden}.card-list__body{display:flex;flex-direction:column;min-width:0}.card-list__scroll{min-height:0;box-sizing:border-box;-webkit-overflow-scrolling:touch}.card-list__stack{display:flex;flex-direction:column;gap:.75rem;padding:.75rem;box-sizing:border-box}.card-list__status{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.35rem .75rem;padding:.45rem .75rem .55rem;border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08));font-size:.8rem;color:var(--app-color-tab-inactive-text, #51667a);background:var(--app-color-background, #fafbfc)}.card-list__status-text{font-weight:500}.card-list__status-hint{font-size:.78rem;color:var(--app-color-text-muted, #6b8299)}.card-list__visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: DataCardComponent, selector: "app-data-card", inputs: ["title", "subtitle", "avatarText", "variant", "showActions"], outputs: ["edit", "remove"] }, { kind: "component", type: EmptyStateComponent, selector: "app-empty-state", inputs: ["message", "description", "iconClass", "variant", "embed"] }, { kind: "component", type: SkeletonCardComponent, selector: "app-skeleton-card", inputs: ["showActions", "animate"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
164
+ }
165
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CardListComponent, decorators: [{
166
+ type: Component,
167
+ args: [{ selector: 'app-card-list', standalone: true, imports: [NgStyle, DataCardComponent, EmptyStateComponent, SkeletonCardComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "<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\u2026</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\u2026</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", styles: [":host{display:block;width:100%;min-width:0}.card-list{position:relative;width:100%;min-height:5rem;box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09));background:var(--app-color-surface, #fff);overflow:hidden}.card-list__body{display:flex;flex-direction:column;min-width:0}.card-list__scroll{min-height:0;box-sizing:border-box;-webkit-overflow-scrolling:touch}.card-list__stack{display:flex;flex-direction:column;gap:.75rem;padding:.75rem;box-sizing:border-box}.card-list__status{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:.35rem .75rem;padding:.45rem .75rem .55rem;border-top:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .08));font-size:.8rem;color:var(--app-color-tab-inactive-text, #51667a);background:var(--app-color-background, #fafbfc)}.card-list__status-text{font-weight:500}.card-list__status-hint{font-size:.78rem;color:var(--app-color-text-muted, #6b8299)}.card-list__visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
168
+ }], propDecorators: { items: [{
169
+ type: Input,
170
+ args: [{ required: true }]
171
+ }], loading: [{
172
+ type: Input
173
+ }], loadingMore: [{
174
+ type: Input,
175
+ args: [{ transform: booleanAttribute }]
176
+ }], emptyMessage: [{
177
+ type: Input
178
+ }], variant: [{
179
+ type: Input
180
+ }], mapItem: [{
181
+ type: Input,
182
+ args: [{ required: true }]
183
+ }], showItemActions: [{
184
+ type: Input
185
+ }], trackByProp: [{
186
+ type: Input
187
+ }], dataMode: [{
188
+ type: Input
189
+ }], scrollBatchSize: [{
190
+ type: Input
191
+ }], scrollLoadThresholdPx: [{
192
+ type: Input
193
+ }], showFooter: [{
194
+ type: Input
195
+ }], scrollMaxHeight: [{
196
+ type: Input
197
+ }], totalCountRemote: [{
198
+ type: Input
199
+ }], hasNextPage: [{
200
+ type: Input
201
+ }], loadMore: [{
202
+ type: Output
203
+ }], edit: [{
204
+ type: Output
205
+ }], remove: [{
206
+ type: Output
207
+ }] } });
208
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FyZC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvZGF0YS1kaXNwbGF5L2NhcmQtbGlzdC9jYXJkLWxpc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvY2FyZC1saXN0L2NhcmQtbGlzdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUVOLGdCQUFnQixFQUNoQixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDM0UsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7O0FBbUJ2RSxNQUFNLE9BQU8saUJBQWlCO0lBUjlCO1FBU21CLFFBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUd4QyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3pCOzs7O1dBSUc7UUFDcUMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDbkQsaUJBQVksR0FBRyx5QkFBeUIsQ0FBQztRQUN6QyxZQUFPLEdBQWMsU0FBUyxDQUFDO1FBRS9CLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLGdCQUFXLEdBQXFCLElBQWUsQ0FBQztRQUVoRCxhQUFRLEdBQXFCLFFBQVEsQ0FBQztRQUUvQywwRkFBMEY7UUFDakYsb0JBQWUsR0FBRyxFQUFFLENBQUM7UUFDckIsMEJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLHVHQUF1RztRQUM5RixlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLG9CQUFlLEdBQWtCLGtCQUFrQixDQUFDO1FBRTdEOzs7V0FHRztRQUNNLHFCQUFnQixHQUFrQixJQUFJLENBQUM7UUFDaEQscUVBQXFFO1FBQzVELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzdCLDhEQUE4RDtRQUMzQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUVwQyxTQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztRQUM3QixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQUssQ0FBQztRQUVsRCxpRkFBaUY7UUFDakYsaUJBQVksR0FBRyxDQUFDLENBQUM7UUFFVCxvQkFBZSxHQUFHLEtBQUssQ0FBQztRQTBGaEMsWUFBTyxHQUFHLENBQUMsS0FBYSxFQUFFLElBQU8sRUFBVyxFQUFFO1lBQzVDLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQXFCLENBQUM7Z0JBQ3ZDLElBQUksR0FBRyxJQUFLLElBQWUsRUFBRSxDQUFDO29CQUM1QixPQUFRLElBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ2hELENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDLENBQUM7S0ErQ0g7SUEvSUMseUZBQXlGO0lBQ3pGLElBQUksZ0JBQWdCO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDM0MsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUNFLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFDaEIsT0FBTyxDQUFDLFVBQVUsQ0FBQztZQUNuQixPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFDMUIsQ0FBQztZQUNELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsSUFBSSxjQUFjO1FBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLGdCQUFnQixJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2hFLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQy9CLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUM7SUFDN0IsQ0FBQztJQUVELElBQUksWUFBWTtRQUNkLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzlCLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ25DLE9BQU8sR0FBRyxNQUFNLE9BQU8sSUFBSSxDQUFDLGNBQWMsY0FBYyxDQUFDO1FBQzNELENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sR0FBRyxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsY0FBYyxDQUFDO0lBQzFELENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDakIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUMvQixJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDckQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsMEZBQTBGO1FBQzFGLG1FQUFtRTtRQUNuRSxPQUFPO1lBQ0wsWUFBWSxFQUFFLENBQUM7WUFDZixZQUFZLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07WUFDdkQsWUFBWSxFQUFFLFFBQVE7U0FDdkIsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFDMUUsSUFBSSxlQUFlO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8sQ0FDTCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQU87UUFDYixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztRQUN6RCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRUQseUZBQXlGO0lBQ3pGLG1CQUFtQjtRQUNqQixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDYixDQUFDO0lBWUQsUUFBUSxDQUFDLEVBQVM7UUFDaEIsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQXFCLENBQUM7UUFDcEMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUM7UUFDbkUsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDM0MsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDekIsT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRU8saUJBQWlCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDbEYsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLG1CQUFtQjtRQUN6QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzdDLE9BQU87UUFDVCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUMxQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQ3hDLElBQUksQ0FBQyxjQUFjLENBQ3BCLENBQUM7UUFDRixJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxrQkFBa0I7UUFDeEIsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3hCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxRCxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQzFCLENBQUM7K0dBMUxVLGlCQUFpQjttR0FBakIsaUJBQWlCLDJJQVVSLGdCQUFnQixxZUM1Q3RDLCsyREE2Q0EsOHBDRGhCWSxPQUFPLDJFQUFFLGlCQUFpQiw4SkFBRSxtQkFBbUIsaUlBQUUscUJBQXFCOzs0RkFLckUsaUJBQWlCO2tCQVI3QixTQUFTOytCQUNFLGVBQWUsY0FDYixJQUFJLFdBQ1AsQ0FBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLENBQUMsbUJBR2hFLHVCQUF1QixDQUFDLE1BQU07OEJBS3BCLEtBQUs7c0JBQS9CLEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2dCQUNoQixPQUFPO3NCQUFmLEtBQUs7Z0JBTWtDLFdBQVc7c0JBQWxELEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBQzdCLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNxQixPQUFPO3NCQUFqQyxLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFDaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUcsVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQU1HLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVhLFFBQVE7c0JBQTFCLE1BQU07Z0JBRVksSUFBSTtzQkFBdEIsTUFBTTtnQkFDWSxNQUFNO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdTdHlsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIGluamVjdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRhQ2FyZENvbXBvbmVudCB9IGZyb20gJy4uL2RhdGEtY2FyZC9kYXRhLWNhcmQuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgU2tlbGV0b25DYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbG9hZGluZy9za2VsZXRvbi1sb2FkaW5nJztcbmltcG9ydCB0eXBlIHsgQ2FyZEl0ZW1WaWV3LCBDYXJkTGlzdE1hcEZuIH0gZnJvbSAnLi4vX21vZGVscy9jYXJkLWl0ZW0tdmlldy5tb2RlbCc7XG5cbi8qKlxuICogLSAqKm1lbW9yeSoqOiBgaXRlbXNgIHRlbSBhIGxpc3RhIGNvbXBsZXRhIChleC46IDUwMCBlbSBtZW3Ds3JpYSk7IHPDsyBzZSBtb3N0cmFtXG4gKiAgIGBzY3JvbGxCYXRjaFNpemVgIGRlIGNhZGEgdmV6IGF0w6kgbyB1c3XDoXJpbyBmYXplciBzY3JvbGwgKGZhdGlhIGxvY2FsKS5cbiAqIC0gKipyZW1vdGUqKjogYGl0ZW1zYCBzw6NvIHPDsyBhcyBsaW5oYXMgasOhIGRldm9sdmlkYXMgcGVsYSBBUEk7IGFvIGZpbSBkbyBzY3JvbGxcbiAqICAgZW1pdGUgYGxvYWRNb3JlYCBwYXJhIHBlZGlyIGEgcHLDs3hpbWEgcMOhZ2luYSAoU1FMIE9GRlNFVC9GRVRDSCBubyBiYWNrZW5kKS5cbiAqL1xuZXhwb3J0IHR5cGUgQ2FyZExpc3REYXRhTW9kZSA9ICdtZW1vcnknIHwgJ3JlbW90ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1jYXJkLWxpc3QnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbTmdTdHlsZSwgRGF0YUNhcmRDb21wb25lbnQsIEVtcHR5U3RhdGVDb21wb25lbnQsIFNrZWxldG9uQ2FyZENvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jYXJkLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY2FyZC1saXN0LmNvbXBvbmVudC5zY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENhcmRMaXN0Q29tcG9uZW50PFQgPSB1bmtub3duPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBpdGVtcyE6IFRbXTtcbiAgQElucHV0KCkgbG9hZGluZyA9IGZhbHNlO1xuICAvKipcbiAgICogQ29tIGl0ZW5zIGrDoSB2aXPDrXZlaXM6IG1vc3RyYSAqKnVtKiogc2tlbGV0b24gbm8gZnVuZG8gKHByw7N4aW1hIHDDoWdpbmEgcmVtb3RhKVxuICAgKiBwYXJhIG7Do28gc2FsdGFyIG8gc2Nyb2xsIG5lbSBvY3VwYXIgYWx0dXJhIGRlIHbDoXJpb3MgY2FydMO1ZXMuIE8gY2FycmVnYW1lbnRvIGluaWNpYWxcbiAgICogY29udGludWEgYSB1c2FyIHPDsyB7QGxpbmsgbG9hZGluZ30gKGxpc3RhIHZhemlhIG91IHJlZnJlc2ggY29tcGxldG8gY29tIGBsb2FkaW5nYCBlIHNlbSBgbG9hZGluZ01vcmVgKS5cbiAgICovXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KSBsb2FkaW5nTW9yZSA9IGZhbHNlO1xuICBASW5wdXQoKSBlbXB0eU1lc3NhZ2UgPSAnU2VtIGl0ZW5zIHBhcmEgbW9zdHJhci4nO1xuICBASW5wdXQoKSB2YXJpYW50OiAnZGVmYXVsdCcgPSAnZGVmYXVsdCc7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIG1hcEl0ZW0hOiBDYXJkTGlzdE1hcEZuPFQ+O1xuICBASW5wdXQoKSBzaG93SXRlbUFjdGlvbnMgPSB0cnVlO1xuICBASW5wdXQoKSB0cmFja0J5UHJvcDoga2V5b2YgVCB8IHN0cmluZyA9ICdpZCcgYXMga2V5b2YgVDtcblxuICBASW5wdXQoKSBkYXRhTW9kZTogQ2FyZExpc3REYXRhTW9kZSA9ICdtZW1vcnknO1xuXG4gIC8qKiBFbSBtb2RvIGBtZW1vcnlgOiBxdWFudG9zIGl0ZW5zIHJldmVsYXIgcG9yIGNhZGEgcGFzc28gZGUgc2Nyb2xsLiBQb3Igb21pc3PDo28gYDEwYC4gKi9cbiAgQElucHV0KCkgc2Nyb2xsQmF0Y2hTaXplID0gMTA7XG4gIEBJbnB1dCgpIHNjcm9sbExvYWRUaHJlc2hvbGRQeCA9IDgwO1xuICAvKiogTW9zdHJhIG8gcm9kYXDDqSBjb20gbyByZXN1bW8gKOKAnFggZGUgWeKAnSkgZSBkaWNhLiBQb3Igb21pc3PDo28gYHRydWVgOyBjb20gYGZhbHNlYCBvY3VsdGEgbyBmb290ZXIuICovXG4gIEBJbnB1dCgpIHNob3dGb290ZXIgPSB0cnVlO1xuICBASW5wdXQoKSBzY3JvbGxNYXhIZWlnaHQ6IHN0cmluZyB8IG51bGwgPSAnbWluKDI4cmVtLCA1MHZoKSc7XG5cbiAgLyoqXG4gICAqIE1vZG8gKipyZW1vdGUqKjogdG90YWwgZGUgcmVnaXN0cm9zIG5vIHNlcnZpZG9yIChleC46IENPVU5UIFNRTCksIHBhcmEgbyB0ZXh0byDigJxYIGRlIFnigJ0uXG4gICAqIFNlIGBudWxsYCwgdXNhIGBpdGVtcy5sZW5ndGhgLlxuICAgKi9cbiAgQElucHV0KCkgdG90YWxDb3VudFJlbW90ZTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIC8qKiBNb2RvICoqcmVtb3RlKio6IGV4aXN0ZSBww6FnaW5hIHNlZ3VpbnRlIHBhcmEgcGVkaXIgYW8gYmFja2VuZC4gKi9cbiAgQElucHV0KCkgaGFzTmV4dFBhZ2UgPSBmYWxzZTtcbiAgLyoqIE1vZG8gKipyZW1vdGUqKjogcGVkaWRvIGRlIG1haXMgZGFkb3MgKHByw7N4aW1hIHDDoWdpbmEpLiAqL1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbG9hZE1vcmUgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgQE91dHB1dCgpIHJlYWRvbmx5IGVkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSByZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPFQ+KCk7XG5cbiAgLyoqIE1vZG8gbWVtb3J5OiBxdWFudG9zIGNhcnTDtWVzIHJlbmRlcml6YXIgKGZhdGlhIGluaWNpYWwgPSBzY3JvbGxCYXRjaFNpemUpLiAqL1xuICB2aXNpYmxlQ291bnQgPSAwO1xuXG4gIHByaXZhdGUgbG9hZE1vcmVQZW5kaW5nID0gZmFsc2U7XG5cbiAgLyoqIFNrZWxldG9uIHF1ZSBvY3VwYSBhIGxpc3RhIGludGVpcmEgKGNhcnJlZ2FtZW50byBpbmljaWFsIC8gcmVmcmVzaCBjb20gYGxvYWRpbmdgKS4gKi9cbiAgZ2V0IHNob3dGdWxsU2tlbGV0b24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubG9hZGluZyAmJiAhdGhpcy5sb2FkaW5nTW9yZTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSkge1xuICAgICAgdGhpcy5sb2FkTW9yZVBlbmRpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgY2hhbmdlc1snaXRlbXMnXSB8fFxuICAgICAgY2hhbmdlc1snZGF0YU1vZGUnXSB8fFxuICAgICAgY2hhbmdlc1snc2Nyb2xsQmF0Y2hTaXplJ11cbiAgICApIHtcbiAgICAgIHRoaXMucmVzZXRWaXNpYmxlV2luZG93KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHRvdGFsSXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaXRlbXM/Lmxlbmd0aCA/PyAwO1xuICB9XG5cbiAgLyoqIFRvdGFsIHBhcmEgbyByb2RhcMOpIOKAnFggZGUgWeKAnS4gKi9cbiAgZ2V0IHRvdGFsRm9yU3RhdHVzKCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YU1vZGUgPT09ICdyZW1vdGUnICYmIHRoaXMudG90YWxDb3VudFJlbW90ZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy50b3RhbENvdW50UmVtb3RlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50b3RhbEl0ZW1Db3VudDtcbiAgfVxuXG4gIGdldCB2aXNpYmxlSXRlbXMoKTogVFtdIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5pdGVtcyA/PyBbXTtcbiAgICBpZiAodGhpcy5kYXRhTW9kZSA9PT0gJ3JlbW90ZScpIHtcbiAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cbiAgICByZXR1cm4gbGlzdC5zbGljZSgwLCB0aGlzLnZpc2libGVDb3VudCk7XG4gIH1cblxuICBnZXQgc2Nyb2xsU3RhdHVzTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy50b3RhbEZvclN0YXR1cyA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhTW9kZSA9PT0gJ3JlbW90ZScpIHtcbiAgICAgIGNvbnN0IGxvYWRlZCA9IHRoaXMudG90YWxJdGVtQ291bnQ7XG4gICAgICByZXR1cm4gYCR7bG9hZGVkfSBkZSAke3RoaXMudG90YWxGb3JTdGF0dXN9IHJlZ2lzdHJvKHMpYDtcbiAgICB9XG4gICAgY29uc3Qgc2hvd24gPSBNYXRoLm1pbih0aGlzLnZpc2libGVDb3VudCwgdGhpcy50b3RhbEl0ZW1Db3VudCk7XG4gICAgcmV0dXJuIGAke3Nob3dufSBkZSAke3RoaXMudG90YWxGb3JTdGF0dXN9IHJlZ2lzdHJvKHMpYDtcbiAgfVxuXG4gIGdldCBzY3JvbGxBcmVhU3R5bGUoKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3QgaCA9IHRoaXMuc2Nyb2xsTWF4SGVpZ2h0O1xuICAgIGlmIChoID09PSBudWxsIHx8IGggPT09IHVuZGVmaW5lZCB8fCBoLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgLy8gQ2FycmVnYW1lbnRvIGluaWNpYWwgKHNrZWxldG9uIGVtIGxpc3RhIHZhemlhKTogc2VtIGJhcnJhIGRlIHNjcm9sbDsgc8OzIGNvbSBpdGVucyByZWFpc1xuICAgIC8vIMOpIHF1ZSBgYXV0b2AgZW50cmEgZW0gZWZlaXRvIHNlIG8gY29udGXDumRvIGV4Y2VkZXIgYG1heC1oZWlnaHRgLlxuICAgIHJldHVybiB7XG4gICAgICAnbWF4LWhlaWdodCc6IGgsXG4gICAgICAnb3ZlcmZsb3cteSc6IHRoaXMuc2hvd0Z1bGxTa2VsZXRvbiA/ICdoaWRkZW4nIDogJ2F1dG8nLFxuICAgICAgJ292ZXJmbG93LXgnOiAnaGlkZGVuJyxcbiAgICB9O1xuICB9XG5cbiAgLyoqIEjDoSBtYWlzIGxpbmhhcyBwYXJhIG1vc3RyYXIgKG1lbcOzcmlhKSBvdSBwYXJhIHBlZGlyIMOgIEFQSSAocmVtb3RlKS4gKi9cbiAgZ2V0IGhhc01vcmVUb1JldmVhbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5kYXRhTW9kZSA9PT0gJ3JlbW90ZScpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc05leHRQYWdlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy52aXNpYmxlQ291bnQgPCB0aGlzLnRvdGFsSXRlbUNvdW50ICYmIHRoaXMudG90YWxJdGVtQ291bnQgPiAwXG4gICAgKTtcbiAgfVxuXG4gIHZpZXdGb3IoaXRlbTogVCk6IENhcmRJdGVtVmlldyB7XG4gICAgcmV0dXJuIHRoaXMubWFwSXRlbShpdGVtKTtcbiAgfVxuXG4gIHNrZWxldG9uQ2FyZEluZGljZXMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1pbig4LCBNYXRoLm1heCgzLCB0aGlzLnNjcm9sbEJhdGNoU2l6ZSkpO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHsgbGVuZ3RoOiBuIH0sIChfLCBpKSA9PiBpKTtcbiAgfVxuXG4gIC8qKiBVbSDDum5pY28gY2FydMOjbyBza2VsZXRvbiBubyBmdW5kbyBkdXJhbnRlIGBsb2FkaW5nTW9yZWAgKG1hbnTDqW0gbyBzY3JvbGwgZXN0w6F2ZWwpLiAqL1xuICBza2VsZXRvblRhaWxJbmRpY2VzKCk6IG51bWJlcltdIHtcbiAgICByZXR1cm4gWzBdO1xuICB9XG5cbiAgdHJhY2tGbiA9IChpbmRleDogbnVtYmVyLCBpdGVtOiBUKTogdW5rbm93biA9PiB7XG4gICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMudHJhY2tCeVByb3AgYXMgc3RyaW5nO1xuICAgICAgaWYgKGtleSBpbiAoaXRlbSBhcyBvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiAoaXRlbSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9O1xuXG4gIG9uU2Nyb2xsKGV2OiBFdmVudCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gZXYudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgIGNvbnN0IHJlbWFpbmluZyA9IGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodDtcbiAgICBpZiAocmVtYWluaW5nID4gdGhpcy5zY3JvbGxMb2FkVGhyZXNob2xkUHgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRhTW9kZSA9PT0gJ3JlbW90ZScpIHtcbiAgICAgIHRoaXMucmVxdWVzdFJlbW90ZVBhZ2UoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRNb3JlTWVtb3J5Q2h1bmsoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWVzdFJlbW90ZVBhZ2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc05leHRQYWdlIHx8IHRoaXMubG9hZGluZyB8fCB0aGlzLmxvYWRpbmdNb3JlIHx8IHRoaXMubG9hZE1vcmVQZW5kaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubG9hZE1vcmVQZW5kaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmxvYWRNb3JlLmVtaXQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZE1vcmVNZW1vcnlDaHVuaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy52aXNpYmxlQ291bnQgPj0gdGhpcy50b3RhbEl0ZW1Db3VudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZpc2libGVDb3VudCA9IE1hdGgubWluKFxuICAgICAgdGhpcy52aXNpYmxlQ291bnQgKyB0aGlzLnNjcm9sbEJhdGNoU2l6ZSxcbiAgICAgIHRoaXMudG90YWxJdGVtQ291bnQsXG4gICAgKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRWaXNpYmxlV2luZG93KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGFNb2RlID09PSAncmVtb3RlJykge1xuICAgICAgdGhpcy52aXNpYmxlQ291bnQgPSB0aGlzLnRvdGFsSXRlbUNvdW50O1xuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbEl0ZW1Db3VudDtcbiAgICB0aGlzLnZpc2libGVDb3VudCA9IE1hdGgubWluKHRoaXMuc2Nyb2xsQmF0Y2hTaXplLCB0b3RhbCk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJjYXJkLWxpc3RcIiBbYXR0ci5kYXRhLXZhcmlhbnRdPVwidmFyaWFudFwiPlxyXG4gIEBpZiAoc2hvd0Z1bGxTa2VsZXRvbikge1xyXG4gIDxkaXYgY2xhc3M9XCJjYXJkLWxpc3RfX2JvZHlcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCIgYXJpYS1idXN5PVwidHJ1ZVwiPlxyXG4gICAgPHNwYW4gY2xhc3M9XCJjYXJkLWxpc3RfX3Zpc3VhbGx5LWhpZGRlblwiPkEgY2FycmVnYXIgbGlzdGHigKY8L3NwYW4+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1saXN0X19zY3JvbGxcIiBbbmdTdHlsZV09XCJzY3JvbGxBcmVhU3R5bGVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQtbGlzdF9fc3RhY2tcIj5cclxuICAgICAgICBAZm9yIChfIG9mIHNrZWxldG9uQ2FyZEluZGljZXMoKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPGFwcC1za2VsZXRvbi1jYXJkIFtzaG93QWN0aW9uc109XCJzaG93SXRlbUFjdGlvbnNcIiAvPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICB9XHJcblxyXG4gIEBpZiAoIXNob3dGdWxsU2tlbGV0b24gJiYgdG90YWxJdGVtQ291bnQgPT09IDAgJiYgIWxvYWRpbmdNb3JlKSB7XHJcbiAgPGFwcC1lbXB0eS1zdGF0ZSBbbWVzc2FnZV09XCJlbXB0eU1lc3NhZ2VcIiAvPlxyXG4gIH1cclxuXHJcbiAgQGlmICghc2hvd0Z1bGxTa2VsZXRvbiAmJiB0b3RhbEl0ZW1Db3VudCA+IDApIHtcclxuICA8ZGl2IGNsYXNzPVwiY2FyZC1saXN0X19ib2R5XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1saXN0X19zY3JvbGxcIiBbbmdTdHlsZV09XCJzY3JvbGxBcmVhU3R5bGVcIiAoc2Nyb2xsKT1cIm9uU2Nyb2xsKCRldmVudClcIlxyXG4gICAgICBbYXR0ci5hcmlhLWJ1c3ldPVwibG9hZGluZ01vcmUgPyB0cnVlIDogbnVsbFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1saXN0X19zdGFja1wiPlxyXG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgdmlzaWJsZUl0ZW1zOyB0cmFjayB0cmFja0ZuKCRpbmRleCwgaXRlbSkpIHtcclxuICAgICAgICA8YXBwLWRhdGEtY2FyZCBbdGl0bGVdPVwidmlld0ZvcihpdGVtKS50aXRsZVwiIFtzdWJ0aXRsZV09XCJ2aWV3Rm9yKGl0ZW0pLnN1YnRpdGxlXCJcclxuICAgICAgICAgIFthdmF0YXJUZXh0XT1cInZpZXdGb3IoaXRlbSkuYXZhdGFyVGV4dFwiIFt2YXJpYW50XT1cInZhcmlhbnRcIiBbc2hvd0FjdGlvbnNdPVwic2hvd0l0ZW1BY3Rpb25zXCJcclxuICAgICAgICAgIChlZGl0KT1cImVkaXQuZW1pdChpdGVtKVwiIChyZW1vdmUpPVwicmVtb3ZlLmVtaXQoaXRlbSlcIiAvPlxyXG4gICAgICAgIH1cclxuICAgICAgICBAaWYgKGxvYWRpbmdNb3JlKSB7XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXJkLWxpc3RfX3Zpc3VhbGx5LWhpZGRlblwiPkEgY2FycmVnYXIgbWFpcyBpdGVuc+KApjwvc3Bhbj5cclxuICAgICAgICBAZm9yIChfIG9mIHNrZWxldG9uVGFpbEluZGljZXMoKTsgdHJhY2sgJGluZGV4KSB7XHJcbiAgICAgICAgPGFwcC1za2VsZXRvbi1jYXJkIFtzaG93QWN0aW9uc109XCJzaG93SXRlbUFjdGlvbnNcIiAvPlxyXG4gICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgQGlmIChzaG93Rm9vdGVyKSB7XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FyZC1saXN0X19zdGF0dXNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZC1saXN0X19zdGF0dXMtdGV4dFwiPnt7IHNjcm9sbFN0YXR1c0xhYmVsIH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbiAgfVxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,25 @@
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ let dashboardSectionSeq = 0;
4
+ /**
5
+ * Bloco de dashboard: título, ações opcionais e conteúdo (stat-cards, listas, grades).
6
+ * Superfície alinhada aos cartões da lib.
7
+ */
8
+ export class DashboardSectionComponent {
9
+ constructor() {
10
+ this.subtitle = '';
11
+ this.titleId = `app-dashboard-section-title-${++dashboardSectionSeq}`;
12
+ }
13
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DashboardSectionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
14
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: DashboardSectionComponent, isStandalone: true, selector: "app-dashboard-section", inputs: { title: "title", subtitle: "subtitle" }, ngImport: i0, template: "<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", styles: [":host{display:block;width:100%;min-width:0}.dashboard-section{box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .1));background:var(--app-color-surface, #fff);padding:0;transition:border-color .15s ease,box-shadow .15s ease;display:flex;flex-direction:column;min-width:0;overflow:hidden}.dashboard-section__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:.5rem .75rem;padding:.85rem 1rem;border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09))}.dashboard-section__headline{flex:1 1 12rem;min-width:0}.dashboard-section__title{margin:0;font-size:1rem;font-weight:600;line-height:1.35;color:var(--app-color-text-primary, #1a2f45)}.dashboard-section__subtitle{margin:.25rem 0 0;font-size:.84rem;line-height:1.4;color:var(--app-color-text-muted, #6b8299)}.dashboard-section__actions{flex:0 0 auto;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.5rem;min-width:0}.dashboard-section__actions:empty{display:none}.dashboard-section__body{padding:.85rem 1rem 1rem;min-width:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
15
+ }
16
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DashboardSectionComponent, decorators: [{
17
+ type: Component,
18
+ args: [{ selector: 'app-dashboard-section', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, template: "<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", styles: [":host{display:block;width:100%;min-width:0}.dashboard-section{box-sizing:border-box;border-radius:10px;border:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .1));background:var(--app-color-surface, #fff);padding:0;transition:border-color .15s ease,box-shadow .15s ease;display:flex;flex-direction:column;min-width:0;overflow:hidden}.dashboard-section__header{display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:space-between;gap:.5rem .75rem;padding:.85rem 1rem;border-bottom:1px solid var(--app-color-border-subtle, rgba(26, 47, 69, .09))}.dashboard-section__headline{flex:1 1 12rem;min-width:0}.dashboard-section__title{margin:0;font-size:1rem;font-weight:600;line-height:1.35;color:var(--app-color-text-primary, #1a2f45)}.dashboard-section__subtitle{margin:.25rem 0 0;font-size:.84rem;line-height:1.4;color:var(--app-color-text-muted, #6b8299)}.dashboard-section__actions{flex:0 0 auto;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:.5rem;min-width:0}.dashboard-section__actions:empty{display:none}.dashboard-section__body{padding:.85rem 1rem 1rem;min-width:0}\n"] }]
19
+ }], propDecorators: { title: [{
20
+ type: Input,
21
+ args: [{ required: true }]
22
+ }], subtitle: [{
23
+ type: Input
24
+ }] } });
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFzaGJvYXJkLXNlY3Rpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvZGFzaGJvYXJkLXNlY3Rpb24vZGFzaGJvYXJkLXNlY3Rpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9kYXRhLWRpc3BsYXkvZGFzaGJvYXJkLXNlY3Rpb24vZGFzaGJvYXJkLXNlY3Rpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTFFLElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRTVCOzs7R0FHRztBQVFILE1BQU0sT0FBTyx5QkFBeUI7SUFQdEM7UUFVVyxhQUFRLEdBQUcsRUFBRSxDQUFDO1FBRWQsWUFBTyxHQUFHLCtCQUErQixFQUFFLG1CQUFtQixFQUFFLENBQUM7S0FDM0U7K0dBTlkseUJBQXlCO21HQUF6Qix5QkFBeUIsbUlDZnRDLGluQkFnQkE7OzRGRERhLHlCQUF5QjtrQkFQckMsU0FBUzsrQkFDRSx1QkFBdUIsY0FDckIsSUFBSSxtQkFHQyx1QkFBdUIsQ0FBQyxNQUFNOzhCQUdwQixLQUFLO3NCQUEvQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFFaEIsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5sZXQgZGFzaGJvYXJkU2VjdGlvblNlcSA9IDA7XHJcblxyXG4vKipcclxuICogQmxvY28gZGUgZGFzaGJvYXJkOiB0w610dWxvLCBhw6fDtWVzIG9wY2lvbmFpcyBlIGNvbnRlw7pkbyAoc3RhdC1jYXJkcywgbGlzdGFzLCBncmFkZXMpLlxyXG4gKiBTdXBlcmbDrWNpZSBhbGluaGFkYSBhb3MgY2FydMO1ZXMgZGEgbGliLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtZGFzaGJvYXJkLXNlY3Rpb24nLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2Rhc2hib2FyZC1zZWN0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vZGFzaGJvYXJkLXNlY3Rpb24uY29tcG9uZW50LnNjc3MnLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkU2VjdGlvbkNvbXBvbmVudCB7XHJcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgdGl0bGUhOiBzdHJpbmc7XHJcblxyXG4gIEBJbnB1dCgpIHN1YnRpdGxlID0gJyc7XHJcblxyXG4gIHJlYWRvbmx5IHRpdGxlSWQgPSBgYXBwLWRhc2hib2FyZC1zZWN0aW9uLXRpdGxlLSR7KytkYXNoYm9hcmRTZWN0aW9uU2VxfWA7XHJcbn1cclxuIiwiPHNlY3Rpb24gY2xhc3M9XCJkYXNoYm9hcmQtc2VjdGlvblwiIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJ0aXRsZUlkXCI+XHJcbiAgPGhlYWRlciBjbGFzcz1cImRhc2hib2FyZC1zZWN0aW9uX19oZWFkZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJkYXNoYm9hcmQtc2VjdGlvbl9faGVhZGxpbmVcIj5cclxuICAgICAgPGgyIGNsYXNzPVwiZGFzaGJvYXJkLXNlY3Rpb25fX3RpdGxlXCIgW2lkXT1cInRpdGxlSWRcIj57eyB0aXRsZSB9fTwvaDI+XHJcbiAgICAgIEBpZiAoc3VidGl0bGUudHJpbSgpKSB7XHJcbiAgICAgICAgPHAgY2xhc3M9XCJkYXNoYm9hcmQtc2VjdGlvbl9fc3VidGl0bGVcIj57eyBzdWJ0aXRsZSB9fTwvcD5cclxuICAgICAgfVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGFzaGJvYXJkLXNlY3Rpb25fX2FjdGlvbnNcIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2Rhc2hib2FyZC1zZWN0aW9uLWFjdGlvbnNdXCIgLz5cclxuICAgIDwvZGl2PlxyXG4gIDwvaGVhZGVyPlxyXG4gIDxkaXYgY2xhc3M9XCJkYXNoYm9hcmQtc2VjdGlvbl9fYm9keVwiPlxyXG4gICAgPG5nLWNvbnRlbnQgLz5cclxuICA8L2Rpdj5cclxuPC9zZWN0aW9uPlxyXG4iXX0=