@a.izzuddin/ai-chat 0.2.9 → 0.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +58 -29
- package/dist/index.d.mts +11 -2
- package/dist/index.d.ts +11 -2
- package/dist/index.js +83 -22
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +83 -22
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/ai-chat.ts"],"names":["AIChat","LitElement","html","repeat","classMap","unsafeHTML","css","state","customElement"],"mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,EAAA,CAAA;AADLN,cAAA,CA2wBK,UAAA,GAAa;AAAA,EAC3B,MAAA,EAAQ,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,SAAA,EAAU;AAAA,EAC7C,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,YAAA,EAAa;AAAA,EACnD,SAAA,EAAW,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,OAAA,EAAQ;AAAA,EAC9C,KAAA,EAAO,EAAE,IAAA,EAAM,MAAA,EAAO;AAAA,EACtB,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAS,IAAA,EAAK;AAAA,EACpC,eAAA,EAAiB,EAAE,IAAA,EAAM,KAAA,EAAM;AAAA,EAC/B,YAAA,EAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,gBAAA,EAAiB;AAAA,EAC1D,aAAA,EAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,iBAAA,EAAkB;AAAA,EAC5D,kBAAA,EAAoB,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,sBAAA,EAAuB;AAAA,EACtE,WAAA,EAAa,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,cAAA,EAAe;AAAA,EACvD,YAAA,EAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,eAAA,EAAgB;AAAA,EACzD,YAAA,EAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,eAAA,EAAgB;AAAA,EACzD,iBAAA,EAAmB,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,qBAAA,EAAsB;AAAA,EACpE,aAAA,EAAe,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,iBAAA,EAAkB;AAAA,EAC5D,YAAA,EAAc,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,gBAAA,EAAiB;AAAA,EAC1D,cAAA,EAAgB,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,iBAAA,EAAkB;AAAA,EAC7D,eAAA,EAAiB,EAAE,IAAA,EAAM,MAAA,EAAQ,WAAW,kBAAA;AAC9C,CAAA;AA9BgB,eAAA,CAAA;AAAA,EADfO,mBAAA;AAAM,CAAA,EA9vBIP,cAAA,CA+vBK,SAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADfO,mBAAA;AAAM,CAAA,EAjwBIP,cAAA,CAkwBK,SAAA,EAAA,OAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADfO,mBAAA;AAAM,CAAA,EApwBIP,cAAA,CAqwBK,SAAA,EAAA,WAAA,EAAA,CAAA,CAAA;AAGA,eAAA,CAAA;AAAA,EADfO,mBAAA;AAAM,CAAA,EAvwBIP,cAAA,CAwwBK,SAAA,EAAA,QAAA,EAAA,CAAA,CAAA;AAxwBLA,cAAA,GAAN,eAAA,CAAA;AAAA,EADNQ,4BAAc,SAAS;AAAA,CAAA,EACXR,cAAA,CAAA","file":"index.js","sourcesContent":["import { LitElement, html, css, PropertyValues } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { repeat } from 'lit/directives/repeat.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\n\nconst VERSION = '0.2.8';\n\n// FAQ functionality - commented out for now\n// export interface FAQ {\n// \"no.\": string;\n// question: string;\n// }\n\nexport interface Message {\n id: string;\n role: 'user' | 'assistant';\n content: string;\n faqs?: any[]; // Commented out functionality - type changed to any[] to avoid FAQ interface dependency\n suggestedQuestions?: string[];\n}\n\n/**\n * AI Chat Web Component\n *\n * @fires message-sent - Fired when user sends a message\n * @fires response-received - Fired when AI responds\n * @fires error - Fired when an error occurs\n *\n * @example\n * ```html\n * <!-- Basic usage -->\n * <ai-chat\n * api-url=\"https://api.example.com\"\n * session-id=\"user-123\"\n * title=\"My AI Assistant\">\n * </ai-chat>\n *\n * <!-- Widget mode with custom size -->\n * <ai-chat\n * api-url=\"https://api.example.com\"\n * session-id=\"user-123\"\n * title=\"My AI Assistant\"\n * mode=\"widget\"\n * widget-width=\"400px\"\n * widget-height=\"650px\">\n * </ai-chat>\n *\n * <!-- Custom theme colors -->\n * <ai-chat\n * api-url=\"https://api.example.com\"\n * session-id=\"user-123\"\n * title=\"My AI Assistant\"\n * primary-color=\"#10B981\"\n * primary-color-hover=\"#059669\"\n * user-message-bg=\"#D1FAE5\"\n * bot-message-bg=\"#F3F4F6\">\n * </ai-chat>\n * ```\n */\n@customElement('ai-chat')\nexport class AIChat extends LitElement {\n static styles = css`\n :host {\n font-family: system-ui, -apple-system, sans-serif;\n color: #09090b;\n }\n\n /* Fullscreen mode (default) */\n :host([mode=\"fullscreen\"]) {\n display: flex;\n flex-direction: column;\n height: 100vh;\n background: #ffffff;\n }\n\n :host([mode=\"fullscreen\"][theme=\"dark\"]) {\n background: #000;\n color: #fafafa;\n }\n\n /* Widget mode */\n :host([mode=\"widget\"]) {\n position: fixed;\n bottom: 20px;\n right: 20px;\n z-index: 9999;\n }\n\n .widget-container {\n position: relative;\n }\n\n .widget-button {\n width: 60px;\n height: 60px;\n border-radius: 50%;\n background: #3681D3;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 16px rgba(65, 105, 225, 0.3);\n transition: transform 0.2s, box-shadow 0.2s;\n }\n\n .widget-button:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 20px rgba(65, 105, 225, 0.4);\n }\n\n .widget-button-no-bg {\n background: transparent;\n box-shadow: none;\n }\n\n .widget-button-no-bg:hover {\n background: transparent;\n box-shadow: none;\n transform: scale(1.1);\n }\n\n .widget-button svg {\n width: 28px;\n height: 28px;\n color: white;\n }\n\n .widget-button-icon {\n width: auto;\n height: auto;\n object-fit: cover;\n }\n\n .widget-window {\n position: absolute;\n bottom: 80px;\n right: 0;\n width: var(--widget-width, 380px);\n height: var(--widget-height, 600px);\n background: #fff;\n border-radius: 16px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.05);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n opacity: 0;\n transform: scale(0.9) translateY(20px);\n pointer-events: none;\n transition: opacity 0.2s, transform 0.2s;\n }\n\n .widget-window.open {\n opacity: 1;\n transform: scale(1) translateY(0);\n pointer-events: all;\n }\n\n :host([theme=\"dark\"]) .widget-window {\n background: #18181b;\n color: #fafafa;\n }\n\n /* Tablet breakpoint */\n @media (max-width: 1024px) and (min-width: 769px) {\n .widget-window {\n width: var(--widget-width, 400px);\n height: var(--widget-height, 650px);\n }\n }\n\n /* Small tablet breakpoint */\n @media (max-width: 768px) and (min-width: 481px) {\n .widget-window {\n width: var(--widget-width, 360px);\n height: var(--widget-height, 550px);\n }\n }\n\n /* Mobile portrait */\n @media (max-width: 480px) and (orientation: portrait) {\n .widget-window {\n width: calc(100vw - 40px);\n height: 70vh;\n bottom: 80px;\n right: 0;\n }\n\n .widget-button {\n width: 56px;\n height: 56px;\n }\n\n .widget-button svg {\n width: 24px;\n height: 24px;\n }\n }\n\n /* Mobile landscape */\n @media (max-width: 900px) and (orientation: landscape) {\n .widget-window {\n width: var(--widget-width, 500px);\n height: calc(100vh - 100px);\n bottom: 80px;\n right: 0;\n }\n\n .widget-button {\n width: 56px;\n height: 56px;\n }\n\n .widget-button svg {\n width: 24px;\n height: 24px;\n }\n }\n\n /* Mobile responsive styles for all modes */\n @media (max-width: 768px) {\n .header {\n padding: 0.875rem 1rem;\n }\n\n .header-avatar {\n width: 2.25rem;\n height: 2.25rem;\n }\n\n .title {\n font-size: 1.125rem;\n }\n\n .messages-area {\n padding: 1rem 0.75rem;\n }\n\n .message {\n gap: 0.75rem;\n }\n\n .avatar {\n width: 2rem;\n height: 2rem;\n font-size: 0.75rem;\n }\n\n .message-content {\n max-width: 100%;\n padding: 0.625rem 0.875rem;\n font-size: 0.9375rem;\n }\n\n .empty-state {\n margin-top: 3rem;\n }\n\n .empty-state p {\n font-size: 1.25rem;\n padding: 0 1rem;\n }\n\n .faq-section {\n margin-top: 0.75rem;\n padding-top: 0.75rem;\n }\n\n .faq-item {\n font-size: 0.8125rem;\n padding: 0;\n }\n\n .input-area {\n padding: 0.75rem;\n }\n\n .input-form {\n gap: 0.5rem;\n }\n\n .input-field {\n height: 2.75rem;\n padding: 0 0.875rem;\n font-size: 0.9375rem;\n }\n\n .send-button {\n width: 2.75rem;\n height: 2.75rem;\n flex-shrink: 0;\n }\n\n .send-icon {\n width: 1.125rem;\n height: 1.125rem;\n }\n }\n\n /* Extra small screens */\n @media (max-width: 480px) {\n .header {\n padding: 0.75rem 0.875rem;\n }\n\n .header-avatar {\n width: 2rem;\n height: 2rem;\n }\n\n .title {\n font-size: 1rem;\n }\n\n .messages-area {\n padding: 0.75rem 0.5rem;\n }\n\n .message {\n gap: 0.5rem;\n }\n\n .avatar {\n width: 1.75rem;\n height: 1.75rem;\n font-size: 0.7rem;\n }\n\n .message-content {\n padding: 0.5rem 0.75rem;\n font-size: 0.875rem;\n border-radius: 0.75rem;\n }\n\n .empty-state {\n margin-top: 2rem;\n }\n\n .empty-state p {\n font-size: 1.125rem;\n }\n\n .input-area {\n padding: 0.625rem;\n }\n\n .input-field {\n height: 2.5rem;\n padding: 0 0.75rem;\n font-size: 0.875rem;\n }\n\n .send-button {\n width: 2.5rem;\n height: 2.5rem;\n }\n\n .version-tag {\n font-size: 0.7rem;\n padding: 0.375rem;\n }\n }\n\n .header {\n background:#3681D3;\n padding: 1rem 1.25rem;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n box-shadow: 0 2px 8px rgba(65, 105, 225, 0.2);\n }\n\n :host([theme=\"dark\"]) .header {\n background: #3681D3\n }\n\n .header-content {\n max-width: 56rem;\n margin: 0 auto;\n display: flex;\n align-items: center;\n gap: 0.75rem;\n width: 100%;\n }\n\n .header-avatar {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 50%;\n background: #fff;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n flex-shrink: 0;\n }\n\n .header-avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .title {\n font-size: 1.25rem;\n font-weight: 600;\n margin: 0;\n color: #fff;\n }\n\n .messages-area {\n flex: 1;\n overflow-y: auto;\n padding: 1.5rem 1rem;\n position: relative;\n background: #ffffff;\n }\n\n :host([theme=\"dark\"]) .messages-area {\n background: #000;\n }\n\n .messages-area::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background-image: var(--background-image-url);\n background-size: 200px auto 60%;\n background-position: center center;\n background-repeat: no-repeat;\n opacity: 0.03;\n pointer-events: none;\n z-index: 0;\n }\n\n .messages-container {\n max-width: 56rem;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n position: relative;\n z-index: 1;\n }\n\n .empty-state {\n text-align: center;\n margin-top: 5rem;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 1.5rem;\n }\n\n :host([theme=\"dark\"]) .empty-state {\n color: #a1a1aa;\n }\n\n .empty-state-avatar {\n width: 5rem;\n height: 5rem;\n border-radius: 50%;\n background: #E5E7EB;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n }\n\n :host([theme=\"dark\"]) .empty-state-avatar {\n background: #3f3f46;\n }\n\n .empty-state-avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .empty-state-avatar svg {\n width: 3rem;\n height: 3rem;\n color: #9ca3af;\n }\n\n :host([theme=\"dark\"]) .empty-state-avatar svg {\n color: #6b7280;\n }\n\n .empty-state-content {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .empty-state-message {\n font-size: 1.25rem;\n font-weight: 600;\n margin: 0;\n color: #374151;\n }\n\n :host([theme=\"dark\"]) .empty-state-message {\n color: #f3f4f6;\n }\n\n .empty-state-subtitle {\n font-size: 0.9375rem;\n margin: 0;\n color: #6b7280;\n max-width: 24rem;\n }\n\n :host([theme=\"dark\"]) .empty-state-subtitle {\n color: #9ca3af;\n }\n\n .message {\n display: flex;\n gap: 1rem;\n }\n\n .message.user {\n flex-direction: row-reverse;\n }\n\n .avatar {\n width: 2.5rem;\n height: 2.5rem;\n border-radius: 9999px;\n background: #E5E7EB;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n font-weight: 600;\n font-size: 0.875rem;\n overflow: hidden;\n color: #6B7280;\n }\n\n :host([theme=\"dark\"]) .avatar {\n background: #3f3f46;\n color: #9ca3af;\n }\n\n .avatar-image {\n width: 100%;\n height: 100%;\n object-fit: cover;\n }\n\n .message-content {\n max-width: 36rem;\n padding: 0.875rem 1.125rem;\n border-radius: 1.25rem;\n line-height: 1.6;\n }\n\n .message.user .message-content {\n background: var(--user-message-bg, #D6E4FF);\n color: #1a1a1a;\n border-radius: 1.25rem 1.25rem 0.25rem 1.25rem;\n }\n\n .message.assistant .message-content {\n background: var(--bot-message-bg, #F5F5F5);\n color: #1a1a1a;\n border-radius: 1.25rem 1.25rem 1.25rem 0.25rem;\n }\n\n :host([theme=\"dark\"]) .message.user .message-content {\n background: #3D5A99;\n color: #fff;\n }\n\n :host([theme=\"dark\"]) .message.assistant .message-content {\n background: #27272a;\n color: #fafafa;\n }\n\n .message-text {\n white-space: pre-wrap;\n margin: 0;\n word-wrap: break-word;\n }\n\n .message-text ul,\n .message-text ol {\n margin: 0.5rem 0;\n padding-left: 1.5rem;\n white-space: normal;\n list-style-position: outside;\n }\n\n .message-text li {\n margin: 0.25rem 0;\n white-space: normal;\n display: list-item;\n }\n\n .message-text ul {\n list-style-type: disc;\n }\n\n .message-text ol {\n list-style-type: decimal;\n counter-reset: list-counter;\n }\n\n .message-text ol li {\n display: list-item;\n list-style-type: decimal;\n }\n\n .faq-section {\n margin-top: 0.75rem;\n padding-top: 0.75rem;\n border-top: 1px solid #d1d5db;\n }\n\n :host([theme=\"dark\"]) .faq-section {\n border-top-color: #3f3f46;\n }\n\n .faq-title {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--primary-color, #3681D3);\n margin: 0 0 0.375rem 0;\n }\n\n :host([theme=\"dark\"]) .faq-title {\n color: var(--primary-color-light, #5B7FE8);\n }\n\n .faq-list {\n list-style: none;\n padding: 0;\n margin: 0;\n display: flex;\n flex-direction: column;\n gap: 0.375rem;\n }\n\n .faq-item {\n font-size: 0.875rem;\n color: var(--primary-color, #3681D3);\n padding: 0;\n border-radius: 0.5rem;\n cursor: pointer;\n transition: background-color 0.2s, color 0.2s;\n border: 1px solid transparent;\n }\n\n .faq-item:hover {\n background-color: #EEF2FF;\n color: var(--primary-color-hover, #3457C7);\n border-color: #C7D2FE;\n }\n\n :host([theme=\"dark\"]) .faq-item {\n color: var(--primary-color-light, #5B7FE8);\n }\n\n :host([theme=\"dark\"]) .faq-item:hover {\n background-color: #1e293b;\n color: #93C5FD;\n border-color: #3f3f46;\n }\n\n /* FAQ static item styles - commented out for now */\n /* .faq-item-static {\n font-size: 0.875rem;\n color: #6B7280;\n padding: 0;\n border-radius: 0.5rem;\n cursor: default;\n border: 1px solid transparent;\n }\n\n :host([theme=\"dark\"]) .faq-item-static {\n color: #9CA3AF;\n } */\n\n .loading {\n display: flex;\n gap: 1rem;\n }\n\n .spinner {\n display: inline-block;\n width: 1.25rem;\n height: 1.25rem;\n border: 2px solid #e4e4e7;\n border-top-color: #71717a;\n border-radius: 50%;\n animation: spin 1s linear infinite;\n }\n\n @keyframes spin {\n to { transform: rotate(360deg); }\n }\n\n .input-area {\n border-top: 1px solid #e5e7eb;\n background: #fff;\n padding: 1rem 1.25rem;\n }\n\n :host([theme=\"dark\"]) .input-area {\n border-top-color: #27272a;\n background: #18181b;\n }\n\n .input-form {\n max-width: 56rem;\n margin: 0 auto;\n display: flex;\n gap: 0.75rem;\n align-items: center;\n }\n\n .input-field {\n flex: 1;\n height: 3rem;\n padding: 0 1rem;\n border: 1px solid #d1d5db;\n border-radius: 1.5rem;\n font-size: 0.9375rem;\n font-family: inherit;\n background: #fff;\n color: #374151;\n transition: border-color 0.2s, box-shadow 0.2s;\n }\n\n .input-field::placeholder {\n color: #9ca3af;\n }\n\n :host([theme=\"dark\"]) .input-field {\n border-color: #3f3f46;\n background: #18181b;\n color: #fafafa;\n }\n\n .input-field:focus {\n outline: none;\n border-color: var(--primary-color, #3681D3);\n box-shadow: 0 0 0 3px rgba(65, 105, 225, 0.1);\n }\n\n .input-field:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .send-button {\n width: 3rem;\n height: 3rem;\n border-radius: 9999px;\n border: none;\n background: var(--primary-color, #3681D3);\n color: #fff;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: background 0.2s, transform 0.1s;\n flex-shrink: 0;\n }\n\n .send-button:hover:not(:disabled) {\n background: var(--primary-color-hover, #3457C7);\n transform: scale(1.05);\n }\n\n .send-button:active:not(:disabled) {\n transform: scale(0.95);\n }\n\n .send-button:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n }\n\n .send-icon {\n width: 1.25rem;\n height: 1.25rem;\n }\n\n .version-tag {\n text-align: center;\n padding: 0.5rem;\n font-size: 0.75rem;\n color: #9ca3af;\n border-top: 1px solid #e5e7eb;\n }\n\n :host([theme=\"dark\"]) .version-tag {\n color: #6b7280;\n border-top-color: #27272a;\n }\n `;\n\n declare apiUrl: string;\n declare sessionId: string;\n declare chatTitle: string;\n declare theme: 'light' | 'dark';\n declare mode: 'fullscreen' | 'widget';\n declare initialMessages: Message[];\n declare botAvatarUrl: string;\n declare widgetIconUrl: string;\n declare backgroundImageUrl: string;\n declare widgetWidth: string;\n declare widgetHeight: string;\n declare primaryColor: string;\n declare primaryColorHover: string;\n declare userMessageBg: string;\n declare botMessageBg: string;\n declare welcomeMessage: string;\n declare welcomeSubtitle: string;\n\n @state()\n private declare messages: Message[];\n\n @state()\n private declare input: string;\n\n @state()\n private declare isLoading: boolean;\n\n @state()\n private declare isOpen: boolean;\n\n\n static override properties = {\n apiUrl: { type: String, attribute: 'api-url' },\n sessionId: { type: String, attribute: 'session-id' },\n chatTitle: { type: String, attribute: 'title' },\n theme: { type: String },\n mode: { type: String, reflect: true },\n initialMessages: { type: Array },\n botAvatarUrl: { type: String, attribute: 'bot-avatar-url' },\n widgetIconUrl: { type: String, attribute: 'widget-icon-url' },\n backgroundImageUrl: { type: String, attribute: 'background-image-url' },\n widgetWidth: { type: String, attribute: 'widget-width' },\n widgetHeight: { type: String, attribute: 'widget-height' },\n primaryColor: { type: String, attribute: 'primary-color' },\n primaryColorHover: { type: String, attribute: 'primary-color-hover' },\n userMessageBg: { type: String, attribute: 'user-message-bg' },\n botMessageBg: { type: String, attribute: 'bot-message-bg' },\n welcomeMessage: { type: String, attribute: 'welcome-message' },\n welcomeSubtitle: { type: String, attribute: 'welcome-subtitle' },\n };\n\n constructor() {\n super();\n this.apiUrl = '';\n this.sessionId = 'default-session';\n this.chatTitle = 'My AI Agent';\n this.theme = 'light';\n this.mode = 'fullscreen';\n this.initialMessages = [];\n this.botAvatarUrl = '';\n this.widgetIconUrl = '';\n this.backgroundImageUrl = '';\n this.widgetWidth = '380px';\n this.widgetHeight = '600px';\n this.primaryColor = '#3681D3';\n this.primaryColorHover = '#3457C7';\n this.userMessageBg = '#D6E4FF';\n this.botMessageBg = '#F5F5F5';\n this.welcomeMessage = 'How can I help you today?';\n this.welcomeSubtitle = '';\n this.messages = [];\n this.input = '';\n this.isLoading = false;\n this.isOpen = false;\n }\n\n private toggleWidget() {\n this.isOpen = !this.isOpen;\n }\n\n /**\n * Clear all chat messages and reset to welcome message\n * @public\n */\n public clearChat(): void {\n this.clearMessagesFromStorage();\n\n if (this.welcomeMessage) {\n const welcomeText = this.welcomeSubtitle\n ? `${this.welcomeMessage}\\n\\n${this.welcomeSubtitle}`\n : this.welcomeMessage;\n\n this.messages = [{\n id: 'welcome-' + Date.now(),\n role: 'assistant',\n content: welcomeText,\n }];\n } else {\n this.messages = [];\n }\n }\n\n private lightenColor(hex: string, percent: number = 15): string {\n // Remove # if present\n hex = hex.replace('#', '');\n\n // Convert to RGB\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n\n // Lighten\n const newR = Math.min(255, Math.round(r + (255 - r) * (percent / 100)));\n const newG = Math.min(255, Math.round(g + (255 - g) * (percent / 100)));\n const newB = Math.min(255, Math.round(b + (255 - b) * (percent / 100)));\n\n // Convert back to hex\n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\n }\n\n private getStorageKey(): string {\n return `ai-chat-messages-${this.sessionId}`;\n }\n\n private saveMessagesToStorage(): void {\n try {\n const storageKey = this.getStorageKey();\n localStorage.setItem(storageKey, JSON.stringify(this.messages));\n } catch (error) {\n console.warn('Failed to save messages to localStorage:', error);\n }\n }\n\n private loadMessagesFromStorage(): Message[] | null {\n try {\n const storageKey = this.getStorageKey();\n const saved = localStorage.getItem(storageKey);\n if (saved) {\n return JSON.parse(saved) as Message[];\n }\n } catch (error) {\n console.warn('Failed to load messages from localStorage:', error);\n }\n return null;\n }\n\n private clearMessagesFromStorage(): void {\n try {\n const storageKey = this.getStorageKey();\n localStorage.removeItem(storageKey);\n } catch (error) {\n console.warn('Failed to clear messages from localStorage:', error);\n }\n }\n\n private formatMessageContent(content: string): string {\n // Escape HTML to prevent XSS\n const escapeHtml = (text: string) => {\n const div = document.createElement('div');\n div.textContent = text;\n return div.innerHTML;\n };\n\n // Add line break before numbered lists that come after colons or other text\n let processedContent = content.replace(/([:\\w])\\s*(\\d+\\.\\s+)/g, '$1\\n$2');\n\n // First, split inline numbered lists (1. 2. 3. pattern)\n processedContent = processedContent.replace(/(\\d+\\.\\s+[^0-9]+?)(?=\\s+\\d+\\.\\s+|\\s*$)/g, '$1\\n');\n\n // Split inline bullet lists (- pattern)\n processedContent = processedContent.replace(/(-\\s+[^-]+?)(?=\\s+-\\s+|\\s*$)/g, '$1\\n');\n\n // Split content by lines\n const lines = processedContent.split('\\n');\n let formattedContent = '';\n let inList = false;\n let listType: 'ul' | 'ol' | null = null;\n let orderedListCounter = 1; // Track the current numbered list counter\n\n // Helper function to check if next non-empty line is a list item\n const getNextListType = (startIndex: number): 'ul' | 'ol' | null => {\n for (let j = startIndex + 1; j < lines.length; j++) {\n const nextLine = lines[j].trim();\n if (nextLine === '') continue; // Skip blank lines\n if (nextLine.match(/^[-*•]\\s+/)) return 'ul';\n if (nextLine.match(/^\\d+\\.\\s+/)) return 'ol';\n return null; // Found non-list content\n }\n return null; // End of content\n };\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n const trimmedLine = line.trim();\n\n // Check for unordered list (-, *, •)\n const unorderedMatch = trimmedLine.match(/^[-*•]\\s+(.+)$/);\n // Check for ordered list (1., 2., etc.)\n const orderedMatch = trimmedLine.match(/^(\\d+)\\.\\s+(.+)$/);\n\n if (unorderedMatch) {\n if (!inList || listType !== 'ul') {\n if (inList) formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\n formattedContent += '<ul>';\n inList = true;\n listType = 'ul';\n }\n formattedContent += `<li>${escapeHtml(unorderedMatch[1])}</li>`;\n } else if (orderedMatch) {\n const itemNumber = parseInt(orderedMatch[1], 10);\n const itemText = orderedMatch[2];\n\n if (!inList || listType !== 'ol') {\n if (inList) formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\n // Use the start attribute to continue numbering from where we left off\n // or reset to 1 if this is a new sequence starting with 1\n if (itemNumber === 1) {\n orderedListCounter = 1;\n formattedContent += '<ol>';\n } else {\n formattedContent += `<ol start=\"${orderedListCounter}\">`;\n }\n inList = true;\n listType = 'ol';\n }\n formattedContent += `<li value=\"${itemNumber}\">${escapeHtml(itemText)}</li>`;\n orderedListCounter = itemNumber + 1; // Track next number\n } else {\n // Not a list item\n if (trimmedLine === '') {\n // Blank line - check if next line continues the same list type\n const nextListType = getNextListType(i);\n if (inList && nextListType === listType) {\n // Keep list open and add spacing within the list\n formattedContent += '<li style=\"list-style: none; height: 0.5em;\"></li>';\n } else {\n // Close list if we're in one\n if (inList) {\n formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\n inList = false;\n listType = null;\n }\n formattedContent += '<br>';\n }\n } else {\n // Non-blank, non-list content\n if (inList) {\n formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\n inList = false;\n listType = null;\n }\n formattedContent += escapeHtml(line) + '\\n';\n }\n }\n }\n\n // Close any open list\n if (inList) {\n formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\n }\n\n return formattedContent;\n }\n\n connectedCallback() {\n super.connectedCallback();\n\n // Try to load messages from localStorage first\n const savedMessages = this.loadMessagesFromStorage();\n\n if (this.initialMessages && this.initialMessages.length > 0) {\n this.messages = [...this.initialMessages];\n } else if (savedMessages && savedMessages.length > 0) {\n // Restore saved messages from localStorage\n this.messages = savedMessages;\n } else if (this.welcomeMessage) {\n // Add welcome message as initial assistant message\n const welcomeText = this.welcomeSubtitle\n ? `${this.welcomeMessage}\\n\\n${this.welcomeSubtitle}`\n : this.welcomeMessage;\n\n this.messages = [{\n id: 'welcome-' + Date.now(),\n role: 'assistant',\n content: welcomeText,\n }];\n }\n }\n\n updated(changedProperties: PropertyValues) {\n super.updated(changedProperties);\n if (changedProperties.has('messages')) {\n this.scrollToBottom();\n // Save messages to localStorage whenever they change\n this.saveMessagesToStorage();\n }\n }\n\n private scrollToBottom() {\n // Use setTimeout to ensure Lit has finished rendering\n setTimeout(() => {\n // Find the last user message and scroll to it\n const userMessages = this.shadowRoot?.querySelectorAll('.message.user');\n if (userMessages && userMessages.length > 0) {\n const lastUserMessage = userMessages[userMessages.length - 1] as HTMLElement;\n lastUserMessage.scrollIntoView({ behavior: 'smooth', block: 'start' });\n }\n }, 100);\n }\n\n private handleInput(e: Event) {\n this.input = (e.target as HTMLInputElement).value;\n }\n\n private handleFAQClick(question: string) {\n if (this.isLoading) return;\n\n // Set the input and trigger submit\n this.input = question;\n\n // Create a synthetic submit event\n const submitEvent = new Event('submit', { cancelable: true });\n this.handleSubmit(submitEvent);\n }\n\n private async handleSubmit(e: Event) {\n e.preventDefault();\n\n if (!this.input.trim() || this.isLoading || !this.apiUrl) return;\n\n const userMessage: Message = {\n id: Date.now().toString(),\n role: 'user',\n content: this.input.trim(),\n };\n\n this.messages = [...this.messages, userMessage];\n const questionText = this.input.trim();\n this.input = '';\n this.isLoading = true;\n\n // Dispatch message-sent event\n this.dispatchEvent(new CustomEvent('message-sent', {\n detail: userMessage,\n bubbles: true,\n composed: true,\n }));\n\n try {\n const response = await fetch(`${this.apiUrl}/ask`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n session_id: this.sessionId,\n question: questionText,\n }),\n });\n\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(`Backend error: ${response.status} ${errorText}`);\n }\n\n const data = await response.json();\n console.log('🔍 Raw API response:', data);\n\n // Extract the response text and suggested questions\n let responseText = 'No response from agent';\n // let faqs: FAQ[] | undefined = undefined; // Commented out - FAQ functionality disabled\n let suggestedQuestions: string[] | undefined = undefined;\n\n if (data && typeof data === 'object' && data.response && typeof data.response === 'string') {\n console.log('📝 data.response type:', typeof data.response);\n console.log('📝 data.response preview:', data.response.substring(0, 100));\n\n // Check if data.response contains stringified JSON\n const trimmedResponse = data.response.trim();\n if (trimmedResponse.startsWith('{') || trimmedResponse.startsWith('[')) {\n console.log('🔄 Detected stringified JSON, parsing...');\n\n try {\n // First attempt: standard JSON.parse\n const innerData = JSON.parse(data.response);\n console.log('✅ Parsed inner data with JSON.parse');\n\n if (innerData && innerData.response && typeof innerData.response === 'string') {\n responseText = innerData.response;\n // faqs = innerData.faq_used || innerData.faqs_used || undefined; // Commented out - FAQ functionality disabled\n suggestedQuestions = innerData.suggested_follow_ups || innerData.suggested_questions || undefined;\n console.log('✅ Extracted text length:', responseText.length);\n // console.log('✅ Extracted FAQs count:', faqs?.length || 0); // Commented out - FAQ functionality disabled\n console.log('✅ Extracted suggested questions count:', suggestedQuestions?.length || 0);\n } else {\n responseText = data.response;\n // faqs = data.faq_used || data.faqs_used || undefined; // Commented out - FAQ functionality disabled\n suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || undefined;\n }\n } catch (parseError) {\n console.warn('⚠️ JSON.parse failed, using regex extraction...', parseError);\n\n // Backend has malformed JSON - extract response text\n const responsePattern = /\"response\"\\s*:\\s*\"([^\"]*(?:\\\\.[^\"]*)*)\"/s;\n const responseMatch = data.response.match(responsePattern);\n\n if (responseMatch) {\n responseText = responseMatch[1]\n .replace(/\\\\n/g, '\\n')\n .replace(/\\\\t/g, '\\t')\n .replace(/\\\\r/g, '\\r')\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n console.log('✅ Extracted response text, length:', responseText.length);\n } else {\n console.error('❌ Could not extract response');\n responseText = 'Error: Could not parse response';\n }\n\n // FAQ extraction - commented out for now\n // // Extract FAQs array (support both faq_used and faqs_used)\n // const faqsPattern = /\"(?:faq_used|faqs_used)\"\\s*:\\s*(\\[[^\\]]*\\])/s;\n // const faqsMatch = data.response.match(faqsPattern);\n //\n // if (faqsMatch) {\n // try {\n // faqs = JSON.parse(faqsMatch[1]);\n // console.log('✅ Extracted FAQs, count:', faqs?.length || 0);\n // } catch {\n // console.log('⚠️ Could not parse FAQs, trying multiline...');\n // // FAQs might span multiple lines\n // const faqsMultiPattern = /\"(?:faq_used|faqs_used)\"\\s*:\\s*(\\[[\\s\\S]*?\\n\\s*\\])/;\n // const faqsMultiMatch = data.response.match(faqsMultiPattern);\n // if (faqsMultiMatch) {\n // try {\n // faqs = JSON.parse(faqsMultiMatch[1]);\n // console.log('✅ Extracted multi-line FAQs, count:', faqs?.length || 0);\n // } catch {\n // faqs = undefined;\n // }\n // }\n // }\n // }\n\n // Extract suggested questions array\n const suggestedPattern = /\"(?:suggested_follow_ups|suggested_questions)\"\\s*:\\s*(\\[[^\\]]*\\])/s;\n const suggestedMatch = data.response.match(suggestedPattern);\n\n if (suggestedMatch) {\n try {\n suggestedQuestions = JSON.parse(suggestedMatch[1]);\n console.log('✅ Extracted suggested questions, count:', suggestedQuestions?.length || 0);\n } catch {\n console.log('⚠️ Could not parse suggested questions, trying multiline...');\n const suggestedMultiPattern = /\"(?:suggested_follow_ups|suggested_questions)\"\\s*:\\s*(\\[[\\s\\S]*?\\n\\s*\\])/;\n const suggestedMultiMatch = data.response.match(suggestedMultiPattern);\n if (suggestedMultiMatch) {\n try {\n suggestedQuestions = JSON.parse(suggestedMultiMatch[1]);\n console.log('✅ Extracted multi-line suggested questions, count:', suggestedQuestions?.length || 0);\n } catch {\n suggestedQuestions = undefined;\n }\n }\n }\n }\n }\n } else {\n // Not JSON, direct text response\n console.log('📄 Direct text response (not JSON)');\n responseText = data.response;\n // faqs = data.faq_used || data.faqs_used || undefined; // Commented out - FAQ functionality disabled\n suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || undefined;\n }\n } else if (typeof data === 'string') {\n console.log('📄 Response is a plain string');\n responseText = data;\n } else if (data && typeof data === 'object') {\n // Fallback for other formats\n console.warn('⚠️ Unexpected format, using fallback');\n responseText = data.message || data.answer || 'Error: Unexpected response format';\n // faqs = data.faq_used || data.faqs_used || undefined; // Commented out - FAQ functionality disabled\n suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || undefined;\n }\n\n console.log('🎯 Final responseText length:', responseText.length);\n console.log('🎯 Final responseText preview:', responseText.substring(0, 100));\n // console.log('🎯 Final FAQs:', faqs); // Commented out - FAQ functionality disabled\n console.log('🎯 Final suggested questions:', suggestedQuestions);\n\n const assistantMessage: Message = {\n id: (Date.now() + 1).toString(),\n role: 'assistant',\n content: responseText,\n // faqs: faqs, // Commented out - FAQ functionality disabled\n suggestedQuestions: suggestedQuestions,\n };\n\n this.messages = [...this.messages, assistantMessage];\n\n // Dispatch response-received event\n this.dispatchEvent(new CustomEvent('response-received', {\n detail: assistantMessage,\n bubbles: true,\n composed: true,\n }));\n } catch (err) {\n console.error('Backend connection failed:', err);\n\n const errorMessage: Message = {\n id: (Date.now() + 1).toString(),\n role: 'assistant',\n content: `Error: ${err instanceof Error ? err.message : 'Unknown error'}\\n\\nPlease check your API endpoint configuration.`,\n };\n\n this.messages = [...this.messages, errorMessage];\n\n // Dispatch error event\n this.dispatchEvent(new CustomEvent('error', {\n detail: err,\n bubbles: true,\n composed: true,\n }));\n } finally {\n this.isLoading = false;\n }\n }\n\n private renderChatUI() {\n const primaryColorLight = this.lightenColor(this.primaryColor, 15);\n\n return html`\n <!-- Header -->\n <div class=\"header\" style=\"--primary-color: ${this.primaryColor}; --primary-color-light: ${primaryColorLight}; --primary-color-hover: ${this.primaryColorHover};\">\n <div class=\"header-content\">\n <div class=\"header-avatar\">\n ${this.botAvatarUrl\n ? html`<img src=\"${this.botAvatarUrl}\" alt=\"Bot\" class=\"header-avatar-image\" />`\n : html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${this.primaryColor}\" stroke-width=\"2\" style=\"width: 1.5rem; height: 1.5rem;\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\n </svg>`}\n </div>\n <h1 class=\"title\">${this.chatTitle}</h1>\n </div>\n </div>\n\n <!-- Messages Area -->\n <div class=\"messages-area\" style=\"--user-message-bg: ${this.userMessageBg}; --bot-message-bg: ${this.botMessageBg}; --primary-color: ${this.primaryColor}; --primary-color-light: ${primaryColorLight}; --primary-color-hover: ${this.primaryColorHover}; ${this.backgroundImageUrl ? `--background-image-url: url('${this.backgroundImageUrl}');` : ''}\">\n <div class=\"messages-container\">\n ${repeat(this.messages, (msg) => msg.id, (msg) => html`\n <div\n class=${classMap({\n message: true,\n user: msg.role === 'user',\n assistant: msg.role === 'assistant'\n })}\n >\n <div class=\"avatar\">\n ${msg.role === 'user'\n ? 'U'\n : this.botAvatarUrl\n ? html`<img src=\"${this.botAvatarUrl}\" alt=\"AI\" class=\"avatar-image\" />`\n : 'AI'}\n </div>\n <div class=\"message-content\">\n <div class=\"message-text\">${unsafeHTML(this.formatMessageContent(msg.content))}</div>\n <!-- FAQ section - commented out for now -->\n <!-- ${msg.role === 'assistant' && msg.faqs && msg.faqs.length > 0 ? html`\n <div class=\"faq-section\">\n <p class=\"faq-title\">Related FAQs:</p>\n <ul class=\"faq-list\">\n ${msg.faqs.map(faq => html`\n <li class=\"faq-item-static\">\n ${faq.question}\n </li>\n `)}\n </ul>\n </div>\n ` : ''} -->\n ${msg.role === 'assistant' && msg.suggestedQuestions && msg.suggestedQuestions.length > 0 ? html`\n <div class=\"faq-section\">\n <p class=\"faq-title\">Suggested Questions:</p>\n <ul class=\"faq-list\">\n ${msg.suggestedQuestions.map(question => html`\n <li class=\"faq-item\" @click=${() => this.handleFAQClick(question)}>\n ${question}\n </li>\n `)}\n </ul>\n </div>\n ` : ''}\n </div>\n </div>\n `)}\n\n ${this.isLoading ? html`\n <div class=\"loading\">\n <div class=\"avatar\">\n ${this.botAvatarUrl\n ? html`<img src=\"${this.botAvatarUrl}\" alt=\"AI\" class=\"avatar-image\" />`\n : 'AI'}\n </div>\n <div class=\"message-content\">\n <div class=\"spinner\"></div>\n </div>\n </div>\n ` : ''}\n </div>\n </div>\n\n <!-- Input Area -->\n <div class=\"input-area\" style=\"--primary-color: ${this.primaryColor}; --primary-color-hover: ${this.primaryColorHover};\">\n <form class=\"input-form\" @submit=${this.handleSubmit}>\n <input\n type=\"text\"\n class=\"input-field\"\n placeholder=\"Taip mesej anda...\"\n .value=${this.input}\n @input=${this.handleInput}\n ?disabled=${this.isLoading}\n />\n <button\n type=\"submit\"\n class=\"send-button\"\n ?disabled=${this.isLoading || !this.input.trim()}\n aria-label=\"Send message\"\n >\n ${this.isLoading ? html`\n <div class=\"spinner\" style=\"border-color: #fff; border-top-color: transparent;\"></div>\n ` : html`\n <svg class=\"send-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\n </svg>\n `}\n </button>\n </form>\n </div>\n\n <!-- Version -->\n <div class=\"version-tag\">v${VERSION}</div>\n `;\n }\n\n render() {\n const primaryColorLight = this.lightenColor(this.primaryColor, 15);\n\n if (this.mode === 'widget') {\n return html`\n <div class=\"widget-container\">\n <!-- Chat Window -->\n <div\n class=${classMap({ 'widget-window': true, 'open': this.isOpen })}\n style=\"--widget-width: ${this.widgetWidth}; --widget-height: ${this.widgetHeight};\"\n >\n ${this.renderChatUI()}\n </div>\n\n <!-- Toggle Button -->\n <button\n class=${classMap({\n 'widget-button': true,\n 'widget-button-no-bg': !this.isOpen && !!this.widgetIconUrl\n })}\n style=\"--primary-color: ${this.primaryColor}; --primary-color-light: ${primaryColorLight};\"\n @click=${this.toggleWidget}\n aria-label=${this.isOpen ? 'Close chat' : 'Open chat'}\n >\n ${this.isOpen ? html`\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n ` : this.widgetIconUrl ? html`\n <img src=\"${this.widgetIconUrl}\" alt=\"Chat\" class=\"widget-button-icon\" />\n ` : html`\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\n </svg>\n `}\n </button>\n </div>\n `;\n }\n\n // Fullscreen mode\n return this.renderChatUI();\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'ai-chat': AIChat;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/ai-chat.ts"],"names":["AIChat","LitElement","html","repeat","classMap","unsafeHTML","css","state","customElement"],"mappings":"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A;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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","file":"index.js","sourcesContent":["import { LitElement, html, css, PropertyValues } from 'lit';\r\nimport { customElement, state } from 'lit/decorators.js';\r\nimport { repeat } from 'lit/directives/repeat.js';\r\nimport { classMap } from 'lit/directives/class-map.js';\r\nimport { unsafeHTML } from 'lit/directives/unsafe-html.js';\r\n\r\nconst VERSION = '0.2.11';\r\n\r\nexport interface FAQ {\r\n No: string;\r\n Question: string;\r\n}\r\n\r\nexport interface Message {\r\n id: string;\r\n role: 'user' | 'assistant';\r\n content: string;\r\n faqs?: FAQ[];\r\n suggestedQuestions?: string[];\r\n}\r\n\r\n/**\r\n * AI Chat Web Component\r\n *\r\n * @fires message-sent - Fired when user sends a message\r\n * @fires response-received - Fired when AI responds\r\n * @fires error - Fired when an error occurs\r\n *\r\n * @example\r\n * ```html\r\n * <!-- Basic usage -->\r\n * <ai-chat\r\n * api-url=\"https://api.example.com\"\r\n * session-id=\"user-123\"\r\n * title=\"My AI Assistant\">\r\n * </ai-chat>\r\n *\r\n * <!-- Widget mode with custom size -->\r\n * <ai-chat\r\n * api-url=\"https://api.example.com\"\r\n * session-id=\"user-123\"\r\n * title=\"My AI Assistant\"\r\n * mode=\"widget\"\r\n * widget-width=\"400px\"\r\n * widget-height=\"650px\">\r\n * </ai-chat>\r\n *\r\n * <!-- Custom theme colors -->\r\n * <ai-chat\r\n * api-url=\"https://api.example.com\"\r\n * session-id=\"user-123\"\r\n * title=\"My AI Assistant\"\r\n * primary-color=\"#10B981\"\r\n * primary-color-hover=\"#059669\"\r\n * user-message-bg=\"#D1FAE5\"\r\n * bot-message-bg=\"#F3F4F6\">\r\n * </ai-chat>\r\n * ```\r\n */\r\n@customElement('ai-chat')\r\nexport class AIChat extends LitElement {\r\n static styles = css`\r\n :host {\r\n font-family: system-ui, -apple-system, sans-serif;\r\n color: #09090b;\r\n }\r\n\r\n /* Fullscreen mode (default) */\r\n :host([mode=\"fullscreen\"]) {\r\n display: flex;\r\n flex-direction: column;\r\n height: 100vh;\r\n background: #ffffff;\r\n }\r\n\r\n :host([mode=\"fullscreen\"][theme=\"dark\"]) {\r\n background: #000;\r\n color: #fafafa;\r\n }\r\n\r\n /* Widget mode */\r\n :host([mode=\"widget\"]) {\r\n position: fixed;\r\n bottom: 20px;\r\n right: 20px;\r\n z-index: 9999;\r\n }\r\n\r\n .widget-container {\r\n position: relative;\r\n }\r\n\r\n .widget-button {\r\n width: 60px;\r\n height: 60px;\r\n border-radius: 50%;\r\n background: #3681D3;\r\n border: none;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n box-shadow: 0 4px 16px rgba(65, 105, 225, 0.3);\r\n transition: transform 0.2s, box-shadow 0.2s;\r\n }\r\n\r\n .widget-button:hover {\r\n transform: scale(1.05);\r\n box-shadow: 0 6px 20px rgba(65, 105, 225, 0.4);\r\n }\r\n\r\n .widget-button-no-bg {\r\n background: transparent;\r\n box-shadow: none;\r\n }\r\n\r\n .widget-button-no-bg:hover {\r\n background: transparent;\r\n box-shadow: none;\r\n transform: scale(1.1);\r\n }\r\n\r\n .widget-button svg {\r\n width: 28px;\r\n height: 28px;\r\n color: white;\r\n }\r\n\r\n .widget-button-icon {\r\n width: auto;\r\n height: auto;\r\n object-fit: cover;\r\n }\r\n\r\n .widget-window {\r\n position: absolute;\r\n bottom: 80px;\r\n right: 0;\r\n width: var(--widget-width, 380px);\r\n height: var(--widget-height, 600px);\r\n background: #fff;\r\n border-radius: 16px;\r\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12), 0 0 0 1px rgba(0, 0, 0, 0.05);\r\n display: flex;\r\n flex-direction: column;\r\n overflow: hidden;\r\n opacity: 0;\r\n transform: scale(0.9) translateY(20px);\r\n pointer-events: none;\r\n transition: opacity 0.2s, transform 0.2s;\r\n }\r\n\r\n .widget-window.open {\r\n opacity: 1;\r\n transform: scale(1) translateY(0);\r\n pointer-events: all;\r\n }\r\n\r\n :host([theme=\"dark\"]) .widget-window {\r\n background: #18181b;\r\n color: #fafafa;\r\n }\r\n\r\n /* Tablet breakpoint */\r\n @media (max-width: 1024px) and (min-width: 769px) {\r\n .widget-window {\r\n width: var(--widget-width, 400px);\r\n height: var(--widget-height, 650px);\r\n }\r\n }\r\n\r\n /* Small tablet breakpoint */\r\n @media (max-width: 768px) and (min-width: 481px) {\r\n .widget-window {\r\n width: var(--widget-width, 360px);\r\n height: var(--widget-height, 550px);\r\n }\r\n }\r\n\r\n /* Mobile portrait */\r\n @media (max-width: 480px) and (orientation: portrait) {\r\n .widget-window {\r\n width: calc(100vw - 40px);\r\n height: 70vh;\r\n bottom: 80px;\r\n right: 0;\r\n }\r\n\r\n .widget-button {\r\n width: 56px;\r\n height: 56px;\r\n }\r\n\r\n .widget-button svg {\r\n width: 24px;\r\n height: 24px;\r\n }\r\n }\r\n\r\n /* Mobile landscape */\r\n @media (max-width: 900px) and (orientation: landscape) {\r\n .widget-window {\r\n width: var(--widget-width, 500px);\r\n height: calc(100vh - 100px);\r\n bottom: 80px;\r\n right: 0;\r\n }\r\n\r\n .widget-button {\r\n width: 56px;\r\n height: 56px;\r\n }\r\n\r\n .widget-button svg {\r\n width: 24px;\r\n height: 24px;\r\n }\r\n }\r\n\r\n /* Mobile responsive styles for all modes */\r\n @media (max-width: 768px) {\r\n .header {\r\n padding: 0.875rem 1rem;\r\n }\r\n\r\n .header-avatar {\r\n width: 2.25rem;\r\n height: 2.25rem;\r\n }\r\n\r\n .title {\r\n font-size: 1.125rem;\r\n }\r\n\r\n .messages-area {\r\n padding: 1rem 0.75rem;\r\n }\r\n\r\n .message {\r\n gap: 0.75rem;\r\n }\r\n\r\n .avatar {\r\n width: 2rem;\r\n height: 2rem;\r\n font-size: 0.75rem;\r\n }\r\n\r\n .message-content {\r\n max-width: 100%;\r\n padding: 0.625rem 0.875rem;\r\n font-size: 0.9375rem;\r\n }\r\n\r\n .empty-state {\r\n margin-top: 3rem;\r\n }\r\n\r\n .empty-state p {\r\n font-size: 1.25rem;\r\n padding: 0 1rem;\r\n }\r\n\r\n .faq-section {\r\n margin-top: 0.75rem;\r\n padding-top: 0.75rem;\r\n }\r\n\r\n .faq-item {\r\n font-size: 0.8125rem;\r\n padding: 0;\r\n }\r\n\r\n .input-area {\r\n padding: 0.75rem;\r\n }\r\n\r\n .input-form {\r\n gap: 0.5rem;\r\n }\r\n\r\n .input-field {\r\n height: 2.75rem;\r\n padding: 0 0.875rem;\r\n font-size: 0.9375rem;\r\n }\r\n\r\n .send-button {\r\n width: 2.75rem;\r\n height: 2.75rem;\r\n flex-shrink: 0;\r\n }\r\n\r\n .send-icon {\r\n width: 1.125rem;\r\n height: 1.125rem;\r\n }\r\n }\r\n\r\n /* Extra small screens */\r\n @media (max-width: 480px) {\r\n .header {\r\n padding: 0.75rem 0.875rem;\r\n }\r\n\r\n .header-avatar {\r\n width: 2rem;\r\n height: 2rem;\r\n }\r\n\r\n .title {\r\n font-size: 1rem;\r\n }\r\n\r\n .messages-area {\r\n padding: 0.75rem 0.5rem;\r\n }\r\n\r\n .message {\r\n gap: 0.5rem;\r\n }\r\n\r\n .avatar {\r\n width: 1.75rem;\r\n height: 1.75rem;\r\n font-size: 0.7rem;\r\n }\r\n\r\n .message-content {\r\n padding: 0.5rem 0.75rem;\r\n font-size: 0.875rem;\r\n border-radius: 0.75rem;\r\n }\r\n\r\n .empty-state {\r\n margin-top: 2rem;\r\n }\r\n\r\n .empty-state p {\r\n font-size: 1.125rem;\r\n }\r\n\r\n .input-area {\r\n padding: 0.625rem;\r\n }\r\n\r\n .input-field {\r\n height: 2.5rem;\r\n padding: 0 0.75rem;\r\n font-size: 0.875rem;\r\n }\r\n\r\n .send-button {\r\n width: 2.5rem;\r\n height: 2.5rem;\r\n }\r\n\r\n .version-tag {\r\n font-size: 0.7rem;\r\n padding: 0.375rem;\r\n }\r\n }\r\n\r\n .header {\r\n background:#3681D3;\r\n padding: 1rem 1.25rem;\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n box-shadow: 0 2px 8px rgba(65, 105, 225, 0.2);\r\n }\r\n\r\n :host([theme=\"dark\"]) .header {\r\n background: #3681D3\r\n }\r\n\r\n .header-content {\r\n max-width: 56rem;\r\n margin: 0 auto;\r\n display: flex;\r\n align-items: center;\r\n gap: 0.75rem;\r\n width: 100%;\r\n }\r\n\r\n .header-avatar {\r\n width: 2.5rem;\r\n height: 2.5rem;\r\n border-radius: 50%;\r\n background: #fff;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n flex-shrink: 0;\r\n }\r\n\r\n .header-avatar-image {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n .title {\r\n font-size: 1.25rem;\r\n font-weight: 600;\r\n margin: 0;\r\n color: #fff;\r\n }\r\n\r\n .messages-area {\r\n flex: 1;\r\n overflow-y: auto;\r\n padding: 1.5rem 1rem;\r\n position: relative;\r\n background: #ffffff;\r\n }\r\n\r\n :host([theme=\"dark\"]) .messages-area {\r\n background: #000;\r\n }\r\n\r\n .messages-area::before {\r\n content: '';\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background-image: var(--background-image-url);\r\n background-size: 200px auto 60%;\r\n background-position: center center;\r\n background-repeat: no-repeat;\r\n opacity: 0.03;\r\n pointer-events: none;\r\n z-index: 0;\r\n }\r\n\r\n .messages-container {\r\n max-width: 56rem;\r\n margin: 0 auto;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 1.5rem;\r\n position: relative;\r\n z-index: 1;\r\n }\r\n\r\n .empty-state {\r\n text-align: center;\r\n margin-top: 5rem;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n gap: 1.5rem;\r\n }\r\n\r\n :host([theme=\"dark\"]) .empty-state {\r\n color: #a1a1aa;\r\n }\r\n\r\n .empty-state-avatar {\r\n width: 5rem;\r\n height: 5rem;\r\n border-radius: 50%;\r\n background: #E5E7EB;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n overflow: hidden;\r\n }\r\n\r\n :host([theme=\"dark\"]) .empty-state-avatar {\r\n background: #3f3f46;\r\n }\r\n\r\n .empty-state-avatar-image {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n .empty-state-avatar svg {\r\n width: 3rem;\r\n height: 3rem;\r\n color: #9ca3af;\r\n }\r\n\r\n :host([theme=\"dark\"]) .empty-state-avatar svg {\r\n color: #6b7280;\r\n }\r\n\r\n .empty-state-content {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.5rem;\r\n }\r\n\r\n .empty-state-message {\r\n font-size: 1.25rem;\r\n font-weight: 600;\r\n margin: 0;\r\n color: #374151;\r\n }\r\n\r\n :host([theme=\"dark\"]) .empty-state-message {\r\n color: #f3f4f6;\r\n }\r\n\r\n .empty-state-subtitle {\r\n font-size: 0.9375rem;\r\n margin: 0;\r\n color: #6b7280;\r\n max-width: 24rem;\r\n }\r\n\r\n :host([theme=\"dark\"]) .empty-state-subtitle {\r\n color: #9ca3af;\r\n }\r\n\r\n .message {\r\n display: flex;\r\n gap: 1rem;\r\n }\r\n\r\n .message.user {\r\n flex-direction: row-reverse;\r\n }\r\n\r\n .avatar {\r\n width: 2.5rem;\r\n height: 2.5rem;\r\n border-radius: 9999px;\r\n background: #E5E7EB;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n flex-shrink: 0;\r\n font-weight: 600;\r\n font-size: 0.875rem;\r\n overflow: hidden;\r\n color: #6B7280;\r\n }\r\n\r\n :host([theme=\"dark\"]) .avatar {\r\n background: #3f3f46;\r\n color: #9ca3af;\r\n }\r\n\r\n .avatar-image {\r\n width: 100%;\r\n height: 100%;\r\n object-fit: cover;\r\n }\r\n\r\n .message-content {\r\n max-width: 36rem;\r\n padding: 0.875rem 1.125rem;\r\n border-radius: 1.25rem;\r\n line-height: 1.6;\r\n }\r\n\r\n .message.user .message-content {\r\n background: var(--user-message-bg, #D6E4FF);\r\n color: #1a1a1a;\r\n border-radius: 1.25rem 1.25rem 0.25rem 1.25rem;\r\n }\r\n\r\n .message.assistant .message-content {\r\n background: var(--bot-message-bg, #F5F5F5);\r\n color: #1a1a1a;\r\n border-radius: 1.25rem 1.25rem 1.25rem 0.25rem;\r\n }\r\n\r\n :host([theme=\"dark\"]) .message.user .message-content {\r\n background: #3D5A99;\r\n color: #fff;\r\n }\r\n\r\n :host([theme=\"dark\"]) .message.assistant .message-content {\r\n background: #27272a;\r\n color: #fafafa;\r\n }\r\n\r\n .message-text {\r\n white-space: pre-wrap;\r\n margin: 0;\r\n word-wrap: break-word;\r\n }\r\n\r\n .message-text ul,\r\n .message-text ol {\r\n margin: 0.5rem 0;\r\n padding-left: 1.5rem;\r\n white-space: normal;\r\n list-style-position: outside;\r\n }\r\n\r\n .message-text li {\r\n margin: 0.25rem 0;\r\n white-space: normal;\r\n display: list-item;\r\n }\r\n\r\n .message-text ul {\r\n list-style-type: disc;\r\n }\r\n\r\n .message-text ol {\r\n list-style-type: decimal;\r\n counter-reset: list-counter;\r\n }\r\n\r\n .message-text ol li {\r\n display: list-item;\r\n list-style-type: decimal;\r\n }\r\n\r\n .faq-section {\r\n margin-top: 0.75rem;\r\n padding-top: 0.75rem;\r\n border-top: 1px solid #d1d5db;\r\n }\r\n\r\n :host([theme=\"dark\"]) .faq-section {\r\n border-top-color: #3f3f46;\r\n }\r\n\r\n .faq-title {\r\n font-size: 0.875rem;\r\n font-weight: 600;\r\n color: var(--primary-color, #3681D3);\r\n margin: 0 0 0.375rem 0;\r\n }\r\n\r\n :host([theme=\"dark\"]) .faq-title {\r\n color: var(--primary-color-light, #5B7FE8);\r\n }\r\n\r\n .faq-list {\r\n list-style: none;\r\n padding: 0;\r\n margin: 0;\r\n display: flex;\r\n flex-direction: column;\r\n gap: 0.375rem;\r\n }\r\n\r\n .faq-item {\r\n font-size: 0.875rem;\r\n color: var(--primary-color, #3681D3);\r\n padding: 0;\r\n border-radius: 0.5rem;\r\n cursor: pointer;\r\n transition: background-color 0.2s, color 0.2s;\r\n border: 1px solid transparent;\r\n }\r\n\r\n .faq-item:hover {\r\n background-color: #EEF2FF;\r\n color: var(--primary-color-hover, #3457C7);\r\n border-color: #C7D2FE;\r\n }\r\n\r\n :host([theme=\"dark\"]) .faq-item {\r\n color: var(--primary-color-light, #5B7FE8);\r\n }\r\n\r\n :host([theme=\"dark\"]) .faq-item:hover {\r\n background-color: #1e293b;\r\n color: #93C5FD;\r\n border-color: #3f3f46;\r\n }\r\n\r\n /* FAQ static item styles - commented out for now */\r\n /* .faq-item-static {\r\n font-size: 0.875rem;\r\n color: #6B7280;\r\n padding: 0;\r\n border-radius: 0.5rem;\r\n cursor: default;\r\n border: 1px solid transparent;\r\n }\r\n\r\n :host([theme=\"dark\"]) .faq-item-static {\r\n color: #9CA3AF;\r\n } */\r\n\r\n .loading {\r\n display: flex;\r\n gap: 1rem;\r\n }\r\n\r\n .spinner {\r\n display: inline-block;\r\n width: 1.25rem;\r\n height: 1.25rem;\r\n border: 2px solid #e4e4e7;\r\n border-top-color: #71717a;\r\n border-radius: 50%;\r\n animation: spin 1s linear infinite;\r\n }\r\n\r\n @keyframes spin {\r\n to { transform: rotate(360deg); }\r\n }\r\n\r\n .input-area {\r\n border-top: 1px solid #e5e7eb;\r\n background: #fff;\r\n padding: 1rem 1.25rem;\r\n }\r\n\r\n :host([theme=\"dark\"]) .input-area {\r\n border-top-color: #27272a;\r\n background: #18181b;\r\n }\r\n\r\n .input-form {\r\n max-width: 56rem;\r\n margin: 0 auto;\r\n display: flex;\r\n gap: 0.75rem;\r\n align-items: center;\r\n }\r\n\r\n .input-field {\r\n flex: 1;\r\n height: 3rem;\r\n padding: 0 1rem;\r\n border: 1px solid #d1d5db;\r\n border-radius: 1.5rem;\r\n font-size: 0.9375rem;\r\n font-family: inherit;\r\n background: #fff;\r\n color: #374151;\r\n transition: border-color 0.2s, box-shadow 0.2s;\r\n }\r\n\r\n .input-field::placeholder {\r\n color: #9ca3af;\r\n }\r\n\r\n :host([theme=\"dark\"]) .input-field {\r\n border-color: #3f3f46;\r\n background: #18181b;\r\n color: #fafafa;\r\n }\r\n\r\n .input-field:focus {\r\n outline: none;\r\n border-color: var(--primary-color, #3681D3);\r\n box-shadow: 0 0 0 3px rgba(65, 105, 225, 0.1);\r\n }\r\n\r\n .input-field:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n .send-button {\r\n width: 3rem;\r\n height: 3rem;\r\n border-radius: 9999px;\r\n border: none;\r\n background: var(--primary-color, #3681D3);\r\n color: #fff;\r\n cursor: pointer;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n transition: background 0.2s, transform 0.1s;\r\n flex-shrink: 0;\r\n }\r\n\r\n .send-button:hover:not(:disabled) {\r\n background: var(--primary-color-hover, #3457C7);\r\n transform: scale(1.05);\r\n }\r\n\r\n .send-button:active:not(:disabled) {\r\n transform: scale(0.95);\r\n }\r\n\r\n .send-button:disabled {\r\n opacity: 0.5;\r\n cursor: not-allowed;\r\n }\r\n\r\n .send-icon {\r\n width: 1.25rem;\r\n height: 1.25rem;\r\n }\r\n\r\n .version-tag {\r\n text-align: center;\r\n padding: 0.5rem;\r\n font-size: 0.75rem;\r\n color: #9ca3af;\r\n border-top: 1px solid #e5e7eb;\r\n }\r\n\r\n :host([theme=\"dark\"]) .version-tag {\r\n color: #6b7280;\r\n border-top-color: #27272a;\r\n }\r\n `;\r\n\r\n declare apiUrl: string;\r\n declare sessionId: string;\r\n declare chatTitle: string;\r\n declare theme: 'light' | 'dark';\r\n declare mode: 'fullscreen' | 'widget';\r\n declare initialMessages: Message[];\r\n declare botAvatarUrl: string;\r\n declare widgetIconUrl: string;\r\n declare backgroundImageUrl: string;\r\n declare widgetWidth: string;\r\n declare widgetHeight: string;\r\n declare primaryColor: string;\r\n declare primaryColorHover: string;\r\n declare userMessageBg: string;\r\n declare botMessageBg: string;\r\n declare welcomeMessage: string;\r\n declare welcomeSubtitle: string;\r\n declare initialQuestionsUrl: string;\r\n\r\n @state()\r\n private declare messages: Message[];\r\n\r\n @state()\r\n private declare input: string;\r\n\r\n @state()\r\n private declare isLoading: boolean;\r\n\r\n @state()\r\n private declare isOpen: boolean;\r\n\r\n\r\n static override properties = {\r\n apiUrl: { type: String, attribute: 'api-url' },\r\n sessionId: { type: String, attribute: 'session-id' },\r\n chatTitle: { type: String, attribute: 'title' },\r\n theme: { type: String },\r\n mode: { type: String, reflect: true },\r\n initialMessages: { type: Array },\r\n botAvatarUrl: { type: String, attribute: 'bot-avatar-url' },\r\n widgetIconUrl: { type: String, attribute: 'widget-icon-url' },\r\n backgroundImageUrl: { type: String, attribute: 'background-image-url' },\r\n widgetWidth: { type: String, attribute: 'widget-width' },\r\n widgetHeight: { type: String, attribute: 'widget-height' },\r\n primaryColor: { type: String, attribute: 'primary-color' },\r\n primaryColorHover: { type: String, attribute: 'primary-color-hover' },\r\n userMessageBg: { type: String, attribute: 'user-message-bg' },\r\n botMessageBg: { type: String, attribute: 'bot-message-bg' },\r\n welcomeMessage: { type: String, attribute: 'welcome-message' },\r\n welcomeSubtitle: { type: String, attribute: 'welcome-subtitle' },\r\n initialQuestionsUrl: { type: String, attribute: 'initial-questions-url' },\r\n };\r\n\r\n constructor() {\r\n super();\r\n this.apiUrl = '';\r\n this.sessionId = 'default-session';\r\n this.chatTitle = 'My AI Agent';\r\n this.theme = 'light';\r\n this.mode = 'fullscreen';\r\n this.initialMessages = [];\r\n this.botAvatarUrl = '';\r\n this.widgetIconUrl = '';\r\n this.backgroundImageUrl = '';\r\n this.widgetWidth = '380px';\r\n this.widgetHeight = '600px';\r\n this.primaryColor = '#3681D3';\r\n this.primaryColorHover = '#3457C7';\r\n this.userMessageBg = '#D6E4FF';\r\n this.botMessageBg = '#F5F5F5';\r\n this.welcomeMessage = 'How can I help you today?';\r\n this.welcomeSubtitle = '';\r\n this.initialQuestionsUrl = '';\r\n this.messages = [];\r\n this.input = '';\r\n this.isLoading = false;\r\n this.isOpen = false;\r\n }\r\n\r\n private toggleWidget() {\r\n this.isOpen = !this.isOpen;\r\n }\r\n\r\n /**\r\n * Clear all chat messages and reset to welcome message\r\n * @public\r\n */\r\n public clearChat(): void {\r\n this.clearMessagesFromStorage();\r\n\r\n if (this.welcomeMessage) {\r\n const welcomeText = this.welcomeSubtitle\r\n ? `${this.welcomeMessage}\\n\\n${this.welcomeSubtitle}`\r\n : this.welcomeMessage;\r\n\r\n this.messages = [{\r\n id: 'welcome-' + Date.now(),\r\n role: 'assistant',\r\n content: welcomeText,\r\n }];\r\n } else {\r\n this.messages = [];\r\n }\r\n }\r\n\r\n private lightenColor(hex: string, percent: number = 15): string {\r\n // Remove # if present\r\n hex = hex.replace('#', '');\r\n\r\n // Convert to RGB\r\n const r = parseInt(hex.substring(0, 2), 16);\r\n const g = parseInt(hex.substring(2, 4), 16);\r\n const b = parseInt(hex.substring(4, 6), 16);\r\n\r\n // Lighten\r\n const newR = Math.min(255, Math.round(r + (255 - r) * (percent / 100)));\r\n const newG = Math.min(255, Math.round(g + (255 - g) * (percent / 100)));\r\n const newB = Math.min(255, Math.round(b + (255 - b) * (percent / 100)));\r\n\r\n // Convert back to hex\r\n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\r\n }\r\n\r\n private getStorageKey(): string {\r\n return `ai-chat-messages-${this.sessionId}`;\r\n }\r\n\r\n private saveMessagesToStorage(): void {\r\n try {\r\n const storageKey = this.getStorageKey();\r\n sessionStorage.setItem(storageKey, JSON.stringify(this.messages));\r\n // Store the current session ID to track session changes\r\n sessionStorage.setItem('ai-chat-last-session-id', this.sessionId);\r\n } catch (error) {\r\n console.warn('Failed to save messages to sessionStorage:', error);\r\n }\r\n }\r\n\r\n private loadMessagesFromStorage(): Message[] | null {\r\n try {\r\n // Check if session has changed\r\n const lastSessionId = sessionStorage.getItem('ai-chat-last-session-id');\r\n\r\n if (lastSessionId && lastSessionId !== this.sessionId) {\r\n // Session has changed, clear the old session's messages\r\n console.log(`🔄 Session changed from \"${lastSessionId}\" to \"${this.sessionId}\", clearing old messages`);\r\n const oldStorageKey = `ai-chat-messages-${lastSessionId}`;\r\n sessionStorage.removeItem(oldStorageKey);\r\n sessionStorage.setItem('ai-chat-last-session-id', this.sessionId);\r\n return null; // Don't load any messages for new session\r\n }\r\n\r\n const storageKey = this.getStorageKey();\r\n const saved = sessionStorage.getItem(storageKey);\r\n if (saved) {\r\n return JSON.parse(saved) as Message[];\r\n }\r\n } catch (error) {\r\n console.warn('Failed to load messages from sessionStorage:', error);\r\n }\r\n return null;\r\n }\r\n\r\n private clearMessagesFromStorage(): void {\r\n try {\r\n const storageKey = this.getStorageKey();\r\n sessionStorage.removeItem(storageKey);\r\n } catch (error) {\r\n console.warn('Failed to clear messages from sessionStorage:', error);\r\n }\r\n }\r\n\r\n private formatMessageContent(content: string): string {\r\n // Escape HTML to prevent XSS\r\n const escapeHtml = (text: string) => {\r\n const div = document.createElement('div');\r\n div.textContent = text;\r\n return div.innerHTML;\r\n };\r\n\r\n // Add line break before numbered lists that come after any text (not already on new line)\r\n let processedContent = content.replace(/([^\\n])\\s*(\\d+\\.\\s+)/g, '$1\\n$2');\r\n\r\n // First, split inline numbered lists (1. 2. 3. pattern)\r\n processedContent = processedContent.replace(/(\\d+\\.\\s+[^0-9]+?)(?=\\s+\\d+\\.\\s+|\\s*$)/g, '$1\\n');\r\n\r\n // Split inline bullet lists (- pattern)\r\n processedContent = processedContent.replace(/(-\\s+[^-]+?)(?=\\s+-\\s+|\\s*$)/g, '$1\\n');\r\n\r\n // Split content by lines\r\n const lines = processedContent.split('\\n');\r\n let formattedContent = '';\r\n let inList = false;\r\n let listType: 'ul' | 'ol' | null = null;\r\n let orderedListCounter = 1; // Track the current numbered list counter\r\n\r\n // Helper function to check if next non-empty line is a list item\r\n const getNextListType = (startIndex: number): 'ul' | 'ol' | null => {\r\n for (let j = startIndex + 1; j < lines.length; j++) {\r\n const nextLine = lines[j].trim();\r\n if (nextLine === '') continue; // Skip blank lines\r\n if (nextLine.match(/^[-*•]\\s+/)) return 'ul';\r\n if (nextLine.match(/^\\d+\\.\\s+/)) return 'ol';\r\n return null; // Found non-list content\r\n }\r\n return null; // End of content\r\n };\r\n\r\n for (let i = 0; i < lines.length; i++) {\r\n const line = lines[i];\r\n const trimmedLine = line.trim();\r\n\r\n // Check for unordered list (-, *, •)\r\n const unorderedMatch = trimmedLine.match(/^[-*•]\\s+(.+)$/);\r\n // Check for ordered list (1., 2., etc.)\r\n const orderedMatch = trimmedLine.match(/^(\\d+)\\.\\s+(.+)$/);\r\n\r\n if (unorderedMatch) {\r\n if (!inList || listType !== 'ul') {\r\n if (inList) formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\r\n formattedContent += '<ul>';\r\n inList = true;\r\n listType = 'ul';\r\n }\r\n formattedContent += `<li>${escapeHtml(unorderedMatch[1])}</li>`;\r\n } else if (orderedMatch) {\r\n const itemNumber = parseInt(orderedMatch[1], 10);\r\n const itemText = orderedMatch[2];\r\n\r\n if (!inList || listType !== 'ol') {\r\n if (inList) formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\r\n // Use the start attribute to continue numbering from where we left off\r\n // or reset to 1 if this is a new sequence starting with 1\r\n if (itemNumber === 1) {\r\n orderedListCounter = 1;\r\n formattedContent += '<ol>';\r\n } else {\r\n formattedContent += `<ol start=\"${orderedListCounter}\">`;\r\n }\r\n inList = true;\r\n listType = 'ol';\r\n }\r\n formattedContent += `<li value=\"${itemNumber}\">${escapeHtml(itemText)}</li>`;\r\n orderedListCounter = itemNumber + 1; // Track next number\r\n } else {\r\n // Not a list item\r\n if (trimmedLine === '') {\r\n // Blank line - check if next line continues the same list type\r\n const nextListType = getNextListType(i);\r\n if (inList && nextListType === listType) {\r\n // Keep list open and add spacing within the list\r\n formattedContent += '<li style=\"list-style: none; height: 0.5em;\"></li>';\r\n } else {\r\n // Close list if we're in one\r\n if (inList) {\r\n formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\r\n inList = false;\r\n listType = null;\r\n }\r\n formattedContent += '<br>';\r\n }\r\n } else {\r\n // Non-blank, non-list content\r\n if (inList) {\r\n formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\r\n inList = false;\r\n listType = null;\r\n }\r\n formattedContent += escapeHtml(line) + '\\n';\r\n }\r\n }\r\n }\r\n\r\n // Close any open list\r\n if (inList) {\r\n formattedContent += listType === 'ol' ? '</ol>' : '</ul>';\r\n }\r\n\r\n return formattedContent;\r\n }\r\n\r\n async connectedCallback() {\r\n super.connectedCallback();\r\n\r\n // Try to load messages from sessionStorage first\r\n const savedMessages = this.loadMessagesFromStorage();\r\n\r\n if (this.initialMessages && this.initialMessages.length > 0) {\r\n this.messages = [...this.initialMessages];\r\n } else if (savedMessages && savedMessages.length > 0) {\r\n // Restore saved messages from sessionStorage\r\n this.messages = savedMessages;\r\n } else {\r\n // Fetch initial suggested questions if URL is provided\r\n let suggestedQuestions: string[] | undefined = undefined;\r\n\r\n if (this.initialQuestionsUrl) {\r\n try {\r\n const response = await fetch(this.initialQuestionsUrl);\r\n if (response.ok) {\r\n const data = await response.json();\r\n console.log('📥 Fetched initial questions:', data);\r\n\r\n // Support various response formats\r\n let questionsArray = data.questions || data.suggested_questions || data;\r\n\r\n // If array contains objects with question_text property, extract them\r\n if (Array.isArray(questionsArray) && questionsArray.length > 0) {\r\n if (typeof questionsArray[0] === 'object' && questionsArray[0].question_text) {\r\n suggestedQuestions = questionsArray.map((q: any) => q.question_text);\r\n } else if (typeof questionsArray[0] === 'string') {\r\n suggestedQuestions = questionsArray;\r\n }\r\n }\r\n\r\n console.log('✅ Processed suggested questions:', suggestedQuestions);\r\n }\r\n } catch (error) {\r\n console.warn('Failed to fetch initial questions:', error);\r\n }\r\n }\r\n\r\n if (this.welcomeMessage) {\r\n // Add welcome message as initial assistant message\r\n const welcomeText = this.welcomeSubtitle\r\n ? `${this.welcomeMessage}\\n\\n${this.welcomeSubtitle}`\r\n : this.welcomeMessage;\r\n\r\n this.messages = [{\r\n id: 'welcome-' + Date.now(),\r\n role: 'assistant',\r\n content: welcomeText,\r\n suggestedQuestions: suggestedQuestions,\r\n }];\r\n }\r\n }\r\n }\r\n\r\n updated(changedProperties: PropertyValues) {\r\n super.updated(changedProperties);\r\n if (changedProperties.has('messages')) {\r\n this.scrollToBottom();\r\n // Save messages to sessionStorage whenever they change\r\n this.saveMessagesToStorage();\r\n }\r\n }\r\n\r\n private scrollToBottom() {\r\n // Use setTimeout to ensure Lit has finished rendering\r\n setTimeout(() => {\r\n // Find the last user message and scroll to it\r\n const userMessages = this.shadowRoot?.querySelectorAll('.message.user');\r\n if (userMessages && userMessages.length > 0) {\r\n const lastUserMessage = userMessages[userMessages.length - 1] as HTMLElement;\r\n lastUserMessage.scrollIntoView({ behavior: 'smooth', block: 'start' });\r\n }\r\n }, 100);\r\n }\r\n\r\n private handleInput(e: Event) {\r\n this.input = (e.target as HTMLInputElement).value;\r\n }\r\n\r\n private handleFAQClick(question: string) {\r\n if (this.isLoading) return;\r\n\r\n // Set the input and trigger submit\r\n this.input = question;\r\n\r\n // Create a synthetic submit event\r\n const submitEvent = new Event('submit', { cancelable: true });\r\n this.handleSubmit(submitEvent);\r\n }\r\n\r\n private async handleSubmit(e: Event) {\r\n e.preventDefault();\r\n\r\n if (!this.input.trim() || this.isLoading || !this.apiUrl) return;\r\n\r\n const userMessage: Message = {\r\n id: Date.now().toString(),\r\n role: 'user',\r\n content: this.input.trim(),\r\n };\r\n\r\n this.messages = [...this.messages, userMessage];\r\n const questionText = this.input.trim();\r\n this.input = '';\r\n this.isLoading = true;\r\n\r\n // Dispatch message-sent event\r\n this.dispatchEvent(new CustomEvent('message-sent', {\r\n detail: userMessage,\r\n bubbles: true,\r\n composed: true,\r\n }));\r\n\r\n try {\r\n const response = await fetch(`${this.apiUrl}/ask`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({\r\n session_id: this.sessionId,\r\n question: questionText,\r\n }),\r\n });\r\n\r\n if (!response.ok) {\r\n const errorText = await response.text();\r\n throw new Error(`Backend error: ${response.status} ${errorText}`);\r\n }\r\n\r\n const data = await response.json();\r\n console.log('🔍 Raw API response:', data);\r\n\r\n // Extract the response text and suggested questions\r\n let responseText = 'No response from agent';\r\n let faqs: FAQ[] | undefined = undefined;\r\n let suggestedQuestions: string[] | undefined = undefined;\r\n\r\n if (data && typeof data === 'object' && data.response && typeof data.response === 'string') {\r\n console.log('📝 data.response type:', typeof data.response);\r\n console.log('📝 data.response preview:', data.response.substring(0, 100));\r\n\r\n // Check if data.response contains stringified JSON\r\n const trimmedResponse = data.response.trim();\r\n if (trimmedResponse.startsWith('{') || trimmedResponse.startsWith('[')) {\r\n console.log('🔄 Detected stringified JSON, parsing...');\r\n\r\n try {\r\n // First attempt: standard JSON.parse\r\n const innerData = JSON.parse(data.response);\r\n console.log('✅ Parsed inner data with JSON.parse');\r\n\r\n if (innerData && innerData.response && typeof innerData.response === 'string') {\r\n responseText = innerData.response;\r\n faqs = innerData.faq_used || innerData.faqs_used || undefined;\r\n suggestedQuestions = innerData.suggested_follow_ups || innerData.suggested_questions || undefined;\r\n console.log('✅ Extracted text length:', responseText.length);\r\n console.log('✅ Extracted FAQs count:', faqs?.length || 0);\r\n console.log('✅ Extracted suggested questions count:', suggestedQuestions?.length || 0);\r\n } else {\r\n responseText = data.response;\r\n faqs = data.faq_used || data.faqs_used || undefined;\r\n suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || undefined;\r\n }\r\n } catch (parseError) {\r\n console.warn('⚠️ JSON.parse failed, using regex extraction...', parseError);\r\n\r\n // Backend has malformed JSON - extract response text\r\n const responsePattern = /\"response\"\\s*:\\s*\"([^\"]*(?:\\\\.[^\"]*)*)\"/s;\r\n const responseMatch = data.response.match(responsePattern);\r\n\r\n if (responseMatch) {\r\n responseText = responseMatch[1]\r\n .replace(/\\\\n/g, '\\n')\r\n .replace(/\\\\t/g, '\\t')\r\n .replace(/\\\\r/g, '\\r')\r\n .replace(/\\\\\"/g, '\"')\r\n .replace(/\\\\\\\\/g, '\\\\');\r\n console.log('✅ Extracted response text, length:', responseText.length);\r\n } else {\r\n console.error('❌ Could not extract response');\r\n responseText = 'Error: Could not parse response';\r\n }\r\n\r\n // Extract FAQs array (support both faq_used and faqs_used)\r\n const faqsPattern = /\"(?:faq_used|faqs_used)\"\\s*:\\s*(\\[[^\\]]*\\])/s;\r\n const faqsMatch = data.response.match(faqsPattern);\r\n\r\n if (faqsMatch) {\r\n try {\r\n faqs = JSON.parse(faqsMatch[1]);\r\n console.log('✅ Extracted FAQs, count:', faqs?.length || 0);\r\n } catch {\r\n console.log('⚠️ Could not parse FAQs, trying multiline...');\r\n // FAQs might span multiple lines\r\n const faqsMultiPattern = /\"(?:faq_used|faqs_used)\"\\s*:\\s*(\\[[\\s\\S]*?\\n\\s*\\])/;\r\n const faqsMultiMatch = data.response.match(faqsMultiPattern);\r\n if (faqsMultiMatch) {\r\n try {\r\n faqs = JSON.parse(faqsMultiMatch[1]);\r\n console.log('✅ Extracted multi-line FAQs, count:', faqs?.length || 0);\r\n } catch {\r\n faqs = undefined;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Extract suggested questions array\r\n const suggestedPattern = /\"(?:suggested_follow_ups|suggested_questions)\"\\s*:\\s*(\\[[^\\]]*\\])/s;\r\n const suggestedMatch = data.response.match(suggestedPattern);\r\n\r\n if (suggestedMatch) {\r\n try {\r\n suggestedQuestions = JSON.parse(suggestedMatch[1]);\r\n console.log('✅ Extracted suggested questions, count:', suggestedQuestions?.length || 0);\r\n } catch {\r\n console.log('⚠️ Could not parse suggested questions, trying multiline...');\r\n const suggestedMultiPattern = /\"(?:suggested_follow_ups|suggested_questions)\"\\s*:\\s*(\\[[\\s\\S]*?\\n\\s*\\])/;\r\n const suggestedMultiMatch = data.response.match(suggestedMultiPattern);\r\n if (suggestedMultiMatch) {\r\n try {\r\n suggestedQuestions = JSON.parse(suggestedMultiMatch[1]);\r\n console.log('✅ Extracted multi-line suggested questions, count:', suggestedQuestions?.length || 0);\r\n } catch {\r\n suggestedQuestions = undefined;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n } else {\r\n // Not JSON, direct text response\r\n console.log('📄 Direct text response (not JSON)');\r\n responseText = data.response;\r\n faqs = data.faq_used || data.faqs_used || undefined;\r\n suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || undefined;\r\n }\r\n } else if (typeof data === 'string') {\r\n console.log('📄 Response is a plain string');\r\n responseText = data;\r\n } else if (data && typeof data === 'object') {\r\n // Fallback for other formats\r\n console.warn('⚠️ Unexpected format, using fallback');\r\n responseText = data.message || data.answer || 'Error: Unexpected response format';\r\n faqs = data.faq_used || data.faqs_used || undefined;\r\n suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || undefined;\r\n }\r\n\r\n console.log('🎯 Final responseText length:', responseText.length);\r\n console.log('🎯 Final responseText preview:', responseText.substring(0, 100));\r\n console.log('🎯 Final FAQs:', faqs);\r\n console.log('🎯 Final suggested questions:', suggestedQuestions);\r\n\r\n const assistantMessage: Message = {\r\n id: (Date.now() + 1).toString(),\r\n role: 'assistant',\r\n content: responseText,\r\n faqs: faqs,\r\n suggestedQuestions: suggestedQuestions,\r\n };\r\n\r\n this.messages = [...this.messages, assistantMessage];\r\n\r\n // Dispatch response-received event\r\n this.dispatchEvent(new CustomEvent('response-received', {\r\n detail: assistantMessage,\r\n bubbles: true,\r\n composed: true,\r\n }));\r\n } catch (err) {\r\n console.error('Backend connection failed:', err);\r\n\r\n const errorMessage: Message = {\r\n id: (Date.now() + 1).toString(),\r\n role: 'assistant',\r\n content: `Error: ${err instanceof Error ? err.message : 'Unknown error'}\\n\\nPlease check your API endpoint configuration.`,\r\n };\r\n\r\n this.messages = [...this.messages, errorMessage];\r\n\r\n // Dispatch error event\r\n this.dispatchEvent(new CustomEvent('error', {\r\n detail: err,\r\n bubbles: true,\r\n composed: true,\r\n }));\r\n } finally {\r\n this.isLoading = false;\r\n }\r\n }\r\n\r\n private renderChatUI() {\r\n const primaryColorLight = this.lightenColor(this.primaryColor, 15);\r\n\r\n return html`\r\n <!-- Header -->\r\n <div class=\"header\" style=\"--primary-color: ${this.primaryColor}; --primary-color-light: ${primaryColorLight}; --primary-color-hover: ${this.primaryColorHover};\">\r\n <div class=\"header-content\">\r\n <div class=\"header-avatar\">\r\n ${this.botAvatarUrl\r\n ? html`<img src=\"${this.botAvatarUrl}\" alt=\"Bot\" class=\"header-avatar-image\" />`\r\n : html`<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"${this.primaryColor}\" stroke-width=\"2\" style=\"width: 1.5rem; height: 1.5rem;\">\r\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\r\n </svg>`}\r\n </div>\r\n <h1 class=\"title\">${this.chatTitle}</h1>\r\n </div>\r\n </div>\r\n\r\n <!-- Messages Area -->\r\n <div class=\"messages-area\" style=\"--user-message-bg: ${this.userMessageBg}; --bot-message-bg: ${this.botMessageBg}; --primary-color: ${this.primaryColor}; --primary-color-light: ${primaryColorLight}; --primary-color-hover: ${this.primaryColorHover}; ${this.backgroundImageUrl ? `--background-image-url: url('${this.backgroundImageUrl}');` : ''}\">\r\n <div class=\"messages-container\">\r\n ${repeat(this.messages, (msg) => msg.id, (msg) => html`\r\n <div\r\n class=${classMap({\r\n message: true,\r\n user: msg.role === 'user',\r\n assistant: msg.role === 'assistant'\r\n })}\r\n >\r\n <div class=\"avatar\">\r\n ${msg.role === 'user'\r\n ? 'U'\r\n : this.botAvatarUrl\r\n ? html`<img src=\"${this.botAvatarUrl}\" alt=\"AI\" class=\"avatar-image\" />`\r\n : 'AI'}\r\n </div>\r\n <div class=\"message-content\">\r\n <div class=\"message-text\">${unsafeHTML(this.formatMessageContent(msg.content))}</div>\r\n ${msg.role === 'assistant' && msg.faqs && msg.faqs.length > 0 ? html`\r\n <div class=\"faq-section\">\r\n <p class=\"faq-title\">Related FAQs:</p>\r\n <ul class=\"faq-list\">\r\n ${msg.faqs.map(faq => html`\r\n <li class=\"faq-item-static\">\r\n ${faq.Question}\r\n </li>\r\n `)}\r\n </ul>\r\n </div>\r\n ` : ''}\r\n ${msg.role === 'assistant' && msg.suggestedQuestions && msg.suggestedQuestions.length > 0 ? html`\r\n <div class=\"faq-section\">\r\n <p class=\"faq-title\">Suggested Questions:</p>\r\n <ul class=\"faq-list\">\r\n ${msg.suggestedQuestions.map(question => html`\r\n <li class=\"faq-item\" @click=${() => this.handleFAQClick(question)}>\r\n ${question}\r\n </li>\r\n `)}\r\n </ul>\r\n </div>\r\n ` : ''}\r\n </div>\r\n </div>\r\n `)}\r\n\r\n ${this.isLoading ? html`\r\n <div class=\"loading\">\r\n <div class=\"avatar\">\r\n ${this.botAvatarUrl\r\n ? html`<img src=\"${this.botAvatarUrl}\" alt=\"AI\" class=\"avatar-image\" />`\r\n : 'AI'}\r\n </div>\r\n <div class=\"message-content\">\r\n <div class=\"spinner\"></div>\r\n </div>\r\n </div>\r\n ` : ''}\r\n </div>\r\n </div>\r\n\r\n <!-- Input Area -->\r\n <div class=\"input-area\" style=\"--primary-color: ${this.primaryColor}; --primary-color-hover: ${this.primaryColorHover};\">\r\n <form class=\"input-form\" @submit=${this.handleSubmit}>\r\n <input\r\n type=\"text\"\r\n class=\"input-field\"\r\n placeholder=\"Taip mesej anda...\"\r\n .value=${this.input}\r\n @input=${this.handleInput}\r\n ?disabled=${this.isLoading}\r\n />\r\n <button\r\n type=\"submit\"\r\n class=\"send-button\"\r\n ?disabled=${this.isLoading || !this.input.trim()}\r\n aria-label=\"Send message\"\r\n >\r\n ${this.isLoading ? html`\r\n <div class=\"spinner\" style=\"border-color: #fff; border-top-color: transparent;\"></div>\r\n ` : html`\r\n <svg class=\"send-icon\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <line x1=\"22\" y1=\"2\" x2=\"11\" y2=\"13\"></line>\r\n <polygon points=\"22 2 15 22 11 13 2 9 22 2\"></polygon>\r\n </svg>\r\n `}\r\n </button>\r\n </form>\r\n </div>\r\n\r\n <!-- Version -->\r\n <div class=\"version-tag\">v${VERSION}</div>\r\n `;\r\n }\r\n\r\n render() {\r\n const primaryColorLight = this.lightenColor(this.primaryColor, 15);\r\n\r\n if (this.mode === 'widget') {\r\n return html`\r\n <div class=\"widget-container\">\r\n <!-- Chat Window -->\r\n <div\r\n class=${classMap({ 'widget-window': true, 'open': this.isOpen })}\r\n style=\"--widget-width: ${this.widgetWidth}; --widget-height: ${this.widgetHeight};\"\r\n >\r\n ${this.renderChatUI()}\r\n </div>\r\n\r\n <!-- Toggle Button -->\r\n <button\r\n class=${classMap({\r\n 'widget-button': true,\r\n 'widget-button-no-bg': !this.isOpen && !!this.widgetIconUrl\r\n })}\r\n style=\"--primary-color: ${this.primaryColor}; --primary-color-light: ${primaryColorLight};\"\r\n @click=${this.toggleWidget}\r\n aria-label=${this.isOpen ? 'Close chat' : 'Open chat'}\r\n >\r\n ${this.isOpen ? html`\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\r\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\r\n </svg>\r\n ` : this.widgetIconUrl ? html`\r\n <img src=\"${this.widgetIconUrl}\" alt=\"Chat\" class=\"widget-button-icon\" />\r\n ` : html`\r\n <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\r\n <path d=\"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\"></path>\r\n </svg>\r\n `}\r\n </button>\r\n </div>\r\n `;\r\n }\r\n\r\n // Fullscreen mode\r\n return this.renderChatUI();\r\n }\r\n}\r\n\r\ndeclare global {\r\n interface HTMLElementTagNameMap {\r\n 'ai-chat': AIChat;\r\n }\r\n}\r\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -14,7 +14,7 @@ var __decorateClass = (decorators, target, key, kind) => {
|
|
|
14
14
|
if (kind && result) __defProp(target, key, result);
|
|
15
15
|
return result;
|
|
16
16
|
};
|
|
17
|
-
var VERSION = "0.2.
|
|
17
|
+
var VERSION = "0.2.11";
|
|
18
18
|
var AIChat = class extends LitElement {
|
|
19
19
|
constructor() {
|
|
20
20
|
super();
|
|
@@ -35,6 +35,7 @@ var AIChat = class extends LitElement {
|
|
|
35
35
|
this.botMessageBg = "#F5F5F5";
|
|
36
36
|
this.welcomeMessage = "How can I help you today?";
|
|
37
37
|
this.welcomeSubtitle = "";
|
|
38
|
+
this.initialQuestionsUrl = "";
|
|
38
39
|
this.messages = [];
|
|
39
40
|
this.input = "";
|
|
40
41
|
this.isLoading = false;
|
|
@@ -78,29 +79,38 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
78
79
|
saveMessagesToStorage() {
|
|
79
80
|
try {
|
|
80
81
|
const storageKey = this.getStorageKey();
|
|
81
|
-
|
|
82
|
+
sessionStorage.setItem(storageKey, JSON.stringify(this.messages));
|
|
83
|
+
sessionStorage.setItem("ai-chat-last-session-id", this.sessionId);
|
|
82
84
|
} catch (error) {
|
|
83
|
-
console.warn("Failed to save messages to
|
|
85
|
+
console.warn("Failed to save messages to sessionStorage:", error);
|
|
84
86
|
}
|
|
85
87
|
}
|
|
86
88
|
loadMessagesFromStorage() {
|
|
87
89
|
try {
|
|
90
|
+
const lastSessionId = sessionStorage.getItem("ai-chat-last-session-id");
|
|
91
|
+
if (lastSessionId && lastSessionId !== this.sessionId) {
|
|
92
|
+
console.log(`\u{1F504} Session changed from "${lastSessionId}" to "${this.sessionId}", clearing old messages`);
|
|
93
|
+
const oldStorageKey = `ai-chat-messages-${lastSessionId}`;
|
|
94
|
+
sessionStorage.removeItem(oldStorageKey);
|
|
95
|
+
sessionStorage.setItem("ai-chat-last-session-id", this.sessionId);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
88
98
|
const storageKey = this.getStorageKey();
|
|
89
|
-
const saved =
|
|
99
|
+
const saved = sessionStorage.getItem(storageKey);
|
|
90
100
|
if (saved) {
|
|
91
101
|
return JSON.parse(saved);
|
|
92
102
|
}
|
|
93
103
|
} catch (error) {
|
|
94
|
-
console.warn("Failed to load messages from
|
|
104
|
+
console.warn("Failed to load messages from sessionStorage:", error);
|
|
95
105
|
}
|
|
96
106
|
return null;
|
|
97
107
|
}
|
|
98
108
|
clearMessagesFromStorage() {
|
|
99
109
|
try {
|
|
100
110
|
const storageKey = this.getStorageKey();
|
|
101
|
-
|
|
111
|
+
sessionStorage.removeItem(storageKey);
|
|
102
112
|
} catch (error) {
|
|
103
|
-
console.warn("Failed to clear messages from
|
|
113
|
+
console.warn("Failed to clear messages from sessionStorage:", error);
|
|
104
114
|
}
|
|
105
115
|
}
|
|
106
116
|
formatMessageContent(content) {
|
|
@@ -109,7 +119,7 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
109
119
|
div.textContent = text;
|
|
110
120
|
return div.innerHTML;
|
|
111
121
|
};
|
|
112
|
-
let processedContent = content.replace(/([
|
|
122
|
+
let processedContent = content.replace(/([^\n])\s*(\d+\.\s+)/g, "$1\n$2");
|
|
113
123
|
processedContent = processedContent.replace(/(\d+\.\s+[^0-9]+?)(?=\s+\d+\.\s+|\s*$)/g, "$1\n");
|
|
114
124
|
processedContent = processedContent.replace(/(-\s+[^-]+?)(?=\s+-\s+|\s*$)/g, "$1\n");
|
|
115
125
|
const lines = processedContent.split("\n");
|
|
@@ -184,22 +194,46 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
184
194
|
}
|
|
185
195
|
return formattedContent;
|
|
186
196
|
}
|
|
187
|
-
connectedCallback() {
|
|
197
|
+
async connectedCallback() {
|
|
188
198
|
super.connectedCallback();
|
|
189
199
|
const savedMessages = this.loadMessagesFromStorage();
|
|
190
200
|
if (this.initialMessages && this.initialMessages.length > 0) {
|
|
191
201
|
this.messages = [...this.initialMessages];
|
|
192
202
|
} else if (savedMessages && savedMessages.length > 0) {
|
|
193
203
|
this.messages = savedMessages;
|
|
194
|
-
} else
|
|
195
|
-
|
|
204
|
+
} else {
|
|
205
|
+
let suggestedQuestions = void 0;
|
|
206
|
+
if (this.initialQuestionsUrl) {
|
|
207
|
+
try {
|
|
208
|
+
const response = await fetch(this.initialQuestionsUrl);
|
|
209
|
+
if (response.ok) {
|
|
210
|
+
const data = await response.json();
|
|
211
|
+
console.log("\u{1F4E5} Fetched initial questions:", data);
|
|
212
|
+
let questionsArray = data.questions || data.suggested_questions || data;
|
|
213
|
+
if (Array.isArray(questionsArray) && questionsArray.length > 0) {
|
|
214
|
+
if (typeof questionsArray[0] === "object" && questionsArray[0].question_text) {
|
|
215
|
+
suggestedQuestions = questionsArray.map((q) => q.question_text);
|
|
216
|
+
} else if (typeof questionsArray[0] === "string") {
|
|
217
|
+
suggestedQuestions = questionsArray;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
console.log("\u2705 Processed suggested questions:", suggestedQuestions);
|
|
221
|
+
}
|
|
222
|
+
} catch (error) {
|
|
223
|
+
console.warn("Failed to fetch initial questions:", error);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (this.welcomeMessage) {
|
|
227
|
+
const welcomeText = this.welcomeSubtitle ? `${this.welcomeMessage}
|
|
196
228
|
|
|
197
229
|
${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
230
|
+
this.messages = [{
|
|
231
|
+
id: "welcome-" + Date.now(),
|
|
232
|
+
role: "assistant",
|
|
233
|
+
content: welcomeText,
|
|
234
|
+
suggestedQuestions
|
|
235
|
+
}];
|
|
236
|
+
}
|
|
203
237
|
}
|
|
204
238
|
}
|
|
205
239
|
updated(changedProperties) {
|
|
@@ -260,6 +294,7 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
260
294
|
const data = await response.json();
|
|
261
295
|
console.log("\u{1F50D} Raw API response:", data);
|
|
262
296
|
let responseText = "No response from agent";
|
|
297
|
+
let faqs = void 0;
|
|
263
298
|
let suggestedQuestions = void 0;
|
|
264
299
|
if (data && typeof data === "object" && data.response && typeof data.response === "string") {
|
|
265
300
|
console.log("\u{1F4DD} data.response type:", typeof data.response);
|
|
@@ -272,11 +307,14 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
272
307
|
console.log("\u2705 Parsed inner data with JSON.parse");
|
|
273
308
|
if (innerData && innerData.response && typeof innerData.response === "string") {
|
|
274
309
|
responseText = innerData.response;
|
|
310
|
+
faqs = innerData.faq_used || innerData.faqs_used || void 0;
|
|
275
311
|
suggestedQuestions = innerData.suggested_follow_ups || innerData.suggested_questions || void 0;
|
|
276
312
|
console.log("\u2705 Extracted text length:", responseText.length);
|
|
313
|
+
console.log("\u2705 Extracted FAQs count:", faqs?.length || 0);
|
|
277
314
|
console.log("\u2705 Extracted suggested questions count:", suggestedQuestions?.length || 0);
|
|
278
315
|
} else {
|
|
279
316
|
responseText = data.response;
|
|
317
|
+
faqs = data.faq_used || data.faqs_used || void 0;
|
|
280
318
|
suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || void 0;
|
|
281
319
|
}
|
|
282
320
|
} catch (parseError) {
|
|
@@ -290,6 +328,26 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
290
328
|
console.error("\u274C Could not extract response");
|
|
291
329
|
responseText = "Error: Could not parse response";
|
|
292
330
|
}
|
|
331
|
+
const faqsPattern = /"(?:faq_used|faqs_used)"\s*:\s*(\[[^\]]*\])/s;
|
|
332
|
+
const faqsMatch = data.response.match(faqsPattern);
|
|
333
|
+
if (faqsMatch) {
|
|
334
|
+
try {
|
|
335
|
+
faqs = JSON.parse(faqsMatch[1]);
|
|
336
|
+
console.log("\u2705 Extracted FAQs, count:", faqs?.length || 0);
|
|
337
|
+
} catch {
|
|
338
|
+
console.log("\u26A0\uFE0F Could not parse FAQs, trying multiline...");
|
|
339
|
+
const faqsMultiPattern = /"(?:faq_used|faqs_used)"\s*:\s*(\[[\s\S]*?\n\s*\])/;
|
|
340
|
+
const faqsMultiMatch = data.response.match(faqsMultiPattern);
|
|
341
|
+
if (faqsMultiMatch) {
|
|
342
|
+
try {
|
|
343
|
+
faqs = JSON.parse(faqsMultiMatch[1]);
|
|
344
|
+
console.log("\u2705 Extracted multi-line FAQs, count:", faqs?.length || 0);
|
|
345
|
+
} catch {
|
|
346
|
+
faqs = void 0;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
293
351
|
const suggestedPattern = /"(?:suggested_follow_ups|suggested_questions)"\s*:\s*(\[[^\]]*\])/s;
|
|
294
352
|
const suggestedMatch = data.response.match(suggestedPattern);
|
|
295
353
|
if (suggestedMatch) {
|
|
@@ -314,6 +372,7 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
314
372
|
} else {
|
|
315
373
|
console.log("\u{1F4C4} Direct text response (not JSON)");
|
|
316
374
|
responseText = data.response;
|
|
375
|
+
faqs = data.faq_used || data.faqs_used || void 0;
|
|
317
376
|
suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || void 0;
|
|
318
377
|
}
|
|
319
378
|
} else if (typeof data === "string") {
|
|
@@ -322,16 +381,18 @@ ${this.welcomeSubtitle}` : this.welcomeMessage;
|
|
|
322
381
|
} else if (data && typeof data === "object") {
|
|
323
382
|
console.warn("\u26A0\uFE0F Unexpected format, using fallback");
|
|
324
383
|
responseText = data.message || data.answer || "Error: Unexpected response format";
|
|
384
|
+
faqs = data.faq_used || data.faqs_used || void 0;
|
|
325
385
|
suggestedQuestions = data.suggested_follow_ups || data.suggested_questions || void 0;
|
|
326
386
|
}
|
|
327
387
|
console.log("\u{1F3AF} Final responseText length:", responseText.length);
|
|
328
388
|
console.log("\u{1F3AF} Final responseText preview:", responseText.substring(0, 100));
|
|
389
|
+
console.log("\u{1F3AF} Final FAQs:", faqs);
|
|
329
390
|
console.log("\u{1F3AF} Final suggested questions:", suggestedQuestions);
|
|
330
391
|
const assistantMessage = {
|
|
331
392
|
id: (Date.now() + 1).toString(),
|
|
332
393
|
role: "assistant",
|
|
333
394
|
content: responseText,
|
|
334
|
-
|
|
395
|
+
faqs,
|
|
335
396
|
suggestedQuestions
|
|
336
397
|
};
|
|
337
398
|
this.messages = [...this.messages, assistantMessage];
|
|
@@ -390,19 +451,18 @@ Please check your API endpoint configuration.`
|
|
|
390
451
|
</div>
|
|
391
452
|
<div class="message-content">
|
|
392
453
|
<div class="message-text">${unsafeHTML(this.formatMessageContent(msg.content))}</div>
|
|
393
|
-
|
|
394
|
-
<!-- ${msg.role === "assistant" && msg.faqs && msg.faqs.length > 0 ? html`
|
|
454
|
+
${msg.role === "assistant" && msg.faqs && msg.faqs.length > 0 ? html`
|
|
395
455
|
<div class="faq-section">
|
|
396
456
|
<p class="faq-title">Related FAQs:</p>
|
|
397
457
|
<ul class="faq-list">
|
|
398
458
|
${msg.faqs.map((faq) => html`
|
|
399
459
|
<li class="faq-item-static">
|
|
400
|
-
${faq.
|
|
460
|
+
${faq.Question}
|
|
401
461
|
</li>
|
|
402
462
|
`)}
|
|
403
463
|
</ul>
|
|
404
464
|
</div>
|
|
405
|
-
` : ""}
|
|
465
|
+
` : ""}
|
|
406
466
|
${msg.role === "assistant" && msg.suggestedQuestions && msg.suggestedQuestions.length > 0 ? html`
|
|
407
467
|
<div class="faq-section">
|
|
408
468
|
<p class="faq-title">Suggested Questions:</p>
|
|
@@ -1270,7 +1330,8 @@ AIChat.properties = {
|
|
|
1270
1330
|
userMessageBg: { type: String, attribute: "user-message-bg" },
|
|
1271
1331
|
botMessageBg: { type: String, attribute: "bot-message-bg" },
|
|
1272
1332
|
welcomeMessage: { type: String, attribute: "welcome-message" },
|
|
1273
|
-
welcomeSubtitle: { type: String, attribute: "welcome-subtitle" }
|
|
1333
|
+
welcomeSubtitle: { type: String, attribute: "welcome-subtitle" },
|
|
1334
|
+
initialQuestionsUrl: { type: String, attribute: "initial-questions-url" }
|
|
1274
1335
|
};
|
|
1275
1336
|
__decorateClass([
|
|
1276
1337
|
state()
|