@aakash58/chatbot 1.0.84 → 1.0.85

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, ContentChildren, 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, APP_INITIALIZER, ChangeDetectionStrategy } 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';
@@ -11,6 +11,8 @@ import * as i1$3 from '@angular/material/dialog';
11
11
  import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
12
12
  import * as i2 from '@angular/material/button';
13
13
  import { MatButtonModule } from '@angular/material/button';
14
+ import * as i4 from '@angular/forms';
15
+ import { FormsModule } from '@angular/forms';
14
16
  import { Subject, throwError, timer, of, firstValueFrom, delay, retry as retry$1, map as map$1, catchError as catchError$1, Observable } from 'rxjs';
15
17
  import * as i1$4 from '@angular/common/http';
16
18
  import { HttpClient, HttpHeaders, HttpErrorResponse } from '@angular/common/http';
@@ -45,7 +47,6 @@ class DoohbotInput {
45
47
  password = '';
46
48
  authToken;
47
49
  DOOHBOT_API_URL;
48
- skipAuthentication;
49
50
  // inputs
50
51
  userAvatarUrl = appConst.USER_AVATAR;
51
52
  // Application Constants Text
@@ -151,8 +152,11 @@ class MessageListComponent {
151
152
  userAvatarUrl = '';
152
153
  userName = '';
153
154
  isAuthenticated = false;
155
+ isGuestMode = false;
154
156
  trackByMessageId = (index, item) => item.id ?? index;
155
157
  suggestionClick = new EventEmitter();
158
+ loginClick = new EventEmitter();
159
+ continueAsGuest = new EventEmitter();
156
160
  chatMessagesContainer;
157
161
  mutationObserver;
158
162
  appEmoji = {
@@ -187,11 +191,11 @@ class MessageListComponent {
187
191
  this.suggestionClick.emit(text);
188
192
  }
189
193
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
190
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: MessageListComponent, isStandalone: true, selector: "app-message-list", inputs: { messages: "messages", isBotTyping: "isBotTyping", appLogoUrl: "appLogoUrl", appSubtitle: "appSubtitle", welcomeDesc: "welcomeDesc", predefinedMessages: "predefinedMessages", botAvatarUrl: "botAvatarUrl", userAvatarUrl: "userAvatarUrl", userName: "userName", isAuthenticated: "isAuthenticated", trackByMessageId: "trackByMessageId" }, outputs: { suggestionClick: "suggestionClick" }, viewQueries: [{ propertyName: "chatMessagesContainer", first: true, predicate: ["chatMessages"], descendants: true }], ngImport: i0, template: "<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n <h2 class=\"welcome-greeting\" *ngIf=\"userName && isAuthenticated\">\r\n Hi, {{ userName }}!\r\n <!-- <span class=\"emoji\">&#128075;</span> -->\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <div class=\"user-avatar-container\" *ngIf=\"message.sender === 'user'\">\r\n <img class=\"user-avatar\" [src]=\"userAvatarUrl\" alt=\"User Avatar\" />\r\n <!-- <span class=\"user-name\" *ngIf=\"userName\">{{ userName }}</span> -->\r\n </div>\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.chat-messages{flex-grow:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px;scroll-behavior:smooth}.chat-messages::-webkit-scrollbar{width:8px}.chat-messages::-webkit-scrollbar-track{background:var(--grey);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb{background-color:var(--primary-color);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb:hover{background-color:var(--primary-color)}.chat-messages{scrollbar-width:thin;scrollbar-color:var(--primary-color) var(--background-color)}.welcome-screen{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;height:100%;padding:0 20px}.welcome-image{width:80px;margin-bottom:30px}.welcome-greeting{margin:0 0 12px;color:var(--text-color);font-family:var(--font-family);font-size:24px;font-weight:600;background:var(--text-color);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.welcome-greeting .emoji{background:none;-webkit-background-clip:initial;-webkit-text-fill-color:initial;background-clip:initial}.welcome-screen h3{margin:0 0 5px;color:var(--text-color);font-family:var(--font-family);font-size:18px}.welcome-screen p{margin:0 0 30px;color:var(--secondary-text-color);font-size:14px;font-family:var(--font-family)}.message-wrapper{display:flex;align-items:flex-end;gap:8px;margin-bottom:6px}.message-wrapper.user{justify-content:flex-end}.message-wrapper.bot{justify-content:flex-start}.message{padding:10px 15px;max-width:80%;overflow-y:auto;word-wrap:break-word;font-family:var(--font-family)}.message .message-time{font-size:11px;color:var(--grey);text-align:right;margin-top:4px}.message.user{background-color:var(--primary-color);color:var(--user-text-color);align-self:flex-end;border-radius:20px 20px 0}.message.bot{background-color:var(--bot-message-color);color:var(--bot-text-color);align-self:flex-start;border-radius:20px 20px 20px 0}.bot-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color);filter:var(--avatar-filter)}.user-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color)}.user-avatar.placeholder{filter:var(--avatar-filter)}.user-avatar-container{display:flex;flex-direction:column;align-items:center;gap:4px}.user-name{font-size:10px;color:var(--secondary-text-color);font-family:var(--font-family);text-align:center;max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.typing-indicator{display:flex;align-items:center;justify-content:center;gap:4px}.typing-indicator span{width:8px;height:8px;background-color:var(--typing-indicator-color);border-radius:50%;animation:blink 1.4s infinite both}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes blink{0%,80%,to{opacity:.2}40%{opacity:1}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: Chips, selector: "app-chips", inputs: ["messages", "disabled"], outputs: ["chipClick"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
194
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: MessageListComponent, isStandalone: true, selector: "app-message-list", inputs: { messages: "messages", isBotTyping: "isBotTyping", appLogoUrl: "appLogoUrl", appSubtitle: "appSubtitle", welcomeDesc: "welcomeDesc", predefinedMessages: "predefinedMessages", botAvatarUrl: "botAvatarUrl", userAvatarUrl: "userAvatarUrl", userName: "userName", isAuthenticated: "isAuthenticated", isGuestMode: "isGuestMode", trackByMessageId: "trackByMessageId" }, outputs: { suggestionClick: "suggestionClick", loginClick: "loginClick", continueAsGuest: "continueAsGuest" }, viewQueries: [{ propertyName: "chatMessagesContainer", first: true, predicate: ["chatMessages"], descendants: true }], ngImport: i0, template: "<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n <h2 class=\"welcome-greeting\" *ngIf=\"userName && isAuthenticated\">\r\n Hi, {{ userName }}!\r\n <!-- <span class=\"emoji\">&#128075;</span> -->\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Guest Mode Login Button -->\r\n <div *ngIf=\"isGuestMode\" style=\"margin-top: 10px\">\r\n <button class=\"login-btn\" (click)=\"loginClick.emit()\">Login</button>\r\n </div>\r\n\r\n <!-- Fallback / Login Prompts (Below Welcome Text) -->\r\n <div\r\n *ngIf=\"!isAuthenticated && !isGuestMode\"\r\n class=\"auth-buttons-container\"\r\n style=\"margin-top: 20px\"\r\n >\r\n <button (click)=\"loginClick.emit()\" class=\"auth-btn primary\" style=\"margin-right: 10px\">\r\n Login\r\n </button>\r\n <button (click)=\"continueAsGuest.emit()\" class=\"auth-btn secondary\">Continue as Guest</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <div class=\"user-avatar-container\" *ngIf=\"message.sender === 'user'\">\r\n <img class=\"user-avatar\" [src]=\"userAvatarUrl\" alt=\"User Avatar\" />\r\n <!-- <span class=\"user-name\" *ngIf=\"userName\">{{ userName }}</span> -->\r\n </div>\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.login-btn{padding:10px 15px;border:none;border-radius:20px;background-color:var(--primary-color);color:var(--user-text-color);font-size:1em;cursor:pointer;transition:background-color .2s ease}.chat-messages{flex-grow:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px;scroll-behavior:smooth}.chat-messages::-webkit-scrollbar{width:8px}.chat-messages::-webkit-scrollbar-track{background:var(--grey);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb{background-color:var(--primary-color);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb:hover{background-color:var(--primary-color)}.chat-messages{scrollbar-width:thin;scrollbar-color:var(--primary-color) var(--background-color)}.welcome-screen{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;height:100%;padding:0 20px}.welcome-image{width:80px;margin-bottom:30px}.welcome-greeting{margin:0 0 12px;color:var(--text-color);font-family:var(--font-family);font-size:24px;font-weight:600;background:var(--text-color);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.welcome-greeting .emoji{background:none;-webkit-background-clip:initial;-webkit-text-fill-color:initial;background-clip:initial}.welcome-screen h3{margin:0 0 5px;color:var(--text-color);font-family:var(--font-family);font-size:18px}.welcome-screen p{margin:0 0 30px;color:var(--secondary-text-color);font-size:14px;font-family:var(--font-family)}.message-wrapper{display:flex;align-items:flex-end;gap:8px;margin-bottom:6px}.message-wrapper.user{justify-content:flex-end}.message-wrapper.bot{justify-content:flex-start}.message{padding:10px 15px;max-width:80%;overflow-y:auto;word-wrap:break-word;font-family:var(--font-family)}.message .message-time{font-size:11px;color:var(--grey);text-align:right;margin-top:4px}.message.user{background-color:var(--primary-color);color:var(--user-text-color);align-self:flex-end;border-radius:20px 20px 0}.message.bot{background-color:var(--bot-message-color);color:var(--bot-text-color);align-self:flex-start;border-radius:20px 20px 20px 0}.bot-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color);filter:var(--avatar-filter)}.user-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color)}.user-avatar.placeholder{filter:var(--avatar-filter)}.user-avatar-container{display:flex;flex-direction:column;align-items:center;gap:4px}.user-name{font-size:10px;color:var(--secondary-text-color);font-family:var(--font-family);text-align:center;max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.typing-indicator{display:flex;align-items:center;justify-content:center;gap:4px}.typing-indicator span{width:8px;height:8px;background-color:var(--typing-indicator-color);border-radius:50%;animation:blink 1.4s infinite both}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes blink{0%,80%,to{opacity:.2}40%{opacity:1}}.auth-buttons-container{display:flex;flex-direction:row;justify-content:center;gap:10px}.auth-btn{padding:8px 16px;border-radius:20px;font-size:.9em;font-weight:500;cursor:pointer;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(--primary-color);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: Chips, selector: "app-chips", inputs: ["messages", "disabled"], outputs: ["chipClick"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }] });
191
195
  }
192
196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MessageListComponent, decorators: [{
193
197
  type: Component,
194
- args: [{ selector: 'app-message-list', standalone: true, imports: [CommonModule, Chips], template: "<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n <h2 class=\"welcome-greeting\" *ngIf=\"userName && isAuthenticated\">\r\n Hi, {{ userName }}!\r\n <!-- <span class=\"emoji\">&#128075;</span> -->\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <div class=\"user-avatar-container\" *ngIf=\"message.sender === 'user'\">\r\n <img class=\"user-avatar\" [src]=\"userAvatarUrl\" alt=\"User Avatar\" />\r\n <!-- <span class=\"user-name\" *ngIf=\"userName\">{{ userName }}</span> -->\r\n </div>\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.chat-messages{flex-grow:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px;scroll-behavior:smooth}.chat-messages::-webkit-scrollbar{width:8px}.chat-messages::-webkit-scrollbar-track{background:var(--grey);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb{background-color:var(--primary-color);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb:hover{background-color:var(--primary-color)}.chat-messages{scrollbar-width:thin;scrollbar-color:var(--primary-color) var(--background-color)}.welcome-screen{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;height:100%;padding:0 20px}.welcome-image{width:80px;margin-bottom:30px}.welcome-greeting{margin:0 0 12px;color:var(--text-color);font-family:var(--font-family);font-size:24px;font-weight:600;background:var(--text-color);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.welcome-greeting .emoji{background:none;-webkit-background-clip:initial;-webkit-text-fill-color:initial;background-clip:initial}.welcome-screen h3{margin:0 0 5px;color:var(--text-color);font-family:var(--font-family);font-size:18px}.welcome-screen p{margin:0 0 30px;color:var(--secondary-text-color);font-size:14px;font-family:var(--font-family)}.message-wrapper{display:flex;align-items:flex-end;gap:8px;margin-bottom:6px}.message-wrapper.user{justify-content:flex-end}.message-wrapper.bot{justify-content:flex-start}.message{padding:10px 15px;max-width:80%;overflow-y:auto;word-wrap:break-word;font-family:var(--font-family)}.message .message-time{font-size:11px;color:var(--grey);text-align:right;margin-top:4px}.message.user{background-color:var(--primary-color);color:var(--user-text-color);align-self:flex-end;border-radius:20px 20px 0}.message.bot{background-color:var(--bot-message-color);color:var(--bot-text-color);align-self:flex-start;border-radius:20px 20px 20px 0}.bot-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color);filter:var(--avatar-filter)}.user-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color)}.user-avatar.placeholder{filter:var(--avatar-filter)}.user-avatar-container{display:flex;flex-direction:column;align-items:center;gap:4px}.user-name{font-size:10px;color:var(--secondary-text-color);font-family:var(--font-family);text-align:center;max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.typing-indicator{display:flex;align-items:center;justify-content:center;gap:4px}.typing-indicator span{width:8px;height:8px;background-color:var(--typing-indicator-color);border-radius:50%;animation:blink 1.4s infinite both}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes blink{0%,80%,to{opacity:.2}40%{opacity:1}}\n"] }]
198
+ args: [{ selector: 'app-message-list', standalone: true, imports: [CommonModule, Chips], template: "<div #chatMessages class=\"chat-messages\">\r\n <!-- Welcome Screen -->\r\n <div class=\"welcome-screen\" *ngIf=\"messages.length === 0 && !isBotTyping\">\r\n <img [src]=\"appLogoUrl\" alt=\"Welcome\" class=\"welcome-image\" style=\"border-radius: 0px\" />\r\n\r\n <!-- Only show greeting if authenticated -->\r\n <h2 class=\"welcome-greeting\" *ngIf=\"userName && isAuthenticated\">\r\n Hi, {{ userName }}!\r\n <!-- <span class=\"emoji\">&#128075;</span> -->\r\n <span class=\"emoji\">{{ appEmoji.waveHand }}</span>\r\n </h2>\r\n\r\n <h3>{{ appSubtitle }}</h3>\r\n <p>{{ welcomeDesc }}</p>\r\n\r\n <!-- Predefined messages chips: Only show when authenticated -->\r\n <app-chips\r\n *ngIf=\"isAuthenticated\"\r\n [messages]=\"predefinedMessages\"\r\n [disabled]=\"isBotTyping\"\r\n (chipClick)=\"onPredefinedClick($event)\"\r\n ></app-chips>\r\n\r\n <!-- Guest Mode Login Button -->\r\n <div *ngIf=\"isGuestMode\" style=\"margin-top: 10px\">\r\n <button class=\"login-btn\" (click)=\"loginClick.emit()\">Login</button>\r\n </div>\r\n\r\n <!-- Fallback / Login Prompts (Below Welcome Text) -->\r\n <div\r\n *ngIf=\"!isAuthenticated && !isGuestMode\"\r\n class=\"auth-buttons-container\"\r\n style=\"margin-top: 20px\"\r\n >\r\n <button (click)=\"loginClick.emit()\" class=\"auth-btn primary\" style=\"margin-right: 10px\">\r\n Login\r\n </button>\r\n <button (click)=\"continueAsGuest.emit()\" class=\"auth-btn secondary\">Continue as Guest</button>\r\n </div>\r\n </div>\r\n\r\n <!-- Chat Messages -->\r\n <div\r\n *ngFor=\"let message of messages; trackBy: trackByMessageId\"\r\n class=\"message-wrapper\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n <!-- Bot Avatar -->\r\n <img\r\n *ngIf=\"message.sender === 'bot'\"\r\n class=\"bot-avatar\"\r\n [src]=\"botAvatarUrl\"\r\n alt=\"Bot Avatar\"\r\n />\r\n\r\n <!-- Message Bubble -->\r\n <div\r\n class=\"message\"\r\n [class.user]=\"message.sender === 'user'\"\r\n [class.bot]=\"message.sender === 'bot'\"\r\n >\r\n {{ message.text }}\r\n <!-- Show time below message -->\r\n <div *ngIf=\"message.sender === 'bot'\" class=\"message-time\">\r\n {{ message.timestamp | date: 'shortTime' }}\r\n </div>\r\n </div>\r\n\r\n <!-- User Avatar -->\r\n <div class=\"user-avatar-container\" *ngIf=\"message.sender === 'user'\">\r\n <img class=\"user-avatar\" [src]=\"userAvatarUrl\" alt=\"User Avatar\" />\r\n <!-- <span class=\"user-name\" *ngIf=\"userName\">{{ userName }}</span> -->\r\n </div>\r\n </div>\r\n\r\n <!-- Typing Indicator -->\r\n <div class=\"message-wrapper bot\" *ngIf=\"isBotTyping\">\r\n <img class=\"bot-avatar\" [src]=\"botAvatarUrl\" alt=\"Bot Avatar\" />\r\n <div class=\"message bot\">\r\n <div class=\"typing-indicator\">\r\n <span></span>\r\n <span></span>\r\n <span></span>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":host{display:flex;flex-direction:column;flex-grow:1;overflow:hidden}.login-btn{padding:10px 15px;border:none;border-radius:20px;background-color:var(--primary-color);color:var(--user-text-color);font-size:1em;cursor:pointer;transition:background-color .2s ease}.chat-messages{flex-grow:1;padding:20px;overflow-y:auto;display:flex;flex-direction:column;gap:10px;scroll-behavior:smooth}.chat-messages::-webkit-scrollbar{width:8px}.chat-messages::-webkit-scrollbar-track{background:var(--grey);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb{background-color:var(--primary-color);border-radius:4px}.chat-messages::-webkit-scrollbar-thumb:hover{background-color:var(--primary-color)}.chat-messages{scrollbar-width:thin;scrollbar-color:var(--primary-color) var(--background-color)}.welcome-screen{display:flex;flex-direction:column;justify-content:center;align-items:center;text-align:center;height:100%;padding:0 20px}.welcome-image{width:80px;margin-bottom:30px}.welcome-greeting{margin:0 0 12px;color:var(--text-color);font-family:var(--font-family);font-size:24px;font-weight:600;background:var(--text-color);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}.welcome-greeting .emoji{background:none;-webkit-background-clip:initial;-webkit-text-fill-color:initial;background-clip:initial}.welcome-screen h3{margin:0 0 5px;color:var(--text-color);font-family:var(--font-family);font-size:18px}.welcome-screen p{margin:0 0 30px;color:var(--secondary-text-color);font-size:14px;font-family:var(--font-family)}.message-wrapper{display:flex;align-items:flex-end;gap:8px;margin-bottom:6px}.message-wrapper.user{justify-content:flex-end}.message-wrapper.bot{justify-content:flex-start}.message{padding:10px 15px;max-width:80%;overflow-y:auto;word-wrap:break-word;font-family:var(--font-family)}.message .message-time{font-size:11px;color:var(--grey);text-align:right;margin-top:4px}.message.user{background-color:var(--primary-color);color:var(--user-text-color);align-self:flex-end;border-radius:20px 20px 0}.message.bot{background-color:var(--bot-message-color);color:var(--bot-text-color);align-self:flex-start;border-radius:20px 20px 20px 0}.bot-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color);filter:var(--avatar-filter)}.user-avatar{width:24px;height:24px;border-radius:50%;object-fit:cover;border:1px solid var(--border-color)}.user-avatar.placeholder{filter:var(--avatar-filter)}.user-avatar-container{display:flex;flex-direction:column;align-items:center;gap:4px}.user-name{font-size:10px;color:var(--secondary-text-color);font-family:var(--font-family);text-align:center;max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.typing-indicator{display:flex;align-items:center;justify-content:center;gap:4px}.typing-indicator span{width:8px;height:8px;background-color:var(--typing-indicator-color);border-radius:50%;animation:blink 1.4s infinite both}.typing-indicator span:nth-child(2){animation-delay:.2s}.typing-indicator span:nth-child(3){animation-delay:.4s}@keyframes blink{0%,80%,to{opacity:.2}40%{opacity:1}}.auth-buttons-container{display:flex;flex-direction:row;justify-content:center;gap:10px}.auth-btn{padding:8px 16px;border-radius:20px;font-size:.9em;font-weight:500;cursor:pointer;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(--primary-color);border:1px solid var(--primary-color)}.auth-btn.secondary:hover{opacity:.9}\n"] }]
195
199
  }], propDecorators: { messages: [{
196
200
  type: Input
197
201
  }], isBotTyping: [{
@@ -212,10 +216,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
212
216
  type: Input
213
217
  }], isAuthenticated: [{
214
218
  type: Input
219
+ }], isGuestMode: [{
220
+ type: Input
215
221
  }], trackByMessageId: [{
216
222
  type: Input
217
223
  }], suggestionClick: [{
218
224
  type: Output
225
+ }], loginClick: [{
226
+ type: Output
227
+ }], continueAsGuest: [{
228
+ type: Output
219
229
  }], chatMessagesContainer: [{
220
230
  type: ViewChild,
221
231
  args: ['chatMessages']
@@ -528,31 +538,31 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
528
538
  args: ['document:mouseup']
529
539
  }] } });
530
540
 
531
- const DEFAULT_THEME_CONFIG = {
532
- fontFamily: "'Roboto', Arial, sans-serif",
533
- primaryColor: '#2800ff',
534
- secondaryColor: '#08dacf',
535
- backgroundColor: '#f8f9fa, #1a1717',
536
- chatInputColor: 'var(--background-color)',
537
- textAltColor: '#000000, #ffffff',
538
- buttonColor: '#000000, #ffffff',
539
- textColor: '#333, #f5f5f5',
540
- secondaryTextColor: '#858585, #a1a1a1',
541
- hintTextColor: '#858585, #a1a1a1',
542
- userMessageColor: 'var(--primary-color)',
543
- botMessageColor: '#e9ecef, #333',
544
- userTextColor: '#fff',
545
- botTextColor: '#333, #fff',
546
- borderColor: '#ccc, #444',
547
- borderShadowColor: '0 4px 16px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.75)',
548
- borderTopColor: '#dddddd00, #44444400',
549
- typingIndicatorColor: '#999, #bbb',
550
- white: '#ffffff',
551
- black: '#000000',
552
- grey: '#6c757d, #9ca3af',
553
- red: '#ff0000',
554
- lightRed: '#f28b8b',
555
- };
541
+ // const DEFAULT_THEME_CONFIG: DoohbotThemeConfig = {
542
+ // fontFamily: "'Roboto', Arial, sans-serif",
543
+ // primaryColor: '#2800ff',
544
+ // secondaryColor: '#08dacf',
545
+ // backgroundColor: '#f8f9fa, #1a1717',
546
+ // chatInputColor: '#f8f9fa, #1a1717',
547
+ // textAltColor: '#000000, #ffffff',
548
+ // buttonColor: '#000000, #ffffff',
549
+ // textColor: '#333, #f5f5f5',
550
+ // secondaryTextColor: '#858585, #a1a1a1',
551
+ // hintTextColor: '#858585, #a1a1a1',
552
+ // userMessageColor: '#2800ff',
553
+ // botMessageColor: '#e9ecef, #333',
554
+ // userTextColor: '#fff',
555
+ // botTextColor: '#333, #fff',
556
+ // borderColor: '#ccc, #444',
557
+ // borderShadowColor: '0 4px 16px rgba(0, 0, 0, 0.25), 0 4px 16px rgba(0, 0, 0, 0.75)',
558
+ // borderTopColor: '#dddddd00, #44444400',
559
+ // typingIndicatorColor: '#999, #bbb',
560
+ // white: '#ffffff',
561
+ // black: '#000000',
562
+ // grey: '#6c757d, #9ca3af',
563
+ // red: '#ff0000',
564
+ // lightRed: '#f28b8b',
565
+ // };
556
566
  class ThemeService {
557
567
  overlay;
558
568
  renderer;
@@ -897,215 +907,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
897
907
  type: Output
898
908
  }] } });
