@dev-tcloud/tcloud-ui 7.7.5 → 7.8.0

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.
@@ -2,16 +2,31 @@ import * as i0 from '@angular/core';
2
2
  import { Injectable, Component, EventEmitter, Input, Output, InjectionToken, Optional, Inject, inject, signal, Pipe, forwardRef, ViewChild, input, effect, Directive, ViewEncapsulation, HostListener, HostBinding, SkipSelf, ChangeDetectionStrategy, ChangeDetectorRef, computed, ApplicationRef, output, model, numberAttribute, booleanAttribute, ContentChildren, viewChild, EnvironmentInjector, createComponent, ViewContainerRef, NgModule, makeEnvironmentProviders, DOCUMENT } from '@angular/core';
3
3
  import * as i1$1 from '@angular/common';
4
4
  import { DatePipe, CommonModule } from '@angular/common';
5
- import { Subject, Subscription, BehaviorSubject, debounceTime, distinctUntilChanged, map } from 'rxjs';
5
+ import { Subject, Subscription, BehaviorSubject, firstValueFrom, debounceTime, distinctUntilChanged, map, catchError, switchMap, throwError } from 'rxjs';
6
6
  import * as i1 from '@angular/forms';
7
7
  import { NG_VALUE_ACCESSOR, FormsModule, FormControl, ReactiveFormsModule, NG_VALIDATORS, Validators, FormGroup } from '@angular/forms';
8
8
  import * as i1$2 from '@angular/router';
9
9
  import { Router, RouterModule } from '@angular/router';
10
+ import * as i1$3 from '@angular/common/http';
11
+ import { HttpClient, HttpErrorResponse, provideHttpClient, withInterceptorsFromDi, withInterceptors } from '@angular/common/http';
10
12
  import hljs from 'highlight.js';
11
13
  import * as i2 from 'ngx-markdown';
12
14
  import { MarkdownModule, provideMarkdown } from 'ngx-markdown';
13
- import * as i1$3 from '@angular/common/http';
14
- import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http';
15
+ import { map as map$1 } from 'rxjs/operators';
16
+
17
+ /**
18
+ * Aplica os defaults da configuração de auth. Centraliza as chaves padrão
19
+ * (`currentUser`/`currentEnv`/versão 2) para os serviços lerem sem repetir lógica.
20
+ */
21
+ function withAuthDefaults(config) {
22
+ return {
23
+ host: '',
24
+ ...(config ?? {}),
25
+ localStorageName: config?.localStorageName ?? 'currentUser',
26
+ sessionStorageName: config?.sessionStorageName ?? 'currentEnv',
27
+ userInfoVersion: config?.userInfoVersion ?? 2,
28
+ };
29
+ }
15
30
 
16
31
  class TCloudUiAccordionService {
17
32
  constructor() {
@@ -192,6 +207,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
192
207
  * Token de injeção para a configuração do TCloud UI
193
208
  */
194
209
  const TCLOUD_UI_CONFIG = new InjectionToken('TCLOUD_UI_CONFIG');
210
+ /**
211
+ * Token de injeção para a configuração do núcleo de autenticação.
212
+ * Alimentado pelo projeto consumidor via `provideTCloudUi({ auth: {...} })`
213
+ * ou `TCloudUiModule.forRoot({ auth: {...} })`.
214
+ */
215
+ const TCLOUD_UI_AUTH_CONFIG = new InjectionToken('TCLOUD_UI_AUTH_CONFIG');
195
216
  /**
196
217
  * Token de injeção para o serviço de usuário customizado
197
218
  */
@@ -3748,14 +3769,14 @@ class TCloudUiModalComponent {
3748
3769
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TCloudUiModalComponent, isStandalone: true, selector: "tcloud-ui-modal", inputs: { confirm: "confirm", confirmText: "confirmText", confirmInput: "confirmInput", autoClose: "autoClose", title: "title", maxWidth: "maxWidth", position: "position", sticky: "sticky", window: "window", open: "open", loading: "loading" }, outputs: { openChange: "openChange", toConfirm: "toConfirm", toCancel: "toCancel", toAction: "toAction" }, providers: [
3749
3770
  TcloudModalService,
3750
3771
  TCloudUiLayoutService
3751
- ], ngImport: i0, template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{position:fixed;width:100%;left:0;top:0;background-color:var(--c-modal-backdrop);z-index:4005;height:100%}.base-modal{height:100%;overflow:scroll;position:fixed;width:100%;z-index:4005;left:0;top:0;text-align:left!important}.sub-modal{padding:30px;position:absolute;width:100%;display:flex;justify-content:center;align-items:flex-start}.sub-modal.position-left{justify-content:flex-start}.sub-modal.position-right{justify-content:flex-end}.sub-modal.position-bottom{align-items:flex-end}.sub-modal{--modal-enter-from: translateY(-38%);--modal-leave-to: translateY(-38%)}.sub-modal.position-left{--modal-enter-from: translateX(-30%);--modal-leave-to: translateX(-30%)}.sub-modal.position-right{--modal-enter-from: translateX(30%);--modal-leave-to: translateX(30%)}.sub-modal.position-bottom{--modal-enter-from: translateY(30%);--modal-leave-to: translateY(30%)}.sub-modal.modal-fade-enter{animation:tcModalFadeIn .3s ease-out}.sub-modal.modal-fade-leave{animation:tcModalFadeOut .3s ease-out}@keyframes tcModalFadeIn{0%{opacity:0;transform:var(--modal-enter-from)}to{opacity:1;transform:translate(0)}}@keyframes tcModalFadeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--modal-leave-to)}}@media(prefers-reduced-motion:reduce){.sub-modal.modal-fade-enter,.sub-modal.modal-fade-leave{animation:none}}.tc-modal{position:relative;background-color:var(--c-neutral-50);border:1px solid var(--c-neutral-200);padding:12px;border-radius:8px;margin:auto;width:100%;transition:max-width .3s ease-out}@media(prefers-reduced-motion:reduce){.tc-modal{transition:none}}.sub-modal.is-sticky{padding:0}.sub-modal.is-sticky>.tc-modal{border-radius:0}.sub-modal.is-sticky.position-left>.tc-modal{margin:0 auto 0 0}.sub-modal.is-sticky.position-right>.tc-modal{margin:0 0 0 auto}.sub-modal.is-sticky.position-bottom>.tc-modal{margin:auto 0 0}.sub-modal.is-sticky.position-center>.tc-modal,.sub-modal.is-sticky.position-bottom>.tc-modal{max-width:100%!important;width:100%!important}.tc-modal-shadow{-webkit-box-shadow:2px 2px 10px 0px rgba(0,0,0,.368627451);box-shadow:2px 2px 10px #0000005e}.tc-btn-x{min-height:25px!important;min-width:25px!important;height:25px;width:25px;margin-top:8px}.area-top-actions{position:absolute;top:2px;right:5px;z-index:1}.area-top-actions.tc-ui-modal-colorless button.tc-btn-action-close-ui-modal i{color:var(--c-neutral-600)!important}.area-top-actions button.tc-btn-action-close-ui-modal{cursor:pointer;background-color:transparent;border:none;font-size:15px;padding:5px 7px}.area-top-actions button.tc-btn-action-close-ui-modal i{font-size:17px;color:#fff;transition:all .25s;opacity:.7}.area-top-actions button.tc-btn-action-close-ui-modal i:hover{opacity:1!important}h4{font-size:16px;margin:5px 30px 10px 0;font-weight:700}.no-use-header i{color:var(--c-neutral-500)!important}.tcloud-ui-modal-sticky{height:100vh;overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
3772
+ ], ngImport: i0, template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{border:1px solid var(--c-neutral-300);position:fixed;width:100%;left:0;top:0;background-color:#000;z-index:4005;height:100%;opacity:.3}.base-modal{height:100%;overflow:scroll;position:fixed;width:100%;z-index:4005;left:0;top:0;text-align:left!important}.sub-modal{padding:30px;position:absolute;width:100%;display:flex;justify-content:center;align-items:flex-start}.sub-modal.position-left{justify-content:flex-start}.sub-modal.position-right{justify-content:flex-end}.sub-modal.position-bottom{align-items:flex-end}.sub-modal{--modal-enter-from: translateY(-38%);--modal-leave-to: translateY(-38%)}.sub-modal.position-left{--modal-enter-from: translateX(-30%);--modal-leave-to: translateX(-30%)}.sub-modal.position-right{--modal-enter-from: translateX(30%);--modal-leave-to: translateX(30%)}.sub-modal.position-bottom{--modal-enter-from: translateY(30%);--modal-leave-to: translateY(30%)}.sub-modal.modal-fade-enter{animation:tcModalFadeIn .3s ease-out}.sub-modal.modal-fade-leave{animation:tcModalFadeOut .3s ease-out}@keyframes tcModalFadeIn{0%{opacity:0;transform:var(--modal-enter-from)}to{opacity:1;transform:translate(0)}}@keyframes tcModalFadeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--modal-leave-to)}}@media(prefers-reduced-motion:reduce){.sub-modal.modal-fade-enter,.sub-modal.modal-fade-leave{animation:none}}.tc-modal{position:relative;background-color:var(--c-neutral-50);border:1px solid var(--c-neutral-200);padding:12px;border-radius:8px;margin:auto;width:100%;transition:max-width .3s ease-out}@media(prefers-reduced-motion:reduce){.tc-modal{transition:none}}.sub-modal.is-sticky{padding:0}.sub-modal.is-sticky>.tc-modal{border-radius:0}.sub-modal.is-sticky.position-left>.tc-modal{margin:0 auto 0 0}.sub-modal.is-sticky.position-right>.tc-modal{margin:0 0 0 auto}.sub-modal.is-sticky.position-bottom>.tc-modal{margin:auto 0 0}.sub-modal.is-sticky.position-center>.tc-modal,.sub-modal.is-sticky.position-bottom>.tc-modal{max-width:100%!important;width:100%!important}.tc-modal-shadow{-webkit-box-shadow:2px 2px 10px 0px rgba(0,0,0,.368627451);box-shadow:2px 2px 10px #0000005e}.tc-btn-x{min-height:25px!important;min-width:25px!important;height:25px;width:25px;margin-top:8px}.area-top-actions{position:absolute;top:2px;right:5px;z-index:1}.area-top-actions.tc-ui-modal-colorless button.tc-btn-action-close-ui-modal i{color:var(--c-neutral-600)!important}.area-top-actions button.tc-btn-action-close-ui-modal{cursor:pointer;background-color:transparent;border:none;font-size:15px;padding:5px 7px}.area-top-actions button.tc-btn-action-close-ui-modal i{font-size:17px;color:#fff;transition:all .25s;opacity:.7}.area-top-actions button.tc-btn-action-close-ui-modal i:hover{opacity:1!important}h4{font-size:16px;margin:5px 30px 10px 0;font-weight:700}.no-use-header i{color:var(--c-neutral-500)!important}.tcloud-ui-modal-sticky{height:100vh;overflow:hidden}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] }); }
3752
3773
  }
