uitec-ng-header 1.0.16 → 1.1.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.
- package/README.md +196 -24
- package/esm2020/lib/assistant/components/assistant-action-card/ui-assistant-action-card.component.mjs +102 -0
- package/esm2020/lib/assistant/components/assistant-button/ui-assistant-button.component.mjs +18 -0
- package/esm2020/lib/assistant/components/assistant-composer/ui-assistant-composer.component.mjs +79 -0
- package/esm2020/lib/assistant/components/assistant-layout/ui-assistant-layout.component.mjs +140 -0
- package/esm2020/lib/assistant/components/assistant-messages/ui-assistant-messages.component.mjs +144 -0
- package/esm2020/lib/assistant/components/assistant-panel/ui-assistant-panel.component.mjs +156 -0
- package/esm2020/lib/assistant/components/assistant-text/ui-assistant-text.component.mjs +26 -0
- package/esm2020/lib/assistant/models/uiny-api.models.mjs +12 -0
- package/esm2020/lib/assistant/models/uiny.models.mjs +2 -0
- package/esm2020/lib/assistant/services/ui-assistant.service.mjs +137 -0
- package/esm2020/lib/assistant/services/uiny-api.service.mjs +149 -0
- package/esm2020/lib/assistant/services/uiny-chat.service.mjs +368 -0
- package/esm2020/lib/assistant/services/uiny-session.service.mjs +74 -0
- package/esm2020/lib/assistant/ui-assistant.module.mjs +59 -0
- package/esm2020/lib/assistant/uiny.config.mjs +53 -0
- package/esm2020/lib/assistant/utils/uiny-api.adapter.mjs +154 -0
- package/esm2020/lib/assistant/utils/uiny-contexto.mjs +43 -0
- package/esm2020/lib/assistant/utils/uiny-markdown.mjs +122 -0
- package/esm2020/lib/my-account/my-account.component.mjs +3 -3
- package/esm2020/lib/ui-header.component.mjs +26 -10
- package/esm2020/lib/ui-header.module.mjs +10 -4
- package/esm2020/lib/ui-header.service.mjs +1 -1
- package/esm2020/public-api.mjs +17 -1
- package/fesm2015/uitec-ng-header.mjs +1809 -15
- package/fesm2015/uitec-ng-header.mjs.map +1 -1
- package/fesm2020/uitec-ng-header.mjs +1772 -15
- package/fesm2020/uitec-ng-header.mjs.map +1 -1
- package/lib/assistant/components/assistant-action-card/ui-assistant-action-card.component.d.ts +33 -0
- package/lib/assistant/components/assistant-button/ui-assistant-button.component.d.ts +9 -0
- package/lib/assistant/components/assistant-composer/ui-assistant-composer.component.d.ts +24 -0
- package/lib/assistant/components/assistant-layout/ui-assistant-layout.component.d.ts +51 -0
- package/lib/assistant/components/assistant-messages/ui-assistant-messages.component.d.ts +38 -0
- package/lib/assistant/components/assistant-panel/ui-assistant-panel.component.d.ts +53 -0
- package/lib/assistant/components/assistant-text/ui-assistant-text.component.d.ts +14 -0
- package/lib/assistant/models/uiny-api.models.d.ts +109 -0
- package/lib/assistant/models/uiny.models.d.ts +104 -0
- package/lib/assistant/services/ui-assistant.service.d.ts +55 -0
- package/lib/assistant/services/uiny-api.service.d.ts +38 -0
- package/lib/assistant/services/uiny-chat.service.d.ts +82 -0
- package/lib/assistant/services/uiny-session.service.d.ts +38 -0
- package/lib/assistant/ui-assistant.module.d.ts +19 -0
- package/lib/assistant/uiny.config.d.ts +31 -0
- package/lib/assistant/utils/uiny-api.adapter.d.ts +22 -0
- package/lib/assistant/utils/uiny-contexto.d.ts +7 -0
- package/lib/assistant/utils/uiny-markdown.d.ts +37 -0
- package/lib/ui-header.component.d.ts +10 -4
- package/lib/ui-header.module.d.ts +2 -1
- package/package.json +3 -2
- package/public-api.d.ts +15 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, NgZone, Optional, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { NavigationEnd, Router } from '@angular/router';
|
|
3
|
+
import { Subscription } from 'rxjs';
|
|
4
|
+
import { filter } from 'rxjs/operators';
|
|
5
|
+
import { UiAssistantService } from '../../services/ui-assistant.service';
|
|
6
|
+
import { larguraPainel, UINY_CONFIG, UINY_LADO_A_LADO_PADRAO } from '../../uiny.config';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../../services/ui-assistant.service";
|
|
9
|
+
import * as i2 from "@angular/router";
|
|
10
|
+
import * as i3 from "@angular/common";
|
|
11
|
+
import * as i4 from "../assistant-panel/ui-assistant-panel.component";
|
|
12
|
+
const DURACAO_TRANSICAO_MS = 240;
|
|
13
|
+
/**
|
|
14
|
+
* Contêiner que hospeda a Uiny ao lado da aplicação.
|
|
15
|
+
*
|
|
16
|
+
* Envolve TODO o layout da aplicação (inclusive o header e a sidebar fixos):
|
|
17
|
+
*
|
|
18
|
+
* <ui-assistant-layout (assistantEvent)="...">
|
|
19
|
+
* <div class="page-wrapper">...</div>
|
|
20
|
+
* </ui-assistant-layout>
|
|
21
|
+
*
|
|
22
|
+
* Fechado, não altera nada: a página rola normalmente pela janela.
|
|
23
|
+
* Aberto no desktop, vira uma linha flex [aplicação | painel]: a coluna da aplicação passa
|
|
24
|
+
* a ser o bloco de contenção dos elementos position:fixed (contain: layout) e ganha rolagem
|
|
25
|
+
* própria. Assim o header e a sidebar fixos ocupam a coluna da esquerda, sem serem cobertos.
|
|
26
|
+
* Em telas estreitas o painel ocupa a largura toda e a aplicação fica recolhida até voltar.
|
|
27
|
+
*/
|
|
28
|
+
export class UiAssistantLayoutComponent {
|
|
29
|
+
constructor(assistant, cdr, zone, config, router) {
|
|
30
|
+
this.assistant = assistant;
|
|
31
|
+
this.cdr = cdr;
|
|
32
|
+
this.zone = zone;
|
|
33
|
+
this.router = router;
|
|
34
|
+
/** Ações concluídas e instruções de interface (tema atualizado, atualizar listagem, abrir prévia). */
|
|
35
|
+
this.assistantEvent = new EventEmitter();
|
|
36
|
+
/** Painel montado e layout em modo contido (inclui a animação de fechamento). */
|
|
37
|
+
this.contido = false;
|
|
38
|
+
/** Painel com a largura final (classe que dispara a transição). */
|
|
39
|
+
this.expandido = false;
|
|
40
|
+
/** Tela estreita: painel em largura total, aplicação recolhida. */
|
|
41
|
+
this.empilhado = false;
|
|
42
|
+
this.disponivel = false;
|
|
43
|
+
this.subs = new Subscription();
|
|
44
|
+
this.midia = null;
|
|
45
|
+
this.scrollJanela = 0;
|
|
46
|
+
this.largura = larguraPainel(config);
|
|
47
|
+
const ladoALado = config?.larguraMinimaLadoALado || UINY_LADO_A_LADO_PADRAO;
|
|
48
|
+
if (typeof window !== 'undefined' && window.matchMedia) {
|
|
49
|
+
this.midia = window.matchMedia(`(max-width: ${ladoALado - 0.02}px)`);
|
|
50
|
+
this.empilhado = this.midia.matches;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
ngOnInit() {
|
|
54
|
+
this.removerHost = this.assistant.registrarHost();
|
|
55
|
+
this.subs.add(this.assistant.disponivel$.subscribe(d => {
|
|
56
|
+
this.disponivel = d;
|
|
57
|
+
this.cdr.markForCheck();
|
|
58
|
+
}));
|
|
59
|
+
this.subs.add(this.assistant.aberto$.subscribe(aberto => aberto ? this.abrir() : this.fechar()));
|
|
60
|
+
this.subs.add(this.assistant.eventos$.subscribe(e => this.assistantEvent.emit(e)));
|
|
61
|
+
// Com o layout contido a janela não rola: replica o scroll ao topo da navegação.
|
|
62
|
+
if (this.router) {
|
|
63
|
+
this.subs.add(this.router.events.pipe(filter(e => e instanceof NavigationEnd)).subscribe(() => {
|
|
64
|
+
if (this.contido && this.rolagem)
|
|
65
|
+
this.rolagem.nativeElement.scrollTop = 0;
|
|
66
|
+
}));
|
|
67
|
+
}
|
|
68
|
+
if (this.midia) {
|
|
69
|
+
const aoMudar = (e) => this.zone.run(() => {
|
|
70
|
+
this.empilhado = e.matches;
|
|
71
|
+
this.cdr.markForCheck();
|
|
72
|
+
});
|
|
73
|
+
this.midia.addEventListener ? this.midia.addEventListener('change', aoMudar) : this.midia.addListener(aoMudar);
|
|
74
|
+
this.subs.add(() => this.midia.removeEventListener
|
|
75
|
+
? this.midia.removeEventListener('change', aoMudar)
|
|
76
|
+
: this.midia.removeListener(aoMudar));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
ngOnDestroy() {
|
|
80
|
+
clearTimeout(this.timerFechamento);
|
|
81
|
+
this.subs.unsubscribe();
|
|
82
|
+
this.removerHost?.();
|
|
83
|
+
if (this.contido)
|
|
84
|
+
this.restaurarJanela();
|
|
85
|
+
}
|
|
86
|
+
abrir() {
|
|
87
|
+
clearTimeout(this.timerFechamento);
|
|
88
|
+
if (!this.contido) {
|
|
89
|
+
this.scrollJanela = window.scrollY || 0;
|
|
90
|
+
this.contido = true;
|
|
91
|
+
this.cdr.detectChanges();
|
|
92
|
+
// a rolagem passa da janela para a coluna da aplicação, na mesma posição
|
|
93
|
+
this.rolagem.nativeElement.scrollTop = this.scrollJanela;
|
|
94
|
+
}
|
|
95
|
+
// próximo frame: a largura sai de 0 e a transição acontece
|
|
96
|
+
requestAnimationFrame(() => {
|
|
97
|
+
this.expandido = true;
|
|
98
|
+
this.cdr.detectChanges();
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
fechar() {
|
|
102
|
+
if (!this.contido)
|
|
103
|
+
return;
|
|
104
|
+
this.expandido = false;
|
|
105
|
+
this.cdr.detectChanges();
|
|
106
|
+
clearTimeout(this.timerFechamento);
|
|
107
|
+
this.timerFechamento = setTimeout(() => {
|
|
108
|
+
this.restaurarJanela();
|
|
109
|
+
this.cdr.detectChanges();
|
|
110
|
+
}, this.semAnimacao() ? 0 : DURACAO_TRANSICAO_MS);
|
|
111
|
+
}
|
|
112
|
+
restaurarJanela() {
|
|
113
|
+
const topo = this.empilhado ? this.scrollJanela : (this.rolagem?.nativeElement.scrollTop ?? 0);
|
|
114
|
+
this.contido = false;
|
|
115
|
+
this.cdr.detectChanges();
|
|
116
|
+
window.scrollTo(0, topo);
|
|
117
|
+
}
|
|
118
|
+
semAnimacao() {
|
|
119
|
+
return typeof window !== 'undefined' && !!window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
UiAssistantLayoutComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantLayoutComponent, deps: [{ token: i1.UiAssistantService }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: UINY_CONFIG, optional: true }, { token: i2.Router, optional: true }], target: i0.ɵɵFactoryTarget.Component });
|
|
123
|
+
UiAssistantLayoutComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UiAssistantLayoutComponent, selector: "ui-assistant-layout", outputs: { assistantEvent: "assistantEvent" }, viewQueries: [{ propertyName: "rolagem", first: true, predicate: ["rolagem"], descendants: true, static: true }], ngImport: i0, template: "<div class=\"uiny-layout\"\n [class.uiny-layout--contido]=\"contido\"\n [class.uiny-layout--expandido]=\"expandido\"\n [class.uiny-layout--empilhado]=\"empilhado\"\n [style.--uiny-largura]=\"largura + 'px'\">\n\n <div class=\"uiny-layout__app\"\n [attr.inert]=\"contido && expandido && empilhado ? '' : null\"\n [attr.aria-hidden]=\"contido && expandido && empilhado ? 'true' : null\">\n <div #rolagem class=\"uiny-layout__rolagem\">\n <ng-content></ng-content>\n </div>\n </div>\n\n <aside *ngIf=\"disponivel && contido\" id=\"uiny-painel\" class=\"uiny-layout__painel\"\n aria-label=\"Uiny, assistente da Uishop\"\n [attr.aria-hidden]=\"expandido ? null : 'true'\"\n [attr.inert]=\"expandido ? null : ''\">\n <div class=\"uiny-layout__painel-conteudo\">\n <ui-assistant-panel [empilhado]=\"empilhado\"></ui-assistant-panel>\n </div>\n </aside>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.uiny-layout,.uiny-layout__app,.uiny-layout__rolagem{display:block}.uiny-layout--contido{display:flex;width:100%;height:100vh;height:100dvh;overflow:hidden}.uiny-layout--contido .uiny-layout__app{flex:1 1 0;min-width:0;height:100%;position:relative;contain:layout paint;overflow:hidden}.uiny-layout--contido .uiny-layout__rolagem{height:100%;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.uiny-layout__painel{flex:0 0 auto;width:0;height:100%;overflow:hidden;position:relative;z-index:2;transition:width .24s cubic-bezier(.2,.8,.2,1)}.uiny-layout__painel-conteudo{width:var(--uiny-largura, 380px);height:100%}.uiny-layout--expandido .uiny-layout__painel{width:var(--uiny-largura, 380px)}.uiny-layout--empilhado .uiny-layout__painel,.uiny-layout--empilhado .uiny-layout__painel-conteudo{width:100%}.uiny-layout--empilhado .uiny-layout__painel{transition:opacity .18s ease;opacity:0}.uiny-layout--empilhado.uiny-layout--expandido .uiny-layout__painel{width:100%;opacity:1}.uiny-layout--empilhado.uiny-layout--expandido .uiny-layout__app{display:none}@media (prefers-reduced-motion: reduce){.uiny-layout__painel,.uiny-layout--empilhado .uiny-layout__painel{transition:none}}@media print{.uiny-layout__painel{display:none}}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.UiAssistantPanelComponent, selector: "ui-assistant-panel", inputs: ["empilhado"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
124
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantLayoutComponent, decorators: [{
|
|
125
|
+
type: Component,
|
|
126
|
+
args: [{ selector: 'ui-assistant-layout', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"uiny-layout\"\n [class.uiny-layout--contido]=\"contido\"\n [class.uiny-layout--expandido]=\"expandido\"\n [class.uiny-layout--empilhado]=\"empilhado\"\n [style.--uiny-largura]=\"largura + 'px'\">\n\n <div class=\"uiny-layout__app\"\n [attr.inert]=\"contido && expandido && empilhado ? '' : null\"\n [attr.aria-hidden]=\"contido && expandido && empilhado ? 'true' : null\">\n <div #rolagem class=\"uiny-layout__rolagem\">\n <ng-content></ng-content>\n </div>\n </div>\n\n <aside *ngIf=\"disponivel && contido\" id=\"uiny-painel\" class=\"uiny-layout__painel\"\n aria-label=\"Uiny, assistente da Uishop\"\n [attr.aria-hidden]=\"expandido ? null : 'true'\"\n [attr.inert]=\"expandido ? null : ''\">\n <div class=\"uiny-layout__painel-conteudo\">\n <ui-assistant-panel [empilhado]=\"empilhado\"></ui-assistant-panel>\n </div>\n </aside>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block}.uiny-layout,.uiny-layout__app,.uiny-layout__rolagem{display:block}.uiny-layout--contido{display:flex;width:100%;height:100vh;height:100dvh;overflow:hidden}.uiny-layout--contido .uiny-layout__app{flex:1 1 0;min-width:0;height:100%;position:relative;contain:layout paint;overflow:hidden}.uiny-layout--contido .uiny-layout__rolagem{height:100%;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.uiny-layout__painel{flex:0 0 auto;width:0;height:100%;overflow:hidden;position:relative;z-index:2;transition:width .24s cubic-bezier(.2,.8,.2,1)}.uiny-layout__painel-conteudo{width:var(--uiny-largura, 380px);height:100%}.uiny-layout--expandido .uiny-layout__painel{width:var(--uiny-largura, 380px)}.uiny-layout--empilhado .uiny-layout__painel,.uiny-layout--empilhado .uiny-layout__painel-conteudo{width:100%}.uiny-layout--empilhado .uiny-layout__painel{transition:opacity .18s ease;opacity:0}.uiny-layout--empilhado.uiny-layout--expandido .uiny-layout__painel{width:100%;opacity:1}.uiny-layout--empilhado.uiny-layout--expandido .uiny-layout__app{display:none}@media (prefers-reduced-motion: reduce){.uiny-layout__painel,.uiny-layout--empilhado .uiny-layout__painel{transition:none}}@media print{.uiny-layout__painel{display:none}}\n"] }]
|
|
127
|
+
}], ctorParameters: function () { return [{ type: i1.UiAssistantService }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
128
|
+
type: Optional
|
|
129
|
+
}, {
|
|
130
|
+
type: Inject,
|
|
131
|
+
args: [UINY_CONFIG]
|
|
132
|
+
}] }, { type: i2.Router, decorators: [{
|
|
133
|
+
type: Optional
|
|
134
|
+
}] }]; }, propDecorators: { assistantEvent: [{
|
|
135
|
+
type: Output
|
|
136
|
+
}], rolagem: [{
|
|
137
|
+
type: ViewChild,
|
|
138
|
+
args: ['rolagem', { static: true }]
|
|
139
|
+
}] } });
|
|
140
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktYXNzaXN0YW50LWxheW91dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1oZWFkZXIvc3JjL2xpYi9hc3Npc3RhbnQvY29tcG9uZW50cy9hc3Npc3RhbnQtbGF5b3V0L3VpLWFzc2lzdGFudC1sYXlvdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktaGVhZGVyL3NyYy9saWIvYXNzaXN0YW50L2NvbXBvbmVudHMvYXNzaXN0YW50LWxheW91dC91aS1hc3Npc3RhbnQtbGF5b3V0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLE1BQU0sRUFDTixNQUFNLEVBR04sUUFBUSxFQUNSLE1BQU0sRUFDTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDOzs7Ozs7QUFFeEYsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFFakM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFPSCxNQUFNLE9BQU8sMEJBQTBCO0lBc0JuQyxZQUNXLFNBQTZCLEVBQzVCLEdBQXNCLEVBQ3RCLElBQVksRUFDYSxNQUF5QixFQUN0QyxNQUFjO1FBSjNCLGNBQVMsR0FBVCxTQUFT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QyxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNqSSxDQUFDOzt3SEE3R1EsMEJBQTBCLDJHQTBCWCxXQUFXOzRHQTFCMUIsMEJBQTBCLDROQzVDdkMsczhCQXVCQTs0RkRxQmEsMEJBQTBCO2tCQU50QyxTQUFTOytCQUNJLHFCQUFxQixtQkFHZCx1QkFBdUIsQ0FBQyxNQUFNOzswQkE0QjFDLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsV0FBVzs7MEJBQzlCLFFBQVE7NENBeEJILGNBQWM7c0JBQXZCLE1BQU07Z0JBRWlDLE9BQU87c0JBQTlDLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEV2ZW50RW1pdHRlcixcclxuICAgIEluamVjdCxcclxuICAgIE5nWm9uZSxcclxuICAgIE9uRGVzdHJveSxcclxuICAgIE9uSW5pdCxcclxuICAgIE9wdGlvbmFsLFxyXG4gICAgT3V0cHV0LFxyXG4gICAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFVpbnlDb25maWcsIFVpbnlFdmVudG8gfSBmcm9tICcuLi8uLi9tb2RlbHMvdWlueS5tb2RlbHMnO1xyXG5pbXBvcnQgeyBVaUFzc2lzdGFudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy91aS1hc3Npc3RhbnQuc2VydmljZSc7XHJcbmltcG9ydCB7IGxhcmd1cmFQYWluZWwsIFVJTllfQ09ORklHLCBVSU5ZX0xBRE9fQV9MQURPX1BBRFJBTyB9IGZyb20gJy4uLy4uL3VpbnkuY29uZmlnJztcclxuXHJcbmNvbnN0IERVUkFDQU9fVFJBTlNJQ0FPX01TID0gMjQwO1xyXG5cclxuLyoqXHJcbiAqIENvbnTDqmluZXIgcXVlIGhvc3BlZGEgYSBVaW55IGFvIGxhZG8gZGEgYXBsaWNhw6fDo28uXHJcbiAqXHJcbiAqIEVudm9sdmUgVE9ETyBvIGxheW91dCBkYSBhcGxpY2HDp8OjbyAoaW5jbHVzaXZlIG8gaGVhZGVyIGUgYSBzaWRlYmFyIGZpeG9zKTpcclxuICpcclxuICogICA8dWktYXNzaXN0YW50LWxheW91dCAoYXNzaXN0YW50RXZlbnQpPVwiLi4uXCI+XHJcbiAqICAgICAgIDxkaXYgY2xhc3M9XCJwYWdlLXdyYXBwZXJcIj4uLi48L2Rpdj5cclxuICogICA8L3VpLWFzc2lzdGFudC1sYXlvdXQ+XHJcbiAqXHJcbiAqIEZlY2hhZG8sIG7Do28gYWx0ZXJhIG5hZGE6IGEgcMOhZ2luYSByb2xhIG5vcm1hbG1lbnRlIHBlbGEgamFuZWxhLlxyXG4gKiBBYmVydG8gbm8gZGVza3RvcCwgdmlyYSB1bWEgbGluaGEgZmxleCBbYXBsaWNhw6fDo28gfCBwYWluZWxdOiBhIGNvbHVuYSBkYSBhcGxpY2HDp8OjbyBwYXNzYVxyXG4gKiBhIHNlciBvIGJsb2NvIGRlIGNvbnRlbsOnw6NvIGRvcyBlbGVtZW50b3MgcG9zaXRpb246Zml4ZWQgKGNvbnRhaW46IGxheW91dCkgZSBnYW5oYSByb2xhZ2VtXHJcbiAqIHByw7NwcmlhLiBBc3NpbSBvIGhlYWRlciBlIGEgc2lkZWJhciBmaXhvcyBvY3VwYW0gYSBjb2x1bmEgZGEgZXNxdWVyZGEsIHNlbSBzZXJlbSBjb2JlcnRvcy5cclxuICogRW0gdGVsYXMgZXN0cmVpdGFzIG8gcGFpbmVsIG9jdXBhIGEgbGFyZ3VyYSB0b2RhIGUgYSBhcGxpY2HDp8OjbyBmaWNhIHJlY29saGlkYSBhdMOpIHZvbHRhci5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd1aS1hc3Npc3RhbnQtbGF5b3V0JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi91aS1hc3Npc3RhbnQtbGF5b3V0LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL3VpLWFzc2lzdGFudC1sYXlvdXQuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUFzc2lzdGFudExheW91dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuXHJcbiAgICAvKiogQcOnw7VlcyBjb25jbHXDrWRhcyBlIGluc3RydcOnw7VlcyBkZSBpbnRlcmZhY2UgKHRlbWEgYXR1YWxpemFkbywgYXR1YWxpemFyIGxpc3RhZ2VtLCBhYnJpciBwcsOpdmlhKS4gKi9cclxuICAgIEBPdXRwdXQoKSBhc3Npc3RhbnRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8VWlueUV2ZW50bz4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdyb2xhZ2VtJywgeyBzdGF0aWM6IHRydWUgfSkgcm9sYWdlbTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgLyoqIFBhaW5lbCBtb250YWRvIGUgbGF5b3V0IGVtIG1vZG8gY29udGlkbyAoaW5jbHVpIGEgYW5pbWHDp8OjbyBkZSBmZWNoYW1lbnRvKS4gKi9cclxuICAgIHB1YmxpYyBjb250aWRvID0gZmFsc2U7XHJcbiAgICAvKiogUGFpbmVsIGNvbSBhIGxhcmd1cmEgZmluYWwgKGNsYXNzZSBxdWUgZGlzcGFyYSBhIHRyYW5zacOnw6NvKS4gKi9cclxuICAgIHB1YmxpYyBleHBhbmRpZG8gPSBmYWxzZTtcclxuICAgIC8qKiBUZWxhIGVzdHJlaXRhOiBwYWluZWwgZW0gbGFyZ3VyYSB0b3RhbCwgYXBsaWNhw6fDo28gcmVjb2xoaWRhLiAqL1xyXG4gICAgcHVibGljIGVtcGlsaGFkbyA9IGZhbHNlO1xyXG4gICAgcHVibGljIGRpc3Bvbml2ZWwgPSBmYWxzZTtcclxuICAgIHB1YmxpYyByZWFkb25seSBsYXJndXJhOiBudW1iZXI7XHJcblxyXG4gICAgcHJpdmF0ZSByZW1vdmVySG9zdDogKCkgPT4gdm9pZDtcclxuICAgIHByaXZhdGUgc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHByaXZhdGUgbWlkaWE6IE1lZGlhUXVlcnlMaXN0IHwgbnVsbCA9IG51bGw7XHJcbiAgICBwcml2YXRlIHRpbWVyRmVjaGFtZW50bzogYW55O1xyXG4gICAgcHJpdmF0ZSBzY3JvbGxKYW5lbGEgPSAwO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHB1YmxpYyBhc3Npc3RhbnQ6IFVpQXNzaXN0YW50U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXHJcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChVSU5ZX0NPTkZJRykgY29uZmlnOiBVaW55Q29uZmlnIHwgbnVsbCxcclxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJvdXRlcjogUm91dGVyXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLmxhcmd1cmEgPSBsYXJndXJhUGFpbmVsKGNvbmZpZyk7XHJcbiAgICAgICAgY29uc3QgbGFkb0FMYWRvID0gY29uZmlnPy5sYXJndXJhTWluaW1hTGFkb0FMYWRvIHx8IFVJTllfTEFET19BX0xBRE9fUEFEUkFPO1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubWF0Y2hNZWRpYSkge1xyXG4gICAgICAgICAgICB0aGlzLm1pZGlhID0gd2luZG93Lm1hdGNoTWVkaWEoYChtYXgtd2lkdGg6ICR7bGFkb0FMYWRvIC0gMC4wMn1weClgKTtcclxuICAgICAgICAgICAgdGhpcy5lbXBpbGhhZG8gPSB0aGlzLm1pZGlhLm1hdGNoZXM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMucmVtb3Zlckhvc3QgPSB0aGlzLmFzc2lzdGFudC5yZWdpc3RyYXJIb3N0KCk7XHJcblxyXG4gICAgICAgIHRoaXMuc3Vicy5hZGQodGhpcy5hc3Npc3RhbnQuZGlzcG9uaXZlbCQuc3Vic2NyaWJlKGQgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmRpc3Bvbml2ZWwgPSBkO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9KSk7XHJcbiAgICAgICAgdGhpcy5zdWJzLmFkZCh0aGlzLmFzc2lzdGFudC5hYmVydG8kLnN1YnNjcmliZShhYmVydG8gPT4gYWJlcnRvID8gdGhpcy5hYnJpcigpIDogdGhpcy5mZWNoYXIoKSkpO1xyXG4gICAgICAgIHRoaXMuc3Vicy5hZGQodGhpcy5hc3Npc3RhbnQuZXZlbnRvcyQuc3Vic2NyaWJlKGUgPT4gdGhpcy5hc3Npc3RhbnRFdmVudC5lbWl0KGUpKSk7XHJcblxyXG4gICAgICAgIC8vIENvbSBvIGxheW91dCBjb250aWRvIGEgamFuZWxhIG7Do28gcm9sYTogcmVwbGljYSBvIHNjcm9sbCBhbyB0b3BvIGRhIG5hdmVnYcOnw6NvLlxyXG4gICAgICAgIGlmICh0aGlzLnJvdXRlcikge1xyXG4gICAgICAgICAgICB0aGlzLnN1YnMuYWRkKHRoaXMucm91dGVyLmV2ZW50cy5waXBlKGZpbHRlcihlID0+IGUgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRpZG8gJiYgdGhpcy5yb2xhZ2VtKSB0aGlzLnJvbGFnZW0ubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSAwO1xyXG4gICAgICAgICAgICB9KSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5taWRpYSkge1xyXG4gICAgICAgICAgICBjb25zdCBhb011ZGFyID0gKGU6IE1lZGlhUXVlcnlMaXN0RXZlbnQpID0+IHRoaXMuem9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lbXBpbGhhZG8gPSBlLm1hdGNoZXM7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMubWlkaWEuYWRkRXZlbnRMaXN0ZW5lciA/IHRoaXMubWlkaWEuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgYW9NdWRhcikgOiB0aGlzLm1pZGlhLmFkZExpc3RlbmVyKGFvTXVkYXIpO1xyXG4gICAgICAgICAgICB0aGlzLnN1YnMuYWRkKCgpID0+IHRoaXMubWlkaWEucmVtb3ZlRXZlbnRMaXN0ZW5lclxyXG4gICAgICAgICAgICAgICAgPyB0aGlzLm1pZGlhLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGFvTXVkYXIpXHJcbiAgICAgICAgICAgICAgICA6IHRoaXMubWlkaWEucmVtb3ZlTGlzdGVuZXIoYW9NdWRhcikpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lckZlY2hhbWVudG8pO1xyXG4gICAgICAgIHRoaXMuc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIHRoaXMucmVtb3Zlckhvc3Q/LigpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbnRpZG8pIHRoaXMucmVzdGF1cmFySmFuZWxhKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhYnJpcigpOiB2b2lkIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lckZlY2hhbWVudG8pO1xyXG4gICAgICAgIGlmICghdGhpcy5jb250aWRvKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2Nyb2xsSmFuZWxhID0gd2luZG93LnNjcm9sbFkgfHwgMDtcclxuICAgICAgICAgICAgdGhpcy5jb250aWRvID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgICAgICAvLyBhIHJvbGFnZW0gcGFzc2EgZGEgamFuZWxhIHBhcmEgYSBjb2x1bmEgZGEgYXBsaWNhw6fDo28sIG5hIG1lc21hIHBvc2nDp8Ojb1xyXG4gICAgICAgICAgICB0aGlzLnJvbGFnZW0ubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbEphbmVsYTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gcHLDs3hpbW8gZnJhbWU6IGEgbGFyZ3VyYSBzYWkgZGUgMCBlIGEgdHJhbnNpw6fDo28gYWNvbnRlY2VcclxuICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmV4cGFuZGlkbyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGZlY2hhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAoIXRoaXMuY29udGlkbykgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuZXhwYW5kaWRvID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVyRmVjaGFtZW50byk7XHJcbiAgICAgICAgdGhpcy50aW1lckZlY2hhbWVudG8gPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5yZXN0YXVyYXJKYW5lbGEoKTtcclxuICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH0sIHRoaXMuc2VtQW5pbWFjYW8oKSA/IDAgOiBEVVJBQ0FPX1RSQU5TSUNBT19NUyk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXN0YXVyYXJKYW5lbGEoKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgdG9wbyA9IHRoaXMuZW1waWxoYWRvID8gdGhpcy5zY3JvbGxKYW5lbGEgOiAodGhpcy5yb2xhZ2VtPy5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA/PyAwKTtcclxuICAgICAgICB0aGlzLmNvbnRpZG8gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHRvcG8pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc2VtQW5pbWFjYW8oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICEhd2luZG93Lm1hdGNoTWVkaWEgJiYgd2luZG93Lm1hdGNoTWVkaWEoJyhwcmVmZXJzLXJlZHVjZWQtbW90aW9uOiByZWR1Y2UpJykubWF0Y2hlcztcclxuICAgIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwidWlueS1sYXlvdXRcIlxuICAgIFtjbGFzcy51aW55LWxheW91dC0tY29udGlkb109XCJjb250aWRvXCJcbiAgICBbY2xhc3MudWlueS1sYXlvdXQtLWV4cGFuZGlkb109XCJleHBhbmRpZG9cIlxuICAgIFtjbGFzcy51aW55LWxheW91dC0tZW1waWxoYWRvXT1cImVtcGlsaGFkb1wiXG4gICAgW3N0eWxlLi0tdWlueS1sYXJndXJhXT1cImxhcmd1cmEgKyAncHgnXCI+XG5cbiAgICA8ZGl2IGNsYXNzPVwidWlueS1sYXlvdXRfX2FwcFwiXG4gICAgICAgIFthdHRyLmluZXJ0XT1cImNvbnRpZG8gJiYgZXhwYW5kaWRvICYmIGVtcGlsaGFkbyA/ICcnIDogbnVsbFwiXG4gICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImNvbnRpZG8gJiYgZXhwYW5kaWRvICYmIGVtcGlsaGFkbyA/ICd0cnVlJyA6IG51bGxcIj5cbiAgICAgICAgPGRpdiAjcm9sYWdlbSBjbGFzcz1cInVpbnktbGF5b3V0X19yb2xhZ2VtXCI+XG4gICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGFzaWRlICpuZ0lmPVwiZGlzcG9uaXZlbCAmJiBjb250aWRvXCIgaWQ9XCJ1aW55LXBhaW5lbFwiIGNsYXNzPVwidWlueS1sYXlvdXRfX3BhaW5lbFwiXG4gICAgICAgIGFyaWEtbGFiZWw9XCJVaW55LCBhc3Npc3RlbnRlIGRhIFVpc2hvcFwiXG4gICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cImV4cGFuZGlkbyA/IG51bGwgOiAndHJ1ZSdcIlxuICAgICAgICBbYXR0ci5pbmVydF09XCJleHBhbmRpZG8gPyBudWxsIDogJydcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInVpbnktbGF5b3V0X19wYWluZWwtY29udGV1ZG9cIj5cbiAgICAgICAgICAgIDx1aS1hc3Npc3RhbnQtcGFuZWwgW2VtcGlsaGFkb109XCJlbXBpbGhhZG9cIj48L3VpLWFzc2lzdGFudC1wYW5lbD5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9hc2lkZT5cbjwvZGl2PlxuIl19
|
package/esm2020/lib/assistant/components/assistant-messages/ui-assistant-messages.component.mjs
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, EventEmitter, Input, NgZone, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
import * as i2 from "uitec-ng-icon";
|
|
5
|
+
import * as i3 from "../assistant-text/ui-assistant-text.component";
|
|
6
|
+
import * as i4 from "../assistant-action-card/ui-assistant-action-card.component";
|
|
7
|
+
/** Distância do fim (px) até onde ainda consideramos que o usuário está "no fim". */
|
|
8
|
+
const PERTO_DO_FIM = 96;
|
|
9
|
+
export class UiAssistantMessagesComponent {
|
|
10
|
+
constructor(cdr, zone) {
|
|
11
|
+
this.cdr = cdr;
|
|
12
|
+
this.mensagens = [];
|
|
13
|
+
this.acoes = {};
|
|
14
|
+
this.enviando = false;
|
|
15
|
+
this.carregando = false;
|
|
16
|
+
this.sugestoes = [];
|
|
17
|
+
this.capacidades = [];
|
|
18
|
+
this.temAlteracoes = false;
|
|
19
|
+
this.podeEnviar = true;
|
|
20
|
+
this.sugestao = new EventEmitter();
|
|
21
|
+
this.confirmar = new EventEmitter();
|
|
22
|
+
this.cancelar = new EventEmitter();
|
|
23
|
+
this.verificar = new EventEmitter();
|
|
24
|
+
this.novas = false;
|
|
25
|
+
this.pertoDoFim = true;
|
|
26
|
+
this.rolarPendente = true;
|
|
27
|
+
// o listener roda fora da zona: só reentra quando o indicador muda
|
|
28
|
+
zone.runOutsideAngular(() => setTimeout(() => {
|
|
29
|
+
const el = this.area?.nativeElement;
|
|
30
|
+
if (!el)
|
|
31
|
+
return;
|
|
32
|
+
const aoRolar = () => {
|
|
33
|
+
const perto = this.calcularPertoDoFim();
|
|
34
|
+
if (perto === this.pertoDoFim)
|
|
35
|
+
return;
|
|
36
|
+
this.pertoDoFim = perto;
|
|
37
|
+
if (perto && this.novas)
|
|
38
|
+
zone.run(() => {
|
|
39
|
+
this.novas = false;
|
|
40
|
+
this.cdr.markForCheck();
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
el.addEventListener('scroll', aoRolar, { passive: true });
|
|
44
|
+
this.removerScroll = () => el.removeEventListener('scroll', aoRolar);
|
|
45
|
+
}));
|
|
46
|
+
}
|
|
47
|
+
ngOnChanges(changes) {
|
|
48
|
+
const mudou = changes['mensagens'] || changes['enviando'] || changes['acoes'];
|
|
49
|
+
if (!mudou)
|
|
50
|
+
return;
|
|
51
|
+
const mensagensMudaram = !!changes['mensagens'];
|
|
52
|
+
const anterior = changes['mensagens']?.previousValue || [];
|
|
53
|
+
const atual = this.mensagens || [];
|
|
54
|
+
const conversaTrocada = mensagensMudaram && (!anterior.length || !atual.length || anterior[0]?.id !== atual[0]?.id);
|
|
55
|
+
const ultima = atual[atual.length - 1];
|
|
56
|
+
// quem acabou de enviar quer ver a própria mensagem
|
|
57
|
+
const ultimaDoUsuario = mensagensMudaram && ultima?.papel === 'usuario' && ultima.id.startsWith('local-');
|
|
58
|
+
if (conversaTrocada || ultimaDoUsuario || this.pertoDoFim) {
|
|
59
|
+
this.rolarPendente = true;
|
|
60
|
+
}
|
|
61
|
+
else if (mensagensMudaram && atual.length > anterior.length) {
|
|
62
|
+
// o usuário está lendo mensagens antigas: preserva a posição
|
|
63
|
+
this.novas = true;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
ngAfterViewChecked() {
|
|
67
|
+
if (!this.rolarPendente)
|
|
68
|
+
return;
|
|
69
|
+
this.rolarPendente = false;
|
|
70
|
+
this.irParaOFim(false);
|
|
71
|
+
}
|
|
72
|
+
ngOnDestroy() {
|
|
73
|
+
this.removerScroll?.();
|
|
74
|
+
}
|
|
75
|
+
irParaOFim(suave = true) {
|
|
76
|
+
const el = this.area?.nativeElement;
|
|
77
|
+
if (!el)
|
|
78
|
+
return;
|
|
79
|
+
const reduzir = typeof window !== 'undefined' && window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;
|
|
80
|
+
if (suave && !reduzir && el.scrollTo) {
|
|
81
|
+
el.scrollTo({ top: el.scrollHeight, behavior: 'smooth' });
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
el.scrollTop = el.scrollHeight;
|
|
85
|
+
}
|
|
86
|
+
this.pertoDoFim = true;
|
|
87
|
+
if (this.novas) {
|
|
88
|
+
this.novas = false;
|
|
89
|
+
this.cdr.markForCheck();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
acaoDa(mensagem) {
|
|
93
|
+
return mensagem.idAcao ? this.acoes?.[mensagem.idAcao] ?? null : null;
|
|
94
|
+
}
|
|
95
|
+
/** Ações devolvidas pela API sem mensagem que as referencie: aparecem no fim. */
|
|
96
|
+
get acoesSemMensagem() {
|
|
97
|
+
const referenciadas = new Set((this.mensagens || []).map(m => m.idAcao).filter(Boolean));
|
|
98
|
+
return Object.values(this.acoes || {}).filter(a => !referenciadas.has(a.id));
|
|
99
|
+
}
|
|
100
|
+
trackMensagem(_, m) {
|
|
101
|
+
return m.id;
|
|
102
|
+
}
|
|
103
|
+
trackAcao(_, a) {
|
|
104
|
+
return a.id;
|
|
105
|
+
}
|
|
106
|
+
calcularPertoDoFim() {
|
|
107
|
+
const el = this.area.nativeElement;
|
|
108
|
+
return el.scrollHeight - el.scrollTop - el.clientHeight <= PERTO_DO_FIM;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
UiAssistantMessagesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantMessagesComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
|
|
112
|
+
UiAssistantMessagesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: UiAssistantMessagesComponent, selector: "ui-assistant-messages", inputs: { mensagens: "mensagens", acoes: "acoes", enviando: "enviando", carregando: "carregando", sugestoes: "sugestoes", capacidades: "capacidades", temAlteracoes: "temAlteracoes", podeEnviar: "podeEnviar" }, outputs: { sugestao: "sugestao", confirmar: "confirmar", cancelar: "cancelar", verificar: "verificar" }, viewQueries: [{ propertyName: "area", first: true, predicate: ["area"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div #area class=\"uiny-msgs\" role=\"log\" aria-live=\"off\" aria-label=\"Mensagens da conversa com a Uiny\" tabindex=\"0\">\r\n\r\n <div *ngIf=\"carregando\" class=\"uiny-msgs__carregando\" role=\"status\">\r\n <span class=\"uiny-spinner\" aria-hidden=\"true\"></span> Carregando a conversa\u2026\r\n </div>\r\n\r\n <div *ngIf=\"!carregando && !mensagens?.length\" class=\"uiny-boas-vindas\">\r\n <p class=\"uiny-boas-vindas__titulo\">Ol\u00E1! Eu sou a Uiny.</p>\r\n <p class=\"uiny-boas-vindas__texto\">Sou a assistente virtual da Uishop. Conte o que voc\u00EA precisa e eu ajudo por aqui.</p>\r\n <p *ngIf=\"temAlteracoes\" class=\"uiny-boas-vindas__nota\">\r\n <ui-icon icon=\"verified_user\" size=\"16\"></ui-icon>\r\n <span>Antes de alterar qualquer informa\u00E7\u00E3o, eu mostro o que vai mudar e s\u00F3 sigo com a sua confirma\u00E7\u00E3o.</span>\r\n </p>\r\n\r\n <div *ngIf=\"sugestoes?.length\" class=\"uiny-sugestoes\" aria-label=\"Sugest\u00F5es\">\r\n <button *ngFor=\"let s of sugestoes\" type=\"button\" class=\"uiny-sugestao\" [disabled]=\"!podeEnviar\" (click)=\"sugestao.emit(s)\">\r\n {{ s }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"capacidades?.length\" class=\"uiny-capacidades\">\r\n <p class=\"uiny-capacidades__titulo\">Posso ajudar com:</p>\r\n <ul>\r\n <li *ngFor=\"let c of capacidades\">{{ c }}</li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let m of mensagens; trackBy: trackMensagem\" class=\"uiny-msg\"\r\n [class.uiny-msg--usuario]=\"m.papel === 'usuario'\"\r\n [class.uiny-msg--assistente]=\"m.papel !== 'usuario'\"\r\n [class.uiny-msg--falha]=\"m.erro\">\r\n <span class=\"uiny-sr\">{{ m.papel === 'usuario' ? 'Voc\u00EA:' : 'Uiny:' }}</span>\r\n <div class=\"uiny-msg__balao\">\r\n <p *ngIf=\"m.papel === 'usuario'\" class=\"uiny-msg__simples\">{{ m.texto }}</p>\r\n <ui-assistant-text *ngIf=\"m.papel !== 'usuario'\" [texto]=\"m.texto\"></ui-assistant-text>\r\n </div>\r\n\r\n <ui-assistant-action-card *ngIf=\"acaoDa(m) as acao\" [acao]=\"acao\"\r\n (confirmar)=\"confirmar.emit($event)\" (cancelar)=\"cancelar.emit($event)\" (verificar)=\"verificar.emit($event)\">\r\n </ui-assistant-action-card>\r\n\r\n <!-- esclarecimento: op\u00E7\u00F5es s\u00F3 na \u00FAltima mensagem, enviadas como texto -->\r\n <div *ngIf=\"m.opcoes?.length && m === mensagens[mensagens.length - 1]\" class=\"uiny-sugestoes uiny-msg__opcoes\" aria-label=\"Op\u00E7\u00F5es de resposta\">\r\n <button *ngFor=\"let o of m.opcoes\" type=\"button\" class=\"uiny-sugestao\" [disabled]=\"!podeEnviar || enviando\" (click)=\"sugestao.emit(o)\">\r\n {{ o }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"uiny-msg__meta\">\r\n <span *ngIf=\"m.erro\" class=\"uiny-msg__nao-enviada\">\r\n <ui-icon icon=\"error\" size=\"14\"></ui-icon> N\u00E3o enviada\r\n </span>\r\n <time *ngIf=\"m.criadaEm && !m.erro\" [attr.datetime]=\"m.criadaEm.toISOString()\">{{ m.criadaEm | date:'HH:mm' }}</time>\r\n </div>\r\n </div>\r\n\r\n <ui-assistant-action-card *ngFor=\"let acao of acoesSemMensagem; trackBy: trackAcao\" class=\"uiny-msgs__acao-solta\" [acao]=\"acao\"\r\n (confirmar)=\"confirmar.emit($event)\" (cancelar)=\"cancelar.emit($event)\" (verificar)=\"verificar.emit($event)\">\r\n </ui-assistant-action-card>\r\n\r\n <div *ngIf=\"enviando\" class=\"uiny-digitando\">\r\n <span class=\"uiny-digitando__pontos\" aria-hidden=\"true\"><i></i><i></i><i></i></span>\r\n <span class=\"uiny-digitando__texto\">A Uiny est\u00E1 pensando\u2026</span>\r\n </div>\r\n</div>\r\n\r\n<button *ngIf=\"novas\" type=\"button\" class=\"uiny-novas\" (click)=\"irParaOFim()\">\r\n <ui-icon icon=\"arrow_downward\" size=\"16\"></ui-icon> Novas mensagens\r\n</button>\r\n", styles: [":host{position:relative;display:flex;flex-direction:column;min-height:0}.uiny-msgs{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;padding:16px 14px 8px;scrollbar-width:thin}.uiny-msgs:focus-visible{outline:2px solid var(--uiny-primaria, #7366ff);outline-offset:-2px}.uiny-msgs__carregando{display:flex;align-items:center;gap:8px;color:var(--uiny-texto-suave, #6b6b80);font-size:13px}.uiny-spinner{width:14px;height:14px;border:2px solid var(--uiny-borda, #ececf3);border-top-color:var(--uiny-primaria, #7366ff);border-radius:50%;animation:uiny-girar .8s linear infinite}.uiny-boas-vindas{padding:8px 2px 4px}.uiny-boas-vindas__titulo{margin:0 0 4px;font-size:18px;font-weight:700;color:var(--uiny-texto, #2b2b2b)}.uiny-boas-vindas__texto{margin:0 0 12px;color:var(--uiny-texto-suave, #6b6b80);line-height:1.5}.uiny-boas-vindas__nota{display:flex;gap:6px;margin:0 0 14px;padding:8px 10px;border-radius:10px;background:var(--uiny-fundo-suave, #f7f7fb);color:var(--uiny-texto-suave, #6b6b80);font-size:12.5px;line-height:1.45}.uiny-boas-vindas__nota ui-icon{flex:0 0 auto;color:var(--uiny-primaria, #7366ff)}.uiny-sugestoes{display:flex;flex-direction:column;align-items:flex-start;gap:6px}.uiny-sugestao{max-width:100%;padding:8px 12px;border:1px solid var(--uiny-borda, #ececf3);border-radius:12px;background:var(--uiny-fundo, #fff);color:var(--uiny-texto, #2b2b2b);font-size:13px;text-align:left;line-height:1.35;cursor:pointer;transition:border-color .15s ease,background-color .15s ease}.uiny-sugestao:hover:not(:disabled){border-color:var(--uiny-primaria, #7366ff);background:var(--uiny-aviso-fundo, #f1effe)}.uiny-sugestao:disabled{opacity:.5;cursor:not-allowed}.uiny-sugestao:focus-visible{outline:2px solid var(--uiny-primaria, #7366ff);outline-offset:2px}.uiny-capacidades{font-size:13px;color:var(--uiny-texto-suave, #6b6b80)}.uiny-capacidades ul{margin:0;padding-left:18px}.uiny-capacidades li+li{margin-top:2px}.uiny-capacidades__titulo{margin:0 0 4px;font-weight:600;color:var(--uiny-texto, #2b2b2b)}.uiny-msg{display:flex;flex-direction:column;margin-top:14px}.uiny-msg:first-of-type{margin-top:0}.uiny-msg--usuario{align-items:flex-end}.uiny-msg--usuario .uiny-msg__balao{max-width:85%;padding:9px 13px;border-radius:16px 16px 4px;background:var(--uiny-primaria, #7366ff);color:#fff}.uiny-msg--assistente{align-items:stretch}.uiny-msg--assistente .uiny-msg__balao{max-width:100%;color:var(--uiny-texto, #2b2b2b)}.uiny-msg--falha .uiny-msg__balao{opacity:.65}.uiny-msg__simples{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.45}.uiny-msg__meta{margin-top:3px;font-size:11px;color:var(--uiny-texto-suave, #6b6b80)}.uiny-msg__meta time{opacity:.8}.uiny-msg__nao-enviada{display:inline-flex;align-items:center;gap:3px;color:var(--uiny-erro, #d9364f)}.uiny-msg__opcoes{margin-top:8px}.uiny-msgs__acao-solta{display:block;margin-top:14px}.uiny-digitando{display:flex;align-items:center;gap:8px;margin-top:14px;color:var(--uiny-texto-suave, #6b6b80);font-size:13px}.uiny-digitando__pontos{display:inline-flex;gap:3px}.uiny-digitando__pontos i{width:6px;height:6px;border-radius:50%;background:var(--uiny-primaria, #7366ff);animation:uiny-pulsar 1.2s ease-in-out infinite}.uiny-digitando__pontos i:nth-child(2){animation-delay:.15s}.uiny-digitando__pontos i:nth-child(3){animation-delay:.3s}.uiny-novas{position:absolute;left:50%;bottom:10px;transform:translate(-50%);display:inline-flex;align-items:center;gap:4px;padding:6px 12px;border:0;border-radius:999px;background:var(--uiny-primaria, #7366ff);color:#fff;font-size:12px;font-weight:600;box-shadow:0 6px 16px #1f1b4d33;cursor:pointer}.uiny-novas:focus-visible{outline:2px solid var(--uiny-primaria, #7366ff);outline-offset:2px}.uiny-sr{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@keyframes uiny-girar{to{transform:rotate(360deg)}}@keyframes uiny-pulsar{0%,80%,to{opacity:.25;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion: reduce){.uiny-digitando__pontos i{animation:none;opacity:.6}.uiny-spinner{animation-duration:2.4s}.uiny-sugestao{transition:none}}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.UiIconComponent, selector: "ui-icon", inputs: ["icon", "size", "class"] }, { kind: "component", type: i3.UiAssistantTextComponent, selector: "ui-assistant-text", inputs: ["texto"] }, { kind: "component", type: i4.UiAssistantActionCardComponent, selector: "ui-assistant-action-card", inputs: ["acao"], outputs: ["confirmar", "cancelar", "verificar"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
113
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: UiAssistantMessagesComponent, decorators: [{
|
|
114
|
+
type: Component,
|
|
115
|
+
args: [{ selector: 'ui-assistant-messages', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div #area class=\"uiny-msgs\" role=\"log\" aria-live=\"off\" aria-label=\"Mensagens da conversa com a Uiny\" tabindex=\"0\">\r\n\r\n <div *ngIf=\"carregando\" class=\"uiny-msgs__carregando\" role=\"status\">\r\n <span class=\"uiny-spinner\" aria-hidden=\"true\"></span> Carregando a conversa\u2026\r\n </div>\r\n\r\n <div *ngIf=\"!carregando && !mensagens?.length\" class=\"uiny-boas-vindas\">\r\n <p class=\"uiny-boas-vindas__titulo\">Ol\u00E1! Eu sou a Uiny.</p>\r\n <p class=\"uiny-boas-vindas__texto\">Sou a assistente virtual da Uishop. Conte o que voc\u00EA precisa e eu ajudo por aqui.</p>\r\n <p *ngIf=\"temAlteracoes\" class=\"uiny-boas-vindas__nota\">\r\n <ui-icon icon=\"verified_user\" size=\"16\"></ui-icon>\r\n <span>Antes de alterar qualquer informa\u00E7\u00E3o, eu mostro o que vai mudar e s\u00F3 sigo com a sua confirma\u00E7\u00E3o.</span>\r\n </p>\r\n\r\n <div *ngIf=\"sugestoes?.length\" class=\"uiny-sugestoes\" aria-label=\"Sugest\u00F5es\">\r\n <button *ngFor=\"let s of sugestoes\" type=\"button\" class=\"uiny-sugestao\" [disabled]=\"!podeEnviar\" (click)=\"sugestao.emit(s)\">\r\n {{ s }}\r\n </button>\r\n </div>\r\n\r\n <div *ngIf=\"capacidades?.length\" class=\"uiny-capacidades\">\r\n <p class=\"uiny-capacidades__titulo\">Posso ajudar com:</p>\r\n <ul>\r\n <li *ngFor=\"let c of capacidades\">{{ c }}</li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div *ngFor=\"let m of mensagens; trackBy: trackMensagem\" class=\"uiny-msg\"\r\n [class.uiny-msg--usuario]=\"m.papel === 'usuario'\"\r\n [class.uiny-msg--assistente]=\"m.papel !== 'usuario'\"\r\n [class.uiny-msg--falha]=\"m.erro\">\r\n <span class=\"uiny-sr\">{{ m.papel === 'usuario' ? 'Voc\u00EA:' : 'Uiny:' }}</span>\r\n <div class=\"uiny-msg__balao\">\r\n <p *ngIf=\"m.papel === 'usuario'\" class=\"uiny-msg__simples\">{{ m.texto }}</p>\r\n <ui-assistant-text *ngIf=\"m.papel !== 'usuario'\" [texto]=\"m.texto\"></ui-assistant-text>\r\n </div>\r\n\r\n <ui-assistant-action-card *ngIf=\"acaoDa(m) as acao\" [acao]=\"acao\"\r\n (confirmar)=\"confirmar.emit($event)\" (cancelar)=\"cancelar.emit($event)\" (verificar)=\"verificar.emit($event)\">\r\n </ui-assistant-action-card>\r\n\r\n <!-- esclarecimento: op\u00E7\u00F5es s\u00F3 na \u00FAltima mensagem, enviadas como texto -->\r\n <div *ngIf=\"m.opcoes?.length && m === mensagens[mensagens.length - 1]\" class=\"uiny-sugestoes uiny-msg__opcoes\" aria-label=\"Op\u00E7\u00F5es de resposta\">\r\n <button *ngFor=\"let o of m.opcoes\" type=\"button\" class=\"uiny-sugestao\" [disabled]=\"!podeEnviar || enviando\" (click)=\"sugestao.emit(o)\">\r\n {{ o }}\r\n </button>\r\n </div>\r\n\r\n <div class=\"uiny-msg__meta\">\r\n <span *ngIf=\"m.erro\" class=\"uiny-msg__nao-enviada\">\r\n <ui-icon icon=\"error\" size=\"14\"></ui-icon> N\u00E3o enviada\r\n </span>\r\n <time *ngIf=\"m.criadaEm && !m.erro\" [attr.datetime]=\"m.criadaEm.toISOString()\">{{ m.criadaEm | date:'HH:mm' }}</time>\r\n </div>\r\n </div>\r\n\r\n <ui-assistant-action-card *ngFor=\"let acao of acoesSemMensagem; trackBy: trackAcao\" class=\"uiny-msgs__acao-solta\" [acao]=\"acao\"\r\n (confirmar)=\"confirmar.emit($event)\" (cancelar)=\"cancelar.emit($event)\" (verificar)=\"verificar.emit($event)\">\r\n </ui-assistant-action-card>\r\n\r\n <div *ngIf=\"enviando\" class=\"uiny-digitando\">\r\n <span class=\"uiny-digitando__pontos\" aria-hidden=\"true\"><i></i><i></i><i></i></span>\r\n <span class=\"uiny-digitando__texto\">A Uiny est\u00E1 pensando\u2026</span>\r\n </div>\r\n</div>\r\n\r\n<button *ngIf=\"novas\" type=\"button\" class=\"uiny-novas\" (click)=\"irParaOFim()\">\r\n <ui-icon icon=\"arrow_downward\" size=\"16\"></ui-icon> Novas mensagens\r\n</button>\r\n", styles: [":host{position:relative;display:flex;flex-direction:column;min-height:0}.uiny-msgs{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;padding:16px 14px 8px;scrollbar-width:thin}.uiny-msgs:focus-visible{outline:2px solid var(--uiny-primaria, #7366ff);outline-offset:-2px}.uiny-msgs__carregando{display:flex;align-items:center;gap:8px;color:var(--uiny-texto-suave, #6b6b80);font-size:13px}.uiny-spinner{width:14px;height:14px;border:2px solid var(--uiny-borda, #ececf3);border-top-color:var(--uiny-primaria, #7366ff);border-radius:50%;animation:uiny-girar .8s linear infinite}.uiny-boas-vindas{padding:8px 2px 4px}.uiny-boas-vindas__titulo{margin:0 0 4px;font-size:18px;font-weight:700;color:var(--uiny-texto, #2b2b2b)}.uiny-boas-vindas__texto{margin:0 0 12px;color:var(--uiny-texto-suave, #6b6b80);line-height:1.5}.uiny-boas-vindas__nota{display:flex;gap:6px;margin:0 0 14px;padding:8px 10px;border-radius:10px;background:var(--uiny-fundo-suave, #f7f7fb);color:var(--uiny-texto-suave, #6b6b80);font-size:12.5px;line-height:1.45}.uiny-boas-vindas__nota ui-icon{flex:0 0 auto;color:var(--uiny-primaria, #7366ff)}.uiny-sugestoes{display:flex;flex-direction:column;align-items:flex-start;gap:6px}.uiny-sugestao{max-width:100%;padding:8px 12px;border:1px solid var(--uiny-borda, #ececf3);border-radius:12px;background:var(--uiny-fundo, #fff);color:var(--uiny-texto, #2b2b2b);font-size:13px;text-align:left;line-height:1.35;cursor:pointer;transition:border-color .15s ease,background-color .15s ease}.uiny-sugestao:hover:not(:disabled){border-color:var(--uiny-primaria, #7366ff);background:var(--uiny-aviso-fundo, #f1effe)}.uiny-sugestao:disabled{opacity:.5;cursor:not-allowed}.uiny-sugestao:focus-visible{outline:2px solid var(--uiny-primaria, #7366ff);outline-offset:2px}.uiny-capacidades{font-size:13px;color:var(--uiny-texto-suave, #6b6b80)}.uiny-capacidades ul{margin:0;padding-left:18px}.uiny-capacidades li+li{margin-top:2px}.uiny-capacidades__titulo{margin:0 0 4px;font-weight:600;color:var(--uiny-texto, #2b2b2b)}.uiny-msg{display:flex;flex-direction:column;margin-top:14px}.uiny-msg:first-of-type{margin-top:0}.uiny-msg--usuario{align-items:flex-end}.uiny-msg--usuario .uiny-msg__balao{max-width:85%;padding:9px 13px;border-radius:16px 16px 4px;background:var(--uiny-primaria, #7366ff);color:#fff}.uiny-msg--assistente{align-items:stretch}.uiny-msg--assistente .uiny-msg__balao{max-width:100%;color:var(--uiny-texto, #2b2b2b)}.uiny-msg--falha .uiny-msg__balao{opacity:.65}.uiny-msg__simples{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;line-height:1.45}.uiny-msg__meta{margin-top:3px;font-size:11px;color:var(--uiny-texto-suave, #6b6b80)}.uiny-msg__meta time{opacity:.8}.uiny-msg__nao-enviada{display:inline-flex;align-items:center;gap:3px;color:var(--uiny-erro, #d9364f)}.uiny-msg__opcoes{margin-top:8px}.uiny-msgs__acao-solta{display:block;margin-top:14px}.uiny-digitando{display:flex;align-items:center;gap:8px;margin-top:14px;color:var(--uiny-texto-suave, #6b6b80);font-size:13px}.uiny-digitando__pontos{display:inline-flex;gap:3px}.uiny-digitando__pontos i{width:6px;height:6px;border-radius:50%;background:var(--uiny-primaria, #7366ff);animation:uiny-pulsar 1.2s ease-in-out infinite}.uiny-digitando__pontos i:nth-child(2){animation-delay:.15s}.uiny-digitando__pontos i:nth-child(3){animation-delay:.3s}.uiny-novas{position:absolute;left:50%;bottom:10px;transform:translate(-50%);display:inline-flex;align-items:center;gap:4px;padding:6px 12px;border:0;border-radius:999px;background:var(--uiny-primaria, #7366ff);color:#fff;font-size:12px;font-weight:600;box-shadow:0 6px 16px #1f1b4d33;cursor:pointer}.uiny-novas:focus-visible{outline:2px solid var(--uiny-primaria, #7366ff);outline-offset:2px}.uiny-sr{position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}@keyframes uiny-girar{to{transform:rotate(360deg)}}@keyframes uiny-pulsar{0%,80%,to{opacity:.25;transform:scale(.8)}40%{opacity:1;transform:scale(1)}}@media (prefers-reduced-motion: reduce){.uiny-digitando__pontos i{animation:none;opacity:.6}.uiny-spinner{animation-duration:2.4s}.uiny-sugestao{transition:none}}\n"] }]
|
|
116
|
+
}], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { mensagens: [{
|
|
117
|
+
type: Input
|
|
118
|
+
}], acoes: [{
|
|
119
|
+
type: Input
|
|
120
|
+
}], enviando: [{
|
|
121
|
+
type: Input
|
|
122
|
+
}], carregando: [{
|
|
123
|
+
type: Input
|
|
124
|
+
}], sugestoes: [{
|
|
125
|
+
type: Input
|
|
126
|
+
}], capacidades: [{
|
|
127
|
+
type: Input
|
|
128
|
+
}], temAlteracoes: [{
|
|
129
|
+
type: Input
|
|
130
|
+
}], podeEnviar: [{
|
|
131
|
+
type: Input
|
|
132
|
+
}], sugestao: [{
|
|
133
|
+
type: Output
|
|
134
|
+
}], confirmar: [{
|
|
135
|
+
type: Output
|
|
136
|
+
}], cancelar: [{
|
|
137
|
+
type: Output
|
|
138
|
+
}], verificar: [{
|
|
139
|
+
type: Output
|
|
140
|
+
}], area: [{
|
|
141
|
+
type: ViewChild,
|
|
142
|
+
args: ['area', { static: true }]
|
|
143
|
+
}] } });
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktYXNzaXN0YW50LW1lc3NhZ2VzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLWhlYWRlci9zcmMvbGliL2Fzc2lzdGFudC9jb21wb25lbnRzL2Fzc2lzdGFudC1tZXNzYWdlcy91aS1hc3Npc3RhbnQtbWVzc2FnZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktaGVhZGVyL3NyYy9saWIvYXNzaXN0YW50L2NvbXBvbmVudHMvYXNzaXN0YW50LW1lc3NhZ2VzL3VpLWFzc2lzdGFudC1tZXNzYWdlcy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUdOLE1BQU0sRUFFTixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7Ozs7OztBQUd2QixxRkFBcUY7QUFDckYsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBUXhCLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnJDLFlBQW9CLEdBQXNCLEVBQUUsSUFBWTtRQUFwQyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQXJCakMsY0FBUyxHQUFtQixFQUFFLENBQUM7UUFDL0IsVUFBSyxHQUErQixFQUFFLENBQUM7UUFDdkMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUNqQixlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGNBQVMsR0FBYSxFQUFFLENBQUM7UUFDekIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0Isa0JBQWEsR0FBRyxLQUFLLENBQUM7UUFDdEIsZUFBVSxHQUFHLElBQUksQ0FBQztRQUVqQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN0QyxjQUFTLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztR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QXJCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUU4QixJQUFJO3NCQUF4QyxTQUFTO3VCQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBDb21wb25lbnQsXHJcbiAgICBFbGVtZW50UmVmLFxyXG4gICAgRXZlbnRFbWl0dGVyLFxyXG4gICAgSW5wdXQsXHJcbiAgICBOZ1pvbmUsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBPdXRwdXQsXHJcbiAgICBTaW1wbGVDaGFuZ2VzLFxyXG4gICAgVmlld0NoaWxkXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFVpbnlBY2FvLCBVaW55TWVuc2FnZW0gfSBmcm9tICcuLi8uLi9tb2RlbHMvdWlueS5tb2RlbHMnO1xyXG5cclxuLyoqIERpc3TDom5jaWEgZG8gZmltIChweCkgYXTDqSBvbmRlIGFpbmRhIGNvbnNpZGVyYW1vcyBxdWUgbyB1c3XDoXJpbyBlc3TDoSBcIm5vIGZpbVwiLiAqL1xyXG5jb25zdCBQRVJUT19ET19GSU0gPSA5NjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICd1aS1hc3Npc3RhbnQtbWVzc2FnZXMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL3VpLWFzc2lzdGFudC1tZXNzYWdlcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi91aS1hc3Npc3RhbnQtbWVzc2FnZXMuY29tcG9uZW50LnNjc3MnXSxcclxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBVaUFzc2lzdGFudE1lc3NhZ2VzQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBBZnRlclZpZXdDaGVja2VkLCBPbkRlc3Ryb3kge1xyXG5cclxuICAgIEBJbnB1dCgpIG1lbnNhZ2VuczogVWlueU1lbnNhZ2VtW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIGFjb2VzOiB7IFtpZDogc3RyaW5nXTogVWlueUFjYW8gfSA9IHt9O1xyXG4gICAgQElucHV0KCkgZW52aWFuZG8gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIGNhcnJlZ2FuZG8gPSBmYWxzZTtcclxuICAgIEBJbnB1dCgpIHN1Z2VzdG9lczogc3RyaW5nW10gPSBbXTtcclxuICAgIEBJbnB1dCgpIGNhcGFjaWRhZGVzOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgQElucHV0KCkgdGVtQWx0ZXJhY29lcyA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgcG9kZUVudmlhciA9IHRydWU7XHJcblxyXG4gICAgQE91dHB1dCgpIHN1Z2VzdGFvID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgICBAT3V0cHV0KCkgY29uZmlybWFyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgICBAT3V0cHV0KCkgY2FuY2VsYXIgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuICAgIEBPdXRwdXQoKSB2ZXJpZmljYXIgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdhcmVhJywgeyBzdGF0aWM6IHRydWUgfSkgYXJlYTogRWxlbWVudFJlZjxIVE1MRWxlbWVudD47XHJcblxyXG4gICAgcHVibGljIG5vdmFzID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIHBlcnRvRG9GaW0gPSB0cnVlO1xyXG4gICAgcHJpdmF0ZSByb2xhclBlbmRlbnRlID0gdHJ1ZTtcclxuICAgIHByaXZhdGUgcmVtb3ZlclNjcm9sbDogKCkgPT4gdm9pZDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHpvbmU6IE5nWm9uZSkge1xyXG4gICAgICAgIC8vIG8gbGlzdGVuZXIgcm9kYSBmb3JhIGRhIHpvbmE6IHPDsyByZWVudHJhIHF1YW5kbyBvIGluZGljYWRvciBtdWRhXHJcbiAgICAgICAgem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLmFyZWE/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgICAgIGlmICghZWwpIHJldHVybjtcclxuICAgICAgICAgICAgY29uc3QgYW9Sb2xhciA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHBlcnRvID0gdGhpcy5jYWxjdWxhclBlcnRvRG9GaW0oKTtcclxuICAgICAgICAgICAgICAgIGlmIChwZXJ0byA9PT0gdGhpcy5wZXJ0b0RvRmltKSByZXR1cm47XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBlcnRvRG9GaW0gPSBwZXJ0bztcclxuICAgICAgICAgICAgICAgIGlmIChwZXJ0byAmJiB0aGlzLm5vdmFzKSB6b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3ZhcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGFvUm9sYXIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcclxuICAgICAgICAgICAgdGhpcy5yZW1vdmVyU2Nyb2xsID0gKCkgPT4gZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgYW9Sb2xhcik7XHJcbiAgICAgICAgfSkpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBtdWRvdSA9IGNoYW5nZXNbJ21lbnNhZ2VucyddIHx8IGNoYW5nZXNbJ2VudmlhbmRvJ10gfHwgY2hhbmdlc1snYWNvZXMnXTtcclxuICAgICAgICBpZiAoIW11ZG91KSByZXR1cm47XHJcblxyXG4gICAgICAgIGNvbnN0IG1lbnNhZ2Vuc011ZGFyYW0gPSAhIWNoYW5nZXNbJ21lbnNhZ2VucyddO1xyXG4gICAgICAgIGNvbnN0IGFudGVyaW9yOiBVaW55TWVuc2FnZW1bXSA9IGNoYW5nZXNbJ21lbnNhZ2VucyddPy5wcmV2aW91c1ZhbHVlIHx8IFtdO1xyXG4gICAgICAgIGNvbnN0IGF0dWFsID0gdGhpcy5tZW5zYWdlbnMgfHwgW107XHJcbiAgICAgICAgY29uc3QgY29udmVyc2FUcm9jYWRhID0gbWVuc2FnZW5zTXVkYXJhbSAmJiAoIWFudGVyaW9yLmxlbmd0aCB8fCAhYXR1YWwubGVuZ3RoIHx8IGFudGVyaW9yWzBdPy5pZCAhPT0gYXR1YWxbMF0/LmlkKTtcclxuICAgICAgICBjb25zdCB1bHRpbWEgPSBhdHVhbFthdHVhbC5sZW5ndGggLSAxXTtcclxuICAgICAgICAvLyBxdWVtIGFjYWJvdSBkZSBlbnZpYXIgcXVlciB2ZXIgYSBwcsOzcHJpYSBtZW5zYWdlbVxyXG4gICAgICAgIGNvbnN0IHVsdGltYURvVXN1YXJpbyA9IG1lbnNhZ2Vuc011ZGFyYW0gJiYgdWx0aW1hPy5wYXBlbCA9PT0gJ3VzdWFyaW8nICYmIHVsdGltYS5pZC5zdGFydHNXaXRoKCdsb2NhbC0nKTtcclxuXHJcbiAgICAgICAgaWYgKGNvbnZlcnNhVHJvY2FkYSB8fCB1bHRpbWFEb1VzdWFyaW8gfHwgdGhpcy5wZXJ0b0RvRmltKSB7XHJcbiAgICAgICAgICAgIHRoaXMucm9sYXJQZW5kZW50ZSA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtZW5zYWdlbnNNdWRhcmFtICYmIGF0dWFsLmxlbmd0aCA+IGFudGVyaW9yLmxlbmd0aCkge1xyXG4gICAgICAgICAgICAvLyBvIHVzdcOhcmlvIGVzdMOhIGxlbmRvIG1lbnNhZ2VucyBhbnRpZ2FzOiBwcmVzZXJ2YSBhIHBvc2nDp8Ojb1xyXG4gICAgICAgICAgICB0aGlzLm5vdmFzID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICghdGhpcy5yb2xhclBlbmRlbnRlKSByZXR1cm47XHJcbiAgICAgICAgdGhpcy5yb2xhclBlbmRlbnRlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pclBhcmFPRmltKGZhbHNlKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnJlbW92ZXJTY3JvbGw/LigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlyUGFyYU9GaW0oc3VhdmUgPSB0cnVlKTogdm9pZCB7XHJcbiAgICAgICAgY29uc3QgZWwgPSB0aGlzLmFyZWE/Lm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgaWYgKCFlbCkgcmV0dXJuO1xyXG4gICAgICAgIGNvbnN0IHJlZHV6aXIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cubWF0Y2hNZWRpYT8uKCcocHJlZmVycy1yZWR1Y2VkLW1vdGlvbjogcmVkdWNlKScpLm1hdGNoZXM7XHJcbiAgICAgICAgaWYgKHN1YXZlICYmICFyZWR1emlyICYmIGVsLnNjcm9sbFRvKSB7XHJcbiAgICAgICAgICAgIGVsLnNjcm9sbFRvKHsgdG9wOiBlbC5zY3JvbGxIZWlnaHQsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBlbC5zY3JvbGxUb3AgPSBlbC5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucGVydG9Eb0ZpbSA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMubm92YXMpIHtcclxuICAgICAgICAgICAgdGhpcy5ub3ZhcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYWNhb0RhKG1lbnNhZ2VtOiBVaW55TWVuc2FnZW0pOiBVaW55QWNhbyB8IG51bGwge1xyXG4gICAgICAgIHJldHVybiBtZW5zYWdlbS5pZEFjYW8gPyB0aGlzLmFjb2VzPy5bbWVuc2FnZW0uaWRBY2FvXSA/PyBudWxsIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQcOnw7VlcyBkZXZvbHZpZGFzIHBlbGEgQVBJIHNlbSBtZW5zYWdlbSBxdWUgYXMgcmVmZXJlbmNpZTogYXBhcmVjZW0gbm8gZmltLiAqL1xyXG4gICAgZ2V0IGFjb2VzU2VtTWVuc2FnZW0oKTogVWlueUFjYW9bXSB7XHJcbiAgICAgICAgY29uc3QgcmVmZXJlbmNpYWRhcyA9IG5ldyBTZXQoKHRoaXMubWVuc2FnZW5zIHx8IFtdKS5tYXAobSA9PiBtLmlkQWNhbykuZmlsdGVyKEJvb2xlYW4pKTtcclxuICAgICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLmFjb2VzIHx8IHt9KS5maWx0ZXIoYSA9PiAhcmVmZXJlbmNpYWRhcy5oYXMoYS5pZCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHRyYWNrTWVuc2FnZW0oXzogbnVtYmVyLCBtOiBVaW55TWVuc2FnZW0pIHtcclxuICAgICAgICByZXR1cm4gbS5pZDtcclxuICAgIH1cclxuXHJcbiAgICB0cmFja0FjYW8oXzogbnVtYmVyLCBhOiBVaW55QWNhbykge1xyXG4gICAgICAgIHJldHVybiBhLmlkO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXJQZXJ0b0RvRmltKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IGVsID0gdGhpcy5hcmVhLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgICAgcmV0dXJuIGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodCA8PSBQRVJUT19ET19GSU07XHJcbiAgICB9XHJcbn1cclxuIiwiPGRpdiAjYXJlYSBjbGFzcz1cInVpbnktbXNnc1wiIHJvbGU9XCJsb2dcIiBhcmlhLWxpdmU9XCJvZmZcIiBhcmlhLWxhYmVsPVwiTWVuc2FnZW5zIGRhIGNvbnZlcnNhIGNvbSBhIFVpbnlcIiB0YWJpbmRleD1cIjBcIj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiY2FycmVnYW5kb1wiIGNsYXNzPVwidWlueS1tc2dzX19jYXJyZWdhbmRvXCIgcm9sZT1cInN0YXR1c1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidWlueS1zcGlubmVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPiBDYXJyZWdhbmRvIGEgY29udmVyc2HigKZcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCIhY2FycmVnYW5kbyAmJiAhbWVuc2FnZW5zPy5sZW5ndGhcIiBjbGFzcz1cInVpbnktYm9hcy12aW5kYXNcIj5cclxuICAgICAgICA8cCBjbGFzcz1cInVpbnktYm9hcy12aW5kYXNfX3RpdHVsb1wiPk9sw6EhIEV1IHNvdSBhIFVpbnkuPC9wPlxyXG4gICAgICAgIDxwIGNsYXNzPVwidWlueS1ib2FzLXZpbmRhc19fdGV4dG9cIj5Tb3UgYSBhc3Npc3RlbnRlIHZpcnR1YWwgZGEgVWlzaG9wLiBDb250ZSBvIHF1ZSB2b2PDqiBwcmVjaXNhIGUgZXUgYWp1ZG8gcG9yIGFxdWkuPC9wPlxyXG4gICAgICAgIDxwICpuZ0lmPVwidGVtQWx0ZXJhY29lc1wiIGNsYXNzPVwidWlueS1ib2FzLXZpbmRhc19fbm90YVwiPlxyXG4gICAgICAgICAgICA8dWktaWNvbiBpY29uPVwidmVyaWZpZWRfdXNlclwiIHNpemU9XCIxNlwiPjwvdWktaWNvbj5cclxuICAgICAgICAgICAgPHNwYW4+QW50ZXMgZGUgYWx0ZXJhciBxdWFscXVlciBpbmZvcm1hw6fDo28sIGV1IG1vc3RybyBvIHF1ZSB2YWkgbXVkYXIgZSBzw7Mgc2lnbyBjb20gYSBzdWEgY29uZmlybWHDp8Ojby48L3NwYW4+XHJcbiAgICAgICAgPC9wPlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic3VnZXN0b2VzPy5sZW5ndGhcIiBjbGFzcz1cInVpbnktc3VnZXN0b2VzXCIgYXJpYS1sYWJlbD1cIlN1Z2VzdMO1ZXNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdGb3I9XCJsZXQgcyBvZiBzdWdlc3RvZXNcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJ1aW55LXN1Z2VzdGFvXCIgW2Rpc2FibGVkXT1cIiFwb2RlRW52aWFyXCIgKGNsaWNrKT1cInN1Z2VzdGFvLmVtaXQocylcIj5cclxuICAgICAgICAgICAgICAgIHt7IHMgfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjYXBhY2lkYWRlcz8ubGVuZ3RoXCIgY2xhc3M9XCJ1aW55LWNhcGFjaWRhZGVzXCI+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwidWlueS1jYXBhY2lkYWRlc19fdGl0dWxvXCI+UG9zc28gYWp1ZGFyIGNvbTo8L3A+XHJcbiAgICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgYyBvZiBjYXBhY2lkYWRlc1wiPnt7IGMgfX08L2xpPlxyXG4gICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiAqbmdGb3I9XCJsZXQgbSBvZiBtZW5zYWdlbnM7IHRyYWNrQnk6IHRyYWNrTWVuc2FnZW1cIiBjbGFzcz1cInVpbnktbXNnXCJcclxuICAgICAgICBbY2xhc3MudWlueS1tc2ctLXVzdWFyaW9dPVwibS5wYXBlbCA9PT0gJ3VzdWFyaW8nXCJcclxuICAgICAgICBbY2xhc3MudWlueS1tc2ctLWFzc2lzdGVudGVdPVwibS5wYXBlbCAhPT0gJ3VzdWFyaW8nXCJcclxuICAgICAgICBbY2xhc3MudWlueS1tc2ctLWZhbGhhXT1cIm0uZXJyb1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidWlueS1zclwiPnt7IG0ucGFwZWwgPT09ICd1c3VhcmlvJyA/ICdWb2PDqjonIDogJ1Vpbnk6JyB9fTwvc3Bhbj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWlueS1tc2dfX2JhbGFvXCI+XHJcbiAgICAgICAgICAgIDxwICpuZ0lmPVwibS5wYXBlbCA9PT0gJ3VzdWFyaW8nXCIgY2xhc3M9XCJ1aW55LW1zZ19fc2ltcGxlc1wiPnt7IG0udGV4dG8gfX08L3A+XHJcbiAgICAgICAgICAgIDx1aS1hc3Npc3RhbnQtdGV4dCAqbmdJZj1cIm0ucGFwZWwgIT09ICd1c3VhcmlvJ1wiIFt0ZXh0b109XCJtLnRleHRvXCI+PC91aS1hc3Npc3RhbnQtdGV4dD5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHVpLWFzc2lzdGFudC1hY3Rpb24tY2FyZCAqbmdJZj1cImFjYW9EYShtKSBhcyBhY2FvXCIgW2FjYW9dPVwiYWNhb1wiXHJcbiAgICAgICAgICAgIChjb25maXJtYXIpPVwiY29uZmlybWFyLmVtaXQoJGV2ZW50KVwiIChjYW5jZWxhcik9XCJjYW5jZWxhci5lbWl0KCRldmVudClcIiAodmVyaWZpY2FyKT1cInZlcmlmaWNhci5lbWl0KCRldmVudClcIj5cclxuICAgICAgICA8L3VpLWFzc2lzdGFudC1hY3Rpb24tY2FyZD5cclxuXHJcbiAgICAgICAgPCEtLSBlc2NsYXJlY2ltZW50bzogb3DDp8O1ZXMgc8OzIG5hIMO6bHRpbWEgbWVuc2FnZW0sIGVudmlhZGFzIGNvbW8gdGV4dG8gLS0+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIm0ub3Bjb2VzPy5sZW5ndGggJiYgbSA9PT0gbWVuc2FnZW5zW21lbnNhZ2Vucy5sZW5ndGggLSAxXVwiIGNsYXNzPVwidWlueS1zdWdlc3RvZXMgdWlueS1tc2dfX29wY29lc1wiIGFyaWEtbGFiZWw9XCJPcMOnw7VlcyBkZSByZXNwb3N0YVwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBvIG9mIG0ub3Bjb2VzXCIgdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwidWlueS1zdWdlc3Rhb1wiIFtkaXNhYmxlZF09XCIhcG9kZUVudmlhciB8fCBlbnZpYW5kb1wiIChjbGljayk9XCJzdWdlc3Rhby5lbWl0KG8pXCI+XHJcbiAgICAgICAgICAgICAgICB7eyBvIH19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidWlueS1tc2dfX21ldGFcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtLmVycm9cIiBjbGFzcz1cInVpbnktbXNnX19uYW8tZW52aWFkYVwiPlxyXG4gICAgICAgICAgICAgICAgPHVpLWljb24gaWNvbj1cImVycm9yXCIgc2l6ZT1cIjE0XCI+PC91aS1pY29uPiBOw6NvIGVudmlhZGFcclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8dGltZSAqbmdJZj1cIm0uY3JpYWRhRW0gJiYgIW0uZXJyb1wiIFthdHRyLmRhdGV0aW1lXT1cIm0uY3JpYWRhRW0udG9JU09TdHJpbmcoKVwiPnt7IG0uY3JpYWRhRW0gfCBkYXRlOidISDptbScgfX08L3RpbWU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8dWktYXNzaXN0YW50LWFjdGlvbi1jYXJkICpuZ0Zvcj1cImxldCBhY2FvIG9mIGFjb2VzU2VtTWVuc2FnZW07IHRyYWNrQnk6IHRyYWNrQWNhb1wiIGNsYXNzPVwidWlueS1tc2dzX19hY2FvLXNvbHRhXCIgW2FjYW9dPVwiYWNhb1wiXHJcbiAgICAgICAgKGNvbmZpcm1hcik9XCJjb25maXJtYXIuZW1pdCgkZXZlbnQpXCIgKGNhbmNlbGFyKT1cImNhbmNlbGFyLmVtaXQoJGV2ZW50KVwiICh2ZXJpZmljYXIpPVwidmVyaWZpY2FyLmVtaXQoJGV2ZW50KVwiPlxyXG4gICAgPC91aS1hc3Npc3RhbnQtYWN0aW9uLWNhcmQ+XHJcblxyXG4gICAgPGRpdiAqbmdJZj1cImVudmlhbmRvXCIgY2xhc3M9XCJ1aW55LWRpZ2l0YW5kb1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwidWlueS1kaWdpdGFuZG9fX3BvbnRvc1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjxpPjwvaT48aT48L2k+PGk+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cInVpbnktZGlnaXRhbmRvX190ZXh0b1wiPkEgVWlueSBlc3TDoSBwZW5zYW5kb+KApjwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxidXR0b24gKm5nSWY9XCJub3Zhc1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInVpbnktbm92YXNcIiAoY2xpY2spPVwiaXJQYXJhT0ZpbSgpXCI+XHJcbiAgICA8dWktaWNvbiBpY29uPVwiYXJyb3dfZG93bndhcmRcIiBzaXplPVwiMTZcIj48L3VpLWljb24+IE5vdmFzIG1lbnNhZ2Vuc1xyXG48L2J1dHRvbj5cclxuIl19
|