899
909
 
900
- class MenuItem {
901
- href = '#';
902
- selected = new EventEmitter();
903
- onClick(event) {
904
- // Optional: prevent default if used for actions, not navigation
905
- // event.preventDefault();
906
- this.selected.emit();
907
- }
908
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MenuItem, deps: [], target: i0.ɵɵFactoryTarget.Component });
909
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: MenuItem, isStandalone: true, selector: "app-menu-item", inputs: { href: "href" }, outputs: { selected: "selected" }, ngImport: i0, template: "<li>\r\n <a [href]=\"href\" (click)=\"onClick($event)\">\r\n <ng-content></ng-content>\r\n </a>\r\n</li>\r\n", styles: [""] });
910
- }
911
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: MenuItem, decorators: [{
912
- type: Component,
913
- args: [{ selector: 'app-menu-item', imports: [], template: "<li>\r\n <a [href]=\"href\" (click)=\"onClick($event)\">\r\n <ng-content></ng-content>\r\n </a>\r\n</li>\r\n" }]
914
- }], propDecorators: { href: [{
915
- type: Input
916
- }], selected: [{
917
- type: Output
918
- }] } });
919
-
920
- class DropdownMenu {
921
- detailsRef;
922
- menuItems;
923
- ngAfterContentInit() {
924
- // Subscribe to all menu item selections
925
- this.menuItems.forEach((item) => {
926
- item.selected.subscribe(() => {
927
- this.close();
928
- });
929
- });
930
- }
931
- close() {
932
- this.detailsRef.nativeElement.open = false;
933
- }
934
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DropdownMenu, deps: [], target: i0.ɵɵFactoryTarget.Component });
935
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: DropdownMenu, isStandalone: true, selector: "app-dropdown-menu", queries: [{ propertyName: "menuItems", predicate: MenuItem }], viewQueries: [{ propertyName: "detailsRef", first: true, predicate: ["details"], descendants: true }], ngImport: i0, template: "<details class=\"dropdown-menu\" #details>\r\n <summary role=\"button\" class=\"dropdown-trigger\">\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n </summary>\r\n <ul class=\"dropdown-list\">\r\n <ng-content></ng-content>\r\n </ul>\r\n</details>\r\n\r\n<!-- ussage example:\r\n<app-dropdown-menu>\r\n <span trigger>\u2630 Menu</span>\r\n\r\n <app-menu-item href=\"/profile\" (selected)=\"doSomething('profile')\">\r\n My Profile\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"/settings\" (selected)=\"doSomething('settings')\">\r\n Settings\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"#\" (selected)=\"logout()\">\r\n Logout\r\n </app-menu-item>\r\n</app-dropdown-menu> -->\r\n\r\n<!-- \r\n Note: The above usage example is commented out to avoid rendering issues.\r\n It demonstrates how to use the DropdownMenu component with MenuItem components as options.\r\n-->\r\n", styles: [".dropdown-menu{position:relative;display:inline-block;margin:0;padding:0}.dropdown-menu summary{list-style:none;cursor:pointer;outline:none}.dropdown-menu summary::-webkit-details-marker{display:none}.dropdown-list{position:absolute;top:100%;left:0;margin:8px 0 0;padding:8px 0;width:180px;background:var(--background-color);border-radius:6px;box-shadow:var(--border-shadow-color);z-index:1000;list-style:none}.dropdown-list:before{content:\"\";position:absolute;top:-6px;left:16px;width:0;height:0;border:6px solid transparent;border-bottom-color:var(--background-color)}.dropdown-list li a{display:block;padding:8px 16px;color:var(--primary-color);text-decoration:none}.dropdown-list li a:hover{background:var(--red);color:var(--secondary-color)}\n"] });
936
- }
937
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: DropdownMenu, decorators: [{
938
- type: Component,
939
- args: [{ selector: 'app-dropdown-menu', imports: [], template: "<details class=\"dropdown-menu\" #details>\r\n <summary role=\"button\" class=\"dropdown-trigger\">\r\n <ng-content select=\"[trigger]\"></ng-content>\r\n </summary>\r\n <ul class=\"dropdown-list\">\r\n <ng-content></ng-content>\r\n </ul>\r\n</details>\r\n\r\n<!-- ussage example:\r\n<app-dropdown-menu>\r\n <span trigger>\u2630 Menu</span>\r\n\r\n <app-menu-item href=\"/profile\" (selected)=\"doSomething('profile')\">\r\n My Profile\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"/settings\" (selected)=\"doSomething('settings')\">\r\n Settings\r\n </app-menu-item>\r\n \r\n <app-menu-item href=\"#\" (selected)=\"logout()\">\r\n Logout\r\n </app-menu-item>\r\n</app-dropdown-menu> -->\r\n\r\n<!-- \r\n Note: The above usage example is commented out to avoid rendering issues.\r\n It demonstrates how to use the DropdownMenu component with MenuItem components as options.\r\n-->\r\n", styles: [".dropdown-menu{position:relative;display:inline-block;margin:0;padding:0}.dropdown-menu summary{list-style:none;cursor:pointer;outline:none}.dropdown-menu summary::-webkit-details-marker{display:none}.dropdown-list{position:absolute;top:100%;left:0;margin:8px 0 0;padding:8px 0;width:180px;background:var(--background-color);border-radius:6px;box-shadow:var(--border-shadow-color);z-index:1000;list-style:none}.dropdown-list:before{content:\"\";position:absolute;top:-6px;left:16px;width:0;height:0;border:6px solid transparent;border-bottom-color:var(--background-color)}.dropdown-list li a{display:block;padding:8px 16px;color:var(--primary-color);text-decoration:none}.dropdown-list li a:hover{background:var(--red);color:var(--secondary-color)}\n"] }]
940
- }], propDecorators: { detailsRef: [{
941
- type: ViewChild,
942
- args: ['details']
943
- }], menuItems: [{
944
- type: ContentChildren,
945
- args: [MenuItem]
946
- }] } });
947
-
948
- class PopoutWindowDirective {
949
- renderer2;
950
- elementRef;
951
- innerWrapper;
952
- windowWidth = 400;
953
- windowHeight = 400;
954
- windowLeft = 200;
955
- windowTop = 200;
956
- windowTitle = 'Popout Window';
957
- windowStyle = '';
958
- windowStyleUrl = '';
959
- suppressCloneStyles = false;
960
- get isPoppedOut() {
961
- return this.isOut;
962
- }
963
- closed = new EventEmitter();
964
- shown = new EventEmitter();
965
- popoutWindow = null;
966
- isOut = false;
967
- observer;
968
- beforeunloadHandler() {
969
- this.close();
970
- }
971
- constructor(renderer2, elementRef) {
972
- this.renderer2 = renderer2;
973
- this.elementRef = elementRef;
974
- }
975
- ngOnDestroy() {
976
- this.observer?.disconnect();
977
- this.close();
978
- }
979
- close() {
980
- if (this.popoutWindow) {
981
- this.popoutWindow.close();
982
- this.popoutWindow = null;
983
- this.isOut = false;
984
- this.closed.next(true);
985
- }
986
- }
987
- popIn() {
988
- if (this.elementRef.nativeElement && this.innerWrapper.nativeElement) {
989
- this.renderer2.appendChild(this.elementRef.nativeElement, this.innerWrapper.nativeElement);
990
- this.close();
991
- }
992
- }
993
- popOut() {
994
- if (!this.popoutWindow) {
995
- const elmRect = this.innerWrapper.nativeElement.getBoundingClientRect();
996
- const navHeight = window.outerHeight - window.innerHeight;
997
- const navWidth = window.outerWidth - window.innerWidth;
998
- const winLeft = this.windowLeft || window.screenX + navWidth + elmRect.left;
999
- const winTop = this.windowTop || window.screenY + navHeight + elmRect.top - 60;
1000
- this.popoutWindow = window.open('', `popoutWindow${Date.now()}`, `width=${this.windowWidth > 99 ? this.windowWidth : elmRect.width},
1001
- height=${this.windowHeight > 99 ? this.windowHeight : elmRect.height + 1},
1002
- left=${winLeft},
1003
- top=${winTop}`);
1004
- if (!this.popoutWindow) {
1005
- console.error('Popup blocked or failed to open');
1006
- return;
1007
- }
1008
- this.popoutWindow.document.title = this.windowTitle
1009
- ? this.windowTitle
1010
- : window.document.title;
1011
- this.popoutWindow.document.body.style.margin = '0';
1012
- if (!this.suppressCloneStyles) {
1013
- document.head.querySelectorAll('style').forEach((node) => {
1014
- this.popoutWindow?.document.head.appendChild(node.cloneNode(true));
1015
- });
1016
- this.observeStyleChanges();
1017
- document.head.querySelectorAll('link[rel="stylesheet"]').forEach((node) => {
1018
- this.popoutWindow?.document.head.insertAdjacentHTML('beforeend', `<link rel="stylesheet" type="${node.type}" href="${node.href}">`);
1019
- });
1020
- // Safe check for document.fonts
1021
- const doc = document;
1022
- const targetDoc = this.popoutWindow.document;
1023
- if (doc.fonts && targetDoc.fonts) {
1024
- doc.fonts.forEach((node) => {
1025
- targetDoc.fonts.add(node);
1026
- });
1027
- }
1028
- }
1029
- if (this.windowStyleUrl) {
1030
- this.popoutWindow.document.head.insertAdjacentHTML('beforeend', `<link rel="stylesheet" type="text/css" href="${window.location.origin}/${this.windowStyleUrl}">`);
1031
- }
1032
- if (this.windowStyle) {
1033
- this.popoutWindow.document.head.insertAdjacentHTML('beforeend', `<style>${this.windowStyle}</style>`);
1034
- }
1035
- this.renderer2.appendChild(this.popoutWindow.document.body, this.innerWrapper.nativeElement);
1036
- this.isOut = true;
1037
- this.shown.emit(this.popoutWindow);
1038
- this.popoutWindow.addEventListener('unload', () => {
1039
- this.popIn();
1040
- });
1041
- }
1042
- else {
1043
- this.popoutWindow.focus();
1044
- }
1045
- }
1046
- observeStyleChanges() {
1047
- const docHead = document.querySelector('head');
1048
- if (!docHead)
1049
- return;
1050
- this.observer?.disconnect();
1051
- this.observer = new MutationObserver((mutations) => {
1052
- mutations.forEach((mutation) => {
1053
- mutation.addedNodes.forEach((node) => {
1054
- if (node.nodeName === 'STYLE' && this.popoutWindow) {
1055
- this.popoutWindow.document.head.appendChild(node.cloneNode(true));
1056
- }
1057
- });
1058
- });
1059
- });
1060
- this.observer.observe(docHead, { childList: true });
1061
- }
1062
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PopoutWindowDirective, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
1063
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.14", type: PopoutWindowDirective, isStandalone: true, selector: "popout-window", inputs: { windowWidth: "windowWidth", windowHeight: "windowHeight", windowLeft: "windowLeft", windowTop: "windowTop", windowTitle: "windowTitle", windowStyle: "windowStyle", windowStyleUrl: "windowStyleUrl", suppressCloneStyles: "suppressCloneStyles", isPoppedOut: "isPoppedOut" }, outputs: { closed: "closed", shown: "shown" }, host: { listeners: { "window:beforeunload": "beforeunloadHandler()" } }, viewQueries: [{ propertyName: "innerWrapper", first: true, predicate: ["innerWrapper"], descendants: true }], ngImport: i0, template: `
1064
- <div #innerWrapper style="width: 100%; height: 100%; overflow: auto;">
1065
- <ng-content></ng-content>
1066
- </div>
1067
- `, isInline: true });
1068
- }
1069
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: PopoutWindowDirective, decorators: [{
1070
- type: Component,
1071
- args: [{
1072
- selector: 'popout-window',
1073
- template: `
1074
- <div #innerWrapper style="width: 100%; height: 100%; overflow: auto;">
1075
- <ng-content></ng-content>
1076
- </div>
1077
- `,
1078
- }]
1079
- }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }], propDecorators: { innerWrapper: [{
1080
- type: ViewChild,
1081
- args: ['innerWrapper']
1082
- }], windowWidth: [{
1083
- type: Input
1084
- }], windowHeight: [{
1085
- type: Input
1086
- }], windowLeft: [{
1087
- type: Input
1088
- }], windowTop: [{
1089
- type: Input
1090
- }], windowTitle: [{
1091
- type: Input
1092
- }], windowStyle: [{
1093
- type: Input
1094
- }], windowStyleUrl: [{
1095
- type: Input
1096
- }], suppressCloneStyles: [{
1097
- type: Input
1098
- }], isPoppedOut: [{
1099
- type: Input
1100
- }], closed: [{
1101
- type: Output
1102
- }], shown: [{
1103
- type: Output
1104
- }], beforeunloadHandler: [{
1105
- type: HostListener,
1106
- args: ['window:beforeunload']
1107
- }] } });
1108
-
1109
910
  class ChatWindowComponent {
1110
911
  isChatOpen = false;
1111
912
  enableDrag = false;
@@ -1135,6 +936,10 @@ class ChatWindowComponent {
1135
936
  chatSessions = [];
1136
937
  chatHistoryUserName = 'User';
1137
938
  isGuestUser = false;
939
+ isGuestMode = false;
940
+ isLoggingIn = false;
941
+ authError = null;
942
+ authSuccess = null;
1138
943
  themeConfig;
1139
944
  toggleChat = new EventEmitter();
1140
945
  toggleFullScreen = new EventEmitter();
@@ -1146,7 +951,14 @@ class ChatWindowComponent {
1146
951
  clearChat = new EventEmitter();
1147
952
  sessionSelected = new EventEmitter();
1148
953
  sessionDeleted = new EventEmitter();
954
+ continueAsGuest = new EventEmitter();
955
+ loginClick = new EventEmitter();
956
+ loginSubmit = new EventEmitter();
1149
957
  themeService = inject(ThemeService);
958
+ // Login form state
959
+ loginUsername = '';
960
+ loginPassword = '';
961
+ showLoginForm = false;
1150
962
  onToggleChat() {
1151
963
  this.toggleChat.emit();
1152
964
  }
@@ -1154,6 +966,21 @@ class ChatWindowComponent {
1154
966
  console.log('History button clicked!');
1155
967
  this.toggleHistorySidebar.emit();
1156
968
  }
969
+ onLoginClick() {
970
+ this.loginClick.emit();
971
+ this.showLoginForm = true;
972
+ }
973
+ onLoginSubmit() {
974
+ if (this.loginUsername && this.loginPassword) {
975
+ this.loginSubmit.emit({
976
+ username: this.loginUsername,
977
+ password: this.loginPassword,
978
+ });
979
+ }
980
+ }
981
+ onCancelLogin() {
982
+ this.showLoginForm = false;
983
+ }
1157
984
  onToggleFullScreen() {
1158
985
  this.toggleFullScreen.emit();
1159
986
  }
@@ -1167,6 +994,7 @@ class ChatWindowComponent {
1167
994
  this.send.emit(text);
1168
995
  }
1169
996
  onClearMessageError() {
997
+ this.messageError = null;
1170
998
  this.clearMessageError.emit();
1171
999
  }
1172
1000
  onClearChat() {
@@ -1178,6 +1006,9 @@ class ChatWindowComponent {
1178
1006
  onSessionDeleted(sessionId) {
1179
1007
  this.sessionDeleted.emit(sessionId);
1180
1008
  }
1009
+ onContinueAsGuest() {
1010
+ this.continueAsGuest.emit();
1011
+ }
1181
1012
  onPopoutShown(win) {
1182
1013
  // Apply theme classes
1183
1014
  const activeTheme = this.themeService.activeTheme();
@@ -1190,8 +1021,22 @@ class ChatWindowComponent {
1190
1021
  // Apply CSS variables
1191
1022
  this.themeService.applyCssVariables(body, this.themeConfig);
1192
1023
  }
1024
+ ngOnInit() {
1025
+ // Initialization logic if needed
1026
+ }
1027
+ 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;
1035
+ }
1036
+ }
1037
+ ngOnDestroy() { }
1193
1038
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1194
- 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", themeConfig: "themeConfig" }, outputs: { toggleChat: "toggleChat", toggleFullScreen: "toggleFullScreen", toggleHistorySidebar: "toggleHistorySidebar", openSettings: "openSettings", suggestionClick: "suggestionClick", send: "send", clearMessageError: "clearMessageError", clearChat: "clearChat", sessionSelected: "sessionSelected", sessionDeleted: "sessionDeleted" }, 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 [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 (suggestionClick)=\"onSuggestionClick($event)\"\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\"\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]=\"!messageError\"\r\n (closed)=\"onClearMessageError()\"\r\n ></app-snackbar>\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated\"\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 <!-- 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:#fff;transition:color .2s ease}.theme-btn.selected{color:#000}\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", "trackByMessageId"], outputs: ["suggestionClick"] }, { 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"] }] });
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"] }] });
1195
1040
  }
1196
1041
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: ChatWindowComponent, decorators: [{
1197
1042
  type: Component,
@@ -1206,10 +1051,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1206
1051
  DraggableDialogDirective,
1207
1052
  ResizableDialogDirective,
1208
1053
  ChatHistorySidebarComponent,
1209
- DropdownMenu,
1210
- MenuItem,
1211
- PopoutWindowDirective,
1212
- ], 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 [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 (suggestionClick)=\"onSuggestionClick($event)\"\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\"\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]=\"!messageError\"\r\n (closed)=\"onClearMessageError()\"\r\n ></app-snackbar>\r\n\r\n <!-- Chat Input: Only show when authenticated -->\r\n <app-message-input\r\n *ngIf=\"isAuthenticated\"\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 <!-- 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:#fff;transition:color .2s ease}.theme-btn.selected{color:#000}\n"] }]
1054
+ 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"] }]
1213
1056
  }], propDecorators: { isChatOpen: [{
1214
1057
  type: Input
1215
1058
  }], enableDrag: [{
@@ -1266,6 +1109,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1266
1109
  type: Input
1267
1110
  }], isGuestUser: [{
1268
1111
  type: Input
1112
+ }], isGuestMode: [{
1113
+ type: Input
1114
+ }], isLoggingIn: [{
1115
+ type: Input
1116
+ }], authError: [{
1117
+ type: Input
1118
+ }], authSuccess: [{
1119
+ type: Input
1269
1120
  }], themeConfig: [{
1270
1121
  type: Input
1271
1122
  }], toggleChat: [{
@@ -1288,6 +1139,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
1288
1139
  type: Output
1289
1140
  }], sessionDeleted: [{
1290
1141
  type: Output
1142
+ }], continueAsGuest: [{
1143
+ type: Output
1144
+ }], loginClick: [{
1145
+ type: Output
1146
+ }], loginSubmit: [{
1147
+ type: Output
1291
1148
  }] } });
1292
1149
 
1293
1150
  class FullscreenDirective {
@@ -1948,9 +1805,13 @@ class MessageService {
1948
1805
  isLoadingApi = signal(false, ...(ngDevMode ? [{ debugName: "isLoadingApi" }] : []));
1949
1806
  apiError = signal(null, ...(ngDevMode ? [{ debugName: "apiError" }] : []));
1950
1807
  isBotTyping = signal(false, ...(ngDevMode ? [{ debugName: "isBotTyping" }] : []));
1808
+ isGuestMode = signal(false, ...(ngDevMode ? [{ debugName: "isGuestMode" }] : []));
1951
1809
  constructor() {
1952
1810
  // Start with empty messages - no auto-load
1953
1811
  }
1812
+ setGuestMode(isGuest) {
1813
+ this.isGuestMode.set(isGuest);
1814
+ }
1954
1815
  /**
1955
1816
  * Switch to a new context
1956
1817
  */
@@ -2033,6 +1894,10 @@ class MessageService {
2033
1894
  * Get bot reply - supports both API and local modes
2034
1895
  */
2035
1896
  async getBotReply(userText) {
1897
+ // If in guest mode, force local logic
1898
+ if (this.isGuestMode()) {
1899
+ return this.getBotReplyLocal(userText);
1900
+ }
2036
1901
  // Check if API mode is enabled
2037
1902
  if (this.apiService?.isApiEnabled()) {
2038
1903
  return this.getBotReplyFromApi(userText);
@@ -2448,15 +2313,26 @@ class ChatFacadeService {
2448
2313
  accountService = inject(AccountService);
2449
2314
  authService = inject(AuthService);
2450
2315
  tenantContextService = inject(TenantContextService);
2451
- // Expose state from services
2316
+ // Chat State
2452
2317
  messages = this.messageService.messages;
2453
2318
  isBotTyping = this.messageService.isBotTyping;
2454
2319
  chatSessions = signal([], ...(ngDevMode ? [{ debugName: "chatSessions" }] : []));
2455
2320
  isAuthenticated = signal(false, ...(ngDevMode ? [{ debugName: "isAuthenticated" }] : []));
2321
+ isGuestMode = signal(false, ...(ngDevMode ? [{ debugName: "isGuestMode" }] : []));
2456
2322
  messageError = signal(null, ...(ngDevMode ? [{ debugName: "messageError" }] : []));
2323
+ // API / Auth State
2324
+ apiError = signal(null, ...(ngDevMode ? [{ debugName: "apiError" }] : []));
2325
+ authError = signal(null, ...(ngDevMode ? [{ debugName: "authError" }] : []));
2326
+ authSuccess = signal(null, ...(ngDevMode ? [{ debugName: "authSuccess" }] : []));
2327
+ isLoggingIn = signal(false, ...(ngDevMode ? [{ debugName: "isLoggingIn" }] : []));
2457
2328
  constructor() {
2458
2329
  // Set initial authentication status
2459
2330
  this.isAuthenticated.set(this.authService.isAuthenticated());
2331
+ // Check if we should default to guest mode (missing API config)
2332
+ if (!this.authService.apiUrl || !this.authService.companyCode) {
2333
+ console.log('ChatFacade: No API config detected, defaulting to Guest Mode');
2334
+ this.isGuestMode.set(true);
2335
+ }
2460
2336
  }
2461
2337
  // ============================================================================
2462
2338
  // SESSION MANAGEMENT
@@ -2544,29 +2420,47 @@ class ChatFacadeService {
2544
2420
  // AUTHENTICATION
2545
2421
  // ============================================================================
2546
2422
  /**
2547
- * Authenticate user with credentials or skip authentication for testing
2423
+ * Enable guest mode explicitly
2548
2424
  */
2549
- async login(credentials, skipAuth = false) {
2550
- //Todo: Remove this in production
2551
- if (skipAuth) {
2552
- console.log('Authentication skipped - Mock mode enabled');
2553
- this.isAuthenticated.set(true);
2554
- return true;
2555
- }
2425
+ enableGuestMode() {
2426
+ this.isGuestMode.set(true);
2427
+ this.messageService.setGuestMode(true);
2428
+ }
2429
+ /**
2430
+ * Disable guest mode explicitly
2431
+ */
2432
+ disableGuestMode() {
2433
+ this.isGuestMode.set(false);
2434
+ this.messageService.setGuestMode(false);
2435
+ }
2436
+ /**
2437
+ * Authenticate user with credentials
2438
+ */
2439
+ async login(credentials) {
2440
+ this.isLoggingIn.set(true);
2441
+ this.authError.set(null);
2442
+ this.authSuccess.set(null);
2556
2443
  try {
2557
2444
  const response = await firstValueFrom(this.accountService.login(credentials));
2558
2445
  if (response && response.success) {
2559
2446
  this.isAuthenticated.set(true);
2447
+ this.disableGuestMode(); // Ensure guest mode is off
2448
+ this.authSuccess.set('Login successful!');
2449
+ this.isLoggingIn.set(false);
2560
2450
  return true;
2561
2451
  }
2562
2452
  else {
2563
2453
  this.isAuthenticated.set(false);
2454
+ this.authError.set('Login failed. Please check your credentials.');
2455
+ this.isLoggingIn.set(false);
2564
2456
  return false;
2565
2457
  }
2566
2458
  }
2567
2459
  catch (error) {
2568
2460
  console.error('Login failed:', error);
2569
2461
  this.isAuthenticated.set(false);
2462
+ this.authError.set('An error occurred during login.');
2463
+ this.isLoggingIn.set(false);
2570
2464
  return false;
2571
2465
  }
2572
2466
  }
@@ -2864,6 +2758,10 @@ class Doohbot extends DoohbotInput {
2864
2758
  chatSessions = this.chatFacade.chatSessions;
2865
2759
  messageError = this.chatFacade.messageError;
2866
2760
  showSuggestionChips = this.chatFacade.showSuggestionChips;
2761
+ isGuestMode = this.chatFacade.isGuestMode;
2762
+ isLoggingIn = this.chatFacade.isLoggingIn;
2763
+ authError = this.chatFacade.authError;
2764
+ authSuccess = this.chatFacade.authSuccess;
2867
2765
  // ============================================================================
2868
2766
  // COMPONENT-SPECIFIC STATE
2869
2767
  // ============================================================================
@@ -2969,7 +2867,16 @@ class Doohbot extends DoohbotInput {
2969
2867
  username: this.config.username || AppConst.data?.username,
2970
2868
  password: this.config.password || AppConst.data?.password,
2971
2869
  };
2972
- this.chatFacade.login(credentials, this.config.skipAuthentication);
2870
+ this.chatFacade.login(credentials);
2871
+ }
2872
+ performLoginWithCredentials(credentials) {
2873
+ this.chatFacade.login(credentials);
2874
+ }
2875
+ continueAsGuest() {
2876
+ this.chatFacade.enableGuestMode();
2877
+ }
2878
+ disableGuestMode() {
2879
+ this.chatFacade.disableGuestMode();
2973
2880
  }
2974
2881
  // ============================================================================
2975
2882
  // CHAT OPERATIONS
@@ -3033,7 +2940,7 @@ class Doohbot extends DoohbotInput {
3033
2940
  deps: [AppConst],
3034
2941
  multi: true,
3035
2942
  },
3036
- ], 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 (toggleChat)=\"toggleChat()\"\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", "themeConfig"], outputs: ["toggleChat", "toggleFullScreen", "toggleHistorySidebar", "openSettings", "suggestionClick", "send", "clearMessageError", "clearChat", "sessionSelected", "sessionDeleted"] }, { kind: "directive", type: FullscreenDirective, selector: "[appFullscreen]", inputs: ["fullscreenTarget"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
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 });
3037
2944
  }
3038
2945
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImport: i0, type: Doohbot, decorators: [{
3039
2946
  type: Component,
@@ -3045,7 +2952,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.14", ngImpo
3045
2952
  deps: [AppConst],
3046
2953
  multi: true,
3047
2954
  },
3048
- ], 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 (toggleChat)=\"toggleChat()\"\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"] }]
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"] }]
3049
2956
  }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { config: [{
3050
2957
  type: Input
3051
2958
  }], platformTenant: [{