3753
3774
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiModalComponent, decorators: [{
3754
3775
  type: Component,
3755
3776
  args: [{ selector: 'tcloud-ui-modal', providers: [
3756
3777
  TcloudModalService,
3757
3778
  TCloudUiLayoutService
3758
- ], standalone: true, imports: [CommonModule], template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{position:fixed;width:100%;left:0;top:0;background-color:var(--c-modal-backdrop);z-index:4005;height:100%}.base-modal{height:100%;overflow:scroll;position:fixed;width:100%;z-index:4005;left:0;top:0;text-align:left!important}.sub-modal{padding:30px;position:absolute;width:100%;display:flex;justify-content:center;align-items:flex-start}.sub-modal.position-left{justify-content:flex-start}.sub-modal.position-right{justify-content:flex-end}.sub-modal.position-bottom{align-items:flex-end}.sub-modal{--modal-enter-from: translateY(-38%);--modal-leave-to: translateY(-38%)}.sub-modal.position-left{--modal-enter-from: translateX(-30%);--modal-leave-to: translateX(-30%)}.sub-modal.position-right{--modal-enter-from: translateX(30%);--modal-leave-to: translateX(30%)}.sub-modal.position-bottom{--modal-enter-from: translateY(30%);--modal-leave-to: translateY(30%)}.sub-modal.modal-fade-enter{animation:tcModalFadeIn .3s ease-out}.sub-modal.modal-fade-leave{animation:tcModalFadeOut .3s ease-out}@keyframes tcModalFadeIn{0%{opacity:0;transform:var(--modal-enter-from)}to{opacity:1;transform:translate(0)}}@keyframes tcModalFadeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--modal-leave-to)}}@media(prefers-reduced-motion:reduce){.sub-modal.modal-fade-enter,.sub-modal.modal-fade-leave{animation:none}}.tc-modal{position:relative;background-color:var(--c-neutral-50);border:1px solid var(--c-neutral-200);padding:12px;border-radius:8px;margin:auto;width:100%;transition:max-width .3s ease-out}@media(prefers-reduced-motion:reduce){.tc-modal{transition:none}}.sub-modal.is-sticky{padding:0}.sub-modal.is-sticky>.tc-modal{border-radius:0}.sub-modal.is-sticky.position-left>.tc-modal{margin:0 auto 0 0}.sub-modal.is-sticky.position-right>.tc-modal{margin:0 0 0 auto}.sub-modal.is-sticky.position-bottom>.tc-modal{margin:auto 0 0}.sub-modal.is-sticky.position-center>.tc-modal,.sub-modal.is-sticky.position-bottom>.tc-modal{max-width:100%!important;width:100%!important}.tc-modal-shadow{-webkit-box-shadow:2px 2px 10px 0px rgba(0,0,0,.368627451);box-shadow:2px 2px 10px #0000005e}.tc-btn-x{min-height:25px!important;min-width:25px!important;height:25px;width:25px;margin-top:8px}.area-top-actions{position:absolute;top:2px;right:5px;z-index:1}.area-top-actions.tc-ui-modal-colorless button.tc-btn-action-close-ui-modal i{color:var(--c-neutral-600)!important}.area-top-actions button.tc-btn-action-close-ui-modal{cursor:pointer;background-color:transparent;border:none;font-size:15px;padding:5px 7px}.area-top-actions button.tc-btn-action-close-ui-modal i{font-size:17px;color:#fff;transition:all .25s;opacity:.7}.area-top-actions button.tc-btn-action-close-ui-modal i:hover{opacity:1!important}h4{font-size:16px;margin:5px 30px 10px 0;font-weight:700}.no-use-header i{color:var(--c-neutral-500)!important}.tcloud-ui-modal-sticky{height:100vh;overflow:hidden}\n"] }]
3779
+ ], standalone: true, imports: [CommonModule], template: "@if (control_open) {\n <div class=\"tc-background-modal\" >{{ checkIsOpen() }}</div>\n}\n\n@if (open) {\n <div class=\"tcloud-ui-modal base-modal tcloud-ui-modal-layout-{{ layout }} tcloud-ui-modal-postition-{{ position }}\" [attr.data-layout]=\"layout\">\n <div class=\"sub-modal\" [ngClass]=\"['position-' + position, sticky ? 'is-sticky' : '']\" animate.enter=\"modal-fade-enter\" animate.leave=\"modal-fade-leave\">\n <div class=\"tc-modal tc-modal-shadow\" [style.max-width.px]=\"maxWidth\" [class.tcloud-ui-modal-sticky]=\"sticky\">\n <div class=\"area-top-actions tc-ui-modal-{{mode}}\">\n @if( layout === 'classic'){\n <button type=\"button\" class=\"tc-btn-action-close-ui-modal\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }@else{\n <button type=\"button\" class=\"tc-rev-btn-square tc-btn-x\" [class.no-use-header]=\"title\" (click)=\"toClose()\" [disabled]=\"loading\">\n @if (!loading) {\n <i class=\"fas fa-times\"></i>\n }\n @if (loading) {\n <i class=\"fas fa-spinner fa-spin\"></i>\n }\n </button>\n }\n </div>\n @if (title) {\n <h4 [innerHTML]=\"title\"></h4>\n }\n <ng-content></ng-content>\n </div>\n </div>\n </div>\n}\n\n<!-- Ex: Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open\">\n\n <tcloud-ui-modal-header title=\"T\u00EDtulo do Modal\" ></tcloud-ui-modal-header>\n\n <tcloud-ui-modal-body>\n Conte\u00FAdo do modal aqui\n </tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open = !open\">open modal {{ open }}</button>\n-->\n\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n<!-- ****** -->\n\n<!-- Ex: Confirm Modal -->\n<!--\n<tcloud-ui-modal [(open)]=\"open_confirm\" [title]=\"'Aten\u00E7\u00E3o'\" [confirmText]=\"'Aceito'\" [confirm]=\"true\" (toAction)=\"$event\" >\n\n <tcloud-ui-modal-body>Deseja realmente executar esta a\u00E7\u00E3o?</tcloud-ui-modal-body>\n\n <tcloud-ui-modal-footer></tcloud-ui-modal-footer>\n\n</tcloud-ui-modal>\n\n<button type=\"button\" (click)=\"open_confirm = !open_confirm\">open_confirm modal {{ open_confirm }}</button>\n-->", styles: [".tc-background-modal{border:1px solid var(--c-neutral-300);position:fixed;width:100%;left:0;top:0;background-color:#000;z-index:4005;height:100%;opacity:.3}.base-modal{height:100%;overflow:scroll;position:fixed;width:100%;z-index:4005;left:0;top:0;text-align:left!important}.sub-modal{padding:30px;position:absolute;width:100%;display:flex;justify-content:center;align-items:flex-start}.sub-modal.position-left{justify-content:flex-start}.sub-modal.position-right{justify-content:flex-end}.sub-modal.position-bottom{align-items:flex-end}.sub-modal{--modal-enter-from: translateY(-38%);--modal-leave-to: translateY(-38%)}.sub-modal.position-left{--modal-enter-from: translateX(-30%);--modal-leave-to: translateX(-30%)}.sub-modal.position-right{--modal-enter-from: translateX(30%);--modal-leave-to: translateX(30%)}.sub-modal.position-bottom{--modal-enter-from: translateY(30%);--modal-leave-to: translateY(30%)}.sub-modal.modal-fade-enter{animation:tcModalFadeIn .3s ease-out}.sub-modal.modal-fade-leave{animation:tcModalFadeOut .3s ease-out}@keyframes tcModalFadeIn{0%{opacity:0;transform:var(--modal-enter-from)}to{opacity:1;transform:translate(0)}}@keyframes tcModalFadeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:var(--modal-leave-to)}}@media(prefers-reduced-motion:reduce){.sub-modal.modal-fade-enter,.sub-modal.modal-fade-leave{animation:none}}.tc-modal{position:relative;background-color:var(--c-neutral-50);border:1px solid var(--c-neutral-200);padding:12px;border-radius:8px;margin:auto;width:100%;transition:max-width .3s ease-out}@media(prefers-reduced-motion:reduce){.tc-modal{transition:none}}.sub-modal.is-sticky{padding:0}.sub-modal.is-sticky>.tc-modal{border-radius:0}.sub-modal.is-sticky.position-left>.tc-modal{margin:0 auto 0 0}.sub-modal.is-sticky.position-right>.tc-modal{margin:0 0 0 auto}.sub-modal.is-sticky.position-bottom>.tc-modal{margin:auto 0 0}.sub-modal.is-sticky.position-center>.tc-modal,.sub-modal.is-sticky.position-bottom>.tc-modal{max-width:100%!important;width:100%!important}.tc-modal-shadow{-webkit-box-shadow:2px 2px 10px 0px rgba(0,0,0,.368627451);box-shadow:2px 2px 10px #0000005e}.tc-btn-x{min-height:25px!important;min-width:25px!important;height:25px;width:25px;margin-top:8px}.area-top-actions{position:absolute;top:2px;right:5px;z-index:1}.area-top-actions.tc-ui-modal-colorless button.tc-btn-action-close-ui-modal i{color:var(--c-neutral-600)!important}.area-top-actions button.tc-btn-action-close-ui-modal{cursor:pointer;background-color:transparent;border:none;font-size:15px;padding:5px 7px}.area-top-actions button.tc-btn-action-close-ui-modal i{font-size:17px;color:#fff;transition:all .25s;opacity:.7}.area-top-actions button.tc-btn-action-close-ui-modal i:hover{opacity:1!important}h4{font-size:16px;margin:5px 30px 10px 0;font-weight:700}.no-use-header i{color:var(--c-neutral-500)!important}.tcloud-ui-modal-sticky{height:100vh;overflow:hidden}\n"] }]
3759
3780
  }], ctorParameters: () => [{ type: TCloudUiLayoutService }, { type: TcloudModalService }], propDecorators: { confirm: [{
3760
3781
  type: Input
3761
3782
  }], confirmText: [{
@@ -7561,11 +7582,158 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
7561
7582
  type: Input
7562
7583
  }] } });
