@aakash58/chatbot 1.0.85 → 1.0.87

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, Output, Input, Component, ViewChild, HostListener, Directive, signal, Injectable, Inject, inject, InjectionToken, computed, effect, ElementRef, APP_INITIALIZER, ChangeDetectionStrategy } from '@angular/core';
2
+ import { EventEmitter, Output, Input, Component, ViewChild, HostListener, Directive, signal, Injectable, Inject, inject, InjectionToken, computed, effect, ElementRef, ChangeDetectionStrategy, provideAppInitializer } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
5
  import * as i1$1 from '@angular/material/icon';
@@ -13,13 +13,14 @@ import * as i2 from '@angular/material/button';
13
13
  import { MatButtonModule } from '@angular/material/button';
14
14
  import * as i4 from '@angular/forms';
15
15
  import { FormsModule } from '@angular/forms';
16
- import { Subject, throwError, timer, of, firstValueFrom, delay, retry as retry$1, map as map$1, catchError as catchError$1, Observable } from 'rxjs';
16
+ import { Subject, throwError, timer, of, delay, retry as retry$1, map as map$1, catchError as catchError$1, firstValueFrom, Observable, tap } from 'rxjs';
17
17
  import * as i1$4 from '@angular/common/http';
18
- import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
18
+ import { HttpClient, HttpHeaders, HttpErrorResponse, provideHttpClient, HTTP_INTERCEPTORS, withInterceptorsFromDi } from '@angular/common/http';
19
19
  import { timeout, map, catchError, retry } from 'rxjs/operators';
20
20
  import * as CryptoJS from 'crypto-js';
21
21
  import { JwtHelperService } from '@auth0/angular-jwt';
22
22
  import * as i1$5 from '@angular/router';
23
+ import { bootstrapApplication } from '@angular/platform-browser';
23
24
 