7563
7584
 
7585
+ /**
7586
+ * Wrapper simples de localStorage/sessionStorage em texto plano, compartilhado
7587
+ * pelo núcleo de autenticação. Portado do `storage.service.ts` do front-tcloud.
7588
+ *
7589
+ * Mantém a detecção de dados legados cifrados (prefixo OpenSSL "Salted__" em
7590
+ * base64) apenas para descartá-los — a cifragem AES foi removida.
7591
+ */
7592
+ class TCloudUiStorageService {
7593
+ constructor() {
7594
+ this.legacyEncryptedPrefix = 'U2FsdGVkX1';
7595
+ }
7596
+ /**
7597
+ * Lê o valor em texto plano. Se encontrar um dado legado cifrado, descarta-o
7598
+ * e retorna null, para o consumidor tratar como ausente (ex.: re-login).
7599
+ */
7600
+ read(storage, key) {
7601
+ const data = storage.getItem(key);
7602
+ if (!data) {
7603
+ return null;
7604
+ }
7605
+ if (data.startsWith(this.legacyEncryptedPrefix)) {
7606
+ storage.removeItem(key);
7607
+ return null;
7608
+ }
7609
+ return data;
7610
+ }
7611
+ setLocalStorage(key, data) {
7612
+ localStorage.setItem(key, data);
7613
+ }
7614
+ getLocalStorage(key) {
7615
+ return this.read(localStorage, key);
7616
+ }
7617
+ removeLocalStorage(key) {
7618
+ localStorage.removeItem(key);
7619
+ }
7620
+ setSessionStorage(key, data) {
7621
+ sessionStorage.setItem(key, data);
7622
+ }
7623
+ getSessionStorage(key) {
7624
+ return this.read(sessionStorage, key);
7625
+ }
7626
+ removeSessionStorage(key) {
7627
+ sessionStorage.removeItem(key);
7628
+ }
7629
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
7630
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiStorageService, providedIn: 'root' }); }
7631
+ }
7632
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiStorageService, decorators: [{
7633
+ type: Injectable,
7634
+ args: [{
7635
+ providedIn: 'root'
7636
+ }]
7637
+ }] });
7638
+
7639
+ /**
7640
+ * Núcleo de gestão da sessão do usuário, compartilhado entre os apps.
7641
+ * Portado do subset de autenticação do `user.service.ts` do front-tcloud —
7642
+ * sem as regras de negócio (billing/tss/topologias/alertify/controllers).
7643
+ */
7644
+ class TCloudUiUserService {
7645
+ constructor() {
7646
+ this.http = inject(HttpClient);
7647
+ this.storageService = inject(TCloudUiStorageService);
7648
+ this.config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
7649
+ }
7650
+ get localStorageName() { return this.config.localStorageName; }
7651
+ get sessionStorageName() { return this.config.sessionStorageName; }
7652
+ /** Retorna o usuário logado do localStorage (ou null se ausente). */
7653
+ getUser() {
7654
+ const raw = this.storageService.getLocalStorage(this.localStorageName);
7655
+ return raw ? JSON.parse(raw) : null;
7656
+ }
7657
+ /** Retorna o base64 do email do usuário logado. */
7658
+ getUserHash() {
7659
+ const email = this.getUser()?.user?.email ?? '';
7660
+ return btoa(email);
7661
+ }
7662
+ /** Guarda o usuário logado no localStorage, carimbando o timestamp. */
7663
+ storeUser(user) {
7664
+ user.timestamp = new Date();
7665
+ this.storageService.setLocalStorage(this.localStorageName, JSON.stringify(user));
7666
+ }
7667
+ /** Retorna informações do ambiente da aba atual (sessionStorage). */
7668
+ getCurrentEnv() {
7669
+ const env = this.storageService.getSessionStorage(this.sessionStorageName);
7670
+ return env ? JSON.parse(env) : {};
7671
+ }
7672
+ /** Guarda informações do ambiente da aba atual (sessionStorage). */
7673
+ setCurrentEnv(env) {
7674
+ this.storageService.setSessionStorage(this.sessionStorageName, JSON.stringify(env));
7675
+ }
7676
+ /** Busca as informações do usuário na API (`/user/info?version=N`). */
7677
+ async asyncInfo() {
7678
+ const env = this.getCurrentEnv();
7679
+ const version = this.config.userInfoVersion;
7680
+ let url = `${this.config.host}/user/info?version=${version}`;
7681
+ if (env?.currentCloudID?.t_code && env?.currentCloudID?.cloud_id) {
7682
+ url += `&t_code=${env.currentCloudID.t_code}&cloud_id=${env.currentCloudID.cloud_id}`;
7683
+ }
7684
+ return await firstValueFrom(this.http.get(url));
7685
+ }
7686
+ /**
7687
+ * Hidrata o perfil básico do usuário logado com os dados de `/user/info`.
7688
+ * Versão enxuta (apenas campos de identidade/perfil) para uso compartilhado.
7689
+ * @returns `true` se hidratou com sucesso; `false` se não há usuário em sessão.
7690
+ */
7691
+ async getInfo() {
7692
+ const currentUser = this.getUser();
7693
+ if (!currentUser) {
7694
+ return false;
7695
+ }
7696
+ const info = await this.asyncInfo();
7697
+ currentUser.user.firstName = info?.given_name;
7698
+ currentUser.user.lastName = info?.middle_name;
7699
+ currentUser.user.fullName = `${info?.given_name ?? ''} ${info?.middle_name ?? ''}`.trim();
7700
+ currentUser.user.email = info?.email;
7701
+ currentUser.user.profile = info?.profile;
7702
+ currentUser.user.type_home = info?.type_home?.toLowerCase() ?? 'default';
7703
+ currentUser.user.user_role = info?.type_home ?? 'default';
7704
+ if (info?.url_logout) {
7705
+ currentUser.logoutUrl = info.url_logout;
7706
+ }
7707
+ this.storeUser(currentUser);
7708
+ // Persiste no ambiente da aba os dados de acesso vindos do login. É o que as
7709
+ // diretivas `*ngTCCheckAccess` / `*ngTCFeatureFlags` consomem via
7710
+ // `getCurrentEnv().ui` e `getCurrentEnv().feature_flags`.
7711
+ const currentEnv = this.getCurrentEnv();
7712
+ currentEnv.ui = info?.ui;
7713
+ currentEnv.features = info?.features;
7714
+ currentEnv.feature_flags = info?.feature_flags ?? [];
7715
+ this.setCurrentEnv(currentEnv);
7716
+ return true;
7717
+ }
7718
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiUserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
7719
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiUserService, providedIn: 'root' }); }
7720
+ }
7721
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiUserService, decorators: [{
7722
+ type: Injectable,
7723
+ args: [{
7724
+ providedIn: 'root'
7725
+ }]
7726
+ }] });
7727
+
7564
7728
  class TCloudUiCheckAccessService {
7565
- constructor(_UserService) {
7729
+ constructor(_UserService, _sharedUserService) {
7566
7730
  this._UserService = _UserService;
7731
+ this._sharedUserService = _sharedUserService;
7567
7732
  this.userService = {};
7568
- this.userService = this._UserService;
7733
+ // Prioriza o user service legado do app (token string 'UserService'); se o app
7734
+ // não fornecer um, usa o núcleo de auth compartilhado da própria lib. Assim as
7735
+ // diretivas de acesso funcionam out-of-the-box quando a app usa a auth da lib.
7736
+ this.userService = this._UserService ?? this._sharedUserService;
7569
7737
  }
7570
7738
  check(checkAccess) {
7571
7739
  const temp_user = this.getImpersonalizeUserInfo();
@@ -7714,7 +7882,7 @@ class TCloudUiCheckAccessService {
7714
7882
  removeLocalStorage() {
7715
7883
  localStorage.removeItem('temp_user_info');
7716
7884
  }
7717
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, deps: [{ token: 'UserService', optional: true }], target: i0.ɵɵFactoryTarget.Injectable }); }
7885
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, deps: [{ token: 'UserService', optional: true }, { token: TCloudUiUserService }], target: i0.ɵɵFactoryTarget.Injectable }); }
7718
7886
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, providedIn: 'root' }); }
7719
7887
  }
7720
7888
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiCheckAccessService, decorators: [{
@@ -7727,7 +7895,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
7727
7895
  }, {
7728
7896
  type: Inject,
7729
7897
  args: ['UserService']
7730
- }] }] });
7898
+ }] }, { type: TCloudUiUserService }] });
7731
7899
 
7732
7900
  class TCloudUiCheckAccessDirective {
7733
7901
  set TCCheckAccess(checkAccess) {
@@ -10644,9 +10812,6 @@ class TCloudUiMarkReadmeComponent {
10644
10812
  this.open = false;
10645
10813
  this._pathName = '';
10646
10814
  this._description = '';
10647
- // Permite injetar o Markdown diretamente, sem buscar um arquivo via pathName.
10648
- // Quando content estiver preenchido, ele tem prioridade e o pathName e ignorado.
10649
- this._content = '';
10650
10815
  }
10651
10816
  ngAfterViewInit() {
10652
10817
  // Configurar highlight.js quando o componente for inicializado
@@ -10672,25 +10837,7 @@ class TCloudUiMarkReadmeComponent {
10672
10837
  get description() {
10673
10838
  return this._description;
10674
10839
  }
10675
- set content(v) {
10676
- this._content = v ?? '';
10677
- if (this._content !== '') {
10678
- this.changelogContent = this._content;
10679
- this.loading = false;
10680
- this.message = '';
10681
- }
10682
- }
10683
- get content() {
10684
- return this._content;
10685
- }
10686
10840
  loadChangelog() {
10687
- // content tem prioridade sobre pathName; sem pathName nao ha o que buscar.
10688
- if (this._content !== '') {
10689
- return;
10690
- }
10691
- if (this._pathName === '') {
10692
- return;
10693
- }
10694
10841
  this.message = '';
10695
10842
  this.loading = true;
10696
10843
  this.http.get(`${this.pathName}`, { responseType: 'text' }).subscribe({
@@ -10738,7 +10885,7 @@ class TCloudUiMarkReadmeComponent {
10738
10885
  });
10739
10886
  }
10740
10887
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiMarkReadmeComponent, deps: [{ token: i1$3.HttpClient }], target: i0.ɵɵFactoryTarget.Component }); }
10741
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TCloudUiMarkReadmeComponent, isStandalone: true, selector: "tcloud-ui-mark-readme", inputs: { useAccordion: "useAccordion", open: "open", pathName: "pathName", description: "description", content: "content" }, ngImport: i0, template: "@if (message) {\n <div [innerHTML]=\"message\"></div>\n}\n\n@if (useAccordion) {\n <br><div><hr></div><br>\n <tcloud-ui-accordion [show]=\"open\">\n <tcloud-ui-accordion-title>\n {{ description }}\n </tcloud-ui-accordion-title>\n <tcloud-ui-accordion-body>\n <div>\n <tcloud-ui-loading [loading]=\"loading\" [mode]=\"'inline'\"></tcloud-ui-loading>\n <markdown\n [id]=\"ID\"\n [data]=\"changelogContent\"\n (ready)=\"onMarkdownReady()\">\n </markdown>\n </div>\n </tcloud-ui-accordion-body>\n </tcloud-ui-accordion>\n}\n\n@if (!useAccordion) {\n <div>\n @if (description) {\n <h3 [innerHTML]=\"description\"></h3>\n }\n <tcloud-ui-loading [loading]=\"loading\" [mode]=\"'inline'\"></tcloud-ui-loading>\n <markdown\n [id]=\"ID\"\n [data]=\"changelogContent\"\n (ready)=\"onMarkdownReady()\">\n </markdown>\n </div>\n}\n\n\n", styles: [".hljs{color:var(--c-neutral-700);background:var(--c-neutral-100)}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#e45649}.hljs-built_in,.hljs-builtin-name,.hljs-class,.hljs-title{color:#c18401}.hljs-comment,.hljs-quote,.hljs-deletion{color:#a0a1a7;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-section,.hljs-link,.hljs-emphasis{color:#a626a4}.hljs-addition,.hljs-string,.hljs-symbol{color:#50a14f}.hljs-code{color:#383a42}.hljs-meta-string{color:#50a14f}.hljs-regexp{color:#0184bc}.hljs-name{color:#4078f2}.hljs-type,.hljs-attr-name,.hljs-selector-pseudo{color:#e45649}.hljs-subst{color:var(--c-neutral-700)}.hljs-tag{color:#e45649}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:var(--c-neutral-700)}.hljs-template-tag,.hljs-template-variable{color:#a626a4}body.tc-dark .hljs-attr,body.tc-dark .hljs-attribute,body.tc-dark .hljs-literal,body.tc-dark .hljs-meta,body.tc-dark .hljs-number,body.tc-dark .hljs-operator,body.tc-dark .hljs-variable,body.tc-dark .hljs-selector-attr,body.tc-dark .hljs-selector-class,body.tc-dark .hljs-selector-id,body.tc-dark .hljs-type,body.tc-dark .hljs-attr-name,body.tc-dark .hljs-selector-pseudo,body.tc-dark .hljs-tag{color:#e06c75}body.tc-dark .hljs-built_in,body.tc-dark .hljs-builtin-name,body.tc-dark .hljs-class,body.tc-dark .hljs-title{color:#e6c07b}body.tc-dark .hljs-comment,body.tc-dark .hljs-quote,body.tc-dark .hljs-deletion{color:#7f848e}body.tc-dark .hljs-keyword,body.tc-dark .hljs-selector-tag,body.tc-dark .hljs-section,body.tc-dark .hljs-link,body.tc-dark .hljs-emphasis,body.tc-dark .hljs-template-tag,body.tc-dark .hljs-template-variable{color:#c678dd}body.tc-dark .hljs-addition,body.tc-dark .hljs-string,body.tc-dark .hljs-symbol,body.tc-dark .hljs-meta-string{color:#98c379}body.tc-dark .hljs-regexp{color:#56b6c2}body.tc-dark .hljs-name{color:#61afef}#mark-readme-content{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;line-height:1.6;color:var(--c-neutral-700)}#mark-readme-content h1,#mark-readme-content h2,#mark-readme-content h3,#mark-readme-content h4,#mark-readme-content h5,#mark-readme-content h6{margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.25}#mark-readme-content h1{font-size:2em;border-bottom:1px solid var(--c-neutral-200);padding-bottom:.3em}#mark-readme-content h2{font-size:1.5em;border-bottom:1px solid var(--c-neutral-200);padding-bottom:.3em}#mark-readme-content h3{font-size:1.25em}#mark-readme-content p{margin:.5em 0}#mark-readme-content ul,#mark-readme-content ol{padding-left:2em;margin:.5em 0}#mark-readme-content ul li,#mark-readme-content ol li{margin:.25em 0}#mark-readme-content a{color:var(--c-primary-500);text-decoration:none}#mark-readme-content a:hover{text-decoration:underline}#mark-readme-content code{background-color:var(--c-neutral-100);border-radius:3px;padding:.2em .4em;font-family:Courier New,Courier,monospace;font-size:.9em;color:var(--c-neutral-700);white-space:normal}#mark-readme-content pre{background-color:var(--c-neutral-100)!important;border:1px solid var(--c-neutral-300)!important;border-radius:6px!important;overflow:auto!important;padding:16px!important;margin:1em 0!important;font-family:Courier New,Courier,monospace!important;font-size:.9em!important;line-height:1.45!important;white-space:pre-wrap!important;word-wrap:break-word!important;overflow-wrap:break-word!important;display:block!important}#mark-readme-content pre code{background-color:transparent!important;padding:0!important;margin:0!important;border-radius:0!important;color:inherit!important;display:block!important;white-space:pre-wrap!important;word-break:break-word!important;word-spacing:normal!important;overflow-wrap:break-word!important;tab-size:4!important;-moz-tab-size:4!important;border:none!important;font-family:Courier New,Courier,monospace!important;font-size:.9em!important;line-height:1.45!important}#mark-readme-content pre code.language-typescript,#mark-readme-content pre code.language-html,#mark-readme-content pre code.language-css,#mark-readme-content pre code.language-scss,#mark-readme-content pre code.language-javascript,#mark-readme-content pre code.language-json,#mark-readme-content pre code.language-bash{color:inherit!important}#mark-readme-content table{border-collapse:collapse;width:100%;margin:1em 0}#mark-readme-content table thead{background-color:var(--c-neutral-100);font-weight:600}#mark-readme-content table th,#mark-readme-content table td{border:1px solid var(--c-neutral-300);padding:12px;text-align:left}#mark-readme-content table tr:nth-child(odd){background-color:var(--c-neutral-50)}#mark-readme-content table tr:nth-child(2n){background-color:var(--c-neutral-100)}#mark-readme-content table tr:hover{background-color:var(--c-neutral-200)}#mark-readme-content blockquote{border-left:4px solid var(--c-neutral-300);color:var(--c-neutral-500);padding:.5em 1em;margin:1em 0}#mark-readme-content hr{border:none;border-top:2px solid var(--c-neutral-200);margin:2em 0}#mark-readme-content img{max-width:100%;height:auto}.p-relative{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: MarkdownModule }, { kind: "component", type: i2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: TCloudUiAccordionComponent, selector: "tcloud-ui-accordion", inputs: ["disabled", "show", "loading"], outputs: ["onAction"] }, { kind: "component", type: TCloudUiAccordionTitleComponent, selector: "tcloud-ui-accordion-title" }, { kind: "component", type: TCloudUiAccordionBodyComponent, selector: "tcloud-ui-accordion-body" }, { kind: "component", type: TCloudUiLoadingComponent, selector: "tcloud-ui-loading", inputs: ["gif", "mode", "onlyInline", "onlyIcon", "full", "loading"] }], encapsulation: i0.ViewEncapsulation.None }); }
10888
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.17", type: TCloudUiMarkReadmeComponent, isStandalone: true, selector: "tcloud-ui-mark-readme", inputs: { useAccordion: "useAccordion", open: "open", pathName: "pathName", description: "description" }, ngImport: i0, template: "@if (message) {\n <div [innerHTML]=\"message\"></div>\n}\n\n@if (useAccordion) {\n <br><div><hr></div><br>\n <tcloud-ui-accordion [show]=\"open\">\n <tcloud-ui-accordion-title>\n {{ description }}\n </tcloud-ui-accordion-title>\n <tcloud-ui-accordion-body>\n <div>\n <tcloud-ui-loading [loading]=\"loading\" [mode]=\"'inline'\"></tcloud-ui-loading>\n <markdown\n [id]=\"ID\"\n [data]=\"changelogContent\"\n (ready)=\"onMarkdownReady()\">\n </markdown>\n </div>\n </tcloud-ui-accordion-body>\n </tcloud-ui-accordion>\n}\n\n@if (!useAccordion) {\n <div>\n @if (description) {\n <h3 [innerHTML]=\"description\"></h3>\n }\n <tcloud-ui-loading [loading]=\"loading\" [mode]=\"'inline'\"></tcloud-ui-loading>\n <markdown\n [id]=\"ID\"\n [data]=\"changelogContent\"\n (ready)=\"onMarkdownReady()\">\n </markdown>\n </div>\n}\n\n\n", styles: [".hljs{color:var(--c-neutral-700);background:var(--c-neutral-100)}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-variable,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id{color:#e45649}.hljs-built_in,.hljs-builtin-name,.hljs-class,.hljs-title{color:#c18401}.hljs-comment,.hljs-quote,.hljs-deletion{color:#a0a1a7;font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-section,.hljs-link,.hljs-emphasis{color:#a626a4}.hljs-addition,.hljs-string,.hljs-symbol{color:#50a14f}.hljs-code{color:#383a42}.hljs-meta-string{color:#50a14f}.hljs-regexp{color:#0184bc}.hljs-name{color:#4078f2}.hljs-type,.hljs-attr-name,.hljs-selector-pseudo{color:#e45649}.hljs-subst{color:var(--c-neutral-700)}.hljs-tag{color:#e45649}.hljs-tag .hljs-name,.hljs-tag .hljs-attr{color:var(--c-neutral-700)}.hljs-template-tag,.hljs-template-variable{color:#a626a4}body.tc-dark .hljs-attr,body.tc-dark .hljs-attribute,body.tc-dark .hljs-literal,body.tc-dark .hljs-meta,body.tc-dark .hljs-number,body.tc-dark .hljs-operator,body.tc-dark .hljs-variable,body.tc-dark .hljs-selector-attr,body.tc-dark .hljs-selector-class,body.tc-dark .hljs-selector-id,body.tc-dark .hljs-type,body.tc-dark .hljs-attr-name,body.tc-dark .hljs-selector-pseudo,body.tc-dark .hljs-tag{color:#e06c75}body.tc-dark .hljs-built_in,body.tc-dark .hljs-builtin-name,body.tc-dark .hljs-class,body.tc-dark .hljs-title{color:#e6c07b}body.tc-dark .hljs-comment,body.tc-dark .hljs-quote,body.tc-dark .hljs-deletion{color:#7f848e}body.tc-dark .hljs-keyword,body.tc-dark .hljs-selector-tag,body.tc-dark .hljs-section,body.tc-dark .hljs-link,body.tc-dark .hljs-emphasis,body.tc-dark .hljs-template-tag,body.tc-dark .hljs-template-variable{color:#c678dd}body.tc-dark .hljs-addition,body.tc-dark .hljs-string,body.tc-dark .hljs-symbol,body.tc-dark .hljs-meta-string{color:#98c379}body.tc-dark .hljs-regexp{color:#56b6c2}body.tc-dark .hljs-name{color:#61afef}#mark-readme-content{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;line-height:1.6;color:var(--c-neutral-700)}#mark-readme-content h1,#mark-readme-content h2,#mark-readme-content h3,#mark-readme-content h4,#mark-readme-content h5,#mark-readme-content h6{margin-top:1.5em;margin-bottom:.5em;font-weight:600;line-height:1.25}#mark-readme-content h1{font-size:2em;border-bottom:1px solid var(--c-neutral-200);padding-bottom:.3em}#mark-readme-content h2{font-size:1.5em;border-bottom:1px solid var(--c-neutral-200);padding-bottom:.3em}#mark-readme-content h3{font-size:1.25em}#mark-readme-content p{margin:.5em 0}#mark-readme-content ul,#mark-readme-content ol{padding-left:2em;margin:.5em 0}#mark-readme-content ul li,#mark-readme-content ol li{margin:.25em 0}#mark-readme-content a{color:var(--c-primary-500);text-decoration:none}#mark-readme-content a:hover{text-decoration:underline}#mark-readme-content code{background-color:var(--c-neutral-100);border-radius:3px;padding:.2em .4em;font-family:Courier New,Courier,monospace;font-size:.9em;color:var(--c-neutral-700);white-space:normal}#mark-readme-content pre{background-color:var(--c-neutral-100)!important;border:1px solid var(--c-neutral-300)!important;border-radius:6px!important;overflow:auto!important;padding:16px!important;margin:1em 0!important;font-family:Courier New,Courier,monospace!important;font-size:.9em!important;line-height:1.45!important;white-space:pre-wrap!important;word-wrap:break-word!important;overflow-wrap:break-word!important;display:block!important}#mark-readme-content pre code{background-color:transparent!important;padding:0!important;margin:0!important;border-radius:0!important;color:inherit!important;display:block!important;white-space:pre-wrap!important;word-break:break-word!important;word-spacing:normal!important;overflow-wrap:break-word!important;tab-size:4!important;-moz-tab-size:4!important;border:none!important;font-family:Courier New,Courier,monospace!important;font-size:.9em!important;line-height:1.45!important}#mark-readme-content pre code.language-typescript,#mark-readme-content pre code.language-html,#mark-readme-content pre code.language-css,#mark-readme-content pre code.language-scss,#mark-readme-content pre code.language-javascript,#mark-readme-content pre code.language-json,#mark-readme-content pre code.language-bash{color:inherit!important}#mark-readme-content table{border-collapse:collapse;width:100%;margin:1em 0}#mark-readme-content table thead{background-color:var(--c-neutral-100);font-weight:600}#mark-readme-content table th,#mark-readme-content table td{border:1px solid var(--c-neutral-300);padding:12px;text-align:left}#mark-readme-content table tr:nth-child(odd){background-color:var(--c-neutral-50)}#mark-readme-content table tr:nth-child(2n){background-color:var(--c-neutral-100)}#mark-readme-content table tr:hover{background-color:var(--c-neutral-200)}#mark-readme-content blockquote{border-left:4px solid var(--c-neutral-300);color:var(--c-neutral-500);padding:.5em 1em;margin:1em 0}#mark-readme-content hr{border:none;border-top:2px solid var(--c-neutral-200);margin:2em 0}#mark-readme-content img{max-width:100%;height:auto}.p-relative{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: MarkdownModule }, { kind: "component", type: i2.MarkdownComponent, selector: "markdown, [markdown]", inputs: ["data", "src", "disableSanitizer", "inline", "clipboard", "clipboardButtonComponent", "clipboardButtonTemplate", "emoji", "katex", "katexOptions", "mermaid", "mermaidOptions", "lineHighlight", "line", "lineOffset", "lineNumbers", "start", "commandLine", "filterOutput", "host", "prompt", "output", "user"], outputs: ["error", "load", "ready"] }, { kind: "component", type: TCloudUiAccordionComponent, selector: "tcloud-ui-accordion", inputs: ["disabled", "show", "loading"], outputs: ["onAction"] }, { kind: "component", type: TCloudUiAccordionTitleComponent, selector: "tcloud-ui-accordion-title" }, { kind: "component", type: TCloudUiAccordionBodyComponent, selector: "tcloud-ui-accordion-body" }, { kind: "component", type: TCloudUiLoadingComponent, selector: "tcloud-ui-loading", inputs: ["gif", "mode", "onlyInline", "onlyIcon", "full", "loading"] }], encapsulation: i0.ViewEncapsulation.None }); }
10742
10889
  }
10743
10890
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiMarkReadmeComponent, decorators: [{
10744
10891
  type: Component,
@@ -10757,8 +10904,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
10757
10904
  type: Input
10758
10905
  }], description: [{
10759
10906
  type: Input
10760
- }], content: [{
10761
- type: Input
10762
10907
  }] } });
10763
10908
 
10764
10909
  const COMPONENTS = [
@@ -10881,6 +11026,10 @@ class TCloudUiModule {
10881
11026
  const providers = [
10882
11027
  // Configuração principal
10883
11028
  { provide: TCLOUD_UI_CONFIG, useValue: config?.data ?? {} },
11029
+ // Configuração do núcleo de autenticação (URLs/chaves vindas do app consumidor).
11030
+ // Obs.: em apps NgModule, registre o interceptor com
11031
+ // `provideHttpClient(withInterceptors([tcloudUiJwtInterceptor]))` nos providers do app.
11032
+ { provide: TCLOUD_UI_AUTH_CONFIG, useValue: config?.auth ?? {} },
10884
11033
  DatePipe,
10885
11034
  StatusInfoPipe
10886
11035
  ];
@@ -11165,6 +11314,151 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
11165
11314
  }]
11166
11315
  }] });