24
25
  const appConst = {
25
26
  //LIVE ASSETS
@@ -37,7 +38,7 @@ const appConst = {
37
38
  // base64_ASSETS
38
39
  APP_LOGO: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTMwIiBoZWlnaHQ9IjEzMCIgdmlld0JveD0iMCAwIDEzMCAxMzAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzY3XzE1OTgpIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzIzNjdfMTU5OCkiPgo8cGF0aCBkPSJNNiA2SDEyNFYxMjRINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNjdfMTU5OCkiLz4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZF8yMzY3XzE1OTgpIj4KPHBhdGggZD0iTTkxLjQ3MTcgMzguNTAyOUM3Ny43OTcgNTMuMzc4NCA3Ny44NTYyIDc2LjI2NzYgOTEuNjA3NCA5MS4wNzIzTDkyLjgwNDcgOTIuMzYxM0w5Mi43NzM0IDkyLjMzMkw5Mi44MDk2IDkyLjM2OTFMMzEuMTQzNiAxNTMuMzEyTDE0LjIzOTMgMTM2LjIwN0wxMy4zNDM4IDEzNy4wOTNMLTcgMTE2LjUwN0wtNi4zMTkzNCAxMTUuODMzTC0yMy45MDE0IDk4LjA0MkwzNy41MDY4IDM3LjM1NDVMMzcuNjE0MyAzNy40NjI5TDM3LjUwODggMzcuMzQ5NkwzOC44MDQ3IDM4LjU0MUM1My42Nzg4IDUyLjIxNjUgNzYuNTY4NSA1Mi4xNTYxIDkxLjM3MyAzOC40MDUzTDkyLjY2MzEgMzcuMjA3TDkxLjQ3MTcgMzguNTAyOVoiIGZpbGw9IiNFRUVFRUUiLz4KPC9nPgo8cGF0aCBkPSJNNC41NjQ5NCAxMjYuNDE4TDM5LjMzNTkgOTIuMDU0OEM1NC4xODkyIDc3LjM3NTYgNzguMTMwMSA3Ny41MTY4IDkyLjgwOTIgOTIuMzcwMVY5Mi4zNzAxTDMxLjE0MzkgMTUzLjMxMkw0LjU2NDk0IDEyNi40MThaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXJfMjM2N18xNTk4KSIvPgo8cGF0aCBkPSJNLTIzLjkwMTQgOTguMDQyTDM3LjUwNjQgMzcuMzU0NEM1Mi41NTc5IDUyLjU4NDUgNTIuNDEzMSA3Ny4xMzI2IDM3LjE4MyA5Mi4xODQxTDMuMzUxNzkgMTI1LjYxOUwtMjMuOTAxNCA5OC4wNDJaIiBmaWxsPSJ1cmwoI3BhaW50Ml9saW5lYXJfMjM2N18xNTk4KSIvPgo8L2c+CjwvZz4KPGRlZnM+CjxmaWx0ZXIgaWQ9ImZpbHRlcjBfZF8yMzY3XzE1OTgiIHg9Ii0yNy45MDE0IiB5PSIzNy4yMDciIHdpZHRoPSIxMjQuNzExIiBoZWlnaHQ9IjEyNC4xMDQiIGZpbHRlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzPSJzUkdCIj4KPGZlRmxvb2QgZmxvb2Qtb3BhY2l0eT0iMCIgcmVzdWx0PSJCYWNrZ3JvdW5kSW1hZ2VGaXgiLz4KPGZlQ29sb3JNYXRyaXggaW49IlNvdXJjZUFscGhhIiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMTI3IDAiIHJlc3VsdD0iaGFyZEFscGhhIi8+CjxmZU9mZnNldCBkeT0iNCIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIyIi8+CjxmZUNvbXBvc2l0ZSBpbjI9ImhhcmRBbHBoYSIgb3BlcmF0b3I9Im91dCIvPgo8ZmVDb2xvck1hdHJpeCB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMC4yNSAwIi8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW4yPSJCYWNrZ3JvdW5kSW1hZ2VGaXgiIHJlc3VsdD0iZWZmZWN0MV9kcm9wU2hhZG93XzIzNjdfMTU5OCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImVmZmVjdDFfZHJvcFNoYWRvd18yMzY3XzE1OTgiIHJlc3VsdD0ic2hhcGUiLz4KPC9maWx0ZXI+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzY3XzE1OTgiIHgxPSI2LjAwMjYzIiB5MT0iNiIgeDI9IjEyMy45OTciIHkyPSIxMjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDFfbGluZWFyXzIzNjdfMTU5OCIgeDE9Ijc5Ljk2OTMiIHkxPSI3OS4zNzc5IiB4Mj0iNzYuMjk3NCIgeTI9IjE0Mi44MTkiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNjdfMTU5OCIgeDE9IjUwLjkzMjkiIHkxPSI1MC45NDAzIiB4Mj0iNDcuMTg1MiIgeTI9IjExNS4zNjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGNsaXBQYXRoIGlkPSJjbGlwMF8yMzY3XzE1OTgiPgo8cmVjdCB3aWR0aD0iMTE4IiBoZWlnaHQ9IjExOCIgZmlsbD0id2hpdGUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDYgNikiLz4KPC9jbGlwUGF0aD4KPGNsaXBQYXRoIGlkPSJjbGlwMV8yMzY3XzE1OTgiPgo8cGF0aCBkPSJNNiA2SDk0QzExMC41NjkgNiAxMjQgMTkuNDMxNSAxMjQgMzZWOTRDMTI0IDExMC41NjkgMTEwLjU2OSAxMjQgOTQgMTI0SDZWNloiIGZpbGw9IndoaXRlIi8+CjwvY2xpcFBhdGg+CjwvZGVmcz4KPC9zdmc+Cg==',
39
40
  APP_TEXT_LOGO: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDc3IiBoZWlnaHQ9Ijk0IiB2aWV3Qm94PSIwIDAgNDc3IDk0IiBmaWxsPSJub25lIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCBkPSJNNDUzLjkzMiA4Ny4wMjZDNDUyLjI0OSA4Ny4wMjYgNDUxLjI4NyA4Ni40MjUgNDUwLjA4NSA4NS4yMjI5TDQ0My43MTQgNzkuODEzNkM0NDIuNTEyIDc4LjYxMTUgNDQxLjkxMSA3Ny4yODkyIDQ0MS45MTEgNzUuNDg2MVY0MC44NjYySDQzMy42MTdWMzIuNDUxNkw0NDkuMTI0IDE1LjAyMTVINDUzLjIxMVYzMS4yNDk2SDQ3MC42NDFWNDAuODY2Mkg0NTMuMjExVjc2LjY4ODJINDcxLjAwMlY4Ny4wMjZINDUzLjkzMloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTM3NS44MTkgODcuMDE4N0MzNzQuNjE3IDg3LjAxODcgMzczLjA1NCA4Ni42NTggMzcxLjQ5MiA4NS4wOTUzTDM2Ni4yMDIgNzkuODA2MkMzNjUuMTIgNzguNjA0MSAzNjQuNjQgNzcuMDQxNCAzNjQuNjQgNzUuNTk4OVY0Mi42NjE5QzM2NC42NCA0MC45NzkgMzY1LjI0MSAzOS41MzY1IDM2Ni4yMDIgMzguNDU0N0wzNzEuNDkyIDMzLjE2NTVDMzcyLjkzNCAzMS43MjMgMzc0LjQ5NyAzMS4yNDIyIDM3NS44MTkgMzEuMjQyMkg0MTAuNjhDNDEyLjM2MyAzMS4yNDIyIDQxMy42ODUgMzEuODQzMiA0MTQuODg3IDMzLjA0NTNMNDIwLjI5NiAzOC4zMzQ0QzQyMS42MTkgMzkuNjU2NyA0MjIuMSA0MC45NzkgNDIyLjEgNDIuNjYxOVY3NS41OTg5QzQyMi4xIDc3LjI4MTggNDIxLjYxOSA3OC42MDQxIDQyMC4yOTYgNzkuOTI2NEw0MTQuODg3IDg1LjIxNTVDNDEzLjY4NSA4Ni40MTc2IDQxMi4zNjMgODcuMDE4NyA0MTAuNjggODcuMDE4N0gzNzUuODE5Wk0zNzUuOTM5IDc2LjgwMUg0MTAuOFY0MS40NTk5SDM3NS45MzlWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzQ5LjY0NCAzOC40NTYxQzM1MC44NDYgMzkuNzc4NCAzNTEuNDQ3IDQxLjEwMDcgMzUxLjQ0NyA0Mi43ODM2Vjc1LjYwMDRDMzUxLjQ0NyA3Ny4yODMzIDM1MC44NDYgNzguNjA1NiAzNDkuNjQ0IDc5LjkyNzlMMzQ0LjIzNCA4NS4yMTdDMzQzLjAzMiA4Ni41MzkzIDM0MS40NyA4Ny4wMjAxIDMzOS45MDcgODcuMDIwMUgzMTQuOTAzQzMxMi42MTkgODcuMDIwMSAzMTEuMjk3IDg2LjQxOTEgMzA5LjQ5NCA4NC40OTU4TDMwNi4xMjggODAuODg5NVY4Ny4wMjAxSDI5NC45NDlWNkgzMDYuMTI4VjM3LjM3NDNMMzA5LjQ5NCAzMy44ODgyQzMxMS40MTcgMzEuODQ0NyAzMTIuNjE5IDMxLjM2MzkgMzE0LjkwMyAzMS4zNjM5SDMzOS45MDdDMzQxLjU5IDMxLjM2MzkgMzQzLjAzMiAzMS44NDQ3IDM0NC4yMzQgMzMuMDQ2OEwzNDkuNjQ0IDM4LjQ1NjFaTTM0MC4xNDcgNzYuODAyNVY0MS40NjEzSDMwNi4xMjhWNzYuODAyNUgzNDAuMTQ3WiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMjc2LjUxMiAzOC40NTYxQzI3Ny43MTQgMzkuNzc4NCAyNzguMzE1IDQxLjEwMDcgMjc4LjMxNSA0Mi43ODM2Vjg3LjAyMDFIMjY3LjAxNlY0MS40NjEzSDIzMi44NzZWODcuMDIwMUgyMjEuNjk3VjZIMjMyLjg3NlYzNy40OTQ1TDIzNi4zNjIgMzMuODg4MkMyMzguNDA2IDMxLjg0NDcgMjM5LjQ4OCAzMS4zNjM5IDI0MS43NzIgMzEuMzYzOUgyNjYuNzc1QzI2OC40NTggMzEuMzYzOSAyNjkuOTAxIDMxLjg0NDcgMjcxLjEwMyAzMy4wNDY4TDI3Ni41MTIgMzguNDU2MVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTE2MC4wNTUgODcuMDE4N0MxNTguODUzIDg3LjAxODcgMTU3LjI5IDg2LjY1OCAxNTUuNzI3IDg1LjA5NTNMMTUwLjQzOCA3OS44MDYyQzE0OS4zNTYgNzguNjA0MSAxNDguODc1IDc3LjA0MTQgMTQ4Ljg3NSA3NS41OTg5VjQyLjY2MTlDMTQ4Ljg3NSA0MC45NzkgMTQ5LjQ3NyAzOS41MzY1IDE1MC40MzggMzguNDU0N0wxNTUuNzI3IDMzLjE2NTVDMTU3LjE3IDMxLjcyMyAxNTguNzMzIDMxLjI0MjIgMTYwLjA1NSAzMS4yNDIySDE5NC45MTZDMTk2LjU5OCAzMS4yNDIyIDE5Ny45MjEgMzEuODQzMiAxOTkuMTIzIDMzLjA0NTNMMjA0LjUzMiAzOC4zMzQ0QzIwNS44NTUgMzkuNjU2NyAyMDYuMzM1IDQwLjk3OSAyMDYuMzM1IDQyLjY2MTlWNzUuNTk4OUMyMDYuMzM1IDc3LjI4MTggMjA1Ljg1NSA3OC42MDQxIDIwNC41MzIgNzkuOTI2NEwxOTkuMTIzIDg1LjIxNTVDMTk3LjkyMSA4Ni40MTc2IDE5Ni41OTggODcuMDE4NyAxOTQuOTE2IDg3LjAxODdIMTYwLjA1NVpNMTYwLjE3NSA3Ni44MDFIMTk1LjAzNlY0MS40NTk5SDE2MC4xNzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNODguOTE0OCA4Ny4wMTg3Qzg3LjcxMjcgODcuMDE4NyA4Ni4xNSA4Ni42NTggODQuNTg3MyA4NS4wOTUzTDc5LjI5ODEgNzkuODA2MkM3OC4yMTYyIDc4LjYwNDEgNzcuNzM1NCA3Ny4wNDE0IDc3LjczNTQgNzUuNTk4OVY0Mi42NjE5Qzc3LjczNTQgNDAuOTc5IDc4LjMzNjQgMzkuNTM2NSA3OS4yOTgxIDM4LjQ1NDdMODQuNTg3MyAzMy4xNjU1Qzg2LjAyOTggMzEuNzIzIDg3LjU5MjUgMzEuMjQyMiA4OC45MTQ4IDMxLjI0MjJIMTIzLjc3NUMxMjUuNDU4IDMxLjI0MjIgMTI2Ljc4MSAzMS44NDMyIDEyNy45ODMgMzMuMDQ1M0wxMzMuMzkyIDM4LjMzNDRDMTM0LjcxNCAzOS42NTY3IDEzNS4xOTUgNDAuOTc5IDEzNS4xOTUgNDIuNjYxOVY3NS41OTg5QzEzNS4xOTUgNzcuMjgxOCAxMzQuNzE0IDc4LjYwNDEgMTMzLjM5MiA3OS45MjY0TDEyNy45ODMgODUuMjE1NUMxMjYuNzgxIDg2LjQxNzYgMTI1LjQ1OCA4Ny4wMTg3IDEyMy43NzUgODcuMDE4N0g4OC45MTQ4Wk04OS4wMzUgNzYuODAxSDEyMy44OTZWNDEuNDU5OUg4OS4wMzVWNzYuODAxWiIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNNTEuMTk4NiA2SDYyLjM3OFY4Ny4wMjAxSDUxLjE5ODZWODAuODg5NUw0Ny44MzI3IDg0LjQ5NThDNDYuMDI5NiA4Ni40MTkxIDQ0LjcwNzMgODcuMDIwMSA0Mi40MjMzIDg3LjAyMDFIMTcuNDE5OUMxNS44NTcxIDg3LjAyMDEgMTQuMjk0NCA4Ni41MzkzIDEzLjA5MjMgODUuMjE3TDcuODAzMTQgNzkuOTI3OUM2LjQ4MDg0IDc4LjYwNTYgNiA3Ny4yODMzIDYgNzUuNjAwNFY0Mi43ODM2QzYgNDEuMTAwNyA2LjQ4MDg0IDM5Ljc3ODQgNy44MDMxNCAzOC40NTYxTDEzLjA5MjMgMzMuMDQ2OEMxNC4yOTQ0IDMxLjg0NDcgMTUuNzM2OSAzMS4zNjM5IDE3LjQxOTkgMzEuMzYzOUg0Mi40MjMzQzQ0LjcwNzMgMzEuMzYzOSA0NS45MDk0IDMxLjg0NDcgNDcuODMyNyAzMy44ODgyTDUxLjE5ODYgMzcuMzc0M1Y2Wk0xNy4xNzk0IDc2LjgwMjVINTEuMTk4NlY0MS40NjEzSDE3LjE3OTRWNzYuODAyNVoiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTIxLjgzMyA1OC4xNTYySDI3LjQyMTNWNjMuNzQ0NUgyMS44MzNWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTMxLjE0NiA1OC4xNTYySDM2LjczNDNWNjMuNzQ0NUgzMS4xNDZWNTguMTU2MloiIGZpbGw9IiMyODAwRkYiLz4KPHBhdGggZD0iTTQwLjQ1ODUgNTguMTU2Mkg0Ni4wNDY4VjYzLjc0NDVINDAuNDU4NVY1OC4xNTYyWiIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzg3LjA4MiIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iNDAwLjcxMyIgY3k9IjU5LjI1NTIiIHJ4PSIzLjg5NDg3IiByeT0iMy44OTQ4NSIgZmlsbD0iIzI4MDBGRiIvPgo8ZWxsaXBzZSBjeD0iMzkzLjE5MiIgY3k9IjkuOTE4MjgiIHJ4PSIzLjcwNTQxIiByeT0iMy43MDUzOSIgZmlsbD0iIzI4MDBGRiIvPgo8cGF0aCBkPSJNMzgwLjIyNCAyOS4zNjkxQzM4MC4yMjQgMjguMTAyNCAzODEuNTUxIDI3LjAzMjQgMzgzLjkxMyAyNi4xMzY2QzM4Ni4yNzUgMjUuMjQwOSAzODkuNDc5IDI0LjczNzcgMzkyLjgxOSAyNC43Mzc3QzM5Ni4xNiAyNC43Mzc3IDM5OS4zNjMgMjUuMjQwOSA0MDEuNzI1IDI2LjEzNjZDNDA0LjA4OCAyNy4wMzI0IDQwNS4yMzQgMjguMTAyNCA0MDUuMjM0IDI5LjM2OTFIMzkyLjcyOUgzODAuMjI0WiIgZmlsbD0iIzI4MDBGRiIvPgo8cmVjdCB4PSIzOTEuMzQiIHk9IjEwLjg0MzgiIHdpZHRoPSIzLjcwNTQxIiBoZWlnaHQ9IjE1Ljc0NzkiIGZpbGw9IiMyODAwRkYiLz4KPC9zdmc+Cg==',
40
- APP_HEADER_LOGO: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjI2IiBoZWlnaHQ9IjEzMCIgdmlld0JveD0iMCAwIDYyNiAxMzAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzY3XzE1OTcpIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAxXzIzNjdfMTU5NykiPgo8cGF0aCBkPSJNNiA2SDEyNFYxMjRINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNjdfMTU5NykiLz4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjBfZF8yMzY3XzE1OTcpIj4KPHBhdGggZD0iTTkxLjQ3MTcgMzguNTAyOUM3Ny43OTcgNTMuMzc4NCA3Ny44NTYyIDc2LjI2NzYgOTEuNjA3NCA5MS4wNzIzTDkyLjgwNDcgOTIuMzYxM0w5Mi43NzM0IDkyLjMzMkw5Mi44MDk2IDkyLjM2OTFMMzEuMTQzNiAxNTMuMzEyTDE0LjIzOTMgMTM2LjIwN0wxMy4zNDM4IDEzNy4wOTNMLTcgMTE2LjUwN0wtNi4zMTkzNCAxMTUuODMzTC0yMy45MDE0IDk4LjA0MkwzNy41MDY4IDM3LjM1NDVMMzcuNjE0MyAzNy40NjI5TDM3LjUwODggMzcuMzQ5NkwzOC44MDQ3IDM4LjU0MUM1My42Nzg4IDUyLjIxNjUgNzYuNTY4NSA1Mi4xNTYxIDkxLjM3MyAzOC40MDUzTDkyLjY2MzEgMzcuMjA3TDkxLjQ3MTcgMzguNTAyOVoiIGZpbGw9IiNFRUVFRUUiLz4KPC9nPgo8cGF0aCBkPSJNNC41NjQ5NCAxMjYuNDE4TDM5LjMzNTkgOTIuMDU0OEM1NC4xODkyIDc3LjM3NTYgNzguMTMwMSA3Ny41MTY4IDkyLjgwOTIgOTIuMzcwMVY5Mi4zNzAxTDMxLjE0MzkgMTUzLjMxMkw0LjU2NDk0IDEyNi40MThaIiBmaWxsPSJ1cmwoI3BhaW50MV9saW5lYXJfMjM2N18xNTk3KSIvPgo8cGF0aCBkPSJNLTIzLjkwMTQgOTguMDQyTDM3LjUwNjQgMzcuMzU0NEM1Mi41NTc5IDUyLjU4NDUgNTIuNDEzMSA3Ny4xMzI2IDM3LjE4MyA5Mi4xODQxTDMuMzUxNzkgMTI1LjYxOUwtMjMuOTAxNCA5OC4wNDJaIiBmaWxsPSJ1cmwoI3BhaW50Ml9saW5lYXJfMjM2N18xNTk3KSIvPgo8L2c+CjwvZz4KPHBhdGggZD0iTTYwMi4yMTEgNTcuMjVINjE5LjY0MVY2Ni44NjYySDYwMi4yMTFWMTAyLjY4OEg2MjAuMDAyVjExMy4wMjZINjAyLjkzMkM2MDEuMjQ5IDExMy4wMjYgNjAwLjI4NyAxMTIuNDI1IDU5OS4wODUgMTExLjIyM0w1OTIuNzE0IDEwNS44MTNDNTkxLjUxMiAxMDQuNjEyIDU5MC45MTEgMTAzLjI4OSA1OTAuOTExIDEwMS40ODZWNjYuODY2Mkg1ODIuNjE3VjU4LjQ1MTJMNTk4LjEyNCA0MS4wMjE1SDYwMi4yMTFWNTcuMjVaTTIxMS4zNzggMTEzLjAyMUgyMDAuMTk4VjEwNi44OUwxOTYuODMzIDExMC40OTZDMTk1LjAzIDExMi40MTkgMTkzLjcwNyAxMTMuMDIxIDE5MS40MjMgMTEzLjAyMUgxNjYuNDJDMTY0Ljg1NyAxMTMuMDIxIDE2My4yOTUgMTEyLjUzOSAxNjIuMDkzIDExMS4yMTdMMTU2LjgwMyAxMDUuOTI4QzE1NS40ODEgMTA0LjYwNiAxNTUgMTAzLjI4MyAxNTUgMTAxLjYwMVY2OC43ODMyQzE1NSA2Ny4xMDA2IDE1NS40ODEgNjUuNzc4MiAxNTYuODAzIDY0LjQ1NjFMMTYyLjA5MyA1OS4wNDY5QzE2My4yOTUgNTcuODQ0OSAxNjQuNzM3IDU3LjM2NDMgMTY2LjQyIDU3LjM2NDNIMTkxLjQyM0MxOTMuNzA3IDU3LjM2NDMgMTk0LjkxIDU3Ljg0NTEgMTk2LjgzMyA1OS44ODg3TDIwMC4xOTggNjMuMzc0VjMySDIxMS4zNzhWMTEzLjAyMVpNMzgxLjg3NiA2My40OTQxTDM4NS4zNjIgNTkuODg4N0MzODcuNDA2IDU3Ljg0NTIgMzg4LjQ4OCA1Ny4zNjQzIDM5MC43NzEgNTcuMzY0M0g0MTUuNzc1QzQxNy40NTggNTcuMzY0MyA0MTguOTAxIDU3Ljg0NDkgNDIwLjEwMyA1OS4wNDY5TDQyNS41MTIgNjQuNDU2MUM0MjYuNzE0IDY1Ljc3ODIgNDI3LjMxNSA2Ny4xMDA1IDQyNy4zMTUgNjguNzgzMlYxMTMuMDIxSDQxNi4wMTZWNjcuNDYwOUgzODEuODc2VjExMy4wMjFIMzcwLjY5N1YzMkgzODEuODc2VjYzLjQ5NDFaTTQ1NS4xMjggNjMuMzc0TDQ1OC40OTQgNTkuODg4N0M0NjAuNDE3IDU3Ljg0NTIgNDYxLjYxOSA1Ny4zNjQzIDQ2My45MDMgNTcuMzY0M0g0ODguOTA3QzQ5MC41OSA1Ny4zNjQzIDQ5Mi4wMzIgNTcuODQ0OSA0OTMuMjM0IDU5LjA0NjlMNDk4LjY0NCA2NC40NTYxQzQ5OS44NDYgNjUuNzc4MiA1MDAuNDQ3IDY3LjEwMDUgNTAwLjQ0NyA2OC43ODMyVjEwMS42MDFDNTAwLjQ0NyAxMDMuMjgzIDQ5OS44NDYgMTA0LjYwNiA0OTguNjQ0IDEwNS45MjhMNDkzLjIzNCAxMTEuMjE3QzQ5Mi4wMzIgMTEyLjUzOSA0OTAuNDcgMTEzLjAyIDQ4OC45MDcgMTEzLjAyMUg0NjMuOTAzQzQ2MS42MiAxMTMuMDIgNDYwLjI5NyAxMTIuNDE5IDQ1OC40OTQgMTEwLjQ5Nkw0NTUuMTI4IDEwNi44OVYxMTMuMDIxSDQ0My45NDlWMzJINDU1LjEyOFY2My4zNzRaTTI3Mi43NzUgNTcuMjQyMkMyNzQuNDU4IDU3LjI0MjIgMjc1Ljc4IDU3Ljg0MzEgMjc2Ljk4MiA1OS4wNDQ5TDI4Mi4zOTMgNjQuMzM0QzI4My43MTUgNjUuNjU2MyAyODQuMTk1IDY2Ljk3OTIgMjg0LjE5NSA2OC42NjIxVjEwMS41OTlDMjg0LjE5NSAxMDMuMjgyIDI4My43MTUgMTA0LjYwNCAyODIuMzkzIDEwNS45MjdMMjc2Ljk4MiAxMTEuMjE2QzI3NS43OCAxMTIuNDE4IDI3NC40NTggMTEzLjAxOSAyNzIuNzc1IDExMy4wMTlIMjM3LjkxNUMyMzYuNzEzIDExMy4wMTkgMjM1LjE1IDExMi42NTggMjMzLjU4NyAxMTEuMDk2TDIyOC4yOTggMTA1LjgwN0MyMjcuMjE2IDEwNC42MDUgMjI2LjczNSAxMDMuMDQxIDIyNi43MzUgMTAxLjU5OVY2OC42NjIxQzIyNi43MzUgNjYuOTc5NCAyMjcuMzM2IDY1LjUzNjkgMjI4LjI5OCA2NC40NTUxTDIzMy41ODcgNTkuMTY1QzIzNS4wMjkgNTcuNzIyNiAyMzYuNTkzIDU3LjI0MjIgMjM3LjkxNSA1Ny4yNDIySDI3Mi43NzVaTTM0My45MTYgNTcuMjQyMkMzNDUuNTk5IDU3LjI0MjMgMzQ2LjkyMSA1Ny44NDMgMzQ4LjEyMyA1OS4wNDQ5TDM1My41MzIgNjQuMzM0QzM1NC44NTUgNjUuNjU2MyAzNTUuMzM1IDY2Ljk3OTIgMzU1LjMzNSA2OC42NjIxVjEwMS41OTlDMzU1LjMzNSAxMDMuMjgyIDM1NC44NTUgMTA0LjYwNCAzNTMuNTMyIDEwNS45MjdMMzQ4LjEyMyAxMTEuMjE2QzM0Ni45MjEgMTEyLjQxOCAzNDUuNTk5IDExMy4wMTggMzQzLjkxNiAxMTMuMDE5SDMwOS4wNTVDMzA3Ljg1MyAxMTMuMDE5IDMwNi4yOSAxMTIuNjU4IDMwNC43MjggMTExLjA5NkwyOTkuNDM4IDEwNS44MDdDMjk4LjM1NyAxMDQuNjA1IDI5Ny44NzYgMTAzLjA0MSAyOTcuODc2IDEwMS41OTlWNjguNjYyMUMyOTcuODc2IDY2Ljk3OTMgMjk4LjQ3NyA2NS41MzY5IDI5OS40MzggNjQuNDU1MUwzMDQuNzI4IDU5LjE2NUMzMDYuMTcgNTcuNzIyOSAzMDcuNzMzIDU3LjI0MjIgMzA5LjA1NSA1Ny4yNDIySDM0My45MTZaTTU1OS42OCA1Ny4yNDIyQzU2MS4zNjIgNTcuMjQyMiA1NjIuNjg1IDU3Ljg0MzEgNTYzLjg4NyA1OS4wNDQ5TDU2OS4yOTcgNjQuMzM0QzU3MC42MTkgNjUuNjU2MyA1NzEuMSA2Ni45NzkyIDU3MS4xIDY4LjY2MjFWMTAxLjU5OUM1NzEuMSAxMDMuMjgyIDU3MC42MTkgMTA0LjYwNCA1NjkuMjk3IDEwNS45MjdMNTYzLjg4NyAxMTEuMjE2QzU2Mi42ODUgMTEyLjQxOCA1NjEuMzYyIDExMy4wMTkgNTU5LjY4IDExMy4wMTlINTI0LjgxOUM1MjMuNjE3IDExMy4wMTkgNTIyLjA1NCAxMTIuNjU4IDUyMC40OTEgMTExLjA5Nkw1MTUuMjAyIDEwNS44MDdDNTE0LjEyIDEwNC42MDUgNTEzLjY0IDEwMy4wNDEgNTEzLjY0IDEwMS41OTlWNjguNjYyMUM1MTMuNjQgNjYuOTc5NCA1MTQuMjQxIDY1LjUzNjkgNTE1LjIwMiA2NC40NTUxTDUyMC40OTEgNTkuMTY1QzUyMS45MzQgNTcuNzIyNiA1MjMuNDk3IDU3LjI0MjIgNTI0LjgxOSA1Ny4yNDIySDU1OS42OFpNMTY2LjE4IDEwMi44MDNIMjAwLjE5OFY2Ny40NjA5SDE2Ni4xOFYxMDIuODAzWk00NTUuMTI4IDEwMi44MDNINDg5LjE0N1Y2Ny40NjA5SDQ1NS4xMjhWMTAyLjgwM1pNMjM4LjAzNSAxMDIuODAxSDI3Mi44OTZWNjcuNDZIMjM4LjAzNVYxMDIuODAxWk0zMDkuMTc1IDEwMi44MDFIMzQ0LjAzNlY2Ny40NkgzMDkuMTc1VjEwMi44MDFaTTUyNC45MzkgMTAyLjgwMUg1NTkuOFY2Ny40Nkg1MjQuOTM5VjEwMi44MDFaTTE3Ni40MjEgODkuNzQ0MUgxNzAuODMzVjg0LjE1NjJIMTc2LjQyMVY4OS43NDQxWk0xODUuNzM0IDg5Ljc0NDFIMTgwLjE0NlY4NC4xNTYySDE4NS43MzRWODkuNzQ0MVpNMTk1LjA0NyA4OS43NDQxSDE4OS40NTlWODQuMTU2MkgxOTUuMDQ3Vjg5Ljc0NDFaTTUzNi4wODIgODEuMzYwNEM1MzguMjMzIDgxLjM2MDQgNTM5Ljk3OCA4My4xMDQ4IDUzOS45NzggODUuMjU1OUM1MzkuOTc3IDg3LjQwNjggNTM4LjIzMyA4OS4xNTA0IDUzNi4wODIgODkuMTUwNEM1MzMuOTMxIDg5LjE1MDIgNTMyLjE4OCA4Ny40MDY3IDUzMi4xODggODUuMjU1OUM1MzIuMTg4IDgzLjEwNDkgNTMzLjkzMSA4MS4zNjA1IDUzNi4wODIgODEuMzYwNFpNNTQ5LjcxMyA4MS4zNjA0QzU1MS44NjQgODEuMzYwNCA1NTMuNjA3IDgzLjEwNDggNTUzLjYwNyA4NS4yNTU5QzU1My42MDcgODcuNDA2OCA1NTEuODY0IDg5LjE1MDQgNTQ5LjcxMyA4OS4xNTA0QzU0Ny41NjIgODkuMTUwNCA1NDUuODE5IDg3LjQwNjggNTQ1LjgxOCA4NS4yNTU5QzU0NS44MTggODMuMTA0OCA1NDcuNTYyIDgxLjM2MDQgNTQ5LjcxMyA4MS4zNjA0Wk01NDIuMTkyIDMyLjIxMjlDNTQ0LjIzOSAzMi4yMTI5IDU0NS44OTcgMzMuODcxNyA1NDUuODk3IDM1LjkxOEM1NDUuODk3IDM3LjI4OTIgNTQ1LjE1MiAzOC40ODUyIDU0NC4wNDUgMzkuMTI2VjUwLjgxNDVDNTQ2LjU1OSA1MC45ODU2IDU0OC44OTUgNTEuNDQyNSA1NTAuNzI2IDUyLjEzNjdDNTUzLjA4NyA1My4wMzI0IDU1NC4yMzQgNTQuMTAyNiA1NTQuMjM0IDU1LjM2OTFINTI5LjIyNEM1MjkuMjI0IDU0LjEwMjYgNTMwLjU1MSA1My4wMzI0IDUzMi45MTMgNTIuMTM2N0M1MzQuOTI0IDUxLjM3NDMgNTM3LjU0NCA1MC44OTc4IDU0MC4zNCA1MC43NzI1VjM5LjEyN0M1MzkuMjMyIDM4LjQ4NjIgNTM4LjQ4NyAzNy4yODk0IDUzOC40ODcgMzUuOTE4QzUzOC40ODcgMzMuODcxNyA1NDAuMTQ2IDMyLjIxMjkgNTQyLjE5MiAzMi4yMTI5WiIgZmlsbD0iIzI4MDBGRiIvPgo8ZGVmcz4KPGZpbHRlciBpZD0iZmlsdGVyMF9kXzIzNjdfMTU5NyIgeD0iLTI3LjkwMTQiIHk9IjM3LjIwNyIgd2lkdGg9IjEyNC43MTEiIGhlaWdodD0iMTI0LjEwNCIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVDb2xvck1hdHJpeCBpbj0iU291cmNlQWxwaGEiIHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxMjcgMCIgcmVzdWx0PSJoYXJkQWxwaGEiLz4KPGZlT2Zmc2V0IGR5PSI0Ii8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjIiLz4KPGZlQ29tcG9zaXRlIGluMj0iaGFyZEFscGhhIiBvcGVyYXRvcj0ib3V0Ii8+CjxmZUNvbG9yTWF0cml4IHR5cGU9Im1hdHJpeCIgdmFsdWVzPSIwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwLjI1IDAiLz4KPGZlQmxlbmQgbW9kZT0ibm9ybWFsIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJlZmZlY3QxX2Ryb3BTaGFkb3dfMjM2N18xNTk3Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iZWZmZWN0MV9kcm9wU2hhZG93XzIzNjdfMTU5NyIgcmVzdWx0PSJzaGFwZSIvPgo8L2ZpbHRlcj4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzIzNjdfMTU5NyIgeDE9IjYuMDAyNjMiIHkxPSI2IiB4Mj0iMTIzLjk5NyIgeTI9IjEyNCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50MV9saW5lYXJfMjM2N18xNTk3IiB4MT0iNzkuOTY5MyIgeTE9Ijc5LjM3NzkiIHgyPSI3Ni4yOTc0IiB5Mj0iMTQyLjgxOSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8bGluZWFyR3JhZGllbnQgaWQ9InBhaW50Ml9saW5lYXJfMjM2N18xNTk3IiB4MT0iNTAuOTMyOSIgeTE9IjUwLjk0MDMiIHgyPSI0Ny4xODUyIiB5Mj0iMTE1LjM2NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNjdfMTU5NyI+CjxyZWN0IHdpZHRoPSIxMTgiIGhlaWdodD0iMTE4IiBmaWxsPSJ3aGl0ZSIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNiA2KSIvPgo8L2NsaXBQYXRoPgo8Y2xpcFBhdGggaWQ9ImNsaXAxXzIzNjdfMTU5NyI+CjxwYXRoIGQ9Ik02IDZIOTRDMTEwLjU2OSA2IDEyNCAxOS40MzE1IDEyNCAzNlY5NEMxMjQgMTEwLjU2OSAxMTAuNTY5IDEyNCA5NCAxMjRINlY2WiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K',
41
+ APP_HEADER_LOGO: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNjQ4IiBoZWlnaHQ9IjE0OSIgdmlld0JveD0iMCAwIDY0OCAxNDkiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF8yMzc0XzE1NDYpIj4KPHBhdGggZD0iTTYgNkgxNDMuMjI3VjE0Mi45NzVINlY2WiIgZmlsbD0idXJsKCNwYWludDBfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTEwNS4zOTggNDMuNzI5NkM4OS40OTU0IDYwLjk5NyA4OS41NjQyIDg3LjU2NyAxMDUuNTU2IDEwNC43NTJMMTA2Ljk0OCAxMDYuMjQ5TDEwNi45MTIgMTA2LjIxNUwxMDYuOTU0IDEwNi4yNThMNjkuNzI2NSAxNDIuOTc1SDMzLjcyNjZIMTUuNzI2Nkg2Vjc4LjU2MjVMNDIuNjQwNSA0Mi4zOTY1TDQyLjc2NTQgNDIuNTIyM0w0Mi42NDI3IDQyLjM5MDhMNDQuMTQ5OCA0My43NzM4QzYxLjQ0NzUgNTkuNjQ4MyA4OC4wNjY3IDU5LjU3ODMgMTA1LjI4MyA0My42MTYyTDEwNi43ODQgNDIuMjI1M0wxMDUuMzk4IDQzLjcyOTZaIiBmaWxsPSIjRUVFRUVFIi8+CjxwYXRoIGQ9Ik03LjAwNzAxIDE0Mi45NzVMNDQuNzY3NyAxMDUuODkyQzYyLjA0MTIgODguODUyNyA4OS44ODMyIDg5LjAxNTkgMTA2Ljk1NCAxMDYuMjU4TDY5LjcyNjUgMTQyLjk3NUg3LjAwNzAxWiIgZmlsbD0idXJsKCNwYWludDFfbGluZWFyXzIzNzRfMTU0NikiLz4KPHBhdGggZD0iTTYgNzguNTYyNUw0Mi42NDA1IDQyLjM5NjVDNjAuMTQ0NCA2MC4wNzU3IDU5Ljk3NTUgODguNTcxMSA0Mi4yNjM4IDEwNi4wNDNMNiAxNDJWNzguNTYyNVoiIGZpbGw9InVybCgjcGFpbnQyX2xpbmVhcl8yMzc0XzE1NDYpIi8+CjwvZz4KPHBhdGggZD0iTTYxNy40MzggNTguMDA3OEg2MzQuODY3VjY3LjYyNEg2MTcuNDM4VjEwMy40NDZINjM1LjIyOVYxMTMuNzg0SDYxOC4xNThDNjE2LjQ3NiAxMTMuNzg0IDYxNS41MTQgMTEzLjE4MiA2MTQuMzEyIDExMS45OEw2MDcuOTQgMTA2LjU3MUM2MDYuNzM5IDEwNS4zNjkgNjA2LjEzOCAxMDQuMDQ3IDYwNi4xMzggMTAyLjI0NFY2Ny42MjRINTk3Ljg0NFY1OS4yMDlMNjEzLjM1MSA0MS43NzkzSDYxNy40MzhWNTguMDA3OFpNMjI2LjYwNCAxMTMuNzc4SDIxNS40MjVWMTA3LjY0N0wyMTIuMDYgMTExLjI1NEMyMTAuMjU2IDExMy4xNzcgMjA4LjkzMyAxMTMuNzc4IDIwNi42NDkgMTEzLjc3OEgxODEuNjQ2QzE4MC4wODQgMTEzLjc3OCAxNzguNTIxIDExMy4yOTcgMTc3LjMxOSAxMTEuOTc1TDE3Mi4wMjkgMTA2LjY4NkMxNzAuNzA3IDEwNS4zNjMgMTcwLjIyNyAxMDQuMDQxIDE3MC4yMjcgMTAyLjM1OFY2OS41NDFDMTcwLjIyNyA2Ny44NTg0IDE3MC43MDcgNjYuNTM2IDE3Mi4wMjkgNjUuMjEzOUwxNzcuMzE5IDU5LjgwNDdDMTc4LjUyMSA1OC42MDI3IDE3OS45NjQgNTguMTIyMSAxODEuNjQ2IDU4LjEyMjFIMjA2LjY0OUMyMDguOTMzIDU4LjEyMjEgMjEwLjEzNiA1OC42MDMgMjEyLjA2IDYwLjY0NjVMMjE1LjQyNSA2NC4xMzE4VjMyLjc1NzhIMjI2LjYwNFYxMTMuNzc4Wk0zOTcuMTAzIDY0LjI1Mkw0MDAuNTg5IDYwLjY0NjVDNDAyLjYzMiA1OC42MDMgNDAzLjcxNCA1OC4xMjIxIDQwNS45OTggNTguMTIyMUg0MzEuMDAyQzQzMi42ODUgNTguMTIyMSA0MzQuMTI3IDU4LjYwMjcgNDM1LjMyOSA1OS44MDQ3TDQ0MC43MzggNjUuMjEzOUM0NDEuOTQgNjYuNTM2IDQ0Mi41NDIgNjcuODU4MyA0NDIuNTQyIDY5LjU0MVYxMTMuNzc4SDQzMS4yNDJWNjguMjE4OEgzOTcuMTAzVjExMy43NzhIMzg1LjkyNFYzMi43NTc4SDM5Ny4xMDNWNjQuMjUyWk00NzAuMzU0IDY0LjEzMThMNDczLjcyMSA2MC42NDY1QzQ3NS42NDQgNTguNjAzIDQ3Ni44NDYgNTguMTIyMSA0NzkuMTMgNTguMTIyMUg1MDQuMTM0QzUwNS44MTcgNTguMTIyMSA1MDcuMjU5IDU4LjYwMjcgNTA4LjQ2MSA1OS44MDQ3TDUxMy44NyA2NS4yMTM5QzUxNS4wNzIgNjYuNTM2IDUxNS42NzQgNjcuODU4MyA1MTUuNjc0IDY5LjU0MVYxMDIuMzU4QzUxNS42NzQgMTA0LjA0MSA1MTUuMDcyIDEwNS4zNjMgNTEzLjg3IDEwNi42ODZMNTA4LjQ2MSAxMTEuOTc1QzUwNy4yNTkgMTEzLjI5NyA1MDUuNjk2IDExMy43NzggNTA0LjEzNCAxMTMuNzc4SDQ3OS4xM0M0NzYuODQ2IDExMy43NzggNDc1LjUyNCAxMTMuMTc3IDQ3My43MjEgMTExLjI1NEw0NzAuMzU0IDEwNy42NDdWMTEzLjc3OEg0NTkuMTc2VjMyLjc1NzhINDcwLjM1NFY2NC4xMzE4Wk0yODguMDAyIDU4QzI4OS42ODUgNTggMjkxLjAwNyA1OC42MDA5IDI5Mi4yMDkgNTkuODAyN0wyOTcuNjE5IDY1LjA5MThDMjk4Ljk0MSA2Ni40MTQxIDI5OS40MjIgNjcuNzM3IDI5OS40MjIgNjkuNDE5OVYxMDIuMzU2QzI5OS40MjIgMTA0LjAzOSAyOTguOTQxIDEwNS4zNjIgMjk3LjYxOSAxMDYuNjg1TDI5Mi4yMDkgMTExLjk3NEMyOTEuMDA3IDExMy4xNzYgMjg5LjY4NSAxMTMuNzc2IDI4OC4wMDIgMTEzLjc3NkgyNTMuMTQyQzI1MS45NCAxMTMuNzc2IDI1MC4zNzYgMTEzLjQxNiAyNDguODEzIDExMS44NTRMMjQzLjUyNCAxMDYuNTY0QzI0Mi40NDMgMTA1LjM2MiAyNDEuOTYyIDEwMy43OTkgMjQxLjk2MiAxMDIuMzU2VjY5LjQxOTlDMjQxLjk2MiA2Ny43MzcyIDI0Mi41NjMgNjYuMjk0NyAyNDMuNTI0IDY1LjIxMjlMMjQ4LjgxMyA1OS45MjI5QzI1MC4yNTYgNTguNDgwNCAyNTEuODE5IDU4IDI1My4xNDIgNThIMjg4LjAwMlpNMzU5LjE0MyA1OEMzNjAuODI1IDU4LjAwMDEgMzYyLjE0OCA1OC42MDA4IDM2My4zNSA1OS44MDI3TDM2OC43NTkgNjUuMDkxOEMzNzAuMDgxIDY2LjQxNDEgMzcwLjU2MiA2Ny43MzcgMzcwLjU2MiA2OS40MTk5VjEwMi4zNTZDMzcwLjU2MiAxMDQuMDM5IDM3MC4wODEgMTA1LjM2MiAzNjguNzU5IDEwNi42ODVMMzYzLjM1IDExMS45NzRDMzYyLjE0OCAxMTMuMTc2IDM2MC44MjUgMTEzLjc3NiAzNTkuMTQzIDExMy43NzZIMzI0LjI4MUMzMjMuMDc5IDExMy43NzYgMzIxLjUxNyAxMTMuNDE2IDMxOS45NTQgMTExLjg1NEwzMTQuNjY1IDEwNi41NjRDMzEzLjU4MyAxMDUuMzYyIDMxMy4xMDMgMTAzLjc5OSAzMTMuMTAzIDEwMi4zNTZWNjkuNDE5OUMzMTMuMTAzIDY3LjczNzEgMzEzLjcwMyA2Ni4yOTQ4IDMxNC42NjUgNjUuMjEyOUwzMTkuOTU0IDU5LjkyMjlDMzIxLjM5NiA1OC40ODA3IDMyMi45NTkgNTguMDAwMSAzMjQuMjgxIDU4SDM1OS4xNDNaTTU3NC45MDYgNThDNTc2LjU4OSA1OCA1NzcuOTExIDU4LjYwMDkgNTc5LjExMyA1OS44MDI3TDU4NC41MjMgNjUuMDkxOEM1ODUuODQ2IDY2LjQxNDEgNTg2LjMyNiA2Ny43MzcgNTg2LjMyNiA2OS40MTk5VjEwMi4zNTZDNTg2LjMyNiAxMDQuMDM5IDU4NS44NDYgMTA1LjM2MiA1ODQuNTIzIDEwNi42ODVMNTc5LjExMyAxMTEuOTc0QzU3Ny45MTEgMTEzLjE3NiA1NzYuNTg5IDExMy43NzYgNTc0LjkwNiAxMTMuNzc2SDU0MC4wNDZDNTM4Ljg0NCAxMTMuNzc2IDUzNy4yOCAxMTMuNDE2IDUzNS43MTggMTExLjg1NEw1MzAuNDI5IDEwNi41NjRDNTI5LjM0NyAxMDUuMzYyIDUyOC44NjYgMTAzLjc5OSA1MjguODY2IDEwMi4zNTZWNjkuNDE5OUM1MjguODY2IDY3LjczNzIgNTI5LjQ2NyA2Ni4yOTQ3IDUzMC40MjkgNjUuMjEyOUw1MzUuNzE4IDU5LjkyMjlDNTM3LjE2IDU4LjQ4MDQgNTM4LjcyNCA1OCA1NDAuMDQ2IDU4SDU3NC45MDZaTTE4MS40MDYgMTAzLjU2MUgyMTUuNDI1VjY4LjIxODhIMTgxLjQwNlYxMDMuNTYxWk00NzAuMzU0IDEwMy41NjFINTA0LjM3NFY2OC4yMTg4SDQ3MC4zNTRWMTAzLjU2MVpNMjUzLjI2MiAxMDMuNTU5SDI4OC4xMjJWNjguMjE3OEgyNTMuMjYyVjEwMy41NTlaTTMyNC40MDEgMTAzLjU1OUgzNTkuMjYzVjY4LjIxNzhIMzI0LjQwMVYxMDMuNTU5Wk01NDAuMTY2IDEwMy41NTlINTc1LjAyNlY2OC4yMTc4SDU0MC4xNjZWMTAzLjU1OVpNMTkxLjY0NyA5MC41MDJIMTg2LjA2Vjg0LjkxNDFIMTkxLjY0N1Y5MC41MDJaTTIwMC45NjEgOTAuNTAySDE5NS4zNzNWODQuOTE0MUgyMDAuOTYxVjkwLjUwMlpNMjEwLjI3MyA5MC41MDJIMjA0LjY4NlY4NC45MTQxSDIxMC4yNzNWOTAuNTAyWk01NTEuMzA5IDgyLjExODJDNTUzLjQ2IDgyLjExODIgNTU1LjIwNCA4My44NjI2IDU1NS4yMDQgODYuMDEzN0M1NTUuMjA0IDg4LjE2NDYgNTUzLjQ2IDg5LjkwODIgNTUxLjMwOSA4OS45MDgyQzU0OS4xNTggODkuOTA4MSA1NDcuNDE0IDg4LjE2NDUgNTQ3LjQxNCA4Ni4wMTM3QzU0Ny40MTQgODMuODYyNyA1NDkuMTU4IDgyLjExODMgNTUxLjMwOSA4Mi4xMTgyWk01NjQuOTM5IDgyLjExODJDNTY3LjA5MSA4Mi4xMTgyIDU2OC44MzQgODMuODYyNiA1NjguODM0IDg2LjAxMzdDNTY4LjgzNCA4OC4xNjQ2IDU2Ny4wOSA4OS45MDgyIDU2NC45MzkgODkuOTA4MkM1NjIuNzg4IDg5LjkwODIgNTYxLjA0NSA4OC4xNjQ2IDU2MS4wNDUgODYuMDEzN0M1NjEuMDQ1IDgzLjg2MjYgNTYyLjc4OCA4Mi4xMTgyIDU2NC45MzkgODIuMTE4MlpNNTU3LjQxOSAzMi45NzA3QzU1OS40NjUgMzIuOTcwNyA1NjEuMTI0IDM0LjYyOTUgNTYxLjEyNCAzNi42NzU4QzU2MS4xMjQgMzguMDQ3IDU2MC4zNzkgMzkuMjQzIDU1OS4yNzEgMzkuODgzOFY1MS41NzIzQzU2MS43ODUgNTEuNzQzNCA1NjQuMTIxIDUyLjIwMDMgNTY1Ljk1MiA1Mi44OTQ1QzU2OC4zMTQgNTMuNzkwMiA1NjkuNDYxIDU0Ljg2MDQgNTY5LjQ2MSA1Ni4xMjdINTQ0LjQ1QzU0NC40NSA1NC44NjA0IDU0NS43NzggNTMuNzkwMiA1NDguMTQgNTIuODk0NUM1NTAuMTUgNTIuMTMyMSA1NTIuNzcxIDUxLjY1NTYgNTU1LjU2NiA1MS41MzAzVjM5Ljg4NDhDNTU0LjQ1OSAzOS4yNDQgNTUzLjcxNCAzOC4wNDcyIDU1My43MTQgMzYuNjc1OEM1NTMuNzE0IDM0LjYyOTUgNTU1LjM3MyAzMi45NzA3IDU1Ny40MTkgMzIuOTcwN1oiIGZpbGw9IiMyODAwRkYiLz4KPGRlZnM+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSI2LjAwMzA2IiB5MT0iNiIgeDI9IjE0Mi45NzIiIHkyPSIxNDMuMjI2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiMyODAwRkYiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDhEQUNGIi8+CjwvbGluZWFyR3JhZGllbnQ+CjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQxX2xpbmVhcl8yMzc0XzE1NDYiIHgxPSIxNDMuMjI3IiB5MT0iNzYuODA0NiIgeDI9IjI2LjAwMSIgeTI9IjEyMi45NjQiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzI4MDBGRiIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMwOERBQ0YiLz4KPC9saW5lYXJHcmFkaWVudD4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDJfbGluZWFyXzIzNzRfMTU0NiIgeDE9IjU4LjI1NDEiIHkxPSI1OC4xNjciIHgyPSI1My45MTE3IiB5Mj0iMTMyLjk1MSIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjgwMEZGIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzA4REFDRiIvPgo8L2xpbmVhckdyYWRpZW50Pgo8Y2xpcFBhdGggaWQ9ImNsaXAwXzIzNzRfMTU0NiI+CjxwYXRoIGQ9Ik02IDZIMTEzLjIyN0MxMjkuNzk1IDYgMTQzLjIyNyAxOS40MzE1IDE0My4yMjcgMzZWMTEyLjk3NUMxNDMuMjI3IDEyOS41NDQgMTI5Ljc5NSAxNDIuOTc1IDExMy4yMjcgMTQyLjk3NUg2VjZaIiBmaWxsPSJ3aGl0ZSIvPgo8L2NsaXBQYXRoPgo8L2RlZnM+Cjwvc3ZnPgo=',
41
42
  USER_AVATAR: 'data:image/png;base64,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',
42
43
  BOT_AVATAR: 'data:image/png;base64,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',
43
44
  };
@@ -95,11 +96,11 @@ class ChatButtonComponent {
95
96
  this.toggle.emit();
96
97
  }
97
98
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ChatButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
98
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: ChatButtonComponent, isStandalone: true, selector: "app-chat-button", inputs: { buttonStyle: "buttonStyle", isChatOpen: "isChatOpen", unreadCount: "unreadCount", chatIcon: "chatIcon", appTitle: "appTitle", appLogoUrl: "appLogoUrl", appTextLogoUrl: "appTextLogoUrl" }, outputs: { toggle: "toggle" }, ngImport: i0, template: "<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"appLogoUrl\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"appTextLogoUrl\" />\r\n\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n", styles: [".chat-sidebar{position:fixed;right:0;width:40px;height:120px;border-radius:16px 0 0 16px;background:var(--background-color);color:var(--white);border:none;box-shadow:var(--border-shadow-color);display:flex;justify-content:center;align-items:center;cursor:pointer;z-index:1000}.chat-sidebar.disabled{background:transparent;border-radius:0}.chat-sidebar h2{margin:0;font-size:12px;transform:rotate(-90deg);white-space:nowrap}.chat-sidebar .alert-badge{position:absolute;bottom:15px;right:30px;width:18px;height:18px;border-radius:50%;background:var(--red);color:var(--white);font-size:10px;display:flex;align-items:center;justify-content:center}.chat-sidebar.center{top:50%;transform:translateY(-50%)}.chat-sidebar.top{top:calc(50% - 45vh);transform:none}.chat-sidebar.bottom{top:calc(50% + 30vh);transform:none}.chat-fab{position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;background:var(--background-color);color:var(--white);box-shadow:0 6px 16px #0003;border:none;cursor:pointer;z-index:1000;display:flex;align-items:center;justify-content:center}.chat-fab svg,.chat-fab mat-icon{width:24px;height:24px}.chat-fab:hover{transform:scale(1.1)}.alert-badge{position:absolute;top:-4px;right:-4px;background:var(--red);color:var(--white);border-radius:50%;min-width:18px;height:18px;font-size:11px;display:flex;align-items:center;justify-content:center;font-weight:700;line-height:1}.chat-logo{width:45px;height:45px;mask:url(/assets/logo.svg) no-repeat center;-webkit-mask-size:contain;mask-size:contain;background-color:green}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }] });
99
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: ChatButtonComponent, isStandalone: true, selector: "app-chat-button", inputs: { buttonStyle: "buttonStyle", isChatOpen: "isChatOpen", unreadCount: "unreadCount", chatIcon: "chatIcon", appTitle: "appTitle", appLogoUrl: "appLogoUrl", appTextLogoUrl: "appTextLogoUrl" }, outputs: { toggle: "toggle" }, ngImport: i0, template: "<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"appLogoUrl\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"appTextLogoUrl\" />\r\n\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n", styles: [".chat-sidebar{position:fixed;right:0;width:40px;height:120px;border-radius:16px 0 0 16px;background:var(--background-color);color:var(--white);border:none;box-shadow:var(--border-shadow-color);display:flex;justify-content:center;align-items:center;cursor:pointer;z-index:1000}.chat-sidebar.disabled{background:transparent;border-radius:0}.chat-sidebar h2{margin:0;font-size:12px;transform:rotate(-90deg);white-space:nowrap}.chat-sidebar .alert-badge{position:absolute;bottom:15px;right:30px;width:18px;height:18px;border-radius:50%;background:var(--red);color:var(--white);font-size:10px;display:flex;align-items:center;justify-content:center}.chat-sidebar.center{top:50%;transform:translateY(-50%)}.chat-sidebar.top{top:calc(50% - 45vh);transform:none}.chat-sidebar.bottom{top:calc(50% + 30vh);transform:none}.chat-fab{position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;background:var(--background-color);color:var(--white);box-shadow:0 6px 16px #0003;border:none;cursor:pointer;z-index:1000;display:flex;align-items:center;justify-content:center}.chat-fab svg,.chat-fab mat-icon{width:24px;height:24px}.chat-fab:hover{transform:scale(1.1)}.alert-badge{position:absolute;top:-4px;right:-4px;background:var(--red);color:var(--white);border-radius:50%;min-width:18px;height:18px;font-size:11px;display:flex;align-items:center;justify-content:center;font-weight:700;line-height:1}.chat-logo{width:45px;height:45px;mask:url(/assets/logo.svg) no-repeat center;-webkit-mask-size:contain;mask-size:contain;background-color:var(--white)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }] });
99
100
  }
100
101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ChatButtonComponent, decorators: [{
101
102
  type: Component,
102
- args: [{ selector: 'app-chat-button', standalone: true, imports: [CommonModule, MatIconModule], template: "<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"appLogoUrl\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"appTextLogoUrl\" />\r\n\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n", styles: [".chat-sidebar{position:fixed;right:0;width:40px;height:120px;border-radius:16px 0 0 16px;background:var(--background-color);color:var(--white);border:none;box-shadow:var(--border-shadow-color);display:flex;justify-content:center;align-items:center;cursor:pointer;z-index:1000}.chat-sidebar.disabled{background:transparent;border-radius:0}.chat-sidebar h2{margin:0;font-size:12px;transform:rotate(-90deg);white-space:nowrap}.chat-sidebar .alert-badge{position:absolute;bottom:15px;right:30px;width:18px;height:18px;border-radius:50%;background:var(--red);color:var(--white);font-size:10px;display:flex;align-items:center;justify-content:center}.chat-sidebar.center{top:50%;transform:translateY(-50%)}.chat-sidebar.top{top:calc(50% - 45vh);transform:none}.chat-sidebar.bottom{top:calc(50% + 30vh);transform:none}.chat-fab{position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;background:var(--background-color);color:var(--white);box-shadow:0 6px 16px #0003;border:none;cursor:pointer;z-index:1000;display:flex;align-items:center;justify-content:center}.chat-fab svg,.chat-fab mat-icon{width:24px;height:24px}.chat-fab:hover{transform:scale(1.1)}.alert-badge{position:absolute;top:-4px;right:-4px;background:var(--red);color:var(--white);border-radius:50%;min-width:18px;height:18px;font-size:11px;display:flex;align-items:center;justify-content:center;font-weight:700;line-height:1}.chat-logo{width:45px;height:45px;mask:url(/assets/logo.svg) no-repeat center;-webkit-mask-size:contain;mask-size:contain;background-color:green}\n"] }]
103
+ args: [{ selector: 'app-chat-button', standalone: true, imports: [CommonModule, MatIconModule], template: "<!-- fab -->\r\n<button class=\"chat-fab\" (click)=\"onToggle()\" *ngIf=\"buttonStyle === 'fab' && !isChatOpen\">\r\n <!-- <mat-icon>{{ chatIcon }}</mat-icon> -->\r\n <img style=\"width: 30px; height: 30px\" [src]=\"appLogoUrl\" />\r\n <!-- <div class=\"chat-logo\"></div> -->\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n\r\n<!-- sidebar button -->\r\n<button\r\n class=\"chat-sidebar\"\r\n (click)=\"onToggle()\"\r\n *ngIf=\"isSidebar && !isChatOpen\"\r\n [ngClass]=\"sidebarPosition\"\r\n>\r\n <!-- <h2 style=\"transform: rotate(-90deg); font-size: 16px\">{{ appTitle }}</h2> -->\r\n <img style=\"transform: rotate(-90deg); width: 100px; height: 45px\" [src]=\"appTextLogoUrl\" />\r\n\r\n <span class=\"alert-badge\" *ngIf=\"unreadCount > 0\">\r\n {{ unreadCount > 9 ? '9+' : unreadCount }}\r\n </span>\r\n</button>\r\n", styles: [".chat-sidebar{position:fixed;right:0;width:40px;height:120px;border-radius:16px 0 0 16px;background:var(--background-color);color:var(--white);border:none;box-shadow:var(--border-shadow-color);display:flex;justify-content:center;align-items:center;cursor:pointer;z-index:1000}.chat-sidebar.disabled{background:transparent;border-radius:0}.chat-sidebar h2{margin:0;font-size:12px;transform:rotate(-90deg);white-space:nowrap}.chat-sidebar .alert-badge{position:absolute;bottom:15px;right:30px;width:18px;height:18px;border-radius:50%;background:var(--red);color:var(--white);font-size:10px;display:flex;align-items:center;justify-content:center}.chat-sidebar.center{top:50%;transform:translateY(-50%)}.chat-sidebar.top{top:calc(50% - 45vh);transform:none}.chat-sidebar.bottom{top:calc(50% + 30vh);transform:none}.chat-fab{position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;background:var(--background-color);color:var(--white);box-shadow:0 6px 16px #0003;border:none;cursor:pointer;z-index:1000;display:flex;align-items:center;justify-content:center}.chat-fab svg,.chat-fab mat-icon{width:24px;height:24px}.chat-fab:hover{transform:scale(1.1)}.alert-badge{position:absolute;top:-4px;right:-4px;background:var(--red);color:var(--white);border-radius:50%;min-width:18px;height:18px;font-size:11px;display:flex;align-items:center;justify-content:center;font-weight:700;line-height:1}.chat-logo{width:45px;height:45px;mask:url(/assets/logo.svg) no-repeat center;-webkit-mask-size:contain;mask-size:contain;background-color:var(--white)}\n"] }]
103
104
  }], propDecorators: { buttonStyle: [{
104
105
  type: Input
105
106
  }], isChatOpen: [{
@@ -286,11 +287,11 @@ class SnackBar {
286
287
  }
287
288
  }
288
289
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SnackBar, deps: [], target: i0.ɵɵFactoryTarget.Component });
289
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SnackBar, isStandalone: true, selector: "app-snackbar", inputs: { message: "message", autoDismiss: "autoDismiss", dismissDelay: "dismissDelay", show: "show" }, outputs: { closed: "closed" }, ngImport: i0, template: "<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n", styles: [".message-error{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;margin:0 16px 8px;background-color:var(--light-red);border:1px solid var(--red);border-radius:6px;color:var(--white);font-size:12px;box-shadow:var(--border-shadow-color);animation:fadeIn .2s;font-family:var(--font-family);width:calc(100% - 32px);box-sizing:border-box}.error-content{display:flex;align-items:center;gap:10px;min-width:0;flex:1}.alert-icon{color:var(--red);font-size:18px;flex-shrink:0;display:flex;align-items:center}.error-text{flex:1;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.close-icon{color:var(--white);cursor:pointer;font-size:18px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;opacity:.7;flex-shrink:0}.close-icon:hover{opacity:1;background-color:var(--red)}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
290
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: SnackBar, isStandalone: true, selector: "app-snackbar", inputs: { message: "message", autoDismiss: "autoDismiss", dismissDelay: "dismissDelay", show: "show" }, outputs: { closed: "closed" }, ngImport: i0, template: "<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n", styles: [".message-error{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;margin:0 16px 8px;background-color:var(--light-red);border:1px solid var(--red);border-radius:6px;color:var(--white);font-size:12px;box-shadow:var(--border-shadow-color);animation:slideInRight .3s ease;position:fixed;top:90%;right:1%;transform:translateY(-50%);font-family:var(--font-family);width:calc(100% - 32px);max-width:360px;box-sizing:border-box}.error-content{display:flex;align-items:center;gap:10px;min-width:0;flex:1}.alert-icon{color:var(--red);font-size:18px;flex-shrink:0;display:flex;align-items:center}.error-text{flex:1;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.close-icon{color:var(--white);cursor:pointer;font-size:18px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;opacity:.7;flex-shrink:0}.close-icon:hover{opacity:1;background-color:var(--red)}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}\n"], dependencies: [{ kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }] });
290
291
  }
291
292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: SnackBar, decorators: [{
292
293
  type: Component,
293
- args: [{ selector: 'app-snackbar', standalone: true, imports: [MatIconModule], template: "<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n", styles: [".message-error{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;margin:0 16px 8px;background-color:var(--light-red);border:1px solid var(--red);border-radius:6px;color:var(--white);font-size:12px;box-shadow:var(--border-shadow-color);animation:fadeIn .2s;font-family:var(--font-family);width:calc(100% - 32px);box-sizing:border-box}.error-content{display:flex;align-items:center;gap:10px;min-width:0;flex:1}.alert-icon{color:var(--red);font-size:18px;flex-shrink:0;display:flex;align-items:center}.error-text{flex:1;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.close-icon{color:var(--white);cursor:pointer;font-size:18px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;opacity:.7;flex-shrink:0}.close-icon:hover{opacity:1;background-color:var(--red)}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}\n"] }]
294
+ args: [{ selector: 'app-snackbar', standalone: true, imports: [MatIconModule], template: "<div class=\"message-error\">\r\n <div class=\"error-content\">\r\n <mat-icon class=\"alert-icon\">warning</mat-icon>\r\n <span class=\"error-text\">{{ message }}</span>\r\n </div>\r\n <mat-icon class=\"close-icon\" (click)=\"close()\">close</mat-icon>\r\n</div>\r\n", styles: [".message-error{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;margin:0 16px 8px;background-color:var(--light-red);border:1px solid var(--red);border-radius:6px;color:var(--white);font-size:12px;box-shadow:var(--border-shadow-color);animation:slideInRight .3s ease;position:fixed;top:90%;right:1%;transform:translateY(-50%);font-family:var(--font-family);width:calc(100% - 32px);max-width:360px;box-sizing:border-box}.error-content{display:flex;align-items:center;gap:10px;min-width:0;flex:1}.alert-icon{color:var(--red);font-size:18px;flex-shrink:0;display:flex;align-items:center}.error-text{flex:1;text-align:left;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.close-icon{color:var(--white);cursor:pointer;font-size:18px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;opacity:.7;flex-shrink:0}.close-icon:hover{opacity:1;background-color:var(--red)}@keyframes fadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}\n"] }]
294
295
  }], propDecorators: { message: [{
295
296
  type: Input
296
297
  }], autoDismiss: [{
@@ -954,11 +955,16 @@ class ChatWindowComponent {
954
955
  continueAsGuest = new EventEmitter();
955
956
  loginClick = new EventEmitter();
956
957
  loginSubmit = new EventEmitter();
958
+ logout = new EventEmitter();
957
959
  themeService = inject(ThemeService);
958
960
  // Login form state
959
961
  loginUsername = '';
960
962
  loginPassword = '';
961
963
  showLoginForm = false;
964
+ showPassword = false;
965
+ togglePasswordVisibility() {
966
+ this.showPassword = !this.showPassword;
967
+ }
962
968
  onToggleChat() {
963
969
  this.toggleChat.emit();
964
970
  }
@@ -997,9 +1003,15 @@ class ChatWindowComponent {
997
1003
  this.messageError = null;
998
1004
  this.clearMessageError.emit();
999
1005
  }
1006
+ onClearAuthError() {
1007
+ this.clearMessageError.emit();
1008
+ }
1000
1009
  onClearChat() {
1001
1010
  this.clearChat.emit();
1002
1011
  }
1012
+ onLogout() {
1013
+ this.logout.emit();
1014
+ }
1003
1015
  onSessionSelected(session) {
1004
1016
  this.sessionSelected.emit(session);
1005
1017
  }
@@ -1025,18 +1037,14 @@ class ChatWindowComponent {
1025
1037
  // Initialization logic if needed
1026
1038
  }
1027
1039
  ngOnChanges(changes) {
1028
- // If authError input changes, update messageError to show snackbar
1029
- if (changes['authError'] && this.authError) {
1030
- this.messageError = this.authError;
1031
- }
1032
- // If authSuccess input changes, update messageError (used for all snackbar messages currently) to show success
1033
- if (changes['authSuccess'] && this.authSuccess) {
1034
- this.messageError = this.authSuccess;
1040
+ //? Handle authentication status changes
1041
+ if (changes['isAuthenticated'] && this.isAuthenticated) {
1042
+ this.showLoginForm = false;
1035
1043
  }
1036
1044
  }
1037
1045
  ngOnDestroy() { }
1038
1046
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1039
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: ChatWindowComponent, isStandalone: true, selector: "app-chat-window", inputs: { isChatOpen: "isChatOpen", enableDrag: "enableDrag", enableResize: "enableResize", isFullScreen: "isFullScreen", isAuthenticated: "isAuthenticated", appTitle: "appTitle", appLogoUrl: "appLogoUrl", appTextLogoUrl: "appTextLogoUrl", appHeaderLogoUrl: "appHeaderLogoUrl", moreIcon: "moreIcon", minimizeIcon: "minimizeIcon", messages: "messages", isBotTyping: "isBotTyping", appSubtitle: "appSubtitle", welcomeDesc: "welcomeDesc", predefinedMessages: "predefinedMessages", botAvatarUrl: "botAvatarUrl", userAvatarUrl: "userAvatarUrl", userName: "userName", trackByMessageId: "trackByMessageId", hintText: "hintText", sendIcon: "sendIcon", messageError: "messageError", showSuggestionChips: "showSuggestionChips", isHistorySidebarOpen: "isHistorySidebarOpen", chatSessions: "chatSessions", chatHistoryUserName: "chatHistoryUserName", isGuestUser: "isGuestUser", isGuestMode: "isGuestMode", isLoggingIn: "isLoggingIn", authError: "authError", authSuccess: "authSuccess", themeConfig: "themeConfig" }, outputs: { toggleChat: "toggleChat", toggleFullScreen: "toggleFullScreen", toggleHistorySidebar: "toggleHistorySidebar", openSettings: "openSettings", suggestionClick: "suggestionClick", send: "send", clearMessageError: "clearMessageError", clearChat: "clearChat", sessionSelected: "sessionSelected", sessionDeleted: "sessionDeleted", continueAsGuest: "continueAsGuest", loginClick: "loginClick", loginSubmit: "loginSubmit" }, usesOnChanges: true, ngImport: i0, template: "<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img\r\n class=\"chat-logo\"\r\n style=\"width: 150px; height: 50px; margin-left: 0px\"\r\n [src]=\"appHeaderLogoUrl\"\r\n alt=\"Text-Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New Chat Button -->\r\n <!-- <button class=\"header-button\" (click)=\"createNewChat()\">\r\n <mat-icon>add</mat-icon>\r\n </button> -->\r\n\r\n <!-- <app-dropdown-menu>\r\n <span trigger>\u2630</span>\r\n\r\n <app-menu-item (selected)=\"onToggleFullScreen()\"> My Profile </app-menu-item>\r\n\r\n <app-menu-item> Settings </app-menu-item>\r\n\r\n <app-menu-item> Logout </app-menu-item>\r\n </app-dropdown-menu> -->\r\n\r\n <!-- History Button -->\r\n <button\r\n class=\"header-button\"\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onToggleHistorySidebar()\"\r\n title=\"Chat History\"\r\n >\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <!-- <popout-window\r\n #popout\r\n [windowTitle]=\"appTitle || 'Chat'\"\r\n [windowWidth]=\"400\"\r\n [windowHeight]=\"620\"\r\n (shown)=\"onPopoutShown($event)\"\r\n > -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen\">\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n *ngIf=\"!showLoginForm\"\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isGuestMode]=\"isGuestMode\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n (continueAsGuest)=\"onContinueAsGuest()\"\r\n ></app-message-list>\r\n\r\n <!-- SUGGESTED CHIPS: Show only if last bot message was fallback AND user is authenticated -->\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && (isAuthenticated || isGuestMode)\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Inline error message -->\r\n <app-snackbar\r\n *ngIf=\"messageError\"\r\n [message]=\"messageError\"\r\n [show]=\"true\"\r\n (closed)=\"onClearMessageError()\"\r\n ></app-snackbar>\r\n\r\n <!-- Chat Input: Only show when authenticated or guest mode -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated || isGuestMode\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- Login Form -->\r\n <div *ngIf=\"showLoginForm && !isAuthenticated\" class=\"login-form-container\">\r\n <h3 class=\"login-title\">Login</h3>\r\n <div class=\"login-fields\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"loginUsername\"\r\n placeholder=\"Username\"\r\n class=\"login-input\"\r\n />\r\n <input\r\n type=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n placeholder=\"Password\"\r\n class=\"login-input\"\r\n (keydown.enter)=\"onLoginSubmit()\"\r\n />\r\n </div>\r\n <div class=\"login-actions\">\r\n <button (click)=\"onCancelLogin()\" class=\"auth-btn secondary\">Cancel</button>\r\n <button\r\n (click)=\"onLoginSubmit()\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"!loginUsername || !loginPassword || isLoggingIn\"\r\n >\r\n {{ isLoggingIn ? 'Logging in...' : 'Submit' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- </popout-window> -->\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Popout Button -->\r\n <!-- <button mat-menu-item (click)=\"popout.popOut()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>open_in_new</mat-icon>\r\n <span>Popout Widget</span>\r\n </button> -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n</mat-menu>\r\n", styles: ["::ng-deep .mat-mdc-menu-panel{background-color:#8b8b8b!important;color:#fff!important;border-radius:8px!important;padding:4px 0!important;box-shadow:0 4px 16px #00000040!important;border-color:#ccc!important;font-family:Roboto,Arial,sans-serif!important;font-size:14px!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item mat-icon{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover{background-color:#5c5c5c!important;color:#f5f5f5!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover mat-icon{color:#f5f5f5!important}.doohbot-container{position:fixed;bottom:20px;right:20px;z-index:1000}.chat-window{width:clamp(400px,30vw,450px);height:clamp(620px,70vh,660px);background-color:var(--background-color);border-radius:20px;border-color:var(--border-color);box-shadow:var(--border-shadow-color);display:flex;flex-direction:column;overflow:hidden;animation:slide-in .5s ease;position:fixed;right:20px;bottom:20px;-webkit-user-select:none;user-select:none}@media (max-width: 768px){.chat-window{width:95%;height:calc(100vh - 20px)}}@media (max-width: 480px){.chat-window{width:90%;height:calc(100vh - 40px)}}.chat-window.fullscreen{width:98vw;height:96vh;border-radius:20px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none}@keyframes slide-in{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}.chat-header{display:flex;justify-content:space-between;align-items:center;padding:10px 20px;background-color:var(--background-color);color:var(--text-alt-color);cursor:move;-webkit-user-select:none;user-select:none}.chat-header:active{cursor:grabbing}.chat-title{display:flex;align-items:center;gap:6px;font-family:var(--font-family)}.chat-logo{width:45px;height:45px;object-fit:contain}.chat-header h2{margin:0;font-size:1.2rem;color:var(--text-alt-color);font-family:var(--font-family);font-weight:700}.header-button{background:none;border:none;color:var(--button-color);cursor:pointer;font-size:1.5rem}.header-button :hover{transform:scale(1.1)}.terms-conditions{font-size:.8rem;color:var(--text-color);margin-top:5px;margin-bottom:10px;display:flex;justify-content:center;align-items:center}.terms-conditions a{color:var(--grey);text-decoration:underline;font-family:var(--font-family)}.terms-conditions a:hover{color:var(--primary-color)}.chat-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.messages-view{display:flex;flex-direction:column;height:100%;width:100%}.messages-view.hidden{display:none}.theme-selector{display:flex;align-items:center;padding:4px 12px;gap:8px}.theme-btn{background:none;border:none;color:var(--white);transition:color .2s ease}.theme-btn.selected{color:var(--black)}.auth-prompt-container{padding:20px;display:flex;justify-content:center;align-items:center;flex-direction:column;gap:15px;text-align:center;height:100%}.auth-prompt-container .auth-prompt-text{margin:0;font-size:.95em;opacity:.8;color:var(--text-color)}.auth-prompt-container .auth-buttons{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}.auth-btn{padding:8px 18px;border-radius:20px;cursor:pointer;font-size:.9em;font-weight:500;transition:all .2s ease}.auth-btn.primary{background:var(--primary-color);color:var(--white);border:1px solid var(--primary-color)}.auth-btn.primary:hover{opacity:.9}.auth-btn.primary:disabled{opacity:.5;cursor:not-allowed}.auth-btn.secondary{background:transparent;color:var(--re);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}.login-form-container{padding:20px;display:flex;flex-direction:column;gap:15px;height:100%;justify-content:center}.login-form-container .login-title{text-align:center;margin:0 0 10px;font-size:1.2em;color:var(--text-color);font-family:var(--font-family)}.login-form-container .login-fields{display:flex;flex-direction:column;gap:10px}.login-form-container .login-fields .login-input{padding:10px 12px;border-radius:8px;border:1px solid var(--border-color);font-size:.9em;background:var(--background-color);color:var(--text-color)}.login-form-container .login-fields .login-input:focus{outline:none;border-color:var(--primary-color)}.login-form-container .login-actions{display:flex;justify-content:center;gap:10px;margin-top:10px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: Chips, selector: "app-chips", inputs: ["messages", "disabled"], outputs: ["chipClick"] }, { kind: "component", type: MessageListComponent, selector: "app-message-list", inputs: ["messages", "isBotTyping", "appLogoUrl", "appSubtitle", "welcomeDesc", "predefinedMessages", "botAvatarUrl", "userAvatarUrl", "userName", "isAuthenticated", "isGuestMode", "trackByMessageId"], outputs: ["suggestionClick", "loginClick", "continueAsGuest"] }, { kind: "component", type: MessageInputComponent, selector: "app-message-input", inputs: ["isBotTyping", "hintText", "sendIcon"], outputs: ["send"] }, { kind: "component", type: SnackBar, selector: "app-snackbar", inputs: ["message", "autoDismiss", "dismissDelay", "show"], outputs: ["closed"] }, { kind: "directive", type: DraggableDialogDirective, selector: "[draggableDialog]", inputs: ["dragHandle", "enableDrag"] }, { kind: "directive", type: ResizableDialogDirective, selector: "[resizableDialog]", inputs: ["enableResize"] }, { kind: "component", type: ChatHistorySidebarComponent, selector: "app-chat-history-sidebar", inputs: ["sessions", "isOpen", "userName"], outputs: ["sessionSelected", "sessionDeleted", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] });
1047
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: ChatWindowComponent, isStandalone: true, selector: "app-chat-window", inputs: { isChatOpen: "isChatOpen", enableDrag: "enableDrag", enableResize: "enableResize", isFullScreen: "isFullScreen", isAuthenticated: "isAuthenticated", appTitle: "appTitle", appLogoUrl: "appLogoUrl", appTextLogoUrl: "appTextLogoUrl", appHeaderLogoUrl: "appHeaderLogoUrl", moreIcon: "moreIcon", minimizeIcon: "minimizeIcon", messages: "messages", isBotTyping: "isBotTyping", appSubtitle: "appSubtitle", welcomeDesc: "welcomeDesc", predefinedMessages: "predefinedMessages", botAvatarUrl: "botAvatarUrl", userAvatarUrl: "userAvatarUrl", userName: "userName", trackByMessageId: "trackByMessageId", hintText: "hintText", sendIcon: "sendIcon", messageError: "messageError", showSuggestionChips: "showSuggestionChips", isHistorySidebarOpen: "isHistorySidebarOpen", chatSessions: "chatSessions", chatHistoryUserName: "chatHistoryUserName", isGuestUser: "isGuestUser", isGuestMode: "isGuestMode", isLoggingIn: "isLoggingIn", authError: "authError", authSuccess: "authSuccess", themeConfig: "themeConfig" }, outputs: { toggleChat: "toggleChat", toggleFullScreen: "toggleFullScreen", toggleHistorySidebar: "toggleHistorySidebar", openSettings: "openSettings", suggestionClick: "suggestionClick", send: "send", clearMessageError: "clearMessageError", clearChat: "clearChat", sessionSelected: "sessionSelected", sessionDeleted: "sessionDeleted", continueAsGuest: "continueAsGuest", loginClick: "loginClick", loginSubmit: "loginSubmit", logout: "logout" }, usesOnChanges: true, ngImport: i0, template: "<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img\r\n class=\"chat-logo\"\r\n style=\"width: 150px; height: 50px; margin-left: 0px\"\r\n [src]=\"appHeaderLogoUrl\"\r\n alt=\"Text-Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New Chat Button -->\r\n <!-- <button class=\"header-button\" (click)=\"createNewChat()\">\r\n <mat-icon>add</mat-icon>\r\n </button> -->\r\n\r\n <!-- <app-dropdown-menu>\r\n <span trigger>\u2630</span>\r\n\r\n <app-menu-item (selected)=\"onToggleFullScreen()\"> My Profile </app-menu-item>\r\n\r\n <app-menu-item> Settings </app-menu-item>\r\n\r\n <app-menu-item> Logout </app-menu-item>\r\n </app-dropdown-menu> -->\r\n\r\n <!-- History Button -->\r\n <button\r\n class=\"header-button\"\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onToggleHistorySidebar()\"\r\n title=\"Chat History\"\r\n >\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <!-- <popout-window\r\n #popout\r\n [windowTitle]=\"appTitle || 'Chat'\"\r\n [windowWidth]=\"400\"\r\n [windowHeight]=\"620\"\r\n (shown)=\"onPopoutShown($event)\"\r\n > -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen\">\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n *ngIf=\"!showLoginForm\"\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isGuestMode]=\"isGuestMode\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n (continueAsGuest)=\"onContinueAsGuest()\"\r\n ></app-message-list>\r\n\r\n <!-- SUGGESTED CHIPS: Show only if last bot message was fallback AND user is authenticated -->\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && (isAuthenticated || isGuestMode)\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Chat Input: Only show when authenticated or guest mode -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated || isGuestMode\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- Login Form -->\r\n <form\r\n *ngIf=\"showLoginForm && !isAuthenticated\"\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n >\r\n <h3 class=\"login-title\">Login</h3>\r\n\r\n <div class=\"login-fields\">\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n placeholder=\"Username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n placeholder=\"Password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancelLogin()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"!loginUsername || !loginPassword || isLoggingIn\"\r\n >\r\n {{ isLoggingIn ? 'Logging in...' : 'Submit' }}\r\n </button>\r\n </div>\r\n </form>\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- </popout-window> -->\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Popout Button -->\r\n <!-- <button mat-menu-item (click)=\"popout.popOut()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>open_in_new</mat-icon>\r\n <span>Popout Widget</span>\r\n </button> -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n\r\n <!-- Logout -->\r\n <button\r\n mat-menu-item\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onLogout()\"\r\n style=\"display: flex; align-items: center\"\r\n >\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n</mat-menu>\r\n", styles: ["::ng-deep .mat-mdc-menu-panel{background-color:#8b8b8b!important;color:#fff!important;border-radius:8px!important;padding:4px 0!important;box-shadow:0 4px 16px #00000040!important;border-color:#ccc!important;font-family:Roboto,Arial,sans-serif!important;font-size:14px!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item mat-icon{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover{background-color:#5c5c5c!important;color:#f5f5f5!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover mat-icon{color:#f5f5f5!important}.doohbot-container{position:fixed;bottom:20px;right:20px;z-index:1000}.chat-window{width:clamp(400px,30vw,450px);height:clamp(620px,70vh,660px);background-color:var(--background-color);border-radius:20px;border-color:var(--border-color);box-shadow:var(--border-shadow-color);display:flex;flex-direction:column;overflow:hidden;animation:slide-in .5s ease;position:fixed;right:20px;bottom:20px;-webkit-user-select:none;user-select:none}@media (max-width: 768px){.chat-window{width:95%;height:calc(100vh - 20px)}}@media (max-width: 480px){.chat-window{width:90%;height:calc(100vh - 40px)}}.chat-window.fullscreen{width:98vw;height:96vh;border-radius:20px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none}@keyframes slide-in{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}.chat-header{display:flex;justify-content:space-between;align-items:center;padding:10px 20px;background-color:var(--background-color);color:var(--text-alt-color);cursor:move;-webkit-user-select:none;user-select:none}.chat-header:active{cursor:grabbing}.chat-title{display:flex;align-items:center;gap:6px;font-family:var(--font-family)}.chat-logo{width:45px;height:45px;object-fit:contain}.chat-header h2{margin:0;font-size:1.2rem;color:var(--text-alt-color);font-family:var(--font-family);font-weight:700}.header-button{background:none;border:none;color:var(--button-color);cursor:pointer;font-size:1.5rem}.header-button :hover{transform:scale(1.1)}.terms-conditions{font-size:.8rem;color:var(--text-color);margin-top:5px;margin-bottom:10px;display:flex;justify-content:center;align-items:center}.terms-conditions a{color:var(--grey);text-decoration:underline;font-family:var(--font-family)}.terms-conditions a:hover{color:var(--primary-color)}.chat-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.messages-view{display:flex;flex-direction:column;height:100%;width:100%}.messages-view.hidden{display:none}.messages-view app-message-list{flex:1;min-height:0}.messages-view app-snackbar{flex-shrink:0;margin-top:auto}.messages-view app-message-input{flex-shrink:0}.theme-selector{display:flex;align-items:center;padding:4px 12px;gap:8px}.theme-btn{background:none;border:none;color:var(--white);transition:color .2s ease}.theme-btn.selected{color:var(--black)}.auth-prompt-container{padding:20px;display:flex;justify-content:center;align-items:center;flex-direction:column;gap:15px;text-align:center;height:100%}.auth-prompt-container .auth-prompt-text{margin:0;font-size:.95em;opacity:.8;color:var(--text-color)}.auth-prompt-container .auth-buttons{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}.auth-btn{padding:8px 18px;border-radius:20px;cursor:pointer;font-size:.9em;font-weight:500;transition:all .2s ease}.auth-btn.primary{background:var(--primary-color);color:var(--white);border:1px solid var(--primary-color)}.auth-btn.primary:hover{opacity:.9}.auth-btn.primary:disabled{opacity:.5;cursor:not-allowed}.auth-btn.secondary{background:transparent;color:var(--re);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}.login-form-container{padding:20px;display:flex;flex-direction:column;gap:15px;height:100%;justify-content:center;margin:0 auto;box-sizing:border-box;max-width:400px;width:100%}.login-form-container .login-title{text-align:center;margin:0 0 10px;font-size:1.2em;color:var(--text-color);font-family:var(--font-family)}.login-form-container .login-fields{display:flex;flex-direction:column;gap:10px}.login-form-container .login-fields .login-input{padding:10px 12px;border-radius:8px;border:1px solid var(--border-color);font-size:.9em;background:var(--background-color);color:var(--text-color);width:100%;box-sizing:border-box}.login-form-container .login-fields .login-input:focus{outline:none;border-color:var(--primary-color)}.login-form-container .login-fields .password-wrapper{position:relative;display:flex;align-items:center}.login-form-container .login-fields .password-wrapper .login-input{width:100%;padding-right:40px;box-sizing:border-box}.login-form-container .login-fields .password-wrapper .password-toggle-btn{position:absolute;right:8px;background:transparent;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;color:var(--text-color);opacity:.6;transition:opacity .2s}.login-form-container .login-fields .password-wrapper .password-toggle-btn:hover{opacity:1}.login-form-container .login-fields .password-wrapper .password-toggle-btn mat-icon{font-size:20px;width:20px;height:20px}.login-form-container .login-actions{display:flex;justify-content:center;gap:10px;margin-top:10px}.login-form-container .input-group{display:flex;flex-direction:column;gap:4px}.login-form-container .input-label{font-size:.85em;color:var(--text-color);font-family:var(--font-family);font-weight:500}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i3.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i3.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: Chips, selector: "app-chips", inputs: ["messages", "disabled"], outputs: ["chipClick"] }, { kind: "component", type: MessageListComponent, selector: "app-message-list", inputs: ["messages", "isBotTyping", "appLogoUrl", "appSubtitle", "welcomeDesc", "predefinedMessages", "botAvatarUrl", "userAvatarUrl", "userName", "isAuthenticated", "isGuestMode", "trackByMessageId"], outputs: ["suggestionClick", "loginClick", "continueAsGuest"] }, { kind: "component", type: MessageInputComponent, selector: "app-message-input", inputs: ["isBotTyping", "hintText", "sendIcon"], outputs: ["send"] }, { kind: "component", type: SnackBar, selector: "app-snackbar", inputs: ["message", "autoDismiss", "dismissDelay", "show"], outputs: ["closed"] }, { kind: "directive", type: DraggableDialogDirective, selector: "[draggableDialog]", inputs: ["dragHandle", "enableDrag"] }, { kind: "directive", type: ResizableDialogDirective, selector: "[resizableDialog]", inputs: ["enableResize"] }, { kind: "component", type: ChatHistorySidebarComponent, selector: "app-chat-history-sidebar", inputs: ["sessions", "isOpen", "userName"], outputs: ["sessionSelected", "sessionDeleted", "closed"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }] });
1040
1048
  }
1041
1049
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ChatWindowComponent, decorators: [{
1042
1050
  type: Component,
@@ -1052,7 +1060,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1052
1060
  ResizableDialogDirective,
1053
1061
  ChatHistorySidebarComponent,
1054
1062
  FormsModule,
1055
- ], template: "<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img\r\n class=\"chat-logo\"\r\n style=\"width: 150px; height: 50px; margin-left: 0px\"\r\n [src]=\"appHeaderLogoUrl\"\r\n alt=\"Text-Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New Chat Button -->\r\n <!-- <button class=\"header-button\" (click)=\"createNewChat()\">\r\n <mat-icon>add</mat-icon>\r\n </button> -->\r\n\r\n <!-- <app-dropdown-menu>\r\n <span trigger>\u2630</span>\r\n\r\n <app-menu-item (selected)=\"onToggleFullScreen()\"> My Profile </app-menu-item>\r\n\r\n <app-menu-item> Settings </app-menu-item>\r\n\r\n <app-menu-item> Logout </app-menu-item>\r\n </app-dropdown-menu> -->\r\n\r\n <!-- History Button -->\r\n <button\r\n class=\"header-button\"\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onToggleHistorySidebar()\"\r\n title=\"Chat History\"\r\n >\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <!-- <popout-window\r\n #popout\r\n [windowTitle]=\"appTitle || 'Chat'\"\r\n [windowWidth]=\"400\"\r\n [windowHeight]=\"620\"\r\n (shown)=\"onPopoutShown($event)\"\r\n > -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen\">\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n *ngIf=\"!showLoginForm\"\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isGuestMode]=\"isGuestMode\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n (continueAsGuest)=\"onContinueAsGuest()\"\r\n ></app-message-list>\r\n\r\n <!-- SUGGESTED CHIPS: Show only if last bot message was fallback AND user is authenticated -->\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && (isAuthenticated || isGuestMode)\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Inline error message -->\r\n <app-snackbar\r\n *ngIf=\"messageError\"\r\n [message]=\"messageError\"\r\n [show]=\"true\"\r\n (closed)=\"onClearMessageError()\"\r\n ></app-snackbar>\r\n\r\n <!-- Chat Input: Only show when authenticated or guest mode -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated || isGuestMode\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- Login Form -->\r\n <div *ngIf=\"showLoginForm && !isAuthenticated\" class=\"login-form-container\">\r\n <h3 class=\"login-title\">Login</h3>\r\n <div class=\"login-fields\">\r\n <input\r\n type=\"text\"\r\n [(ngModel)]=\"loginUsername\"\r\n placeholder=\"Username\"\r\n class=\"login-input\"\r\n />\r\n <input\r\n type=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n placeholder=\"Password\"\r\n class=\"login-input\"\r\n (keydown.enter)=\"onLoginSubmit()\"\r\n />\r\n </div>\r\n <div class=\"login-actions\">\r\n <button (click)=\"onCancelLogin()\" class=\"auth-btn secondary\">Cancel</button>\r\n <button\r\n (click)=\"onLoginSubmit()\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"!loginUsername || !loginPassword || isLoggingIn\"\r\n >\r\n {{ isLoggingIn ? 'Logging in...' : 'Submit' }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- </popout-window> -->\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Popout Button -->\r\n <!-- <button mat-menu-item (click)=\"popout.popOut()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>open_in_new</mat-icon>\r\n <span>Popout Widget</span>\r\n </button> -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n</mat-menu>\r\n", styles: ["::ng-deep .mat-mdc-menu-panel{background-color:#8b8b8b!important;color:#fff!important;border-radius:8px!important;padding:4px 0!important;box-shadow:0 4px 16px #00000040!important;border-color:#ccc!important;font-family:Roboto,Arial,sans-serif!important;font-size:14px!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item mat-icon{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover{background-color:#5c5c5c!important;color:#f5f5f5!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover mat-icon{color:#f5f5f5!important}.doohbot-container{position:fixed;bottom:20px;right:20px;z-index:1000}.chat-window{width:clamp(400px,30vw,450px);height:clamp(620px,70vh,660px);background-color:var(--background-color);border-radius:20px;border-color:var(--border-color);box-shadow:var(--border-shadow-color);display:flex;flex-direction:column;overflow:hidden;animation:slide-in .5s ease;position:fixed;right:20px;bottom:20px;-webkit-user-select:none;user-select:none}@media (max-width: 768px){.chat-window{width:95%;height:calc(100vh - 20px)}}@media (max-width: 480px){.chat-window{width:90%;height:calc(100vh - 40px)}}.chat-window.fullscreen{width:98vw;height:96vh;border-radius:20px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none}@keyframes slide-in{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}.chat-header{display:flex;justify-content:space-between;align-items:center;padding:10px 20px;background-color:var(--background-color);color:var(--text-alt-color);cursor:move;-webkit-user-select:none;user-select:none}.chat-header:active{cursor:grabbing}.chat-title{display:flex;align-items:center;gap:6px;font-family:var(--font-family)}.chat-logo{width:45px;height:45px;object-fit:contain}.chat-header h2{margin:0;font-size:1.2rem;color:var(--text-alt-color);font-family:var(--font-family);font-weight:700}.header-button{background:none;border:none;color:var(--button-color);cursor:pointer;font-size:1.5rem}.header-button :hover{transform:scale(1.1)}.terms-conditions{font-size:.8rem;color:var(--text-color);margin-top:5px;margin-bottom:10px;display:flex;justify-content:center;align-items:center}.terms-conditions a{color:var(--grey);text-decoration:underline;font-family:var(--font-family)}.terms-conditions a:hover{color:var(--primary-color)}.chat-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.messages-view{display:flex;flex-direction:column;height:100%;width:100%}.messages-view.hidden{display:none}.theme-selector{display:flex;align-items:center;padding:4px 12px;gap:8px}.theme-btn{background:none;border:none;color:var(--white);transition:color .2s ease}.theme-btn.selected{color:var(--black)}.auth-prompt-container{padding:20px;display:flex;justify-content:center;align-items:center;flex-direction:column;gap:15px;text-align:center;height:100%}.auth-prompt-container .auth-prompt-text{margin:0;font-size:.95em;opacity:.8;color:var(--text-color)}.auth-prompt-container .auth-buttons{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}.auth-btn{padding:8px 18px;border-radius:20px;cursor:pointer;font-size:.9em;font-weight:500;transition:all .2s ease}.auth-btn.primary{background:var(--primary-color);color:var(--white);border:1px solid var(--primary-color)}.auth-btn.primary:hover{opacity:.9}.auth-btn.primary:disabled{opacity:.5;cursor:not-allowed}.auth-btn.secondary{background:transparent;color:var(--re);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}.login-form-container{padding:20px;display:flex;flex-direction:column;gap:15px;height:100%;justify-content:center}.login-form-container .login-title{text-align:center;margin:0 0 10px;font-size:1.2em;color:var(--text-color);font-family:var(--font-family)}.login-form-container .login-fields{display:flex;flex-direction:column;gap:10px}.login-form-container .login-fields .login-input{padding:10px 12px;border-radius:8px;border:1px solid var(--border-color);font-size:.9em;background:var(--background-color);color:var(--text-color)}.login-form-container .login-fields .login-input:focus{outline:none;border-color:var(--primary-color)}.login-form-container .login-actions{display:flex;justify-content:center;gap:10px;margin-top:10px}\n"] }]
1063
+ ], template: "<div\r\n *ngIf=\"isChatOpen\"\r\n draggableDialog\r\n [enableDrag]=\"enableDrag\"\r\n [dragHandle]=\"'.chat-header'\"\r\n resizableDialog\r\n [enableResize]=\"enableResize\"\r\n class=\"chat-window\"\r\n [class.fullscreen]=\"isFullScreen\"\r\n>\r\n <!-- chat window -->\r\n <div class=\"chat-header\">\r\n <div class=\"chat-title\">\r\n <img\r\n class=\"chat-logo\"\r\n style=\"width: 150px; height: 50px; margin-left: 0px\"\r\n [src]=\"appHeaderLogoUrl\"\r\n alt=\"Text-Logo\"\r\n />\r\n </div>\r\n\r\n <div class=\"chat-header-buttons\">\r\n <!-- New Chat Button -->\r\n <!-- <button class=\"header-button\" (click)=\"createNewChat()\">\r\n <mat-icon>add</mat-icon>\r\n </button> -->\r\n\r\n <!-- <app-dropdown-menu>\r\n <span trigger>\u2630</span>\r\n\r\n <app-menu-item (selected)=\"onToggleFullScreen()\"> My Profile </app-menu-item>\r\n\r\n <app-menu-item> Settings </app-menu-item>\r\n\r\n <app-menu-item> Logout </app-menu-item>\r\n </app-dropdown-menu> -->\r\n\r\n <!-- History Button -->\r\n <button\r\n class=\"header-button\"\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onToggleHistorySidebar()\"\r\n title=\"Chat History\"\r\n >\r\n <mat-icon>history</mat-icon>\r\n </button>\r\n\r\n <!-- settings Button -->\r\n <button class=\"header-button\" [matMenuTriggerFor]=\"settingsMenu\">\r\n <mat-icon>{{ moreIcon }}</mat-icon>\r\n </button>\r\n\r\n <!-- minimize Button -->\r\n <button class=\"header-button\" (click)=\"onToggleChat()\">\r\n <mat-icon>{{ minimizeIcon }}</mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Main Content Area: Toggle between Messages and History -->\r\n <!-- <popout-window\r\n #popout\r\n [windowTitle]=\"appTitle || 'Chat'\"\r\n [windowWidth]=\"400\"\r\n [windowHeight]=\"620\"\r\n (shown)=\"onPopoutShown($event)\"\r\n > -->\r\n <div class=\"chat-content-wrapper\">\r\n <!-- Chat History View -->\r\n <app-chat-history-sidebar\r\n [sessions]=\"chatSessions\"\r\n [isOpen]=\"isHistorySidebarOpen\"\r\n [userName]=\"chatHistoryUserName\"\r\n (sessionSelected)=\"onSessionSelected($event)\"\r\n (sessionDeleted)=\"onSessionDeleted($event)\"\r\n (closed)=\"onToggleHistorySidebar()\"\r\n >\r\n </app-chat-history-sidebar>\r\n\r\n <!-- Messages View -->\r\n <div class=\"messages-view\" [class.hidden]=\"isHistorySidebarOpen\">\r\n <!-- Messages / Welcome Screen -->\r\n <app-message-list\r\n *ngIf=\"!showLoginForm\"\r\n [messages]=\"messages\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [appLogoUrl]=\"appLogoUrl\"\r\n [appSubtitle]=\"appSubtitle\"\r\n [welcomeDesc]=\"welcomeDesc\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [isAuthenticated]=\"isAuthenticated\"\r\n [isGuestMode]=\"isGuestMode\"\r\n (suggestionClick)=\"onSuggestionClick($event)\"\r\n (loginClick)=\"onLoginClick()\"\r\n (continueAsGuest)=\"onContinueAsGuest()\"\r\n ></app-message-list>\r\n\r\n <!-- SUGGESTED CHIPS: Show only if last bot message was fallback AND user is authenticated -->\r\n <app-chips\r\n *ngIf=\"showSuggestionChips && (isAuthenticated || isGuestMode)\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onSuggestionClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Chat Input: Only show when authenticated or guest mode -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated || isGuestMode\"\r\n [isBotTyping]=\"isBotTyping\"\r\n [hintText]=\"hintText\"\r\n [sendIcon]=\"sendIcon\"\r\n (send)=\"onSend($event)\"\r\n ></app-message-input>\r\n\r\n <!-- Login Form -->\r\n <form\r\n *ngIf=\"showLoginForm && !isAuthenticated\"\r\n class=\"login-form-container\"\r\n (ngSubmit)=\"onLoginSubmit()\"\r\n autocomplete=\"on\"\r\n >\r\n <h3 class=\"login-title\">Login</h3>\r\n\r\n <div class=\"login-fields\">\r\n <input\r\n type=\"text\"\r\n name=\"username\"\r\n [(ngModel)]=\"loginUsername\"\r\n placeholder=\"Username\"\r\n class=\"login-input\"\r\n required\r\n autocomplete=\"username\"\r\n />\r\n\r\n <div class=\"password-wrapper\">\r\n <input\r\n [type]=\"showPassword ? 'text' : 'password'\"\r\n name=\"password\"\r\n [(ngModel)]=\"loginPassword\"\r\n placeholder=\"Password\"\r\n class=\"login-input password-input\"\r\n required\r\n autocomplete=\"current-password\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"password-toggle-btn\"\r\n (click)=\"togglePasswordVisibility()\"\r\n tabindex=\"-1\"\r\n >\r\n <mat-icon>\r\n {{ showPassword ? 'visibility' : 'visibility_off' }}\r\n </mat-icon>\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class=\"login-actions\">\r\n <button type=\"button\" (click)=\"onCancelLogin()\" class=\"auth-btn secondary\">Cancel</button>\r\n\r\n <button\r\n type=\"submit\"\r\n class=\"auth-btn primary\"\r\n [disabled]=\"!loginUsername || !loginPassword || isLoggingIn\"\r\n >\r\n {{ isLoggingIn ? 'Logging in...' : 'Submit' }}\r\n </button>\r\n </div>\r\n </form>\r\n\r\n <!-- Auth error snackbar (login/logout errors only) -->\r\n <app-snackbar\r\n *ngIf=\"authError\"\r\n [message]=\"authError\"\r\n (closed)=\"onClearAuthError()\"\r\n ></app-snackbar>\r\n\r\n <!-- footer -->\r\n <div class=\"terms-conditions\">\r\n <a href=\"#\">Terms and Conditions</a>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- </popout-window> -->\r\n</div>\r\n\r\n<mat-menu #settingsMenu=\"matMenu\">\r\n <!-- Change Theme -->\r\n <div class=\"theme-selector\">\r\n <!-- Auto Theme (inherits from parent app) -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'auto'\"\r\n (click)=\"themeService.setTheme('auto')\"\r\n >\r\n <mat-icon>brightness_auto</mat-icon>\r\n </button>\r\n\r\n <!-- Light Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'light'\"\r\n (click)=\"themeService.setTheme('light')\"\r\n >\r\n <mat-icon>light_mode</mat-icon>\r\n </button>\r\n\r\n <!-- Dark Theme -->\r\n <button\r\n mat-icon-button\r\n class=\"theme-btn\"\r\n [class.selected]=\"themeService.theme() === 'dark'\"\r\n (click)=\"themeService.setTheme('dark')\"\r\n >\r\n <mat-icon>dark_mode</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <!-- Popout Button -->\r\n <!-- <button mat-menu-item (click)=\"popout.popOut()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>open_in_new</mat-icon>\r\n <span>Popout Widget</span>\r\n </button> -->\r\n\r\n <!-- Full-Screen Button -->\r\n <button mat-menu-item (click)=\"onToggleFullScreen()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>{{ isFullScreen ? 'fullscreen_exit' : 'fullscreen' }}</mat-icon>\r\n <span> {{ isFullScreen ? 'Minimize' : 'Expand' }}</span>\r\n </button>\r\n\r\n <!-- Clear Chat -->\r\n <button mat-menu-item (click)=\"onClearChat()\" style=\"display: flex; align-items: center\">\r\n <mat-icon>clear_all</mat-icon>\r\n <span>Clear Chat</span>\r\n </button>\r\n\r\n <!-- Logout -->\r\n <button\r\n mat-menu-item\r\n *ngIf=\"isAuthenticated\"\r\n (click)=\"onLogout()\"\r\n style=\"display: flex; align-items: center\"\r\n >\r\n <mat-icon>logout</mat-icon>\r\n <span>Logout</span>\r\n </button>\r\n</mat-menu>\r\n", styles: ["::ng-deep .mat-mdc-menu-panel{background-color:#8b8b8b!important;color:#fff!important;border-radius:8px!important;padding:4px 0!important;box-shadow:0 4px 16px #00000040!important;border-color:#ccc!important;font-family:Roboto,Arial,sans-serif!important;font-size:14px!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item mat-icon{color:#fff!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover{background-color:#5c5c5c!important;color:#f5f5f5!important}::ng-deep .mat-mdc-menu-panel .mat-mdc-menu-item:hover mat-icon{color:#f5f5f5!important}.doohbot-container{position:fixed;bottom:20px;right:20px;z-index:1000}.chat-window{width:clamp(400px,30vw,450px);height:clamp(620px,70vh,660px);background-color:var(--background-color);border-radius:20px;border-color:var(--border-color);box-shadow:var(--border-shadow-color);display:flex;flex-direction:column;overflow:hidden;animation:slide-in .5s ease;position:fixed;right:20px;bottom:20px;-webkit-user-select:none;user-select:none}@media (max-width: 768px){.chat-window{width:95%;height:calc(100vh - 20px)}}@media (max-width: 480px){.chat-window{width:90%;height:calc(100vh - 40px)}}.chat-window.fullscreen{width:98vw;height:96vh;border-radius:20px;position:fixed;top:50%;left:50%;transform:translate(-50%,-50%);-webkit-user-select:none;user-select:none}@keyframes slide-in{0%{transform:translateY(100%);opacity:0}to{transform:translateY(0);opacity:1}}.chat-header{display:flex;justify-content:space-between;align-items:center;padding:10px 20px;background-color:var(--background-color);color:var(--text-alt-color);cursor:move;-webkit-user-select:none;user-select:none}.chat-header:active{cursor:grabbing}.chat-title{display:flex;align-items:center;gap:6px;font-family:var(--font-family)}.chat-logo{width:45px;height:45px;object-fit:contain}.chat-header h2{margin:0;font-size:1.2rem;color:var(--text-alt-color);font-family:var(--font-family);font-weight:700}.header-button{background:none;border:none;color:var(--button-color);cursor:pointer;font-size:1.5rem}.header-button :hover{transform:scale(1.1)}.terms-conditions{font-size:.8rem;color:var(--text-color);margin-top:5px;margin-bottom:10px;display:flex;justify-content:center;align-items:center}.terms-conditions a{color:var(--grey);text-decoration:underline;font-family:var(--font-family)}.terms-conditions a:hover{color:var(--primary-color)}.chat-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;position:relative}.messages-view{display:flex;flex-direction:column;height:100%;width:100%}.messages-view.hidden{display:none}.messages-view app-message-list{flex:1;min-height:0}.messages-view app-snackbar{flex-shrink:0;margin-top:auto}.messages-view app-message-input{flex-shrink:0}.theme-selector{display:flex;align-items:center;padding:4px 12px;gap:8px}.theme-btn{background:none;border:none;color:var(--white);transition:color .2s ease}.theme-btn.selected{color:var(--black)}.auth-prompt-container{padding:20px;display:flex;justify-content:center;align-items:center;flex-direction:column;gap:15px;text-align:center;height:100%}.auth-prompt-container .auth-prompt-text{margin:0;font-size:.95em;opacity:.8;color:var(--text-color)}.auth-prompt-container .auth-buttons{display:flex;gap:10px;flex-wrap:wrap;justify-content:center}.auth-btn{padding:8px 18px;border-radius:20px;cursor:pointer;font-size:.9em;font-weight:500;transition:all .2s ease}.auth-btn.primary{background:var(--primary-color);color:var(--white);border:1px solid var(--primary-color)}.auth-btn.primary:hover{opacity:.9}.auth-btn.primary:disabled{opacity:.5;cursor:not-allowed}.auth-btn.secondary{background:transparent;color:var(--re);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}.login-form-container{padding:20px;display:flex;flex-direction:column;gap:15px;height:100%;justify-content:center;margin:0 auto;box-sizing:border-box;max-width:400px;width:100%}.login-form-container .login-title{text-align:center;margin:0 0 10px;font-size:1.2em;color:var(--text-color);font-family:var(--font-family)}.login-form-container .login-fields{display:flex;flex-direction:column;gap:10px}.login-form-container .login-fields .login-input{padding:10px 12px;border-radius:8px;border:1px solid var(--border-color);font-size:.9em;background:var(--background-color);color:var(--text-color);width:100%;box-sizing:border-box}.login-form-container .login-fields .login-input:focus{outline:none;border-color:var(--primary-color)}.login-form-container .login-fields .password-wrapper{position:relative;display:flex;align-items:center}.login-form-container .login-fields .password-wrapper .login-input{width:100%;padding-right:40px;box-sizing:border-box}.login-form-container .login-fields .password-wrapper .password-toggle-btn{position:absolute;right:8px;background:transparent;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;padding:4px;color:var(--text-color);opacity:.6;transition:opacity .2s}.login-form-container .login-fields .password-wrapper .password-toggle-btn:hover{opacity:1}.login-form-container .login-fields .password-wrapper .password-toggle-btn mat-icon{font-size:20px;width:20px;height:20px}.login-form-container .login-actions{display:flex;justify-content:center;gap:10px;margin-top:10px}.login-form-container .input-group{display:flex;flex-direction:column;gap:4px}.login-form-container .input-label{font-size:.85em;color:var(--text-color);font-family:var(--font-family);font-weight:500}\n"] }]
1056
1064
  }], propDecorators: { isChatOpen: [{
1057
1065
  type: Input
1058
1066
  }], enableDrag: [{
@@ -1145,6 +1153,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1145
1153
  type: Output
1146
1154
  }], loginSubmit: [{
1147
1155
  type: Output
1156
+ }], logout: [{
1157
+ type: Output
1148
1158
  }] } });