11167
11316
 
11317
+ /**
11318
+ * Modelos do núcleo de autenticação compartilhado.
11319
+ * Contém apenas os campos usados pelo fluxo de auth/sessão — regras de negócio
11320
+ * (billing, tss, topologias, etc.) ficam fora da lib.
11321
+ */
11322
+
11323
+ /**
11324
+ * Núcleo de autenticação compartilhado: login/token/refresh/logout e checagem de sessão.
11325
+ * Portado do `authentication.service.ts` do front-tcloud, desacoplado de analytics/genesys
11326
+ * e lendo as URLs via `TCLOUD_UI_AUTH_CONFIG` (fornecido pelo app consumidor).
11327
+ */
11328
+ class TCloudUiAuthenticationService {
11329
+ constructor() {
11330
+ this.http = inject(HttpClient);
11331
+ this.userService = inject(TCloudUiUserService);
11332
+ this.storageService = inject(TCloudUiStorageService);
11333
+ this.config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
11334
+ /** Emite quando o token é renovado (consumidores podem reagir, ex.: Genesys). */
11335
+ this.tokenRefreshed = new BehaviorSubject(false);
11336
+ }
11337
+ /** Verifica se o usuário está logado (possui token em sessão). */
11338
+ isLoggedIn() {
11339
+ return !!this.userService.getUser()?.user?.token;
11340
+ }
11341
+ /** Verifica se há dados de usuário carregados. */
11342
+ hasUserData() {
11343
+ return !!this.userService.getUser();
11344
+ }
11345
+ /** Retorna o token de autenticação do usuário logado. */
11346
+ getAuthToken() {
11347
+ return this.userService.getUser()?.user?.token ?? '';
11348
+ }
11349
+ /** Guarda o novo par de tokens na sessão. */
11350
+ storeNewToken(authToken, refreshToken) {
11351
+ const storageUser = this.userService.getUser();
11352
+ if (!storageUser) {
11353
+ return;
11354
+ }
11355
+ storageUser.user.token = authToken;
11356
+ storageUser.user.refresh_token = refreshToken;
11357
+ this.userService.storeUser(storageUser);
11358
+ this.tokenRefreshed.next(true);
11359
+ }
11360
+ /** Solicita token de autenticação (troca do código Cognito). */
11361
+ requestToken(queryParams) {
11362
+ const url = `${this.config.host}/cognito/authorization`;
11363
+ return this.http.get(url, { params: queryParams });
11364
+ }
11365
+ /** Solicita novo token de segurança quando o atual expira; atualiza a sessão. */
11366
+ refreshToken() {
11367
+ const storedUser = this.userService.getUser();
11368
+ const refreshAuth = storedUser?.user?.refresh_token ?? '';
11369
+ const app = this.config.appToken ?? '';
11370
+ const url = `${this.config.host}/cognito/refresh?app=${app}`;
11371
+ return this.http.post(url, refreshAuth).pipe(map$1((response) => {
11372
+ this.storeNewToken(response.token, response.refresh_token);
11373
+ return response.token;
11374
+ }));
11375
+ }
11376
+ /**
11377
+ * Realiza logout: registra o signout (best-effort), limpa a sessão e redireciona.
11378
+ * Destino: `logoutUrl` do usuário > `logoutRedirectUrl` da config > `loginUrl`.
11379
+ */
11380
+ logout() {
11381
+ const cleanupAndRedirect = () => {
11382
+ const storedUrl = this.userService.getUser()?.logoutUrl;
11383
+ this.storageService.removeLocalStorage(this.config.localStorageName);
11384
+ this.storageService.removeSessionStorage(this.config.sessionStorageName);
11385
+ const target = storedUrl || this.config.logoutRedirectUrl || this.config.loginUrl;
11386
+ if (target) {
11387
+ window.location.href = target;
11388
+ }
11389
+ };
11390
+ if (this.isLoggedIn()) {
11391
+ const body = { token: this.getAuthToken() };
11392
+ this.http.post(`${this.config.host}/audit/cognito/signout`, body).subscribe({
11393
+ next: () => cleanupAndRedirect(),
11394
+ error: () => cleanupAndRedirect(),
11395
+ });
11396
+ }
11397
+ else {
11398
+ cleanupAndRedirect();
11399
+ }
11400
+ }
11401
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiAuthenticationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
11402
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiAuthenticationService, providedIn: 'root' }); }
11403
+ }
11404
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImport: i0, type: TCloudUiAuthenticationService, decorators: [{
11405
+ type: Injectable,
11406
+ args: [{
11407
+ providedIn: 'root'
11408
+ }]
11409
+ }] });
11410
+
11411
+ /**
11412
+ * Interceptor funcional do núcleo de autenticação.
11413
+ * - Injeta o header `Authorization` em requisições destinadas à API configurada (`host`).
11414
+ * - Em respostas 401, tenta `refreshToken()` e refaz a requisição uma vez; se o refresh
11415
+ * falhar, dispara `logout()`.
11416
+ *
11417
+ * Registre no app consumidor via `withInterceptors([tcloudUiJwtInterceptor])` ou deixe
11418
+ * que `provideTCloudUi()`/`TCloudUiModule.forRoot()` o registrem.
11419
+ */
11420
+ const tcloudUiJwtInterceptor = (req, next) => {
11421
+ const auth = inject(TCloudUiAuthenticationService);
11422
+ const config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
11423
+ // Só anexa o token em chamadas para a própria API, evitando vazar credencial a terceiros.
11424
+ const targetsApi = !!config.host && req.url.startsWith(config.host);
11425
+ const withAuth = (request) => {
11426
+ const token = auth.getAuthToken();
11427
+ if (!targetsApi || !token) {
11428
+ return request;
11429
+ }
11430
+ return request.clone({ setHeaders: { Authorization: token } });
11431
+ };
11432
+ return next(withAuth(req)).pipe(catchError((error) => {
11433
+ if (error instanceof HttpErrorResponse && error.status === 401 && targetsApi) {
11434
+ return auth.refreshToken().pipe(switchMap(() => next(withAuth(req))), catchError((refreshError) => {
11435
+ auth.logout();
11436
+ return throwError(() => refreshError);
11437
+ }));
11438
+ }
11439
+ return throwError(() => error);
11440
+ }));
11441
+ };
11442
+
11443
+ /**
11444
+ * Guard de rota do núcleo de autenticação.
11445
+ * Libera a navegação se o usuário estiver logado; caso contrário redireciona
11446
+ * para `loginUrl` (quando configurado) e bloqueia a rota.
11447
+ *
11448
+ * Uso: `{ path: 'x', canActivate: [tcloudUiAuthGuard], component: ... }`
11449
+ */
11450
+ const tcloudUiAuthGuard = () => {
11451
+ const auth = inject(TCloudUiAuthenticationService);
11452
+ const config = withAuthDefaults(inject(TCLOUD_UI_AUTH_CONFIG, { optional: true }));
11453
+ if (auth.isLoggedIn()) {
11454
+ return true;
11455
+ }
11456
+ if (config.loginUrl) {
11457
+ window.location.href = config.loginUrl;
11458
+ }
11459
+ return false;
11460
+ };
11461
+
11168
11462
  /**
11169
11463
  * Função provider para configurar o TCloud UI em aplicações standalone do Angular.
11170
11464
  * Use esta função no `main.ts` ou em `app.config.ts` com `bootstrapApplication`.
@@ -11198,6 +11492,8 @@ function provideTCloudUi(config) {
11198
11492
  const providers = [
11199
11493
  // Configuração principal
11200
11494
  { provide: TCLOUD_UI_CONFIG, useValue: config?.data ?? {} },
11495
+ // Configuração do núcleo de autenticação (URLs/chaves vindas do app consumidor)
11496
+ { provide: TCLOUD_UI_AUTH_CONFIG, useValue: config?.auth ?? {} },
11201
11497
  // Pipes necessários para os serviços
11202
11498
  DatePipe,
11203
11499
  StatusInfoPipe
@@ -11216,7 +11512,7 @@ function provideTCloudUi(config) {
11216
11512
  providers.push({ provide: TCLOUD_UI_VIEWPORT_SERVICE, useClass: config.services.viewportService });
11217
11513
  }
11218
11514
  return makeEnvironmentProviders([
11219
- provideHttpClient(withInterceptorsFromDi()),
11515
+ provideHttpClient(withInterceptorsFromDi(), withInterceptors([tcloudUiJwtInterceptor])),
11220
11516
  provideMarkdown(),
11221
11517
  ...providers
11222
11518
  ]);
@@ -13165,5 +13461,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.17", ngImpo
13165
13461
  * Generated bundle index. Do not edit.
13166
13462
  */