1149
1159
 
1150
1160
  class FullscreenDirective {
@@ -1214,6 +1224,7 @@ const environment = {
1214
1224
  production: false,
1215
1225
  apiBaseUrl: '',
1216
1226
  loginEndpoint: '',
1227
+ apiSegment: 'api/v1/',
1217
1228
  };
1218
1229
 
1219
1230
  class AppConst {
@@ -1222,9 +1233,11 @@ class AppConst {
1222
1233
  async load() {
1223
1234
  const filePath = `../assets/${environment.production ? environment.config : environment.config}?t=${new Date().getTime()}`;
1224
1235
  const response = await fetch(filePath);
1236
+ console.error('============================ AppConst ============================', filePath);
1225
1237
  if (response.ok) {
1226
1238
  try {
1227
1239
  AppConst.data = await response.json();
1240
+ console.error('============================ AppConst ============================', AppConst.data);
1228
1241
  // Override apiBaseUrl if present in environment
1229
1242
  // if (environment.apiBaseUrl) {
1230
1243
  // AppConst.data.apiBaseUrl = environment.apiBaseUrl;
@@ -1788,240 +1801,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1788
1801
  }]
1789
1802
  }], ctorParameters: () => [] });
1790
1803
 
1791
- class MessageService {
1792
- // Context-aware message storage
1793
- currentContextKey = signal('default', ...(ngDevMode ? [{ debugName: "currentContextKey" }] : []));
1794
- // Public messages signal for current context
1795
- messages = signal([], ...(ngDevMode ? [{ debugName: "messages" }] : []));
1796
- audioUnlocked = false;
1797
- // Active session
1798
- activeSession = null;
1799
- // API service (optional)
1800
- apiService = inject(ChatbotApiService, { optional: true });
1801
- chatHistoryService = inject(ChatHistoryService);
1802
- // User context for backend proxy mode
1803
- userContext;
1804
- // API state signals
1805
- isLoadingApi = signal(false, ...(ngDevMode ? [{ debugName: "isLoadingApi" }] : []));
1806
- apiError = signal(null, ...(ngDevMode ? [{ debugName: "apiError" }] : []));
1807
- isBotTyping = signal(false, ...(ngDevMode ? [{ debugName: "isBotTyping" }] : []));
1808
- isGuestMode = signal(false, ...(ngDevMode ? [{ debugName: "isGuestMode" }] : []));
1809
- constructor() {
1810
- // Start with empty messages - no auto-load
1811
- }
1812
- setGuestMode(isGuest) {
1813
- this.isGuestMode.set(isGuest);
1814
- }
1815
- /**
1816
- * Switch to a new context
1817
- */
1818
- switchContext(contextKey) {
1819
- this.currentContextKey.set(contextKey);
1820
- // Start fresh - don't auto-load
1821
- this.startNewSession();
1822
- }
1823
- /**
1824
- * Start a new chat session
1825
- */
1826
- startNewSession() {
1827
- const contextKey = this.currentContextKey();
1828
- const userId = this.userContext?.userId || 'anonymous';
1829
- this.activeSession = this.chatHistoryService.createSession(contextKey, userId);
1830
- this.messages.set([]);
1831
- }
1832
- /**
1833
- * Load an existing session
1834
- */
1835
- loadSession(session) {
1836
- this.activeSession = session;
1837
- this.messages.set([...session.messages]);
1838
- }
1839
- /**
1840
- * Get current context key
1841
- */
1842
- getCurrentContextKey() {
1843
- return this.currentContextKey();
1844
- }
1845
- /**
1846
- * Set user context for backend proxy mode
1847
- */
1848
- setUserContext(context) {
1849
- this.userContext = context;
1850
- // Start fresh when user changes - don't auto-load
1851
- this.startNewSession();
1852
- }
1853
- /**
1854
- * Get current user context
1855
- */
1856
- getUserContext() {
1857
- return this.userContext;
1858
- }
1859
- /**
1860
- * Get active session
1861
- */
1862
- getActiveSession() {
1863
- return this.activeSession;
1864
- }
1865
- /**
1866
- * Clear messages for current session and start new one
1867
- */
1868
- clearMessages() {
1869
- this.messages.set([]);
1870
- this.startNewSession();
1871
- }
1872
- /**
1873
- * Add message to current session
1874
- */
1875
- addMessage(message) {
1876
- const newMessage = { ...message, timestamp: new Date() };
1877
- // Update current messages signal
1878
- this.messages.update((msgs) => [...msgs, newMessage]);
1879
- // Save to active session
1880
- if (this.activeSession) {
1881
- console.log('Saving message to session:', this.activeSession.id);
1882
- this.chatHistoryService.saveMessageToSession(this.activeSession, newMessage).subscribe(() => {
1883
- console.log('Message saved, session title:', this.activeSession?.title);
1884
- });
1885
- }
1886
- else {
1887
- console.warn('No active session to save message to!');
1888
- }
1889
- if (message.sender === 'bot') {
1890
- this.playBotSound();
1891
- }
1892
- }
1893
- /**
1894
- * Get bot reply - supports both API and local modes
1895
- */
1896
- async getBotReply(userText) {
1897
- // If in guest mode, force local logic
1898
- if (this.isGuestMode()) {
1899
- return this.getBotReplyLocal(userText);
1900
- }
1901
- // Check if API mode is enabled
1902
- if (this.apiService?.isApiEnabled()) {
1903
- return this.getBotReplyFromApi(userText);
1904
- }
1905
- // Fall back to local intent matching
1906
- return this.getBotReplyLocal(userText);
1907
- }
1908
- /**
1909
- * Get bot reply from API
1910
- */
1911
- async getBotReplyFromApi(userText) {
1912
- if (!this.apiService) {
1913
- return this.getFallbackReply();
1914
- }
1915
- try {
1916
- this.isLoadingApi.set(true);
1917
- this.apiError.set(null);
1918
- // Get message history if API config includes history
1919
- const history = this.apiService.getConfig().includeHistory ? this.messages() : undefined;
1920
- // Call API
1921
- const response = await firstValueFrom(this.apiService.sendMessage(userText, history));
1922
- this.isLoadingApi.set(false);
1923
- return response.reply;
1924
- }
1925
- catch (error) {
1926
- this.isLoadingApi.set(false);
1927
- const apiError = error;
1928
- this.apiError.set(apiError);
1929
- console.error('API error, falling back to local mode:', apiError);
1930
- // Fallback to local mode on API error
1931
- return this.getBotReplyLocal(userText);
1932
- }
1933
- }
1934
- /**
1935
- * Get bot reply using local intent matching
1936
- */
1937
- getBotReplyLocal(userText) {
1938
- const text = userText.toLowerCase();
1939
- for (const intent of CHAT_INTENTS) {
1940
- if (intent.patterns.some((pattern) => text.includes(pattern))) {
1941
- return intent.response;
1942
- }
1943
- }
1944
- return this.getFallbackReply();
1945
- }
1946
- /**
1947
- * Process a user message: add it, get bot reply, and add bot reply
1948
- */
1949
- async processUserMessage(text) {
1950
- this.addMessage({
1951
- sender: 'user',
1952
- text: text,
1953
- id: Date.now().toString(),
1954
- timestamp: new Date(),
1955
- });
1956
- this.isBotTyping.set(true);
1957
- const minDelay = 1000;
1958
- const start = Date.now();
1959
- try {
1960
- const botReply = await this.getBotReply(text);
1961
- // Ensure minimum delay
1962
- const elapsed = Date.now() - start;
1963
- if (elapsed < minDelay) {
1964
- await new Promise((resolve) => setTimeout(resolve, minDelay - elapsed));
1965
- }
1966
- const isFallback = botReply === this.getFallbackReply();
1967
- this.addMessage({
1968
- sender: 'bot',
1969
- text: botReply,
1970
- id: Date.now().toString(),
1971
- showSuggestions: isFallback,
1972
- });
1973
- }
1974
- catch (error) {
1975
- console.error('Error getting bot reply:', error);
1976
- this.addMessage({
1977
- sender: 'bot',
1978
- text: this.getFallbackReply(),
1979
- id: Date.now().toString(),
1980
- showSuggestions: true,
1981
- });
1982
- }
1983
- finally {
1984
- this.isBotTyping.set(false);
1985
- }
1986
- }
1987
- getFallbackReply() {
1988
- return "I'm sorry 😔, I didn't understand that.";
1989
- }
1990
- isFallbackIntent(userText) {
1991
- const text = userText.toLowerCase();
1992
- return !CHAT_INTENTS.some((intent) => intent.patterns.some((pattern) => text.includes(pattern)));
1993
- }
1994
- unlockAudio() {
1995
- if (this.audioUnlocked)
1996
- return;
1997
- const audio = new Audio();
1998
- audio.volume = 1.0;
1999
- audio
2000
- .play()
2001
- .then(() => (this.audioUnlocked = true))
2002
- .catch(() => { });
2003
- }
2004
- playBotSound() {
2005
- if (!this.audioUnlocked)
2006
- return;
2007
- try {
2008
- const audio = new Audio('assets/bot.mp3');
2009
- audio.play();
2010
- }
2011
- catch (error) {
2012
- console.error('Error playing bot sound:', error);
2013
- }
2014
- }
2015
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2016
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageService, providedIn: 'root' });
2017
- }
2018
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageService, decorators: [{
2019
- type: Injectable,
2020
- args: [{
2021
- providedIn: 'root',
2022
- }]
2023
- }], ctorParameters: () => [] });
2024
-
2025
1804
  class HttpService {
2026
1805
  http;
2027
1806
  // @BlockUI() blockUI!: NgBlockUI;
@@ -2029,6 +1808,8 @@ class HttpService {
2029
1808
  constructor(http) {
2030
1809
  this.http = http;
2031
1810
  this.apiUrl = `${AppConst?.data?.apiBaseUrl}${AppConst?.data?.apiSegment}`;
1811
+ // this.apiUrl = `${environment.apiBaseUrl}${environment.apiSegment}`;
1812
+ console.log('HttpService: Initialized', this.apiUrl);
2032
1813
  }
2033
1814
  get(url, param, nestedParam = false, showLoader = false, refresh = true) {
2034
1815
  // if (showLoader && !this.blockUI.isActive) {
@@ -2091,7 +1872,22 @@ class AccountService {
2091
1872
  this.http = http;
2092
1873
  }
2093
1874
  login(param, showLoader = false) {
2094
- return this.http.post('Account/Login', param, showLoader);
1875
+ return this.http.post('auth/login', param, showLoader);
1876
+ }
1877
+ logout(refreshToken, showLoader = false) {
1878
+ return this.http.post('auth/logout', { refresh_token: refreshToken }, showLoader);
1879
+ }
1880
+ startChat(param, showLoader = false) {
1881
+ return this.http.post('chat/ask', param, showLoader);
1882
+ }
1883
+ getChatHistory(param, showLoader = false) {
1884
+ return this.http.get('chat/history', param, showLoader);
1885
+ }
1886
+ deleteHistory(param, showLoader = false) {
1887
+ return this.http.post('chat/history', param, showLoader);
1888
+ }
1889
+ refreshLogin(param, showLoader = false) {
1890
+ return this.http.post('Account/RefreshToken', param, showLoader);
2095
1891
  }
2096
1892
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountService, deps: [{ token: HttpService }], target: i0.ɵɵFactoryTarget.Injectable });
2097
1893
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AccountService, providedIn: 'root' });
@@ -2294,25 +2090,266 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
2294
2090
  }]
2295
2091
  }], ctorParameters: () => [{ type: i1$5.Router }, { type: i1$4.HttpClient }, { type: CryptoHelperService }] });
2296
2092
 
2297
- /**
2298
- * ChatFacadeService - High-level orchestration service
2299
- *
2300
- * Coordinates operations between multiple services to provide simplified,
2301
- * high-level operations for the chat component. This facade encapsulates
2302
- * complex interactions and provides a clean API for common chat operations.
2303
- *
2304
- * Responsibilities:
2305
- * - Session management (load, delete, switch sessions)
2306
- * - Authentication orchestration
2307
- * - Message operations coordination
2308
- * - Context management
2309
- */
2310
- class ChatFacadeService {
2311
- messageService = inject(MessageService);
2312
- chatHistoryService = inject(ChatHistoryService);
2313
- accountService = inject(AccountService);
2314
- authService = inject(AuthService);
2315
- tenantContextService = inject(TenantContextService);
2093
+ class MessageService {
2094
+ // Context-aware message storage
2095
+ currentContextKey = signal('default', ...(ngDevMode ? [{ debugName: "currentContextKey" }] : []));
2096
+ // Public messages signal for current context
2097
+ messages = signal([], ...(ngDevMode ? [{ debugName: "messages" }] : []));
2098
+ audioUnlocked = false;
2099
+ // Active session
2100
+ activeSession = null;
2101
+ // API service (optional)
2102
+ apiService = inject(ChatbotApiService, { optional: true });
2103
+ chatHistoryService = inject(ChatHistoryService);
2104
+ // User context for backend proxy mode
2105
+ userContext;
2106
+ // API state signals
2107
+ isLoadingApi = signal(false, ...(ngDevMode ? [{ debugName: "isLoadingApi" }] : []));
2108
+ apiError = signal(null, ...(ngDevMode ? [{ debugName: "apiError" }] : []));
2109
+ isBotTyping = signal(false, ...(ngDevMode ? [{ debugName: "isBotTyping" }] : []));
2110
+ isGuestMode = signal(false, ...(ngDevMode ? [{ debugName: "isGuestMode" }] : []));
2111
+ constructor() {
2112
+ // Start with empty messages - no auto-load
2113
+ }
2114
+ setGuestMode(isGuest) {
2115
+ this.isGuestMode.set(isGuest);
2116
+ }
2117
+ /**
2118
+ * Switch to a new context
2119
+ */
2120
+ switchContext(contextKey) {
2121
+ this.currentContextKey.set(contextKey);
2122
+ // Start fresh - don't auto-load
2123
+ this.startNewSession();
2124
+ }
2125
+ /**
2126
+ * Start a new chat session
2127
+ */
2128
+ startNewSession() {
2129
+ const contextKey = this.currentContextKey();
2130
+ const userId = this.userContext?.userId || 'anonymous';
2131
+ this.activeSession = this.chatHistoryService.createSession(contextKey, userId);
2132
+ this.messages.set([]);
2133
+ }
2134
+ /**
2135
+ * Load an existing session
2136
+ */
2137
+ loadSession(session) {
2138
+ this.activeSession = session;
2139
+ this.messages.set([...session.messages]);
2140
+ }
2141
+ /**
2142
+ * Get current context key
2143
+ */
2144
+ getCurrentContextKey() {
2145
+ return this.currentContextKey();
2146
+ }
2147
+ /**
2148
+ * Set user context for backend proxy mode
2149
+ */
2150
+ setUserContext(context) {
2151
+ this.userContext = context;
2152
+ // Start fresh when user changes - don't auto-load
2153
+ this.startNewSession();
2154
+ }
2155
+ /**
2156
+ * Get current user context
2157
+ */
2158
+ getUserContext() {
2159
+ return this.userContext;
2160
+ }
2161
+ /**
2162
+ * Get active session
2163
+ */
2164
+ getActiveSession() {
2165
+ return this.activeSession;
2166
+ }
2167
+ /**
2168
+ * Clear messages for current session and start new one
2169
+ */
2170
+ clearMessages() {
2171
+ this.messages.set([]);
2172
+ this.startNewSession();
2173
+ }
2174
+ /**
2175
+ * Add message to current session
2176
+ */
2177
+ addMessage(message) {
2178
+ const newMessage = { ...message, timestamp: new Date() };
2179
+ // Update current messages signal
2180
+ this.messages.update((msgs) => [...msgs, newMessage]);
2181
+ // Save to active session
2182
+ if (this.activeSession) {
2183
+ console.log('Saving message to session:', this.activeSession.id);
2184
+ this.chatHistoryService.saveMessageToSession(this.activeSession, newMessage).subscribe(() => {
2185
+ console.log('Message saved, session title:', this.activeSession?.title);
2186
+ });
2187
+ }
2188
+ else {
2189
+ console.warn('No active session to save message to!');
2190
+ }
2191
+ if (message.sender === 'bot') {
2192
+ this.playBotSound();
2193
+ }
2194
+ }
2195
+ /**
2196
+ * Get bot reply - supports both API and local modes
2197
+ */
2198
+ async getBotReply(userText) {
2199
+ // If in guest mode, force local logic
2200
+ if (this.isGuestMode()) {
2201
+ return this.getBotReplyLocal(userText);
2202
+ }
2203
+ // Get auth service to check if user is authenticated
2204
+ const authService = inject(AuthService, { optional: true });
2205
+ const isAuthenticated = authService?.isAuthenticated() || false;
2206
+ // Call API if user is authenticated
2207
+ if (isAuthenticated) {
2208
+ return this.getBotReplyFromApi(userText);
2209
+ }
2210
+ // Fall back to local intent matching
2211
+ return this.getBotReplyLocal(userText);
2212
+ }
2213
+ /**
2214
+ * Get bot reply from API
2215
+ */
2216
+ async getBotReplyFromApi(userText) {
2217
+ // Inject AccountService dynamically
2218
+ const accountService = inject(AccountService, { optional: true });
2219
+ if (!accountService) {
2220
+ console.error('AccountService not available, falling back to local');
2221
+ return this.getBotReplyLocal(userText);
2222
+ }
2223
+ try {
2224
+ this.isLoadingApi.set(true);
2225
+ this.apiError.set(null);
2226
+ // Call chat API endpoint
2227
+ const response = await firstValueFrom(accountService.startChat({ message: userText }));
2228
+ this.isLoadingApi.set(false);
2229
+ if (response && response.success && response.data) {
2230
+ return response.data.reply || response.data.message || this.getFallbackReply();
2231
+ }
2232
+ return this.getFallbackReply();
2233
+ }
2234
+ catch (error) {
2235
+ this.isLoadingApi.set(false);
2236
+ const apiError = error;
2237
+ this.apiError.set(apiError);
2238
+ console.error('API error, falling back to local mode:', apiError);
2239
+ // Fallback to local mode on API error
2240
+ return this.getBotReplyLocal(userText);
2241
+ }
2242
+ }
2243
+ /**
2244
+ * Get bot reply using local intent matching
2245
+ */
2246
+ getBotReplyLocal(userText) {
2247
+ const text = userText.toLowerCase();
2248
+ for (const intent of CHAT_INTENTS) {
2249
+ if (intent.patterns.some((pattern) => text.includes(pattern))) {
2250
+ return intent.response;
2251
+ }
2252
+ }
2253
+ return this.getFallbackReply();
2254
+ }
2255
+ /**
2256
+ * Process a user message: add it, get bot reply, and add bot reply
2257
+ */
2258
+ async processUserMessage(text) {
2259
+ this.addMessage({
2260
+ sender: 'user',
2261
+ text: text,
2262
+ id: Date.now().toString(),
2263
+ timestamp: new Date(),
2264
+ });
2265
+ this.isBotTyping.set(true);
2266
+ const minDelay = 1000;
2267
+ const start = Date.now();
2268
+ try {
2269
+ const botReply = await this.getBotReply(text);
2270
+ // Ensure minimum delay
2271
+ const elapsed = Date.now() - start;
2272
+ if (elapsed < minDelay) {
2273
+ await new Promise((resolve) => setTimeout(resolve, minDelay - elapsed));
2274
+ }
2275
+ const isFallback = botReply === this.getFallbackReply();
2276
+ this.addMessage({
2277
+ sender: 'bot',
2278
+ text: botReply,
2279
+ id: Date.now().toString(),
2280
+ showSuggestions: isFallback,
2281
+ });
2282
+ }
2283
+ catch (error) {
2284
+ console.error('Error getting bot reply:', error);
2285
+ this.addMessage({
2286
+ sender: 'bot',
2287
+ text: this.getFallbackReply(),
2288
+ id: Date.now().toString(),
2289
+ showSuggestions: true,
2290
+ });
2291
+ }
2292
+ finally {
2293
+ this.isBotTyping.set(false);
2294
+ }
2295
+ }
2296
+ getFallbackReply() {
2297
+ return "I'm sorry 😔, I didn't understand that.";
2298
+ }
2299
+ isFallbackIntent(userText) {
2300
+ const text = userText.toLowerCase();
2301
+ return !CHAT_INTENTS.some((intent) => intent.patterns.some((pattern) => text.includes(pattern)));
2302
+ }
2303
+ unlockAudio() {
2304
+ if (this.audioUnlocked)
2305
+ return;
2306
+ const audio = new Audio();
2307
+ audio.volume = 1.0;
2308
+ audio
2309
+ .play()
2310
+ .then(() => (this.audioUnlocked = true))
2311
+ .catch(() => { });
2312
+ }
2313
+ playBotSound() {
2314
+ if (!this.audioUnlocked)
2315
+ return;
2316
+ try {
2317
+ const audio = new Audio('assets/bot.mp3');
2318
+ audio.play();
2319
+ }
2320
+ catch (error) {
2321
+ console.error('Error playing bot sound:', error);
2322
+ }
2323
+ }
2324
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2325
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageService, providedIn: 'root' });
2326
+ }
2327
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageService, decorators: [{
2328
+ type: Injectable,
2329
+ args: [{
2330
+ providedIn: 'root',
2331
+ }]
2332
+ }], ctorParameters: () => [] });
2333
+
2334
+ /**
2335
+ * ChatFacadeService - High-level orchestration service
2336
+ *
2337
+ * Coordinates operations between multiple services to provide simplified,
2338
+ * high-level operations for the chat component. This facade encapsulates
2339
+ * complex interactions and provides a clean API for common chat operations.
2340
+ *
2341
+ * Responsibilities:
2342
+ * - Session management (load, delete, switch sessions)
2343
+ * - Authentication orchestration
2344
+ * - Message operations coordination
2345
+ * - Context management
2346
+ */
2347
+ class ChatFacadeService {
2348
+ messageService = inject(MessageService);
2349
+ chatHistoryService = inject(ChatHistoryService);
2350
+ accountService = inject(AccountService);
2351
+ authService = inject(AuthService);
2352
+ tenantContextService = inject(TenantContextService);
2316
2353
  // Chat State
2317
2354
  messages = this.messageService.messages;
2318
2355
  isBotTyping = this.messageService.isBotTyping;
@@ -2334,6 +2371,13 @@ class ChatFacadeService {
2334
2371
  this.isGuestMode.set(true);
2335
2372
  }
2336
2373
  }