13167
13463
 
13168
- export { AcceptedFileType, BytesPipe, CNPJPipe, CPFPipe, CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR$2 as CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR, DateBRPipe, DropdownGroupedSize, DropdownMultiSize$1 as DropdownMultiSize, DropdownSize$1 as DropdownSize, MonthNamePipe, MultiLevelDropdownSize$1 as MultiLevelDropdownSize, ProductActionPipe, ProgressStatusBarGradientStatus$1 as ProgressStatusBarGradientStatus, RespectivePipe, StatusInfoPipe, TCCondition, TCFiltersType, TCLOUD_UI_CONFIG, TCLOUD_UI_LAYOUT_SERVICE, TCLOUD_UI_LOCALE_SERVICE, TCLOUD_UI_USER_SERVICE, TCLOUD_UI_VIEWPORT_SERVICE, TCloudUiAccordionBodyComponent, TCloudUiAccordionComponent, TCloudUiAccordionTitleComponent, TCloudUiAlertBannerComponent, TCloudUiAlignDirective, TCloudUiBreadcrumbComponent, TCloudUiBreadcrumbService, TCloudUiButtonDirective, TCloudUiCalendarComponent, TCloudUiCardAccordionComponent, TCloudUiCardComponent, TCloudUiCardTitleComponent, TCloudUiCarouselComponent, TCloudUiCheckAccessDirective, TCloudUiCheckAccessService, TCloudUiCheckboxDirective, TCloudUiChoiceIssuesComponent, TCloudUiContainerColComponent, TCloudUiContainerComponent, TCloudUiContainerContentComponent, TCloudUiCubesComponent, TCloudUiCurrencyDirective, TCloudUiDataListComponent, TCloudUiDataListOptionComponent, TCloudUiDatepickerComponent, TCloudUiDatepickerTimeComponent, TCloudUiDialogComponent, TCloudUiDialogEventsEnum, TCloudUiDialogHostComponent, TCloudUiDialogModel, TCloudUiDialogService, TCloudUiDialogStatusEnum, TCloudUiDialogTextConfirmationEnum, TCloudUiDigitOnlyDirective, TCloudUiDropdownComponent, TCloudUiDropdownMultiComponent, TCloudUiDropdownMultiLevelComponent, TCloudUiEditorComponent, TCloudUiEditorDiffComponent, TCloudUiElCopyDirective, TCloudUiEmptyContentComponent, TCloudUiFaqComponent, TCloudUiFilterBarComponent, TCloudUiFiltersComponent, TCloudUiFooterComponent, TCloudUiFormDirective, TCloudUiHighLightDirective, TCloudUiHoverParentDirective, TCloudUiIconButtonDirective, TCloudUiInputContainerComponent, TCloudUiInputDirective, TCloudUiInputPasswordComponent, TCloudUiInputSearchComponent, TCloudUiIpMaskDirective, TCloudUiLabelTokenComponent, TCloudUiLegendComponent, TCloudUiLineStepCircleComponent, TCloudUiLineStepTitleComponent, TCloudUiLinhaLogoComponent, TCloudUiLoadingComponent, TCloudUiLoadingTransitionsService, TCloudUiMarkReadmeComponent, TCloudUiMessageComponent, TCloudUiModalBodyComponent, TCloudUiModalComponent, TCloudUiModalFooterComponent, TCloudUiModalHeaderComponent, TCloudUiModule, TCloudUiMultiInputComponent, TCloudUiMultiSelectComponent, TCloudUiMultiplesValuesComponent, TCloudUiNavbarComponent, TCloudUiNavbarFooterComponent, TCloudUiNavbarItemComponent, TCloudUiNgCheckAccessDirective, TCloudUiNgFeatureFlagsDirective, TCloudUiNotFoundComponent, TCloudUiNumberStepComponent, TCloudUiPaginationComponent, TCloudUiPaginationPipe, TCloudUiPopoverComponent, TCloudUiProgressBarComponent, TCloudUiProgressStatusBarComponent, TCloudUiRadioDirective, TCloudUiRangeDateComponent, TCloudUiReorderItemsComponent, TCloudUiScrollBoxComponent, TCloudUiSearchBarComponent, TCloudUiSearchInObjectService, TCloudUiSearchInputComponent, TCloudUiSkeletonLoadingComponent, TCloudUiSkeletonLoadingComponentStyle, TCloudUiSlideToggleDirective, TCloudUiSubNavbarComponent, TCloudUiSubNavbarGroupComponent, TCloudUiSubNavbarItemComponent, TCloudUiTabContentComponent, TCloudUiTabGroupComponent, TCloudUiTabHeadComponent, TCloudUiTabItemComponent, TCloudUiTabMenuComponent, TCloudUiTabOptionComponent, TCloudUiTabSubtitleComponent, TCloudUiTabTitleComponent, TCloudUiTableComponent, TCloudUiTagComponent, TCloudUiToastComponent, TCloudUiTooltipDirective, TCloudUiTopNavigationComponent, TCloudUiUploadAreaComponent, TCloudUiWelcomeComponent, TCloudUiWizardStepsComponent, TagColorsEnum, TcRevButtonDirective, TcRevCalendarComponent, TcRevCardAccordionComponent, TcRevCardComponent, TcRevCardTitleComponent, TcRevCheckboxDirective, TcRevComponentsLibModule, TcRevDropdownComponent, TcRevDropdownGroupedComponent, TcRevDropdownMultiComponent, TcRevDropdownMultiLevelComponent, TcRevEmptyContentComponent, TcRevFaqComponent, TcRevIconButtonDirective, TcRevInputContainerComponent, TcRevInputDirective, TcRevLoadingComponent, TcRevMessageComponent, TcRevMultiInputComponent, TcRevPaginationComponent, TcRevProgressStatusBarComponent, TcRevRadioDirective, TcRevSearchInputComponent, TcRevSideDrawerComponent, TcRevSkeletonLoadingComponent, TcRevSkeletonLoadingComponentStyle, TcRevSlideToggleDirective, TcRevSmallLoadingComponent, TcRevSmallLoadingComponentStyle, TcRevSubNavbarComponent, TcRevSubNavbarItemComponent, TcRevTabGroupComponent, TcRevTabItemComponent, TcRevTagComponent, TcRevToastComponent, TcRevTooltipDirective, TcRevWizardStepsComponent, ToTextPipe, TopologyEnvironmentPipe, TopologyProductPipe, TopologyRegionPipe, TopologyStatusPipe, echartBarConfig, isTextEllipsed, provideTCloudUi };
13464
+ export { AcceptedFileType, BytesPipe, CNPJPipe, CPFPipe, CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR$2 as CUSTOM_INPUT_CONTROL_VALUE_ACCESSOR, DateBRPipe, DropdownGroupedSize, DropdownMultiSize$1 as DropdownMultiSize, DropdownSize$1 as DropdownSize, MonthNamePipe, MultiLevelDropdownSize$1 as MultiLevelDropdownSize, ProductActionPipe, ProgressStatusBarGradientStatus$1 as ProgressStatusBarGradientStatus, RespectivePipe, StatusInfoPipe, TCCondition, TCFiltersType, TCLOUD_UI_AUTH_CONFIG, TCLOUD_UI_CONFIG, TCLOUD_UI_LAYOUT_SERVICE, TCLOUD_UI_LOCALE_SERVICE, TCLOUD_UI_USER_SERVICE, TCLOUD_UI_VIEWPORT_SERVICE, TCloudUiAccordionBodyComponent, TCloudUiAccordionComponent, TCloudUiAccordionTitleComponent, TCloudUiAlertBannerComponent, TCloudUiAlignDirective, TCloudUiAuthenticationService, TCloudUiBreadcrumbComponent, TCloudUiBreadcrumbService, TCloudUiButtonDirective, TCloudUiCalendarComponent, TCloudUiCardAccordionComponent, TCloudUiCardComponent, TCloudUiCardTitleComponent, TCloudUiCarouselComponent, TCloudUiCheckAccessDirective, TCloudUiCheckAccessService, TCloudUiCheckboxDirective, TCloudUiChoiceIssuesComponent, TCloudUiContainerColComponent, TCloudUiContainerComponent, TCloudUiContainerContentComponent, TCloudUiCubesComponent, TCloudUiCurrencyDirective, TCloudUiDataListComponent, TCloudUiDataListOptionComponent, TCloudUiDatepickerComponent, TCloudUiDatepickerTimeComponent, TCloudUiDialogComponent, TCloudUiDialogEventsEnum, TCloudUiDialogHostComponent, TCloudUiDialogModel, TCloudUiDialogService, TCloudUiDialogStatusEnum, TCloudUiDialogTextConfirmationEnum, TCloudUiDigitOnlyDirective, TCloudUiDropdownComponent, TCloudUiDropdownMultiComponent, TCloudUiDropdownMultiLevelComponent, TCloudUiEditorComponent, TCloudUiEditorDiffComponent, TCloudUiElCopyDirective, TCloudUiEmptyContentComponent, TCloudUiFaqComponent, TCloudUiFilterBarComponent, TCloudUiFiltersComponent, TCloudUiFooterComponent, TCloudUiFormDirective, TCloudUiHighLightDirective, TCloudUiHoverParentDirective, TCloudUiIconButtonDirective, TCloudUiInputContainerComponent, TCloudUiInputDirective, TCloudUiInputPasswordComponent, TCloudUiInputSearchComponent, TCloudUiIpMaskDirective, TCloudUiLabelTokenComponent, TCloudUiLegendComponent, TCloudUiLineStepCircleComponent, TCloudUiLineStepTitleComponent, TCloudUiLinhaLogoComponent, TCloudUiLoadingComponent, TCloudUiLoadingTransitionsService, TCloudUiMarkReadmeComponent, TCloudUiMessageComponent, TCloudUiModalBodyComponent, TCloudUiModalComponent, TCloudUiModalFooterComponent, TCloudUiModalHeaderComponent, TCloudUiModule, TCloudUiMultiInputComponent, TCloudUiMultiSelectComponent, TCloudUiMultiplesValuesComponent, TCloudUiNavbarComponent, TCloudUiNavbarFooterComponent, TCloudUiNavbarItemComponent, TCloudUiNgCheckAccessDirective, TCloudUiNgFeatureFlagsDirective, TCloudUiNotFoundComponent, TCloudUiNumberStepComponent, TCloudUiPaginationComponent, TCloudUiPaginationPipe, TCloudUiPopoverComponent, TCloudUiProgressBarComponent, TCloudUiProgressStatusBarComponent, TCloudUiRadioDirective, TCloudUiRangeDateComponent, TCloudUiReorderItemsComponent, TCloudUiScrollBoxComponent, TCloudUiSearchBarComponent, TCloudUiSearchInObjectService, TCloudUiSearchInputComponent, TCloudUiSkeletonLoadingComponent, TCloudUiSkeletonLoadingComponentStyle, TCloudUiSlideToggleDirective, TCloudUiStorageService, TCloudUiSubNavbarComponent, TCloudUiSubNavbarGroupComponent, TCloudUiSubNavbarItemComponent, TCloudUiTabContentComponent, TCloudUiTabGroupComponent, TCloudUiTabHeadComponent, TCloudUiTabItemComponent, TCloudUiTabMenuComponent, TCloudUiTabOptionComponent, TCloudUiTabSubtitleComponent, TCloudUiTabTitleComponent, TCloudUiTableComponent, TCloudUiTagComponent, TCloudUiToastComponent, TCloudUiTooltipDirective, TCloudUiTopNavigationComponent, TCloudUiUploadAreaComponent, TCloudUiUserService, TCloudUiWelcomeComponent, TCloudUiWizardStepsComponent, TagColorsEnum, TcRevButtonDirective, TcRevCalendarComponent, TcRevCardAccordionComponent, TcRevCardComponent, TcRevCardTitleComponent, TcRevCheckboxDirective, TcRevComponentsLibModule, TcRevDropdownComponent, TcRevDropdownGroupedComponent, TcRevDropdownMultiComponent, TcRevDropdownMultiLevelComponent, TcRevEmptyContentComponent, TcRevFaqComponent, TcRevIconButtonDirective, TcRevInputContainerComponent, TcRevInputDirective, TcRevLoadingComponent, TcRevMessageComponent, TcRevMultiInputComponent, TcRevPaginationComponent, TcRevProgressStatusBarComponent, TcRevRadioDirective, TcRevSearchInputComponent, TcRevSideDrawerComponent, TcRevSkeletonLoadingComponent, TcRevSkeletonLoadingComponentStyle, TcRevSlideToggleDirective, TcRevSmallLoadingComponent, TcRevSmallLoadingComponentStyle, TcRevSubNavbarComponent, TcRevSubNavbarItemComponent, TcRevTabGroupComponent, TcRevTabItemComponent, TcRevTagComponent, TcRevToastComponent, TcRevTooltipDirective, TcRevWizardStepsComponent, ToTextPipe, TopologyEnvironmentPipe, TopologyProductPipe, TopologyRegionPipe, TopologyStatusPipe, echartBarConfig, isTextEllipsed, provideTCloudUi, tcloudUiAuthGuard, tcloudUiJwtInterceptor, withAuthDefaults };
13169
13465
  //# sourceMappingURL=dev-tcloud-tcloud-ui.mjs.map