2374
+ /**
2375
+ * Get logged-in user's name from auth token
2376
+ */
2377
+ getLoggedInUserName() {
2378
+ const username = this.authService.getLocalStorage('username');
2379
+ return username || 'User';
2380
+ }
2337
2381
  // ============================================================================
2338
2382
  // SESSION MANAGEMENT
2339
2383
  // ============================================================================
@@ -2415,6 +2459,8 @@ class ChatFacadeService {
2415
2459
  */
2416
2460
  clearMessageError() {
2417
2461
  this.messageError.set(null);
2462
+ this.authError.set(null);
2463
+ this.authSuccess.set(null);
2418
2464
  }
2419
2465
  // ============================================================================
2420
2466
  // AUTHENTICATION
@@ -2436,22 +2482,31 @@ class ChatFacadeService {
2436
2482
  /**
2437
2483
  * Authenticate user with credentials
2438
2484
  */
2439
- async login(credentials) {
2485
+ async login(credentials, silent = false) {
2440
2486
  this.isLoggingIn.set(true);
2441
- this.authError.set(null);
2442
- this.authSuccess.set(null);
2487
+ if (!silent) {
2488
+ this.authError.set(null);
2489
+ this.authSuccess.set(null);
2490
+ }
2443
2491
  try {
2444
2492
  const response = await firstValueFrom(this.accountService.login(credentials));
2493
+ console.log('>>>>>>>>>>>Login response<<<<<<<<<<:', response);
2494
+ console.log('>>>>>>>>>>Credentials used<<<<<<<<:', credentials);
2445
2495
  if (response && response.success) {
2496
+ console.log('Login response (success):', response);
2446
2497
  this.isAuthenticated.set(true);
2447
2498
  this.disableGuestMode(); // Ensure guest mode is off
2448
- this.authSuccess.set('Login successful!');
2499
+ if (!silent) {
2500
+ this.authSuccess.set('Login successful!');
2501
+ }
2449
2502
  this.isLoggingIn.set(false);
2450
2503
  return true;
2451
2504
  }
2452
2505
  else {
2453
2506
  this.isAuthenticated.set(false);
2454
- this.authError.set('Login failed. Please check your credentials.');
2507
+ if (!silent) {
2508
+ this.authError.set('Login failed. Please check your credentials.');
2509
+ }
2455
2510
  this.isLoggingIn.set(false);
2456
2511
  return false;
2457
2512
  }
@@ -2459,7 +2514,9 @@ class ChatFacadeService {
2459
2514
  catch (error) {
2460
2515
  console.error('Login failed:', error);
2461
2516
  this.isAuthenticated.set(false);
2462
- this.authError.set('An error occurred during login.');
2517
+ if (!silent) {
2518
+ this.authError.set('An error occurred during login.');
2519
+ }
2463
2520
  this.isLoggingIn.set(false);
2464
2521
  return false;
2465
2522
  }
@@ -2470,6 +2527,59 @@ class ChatFacadeService {
2470
2527
  checkAuthentication() {
2471
2528
  return this.authService.isAuthenticated();
2472
2529
  }
2530
+ /**
2531
+ * Logout the current user
2532
+ */
2533
+ async logout() {
2534
+ try {
2535
+ // Get refresh token from auth service
2536
+ const refreshToken = this.authService.getLocalStorage('refresh_token');
2537
+ if (!refreshToken) {
2538
+ console.warn('No refresh token found, clearing local state only');
2539
+ this.clearAuthState();
2540
+ return;
2541
+ }
2542
+ // Call the backend logout endpoint with refresh token
2543
+ const response = await firstValueFrom(this.accountService.logout(refreshToken));
2544
+ if (response && response.success) {
2545
+ this.clearAuthState();
2546
+ console.log('User logged out successfully');
2547
+ }
2548
+ else {
2549
+ throw new Error('Logout failed');
2550
+ }
2551
+ }
2552
+ catch (error) {
2553
+ console.error('Logout failed:', error);
2554
+ // Even if backend logout fails, clear local state
2555
+ this.clearAuthState();
2556
+ this.authError.set('Logout completed with errors.');
2557
+ setTimeout(() => {
2558
+ this.authError.set(null);
2559
+ }, 5000);
2560
+ }
2561
+ }
2562
+ /**
2563
+ * Clear authentication state and reset UI
2564
+ */
2565
+ clearAuthState() {
2566
+ // Clear auth storage via AuthService
2567
+ this.authService.clearAuth();
2568
+ // Update authentication state
2569
+ this.isAuthenticated.set(false);
2570
+ this.isGuestMode.set(false);
2571
+ // Clear messages and start new session
2572
+ this.messageService.clearMessages();
2573
+ this.messageService.startNewSession();
2574
+ // Clear sessions
2575
+ this.chatSessions.set([]);
2576
+ // Show success message
2577
+ this.authSuccess.set('Logged out successfully!');
2578
+ // Clear success message after 3 seconds
2579
+ setTimeout(() => {
2580
+ this.authSuccess.set(null);
2581
+ }, 3000);
2582
+ }
2473
2583
  // ============================================================================
2474
2584
  // CONTEXT MANAGEMENT
2475
2585
  // ============================================================================
@@ -2720,6 +2830,43 @@ const appEmoji = {
2720
2830
  redHeart: '\u{2764}\u{FE0F}',
2721
2831
  };
2722
2832
 
2833
+ class AuthInterceptor {
2834
+ auth;
2835
+ constructor(auth) {
2836
+ this.auth = auth;
2837
+ }
2838
+ intercept(req, next) {
2839
+ const authReq = this.getRequestWithHeaders(req);
2840
+ return this.sendRequest(authReq, next);
2841
+ }
2842
+ sendRequest(req, next) {
2843
+ return next.handle(req).pipe(tap((event) => {
2844
+ // if (event instanceof HttpResponse) {
2845
+ // this.ngxCache.setHttpResponse(req.urlWithParams
2846
+ // .replace('refresh=true', '')
2847
+ // .replace('refresh=false', '')
2848
+ // .replace('refresh=undefined', ''), event, AppConst.data.timeToLeave || 60);
2849
+ // }
2850
+ }));
2851
+ }
2852
+ getRequestWithHeaders(req) {
2853
+ let headers = req.headers;
2854
+ const token = this.auth.getLocalStorage('access_token') ?? '';
2855
+ if (token != '') {
2856
+ headers = headers.set('Authorization', `Bearer ${token}`);
2857
+ }
2858
+ return req.clone({ headers });
2859
+ }
2860
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AuthInterceptor, deps: [{ token: AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
2861
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AuthInterceptor, providedIn: 'root' });
2862
+ }
2863
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: AuthInterceptor, decorators: [{
2864
+ type: Injectable,
2865
+ args: [{
2866
+ providedIn: 'root',
2867
+ }]
2868
+ }], ctorParameters: () => [{ type: AuthService }] });
2869
+
2723
2870
  class Doohbot extends DoohbotInput {
2724
2871
  elementRef;
2725
2872
  renderer;
@@ -2807,6 +2954,17 @@ class Doohbot extends DoohbotInput {
2807
2954
  this.renderer.addClass(host, activeTheme);
2808
2955
  this.themeService.applyCssVariables(host, this.themeConfig);
2809
2956
  });
2957
+ // Update userName when authentication status changes
2958
+ effect(() => {
2959
+ const isAuth = this.chatFacade.isAuthenticated();
2960
+ if (isAuth) {
2961
+ const loggedInName = this.chatFacade.getLoggedInUserName();
2962
+ if (loggedInName !== 'User') {
2963
+ this.userName = loggedInName;
2964
+ console.log('Updated userName from auth token:', this.userName);
2965
+ }
2966
+ }
2967
+ });
2810
2968
  }
2811
2969
  // ============================================================================
2812
2970
  // LIFECYCLE HOOKS
@@ -2820,7 +2978,7 @@ class Doohbot extends DoohbotInput {
2820
2978
  this.uiState.closeChat();
2821
2979
  // Close history sidebar when user is switched
2822
2980
  this.uiState.closeHistorySidebar();
2823
- this.performLogin();
2981
+ // this.performLogin();
2824
2982
  // Load sessions for new user
2825
2983
  this.loadUserSessions();
2826
2984
  }
@@ -2867,10 +3025,11 @@ class Doohbot extends DoohbotInput {
2867
3025
  username: this.config.username || AppConst.data?.username,
2868
3026
  password: this.config.password || AppConst.data?.password,
2869
3027
  };
2870
- this.chatFacade.login(credentials);
3028
+ console.log('performLogin:', credentials.username, credentials.password);
3029
+ this.chatFacade.login(credentials, true);
2871
3030
  }
2872
3031
  performLoginWithCredentials(credentials) {
2873
- this.chatFacade.login(credentials);
3032
+ this.chatFacade.login(credentials, false);
2874
3033
  }
2875
3034
  continueAsGuest() {
2876
3035
  this.chatFacade.enableGuestMode();
@@ -2878,6 +3037,9 @@ class Doohbot extends DoohbotInput {
2878
3037
  disableGuestMode() {
2879
3038
  this.chatFacade.disableGuestMode();
2880
3039
  }
3040
+ performLogout() {
3041
+ this.chatFacade.logout();
3042
+ }
2881
3043
  // ============================================================================
2882
3044
  // CHAT OPERATIONS
2883
3045
  // ============================================================================
@@ -2932,27 +3094,11 @@ class Doohbot extends DoohbotInput {
2932
3094
  return item.id || index.toString();
2933
3095
  }
2934
3096
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: Doohbot, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
2935
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: Doohbot, isStandalone: true, selector: "app-doohbot", inputs: { config: "config", platformTenant: "platformTenant", subTenant: "subTenant", agent: "agent", buttonStyle: "buttonStyle", enableDrag: "enableDrag", enableResize: "enableResize", apiConfig: "apiConfig", userContext: "userContext", themeConfig: "themeConfig" }, providers: [
2936
- AppConst,
2937
- {
2938
- provide: APP_INITIALIZER,
2939
- useFactory: (appConst) => () => appConst.load(),
2940
- deps: [AppConst],
2941
- multi: true,
2942
- },
2943
- ], viewQueries: [{ propertyName: "chatWindowRef", first: true, predicate: ChatWindowComponent, descendants: true, read: ElementRef }, { propertyName: "fullscreenDirective", first: true, predicate: FullscreenDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n appFullscreen\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [isAuthenticated]=\"isAuthenticated()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n [isHistorySidebarOpen]=\"isHistorySidebarOpen()\"\r\n [chatSessions]=\"chatSessions()\"\r\n [chatHistoryUserName]=\"userName\"\r\n [isGuestUser]=\"isGuestUser()\"\r\n [isGuestMode]=\"isGuestMode()\"\r\n [isLoggingIn]=\"isLoggingIn()\"\r\n [authError]=\"authError()\"\r\n [authSuccess]=\"authSuccess()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (continueAsGuest)=\"continueAsGuest()\"\r\n (loginClick)=\"disableGuestMode()\"\r\n (loginSubmit)=\"performLoginWithCredentials($event)\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\"\r\n (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n></app-chat-window>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";:host(.light-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #f8f9fa;--chat-input-color: var(--background-color);--text-alt-color: #000000;--button-color: #000000;--text-color: #333;--secondary-text-color: #858585;--hint-text-color: #858585;--user-message-color: var(--primary-color);--bot-message-color: #e9ecef;--user-text-color: #fff;--bot-text-color: #333;--border-color: #ccc;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .25);--border-top-color: #dddddd00;--typing-indicator-color: #999;--avatar-filter: invert(48%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(96%) contrast(91%);--white: #ffffff;--black: #000000;--grey: #6c757d;--red: #ff0000;--light-red: #f28b8b}:host(.dark-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #1a1717;--chat-input-color: var(--background-color);--text-alt-color: #ffffff;--button-color: #ffffff;--text-color: #f5f5f5;--secondary-text-color: #a1a1a1;--hint-text-color: #a1a1a1;--user-message-color: var(--primary-color);--bot-message-color: #333;--user-text-color: #fff;--bot-text-color: #fff;--border-color: #444;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .75);--border-top-color: #44444400;--typing-indicator-color: #bbb;--avatar-filter: invert(100%) brightness(100%);--white: #ffffff;--black: #000000;--grey: #9ca3af;--red: #ff0000;--light-red: #f28b8b}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ChatButtonComponent, selector: "app-chat-button", inputs: ["buttonStyle", "isChatOpen", "unreadCount", "chatIcon", "appTitle", "appLogoUrl", "appTextLogoUrl"], outputs: ["toggle"] }, { kind: "component", type: ChatWindowComponent, selector: "app-chat-window", inputs: ["isChatOpen", "enableDrag", "enableResize", "isFullScreen", "isAuthenticated", "appTitle", "appLogoUrl", "appTextLogoUrl", "appHeaderLogoUrl", "moreIcon", "minimizeIcon", "messages", "isBotTyping", "appSubtitle", "welcomeDesc", "predefinedMessages", "botAvatarUrl", "userAvatarUrl", "userName", "trackByMessageId", "hintText", "sendIcon", "messageError", "showSuggestionChips", "isHistorySidebarOpen", "chatSessions", "chatHistoryUserName", "isGuestUser", "isGuestMode", "isLoggingIn", "authError", "authSuccess", "themeConfig"], outputs: ["toggleChat", "toggleFullScreen", "toggleHistorySidebar", "openSettings", "suggestionClick", "send", "clearMessageError", "clearChat", "sessionSelected", "sessionDeleted", "continueAsGuest", "loginClick", "loginSubmit"] }, { kind: "directive", type: FullscreenDirective, selector: "[appFullscreen]", inputs: ["fullscreenTarget"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3097
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: Doohbot, isStandalone: true, selector: "app-doohbot", inputs: { config: "config", platformTenant: "platformTenant", subTenant: "subTenant", agent: "agent", buttonStyle: "buttonStyle", enableDrag: "enableDrag", enableResize: "enableResize", apiConfig: "apiConfig", userContext: "userContext", themeConfig: "themeConfig" }, viewQueries: [{ propertyName: "chatWindowRef", first: true, predicate: ChatWindowComponent, descendants: true, read: ElementRef }, { propertyName: "fullscreenDirective", first: true, predicate: FullscreenDirective, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n appFullscreen\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [isAuthenticated]=\"isAuthenticated()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n [isHistorySidebarOpen]=\"isHistorySidebarOpen()\"\r\n [chatSessions]=\"chatSessions()\"\r\n [chatHistoryUserName]=\"userName\"\r\n [isGuestUser]=\"isGuestUser()\"\r\n [isGuestMode]=\"isGuestMode()\"\r\n [isLoggingIn]=\"isLoggingIn()\"\r\n [authError]=\"authError()\"\r\n [authSuccess]=\"authSuccess()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (continueAsGuest)=\"continueAsGuest()\"\r\n (loginClick)=\"disableGuestMode()\"\r\n (loginSubmit)=\"performLoginWithCredentials($event)\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\"\r\n (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n (logout)=\"performLogout()\"\r\n></app-chat-window>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";:host(.light-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #f8f9fa;--chat-input-color: var(--background-color);--text-alt-color: #000000;--button-color: #000000;--text-color: #333;--secondary-text-color: #858585;--hint-text-color: #858585;--user-message-color: var(--primary-color);--bot-message-color: #e9ecef;--user-text-color: #fff;--bot-text-color: #333;--border-color: #ccc;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .25);--border-top-color: #dddddd00;--typing-indicator-color: #999;--avatar-filter: invert(48%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(96%) contrast(91%);--white: #ffffff;--black: #000000;--grey: #6c757d;--red: #ff0000;--light-red: #f28b8b}:host(.dark-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #1a1717;--chat-input-color: var(--background-color);--text-alt-color: #ffffff;--button-color: #ffffff;--text-color: #f5f5f5;--secondary-text-color: #a1a1a1;--hint-text-color: #a1a1a1;--user-message-color: var(--primary-color);--bot-message-color: #333;--user-text-color: #fff;--bot-text-color: #fff;--border-color: #444;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .75);--border-top-color: #44444400;--typing-indicator-color: #bbb;--avatar-filter: invert(100%) brightness(100%);--white: #ffffff;--black: #000000;--grey: #9ca3af;--red: #ff0000;--light-red: #f28b8b}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ChatButtonComponent, selector: "app-chat-button", inputs: ["buttonStyle", "isChatOpen", "unreadCount", "chatIcon", "appTitle", "appLogoUrl", "appTextLogoUrl"], outputs: ["toggle"] }, { kind: "component", type: ChatWindowComponent, selector: "app-chat-window", inputs: ["isChatOpen", "enableDrag", "enableResize", "isFullScreen", "isAuthenticated", "appTitle", "appLogoUrl", "appTextLogoUrl", "appHeaderLogoUrl", "moreIcon", "minimizeIcon", "messages", "isBotTyping", "appSubtitle", "welcomeDesc", "predefinedMessages", "botAvatarUrl", "userAvatarUrl", "userName", "trackByMessageId", "hintText", "sendIcon", "messageError", "showSuggestionChips", "isHistorySidebarOpen", "chatSessions", "chatHistoryUserName", "isGuestUser", "isGuestMode", "isLoggingIn", "authError", "authSuccess", "themeConfig"], outputs: ["toggleChat", "toggleFullScreen", "toggleHistorySidebar", "openSettings", "suggestionClick", "send", "clearMessageError", "clearChat", "sessionSelected", "sessionDeleted", "continueAsGuest", "loginClick", "loginSubmit", "logout"] }, { kind: "directive", type: FullscreenDirective, selector: "[appFullscreen]", inputs: ["fullscreenTarget"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2944
3098
  }
2945
3099
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: Doohbot, decorators: [{
2946
3100
  type: Component,
2947
- args: [{ selector: 'app-doohbot', standalone: true, imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
2948
- AppConst,
2949
- {
2950
- provide: APP_INITIALIZER,
2951
- useFactory: (appConst) => () => appConst.load(),
2952
- deps: [AppConst],
2953
- multi: true,
2954
- },
2955
- ], template: "<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n appFullscreen\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [isAuthenticated]=\"isAuthenticated()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n [isHistorySidebarOpen]=\"isHistorySidebarOpen()\"\r\n [chatSessions]=\"chatSessions()\"\r\n [chatHistoryUserName]=\"userName\"\r\n [isGuestUser]=\"isGuestUser()\"\r\n [isGuestMode]=\"isGuestMode()\"\r\n [isLoggingIn]=\"isLoggingIn()\"\r\n [authError]=\"authError()\"\r\n [authSuccess]=\"authSuccess()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (continueAsGuest)=\"continueAsGuest()\"\r\n (loginClick)=\"disableGuestMode()\"\r\n (loginSubmit)=\"performLoginWithCredentials($event)\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\"\r\n (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n></app-chat-window>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";:host(.light-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #f8f9fa;--chat-input-color: var(--background-color);--text-alt-color: #000000;--button-color: #000000;--text-color: #333;--secondary-text-color: #858585;--hint-text-color: #858585;--user-message-color: var(--primary-color);--bot-message-color: #e9ecef;--user-text-color: #fff;--bot-text-color: #333;--border-color: #ccc;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .25);--border-top-color: #dddddd00;--typing-indicator-color: #999;--avatar-filter: invert(48%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(96%) contrast(91%);--white: #ffffff;--black: #000000;--grey: #6c757d;--red: #ff0000;--light-red: #f28b8b}:host(.dark-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #1a1717;--chat-input-color: var(--background-color);--text-alt-color: #ffffff;--button-color: #ffffff;--text-color: #f5f5f5;--secondary-text-color: #a1a1a1;--hint-text-color: #a1a1a1;--user-message-color: var(--primary-color);--bot-message-color: #333;--user-text-color: #fff;--bot-text-color: #fff;--border-color: #444;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .75);--border-top-color: #44444400;--typing-indicator-color: #bbb;--avatar-filter: invert(100%) brightness(100%);--white: #ffffff;--black: #000000;--grey: #9ca3af;--red: #ff0000;--light-red: #f28b8b}\n"] }]
3101
+ args: [{ selector: 'app-doohbot', standalone: true, imports: [CommonModule, ChatButtonComponent, ChatWindowComponent, FullscreenDirective], changeDetection: ChangeDetectionStrategy.OnPush, template: "<app-chat-button\r\n [buttonStyle]=\"buttonStyle\"\r\n [isChatOpen]=\"isChatOpen()\"\r\n [unreadCount]=\"unreadCount()\"\r\n [chatIcon]=\"chatIcon ?? ''\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n (toggle)=\"toggleChat()\"\r\n></app-chat-button>\r\n\r\n<app-chat-window\r\n *ngIf=\"isChatOpen()\"\r\n appFullscreen\r\n [isChatOpen]=\"isChatOpen()\"\r\n [enableDrag]=\"enableDrag\"\r\n [enableResize]=\"enableResize\"\r\n [isFullScreen]=\"isFullScreen()\"\r\n [appTitle]=\"appTitle ?? ''\"\r\n [appLogoUrl]=\"appLogoUrl ?? ''\"\r\n [appTextLogoUrl]=\"appTextLogoUrl ?? ''\"\r\n [appHeaderLogoUrl]=\"appHeaderLogoUrl ?? ''\"\r\n [moreIcon]=\"moreIcon ?? ''\"\r\n [minimizeIcon]=\"minimizeIcon ?? ''\"\r\n [messages]=\"messages()\"\r\n [isBotTyping]=\"isBotTyping()\"\r\n [isAuthenticated]=\"isAuthenticated()\"\r\n [appSubtitle]=\"appSubtitle ?? ''\"\r\n [welcomeDesc]=\"welcomeDesc ?? ''\"\r\n [predefinedMessages]=\"predefinedMessages\"\r\n [botAvatarUrl]=\"botAvatarUrl ?? ''\"\r\n [userAvatarUrl]=\"userAvatarUrl\"\r\n [userName]=\"userName\"\r\n [trackByMessageId]=\"trackByMessageId\"\r\n [hintText]=\"hintText ?? ''\"\r\n [sendIcon]=\"sendIcon ?? ''\"\r\n [messageError]=\"messageError()\"\r\n [showSuggestionChips]=\"showSuggestionChips()\"\r\n [isHistorySidebarOpen]=\"isHistorySidebarOpen()\"\r\n [chatSessions]=\"chatSessions()\"\r\n [chatHistoryUserName]=\"userName\"\r\n [isGuestUser]=\"isGuestUser()\"\r\n [isGuestMode]=\"isGuestMode()\"\r\n [isLoggingIn]=\"isLoggingIn()\"\r\n [authError]=\"authError()\"\r\n [authSuccess]=\"authSuccess()\"\r\n (toggleChat)=\"toggleChat()\"\r\n (continueAsGuest)=\"continueAsGuest()\"\r\n (loginClick)=\"disableGuestMode()\"\r\n (loginSubmit)=\"performLoginWithCredentials($event)\"\r\n (toggleFullScreen)=\"toggleFullScreen()\"\r\n (toggleHistorySidebar)=\"toggleHistorySidebar()\"\r\n (sessionSelected)=\"loadChatSession($event)\"\r\n (sessionDeleted)=\"deleteSession($event)\"\r\n (suggestionClick)=\"sendMessage($event)\"\r\n (send)=\"sendMessage($event)\"\r\n (clearMessageError)=\"clearMessageError()\"\r\n (clearChat)=\"clearChat()\"\r\n (logout)=\"performLogout()\"\r\n></app-chat-window>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap\";@import\"https://fonts.googleapis.com/icon?family=Material+Icons\";:host(.light-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #f8f9fa;--chat-input-color: var(--background-color);--text-alt-color: #000000;--button-color: #000000;--text-color: #333;--secondary-text-color: #858585;--hint-text-color: #858585;--user-message-color: var(--primary-color);--bot-message-color: #e9ecef;--user-text-color: #fff;--bot-text-color: #333;--border-color: #ccc;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .25);--border-top-color: #dddddd00;--typing-indicator-color: #999;--avatar-filter: invert(48%) sepia(0%) saturate(0%) hue-rotate(0deg) brightness(96%) contrast(91%);--white: #ffffff;--black: #000000;--grey: #6c757d;--red: #ff0000;--light-red: #f28b8b}:host(.dark-theme){--font-family: \"Roboto\", Arial, sans-serif;--primary-color: #2800ff;--secondary-color: #08dacf;--background-color: #1a1717;--chat-input-color: var(--background-color);--text-alt-color: #ffffff;--button-color: #ffffff;--text-color: #f5f5f5;--secondary-text-color: #a1a1a1;--hint-text-color: #a1a1a1;--user-message-color: var(--primary-color);--bot-message-color: #333;--user-text-color: #fff;--bot-text-color: #fff;--border-color: #444;--border-shadow-color: 0 4px 16px rgba(0, 0, 0, .75);--border-top-color: #44444400;--typing-indicator-color: #bbb;--avatar-filter: invert(100%) brightness(100%);--white: #ffffff;--black: #000000;--grey: #9ca3af;--red: #ff0000;--light-red: #f28b8b}\n"] }]
2956
3102
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { config: [{
2957
3103
  type: Input
2958
3104
  }], platformTenant: [{
@@ -2980,6 +3126,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
2980
3126
  type: ViewChild,
2981
3127
  args: [FullscreenDirective]
2982
3128
  }] } });
3129
+ // ============================================================================
3130
+ // INITIALIZATION
3131
+ // ============================================================================
3132
+ function initializeApp() {
3133
+ const appConst = inject(AppConst);
3134
+ return appConst.load(); // Returns a Promise
3135
+ }
3136
+ bootstrapApplication(Doohbot, {
3137
+ providers: [
3138
+ provideHttpClient(withInterceptorsFromDi()),
3139
+ AppConst,
3140
+ provideAppInitializer(initializeApp),
3141
+ {
3142
+ provide: HTTP_INTERCEPTORS,
3143
+ useClass: AuthInterceptor,
3144
+ multi: true,
3145
+ },
3146
+ ],
3147
+ });
2983
3148
 
2984
3149
  const DOOHBOT_API_URL = new InjectionToken('DOOHBOT_API_URL');
2985
3150
 
@@ -2992,5 +3157,5 @@ const DOOHBOT_API_URL = new InjectionToken('DOOHBOT_API_URL');
2992
3157
  * Generated bundle index. Do not edit.
2993
3158
  */
2994
3159
 
2995
- export { AccountService, AuthService, ChatWindowComponent, ChatbotApiService, DOOHBOT_API_CONFIG, DOOHBOT_API_URL, DialogComponent, DialogService, Doohbot, DoohbotInput, MessageListComponent, appConst };
3160
+ export { AccountService, AuthService, ChatWindowComponent, ChatbotApiService, DOOHBOT_API_CONFIG, DOOHBOT_API_URL, DialogComponent, DialogService, Doohbot, DoohbotInput, MessageListComponent, appConst, initializeApp };
2996
3161
  //# sourceMappingURL=aakash58-chatbot.mjs.map