@product7/feedback-sdk 1.4.7 → 1.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feedback-sdk.min.js","sources":["../src/api/mock-data/index.js","../src/api/utils/helpers.js","../src/api/services/ChangelogService.js","../src/api/services/FeedbackService.js","../src/api/services/HelpService.js","../src/api/services/MessengerService.js","../src/utils/errors.js","../src/api/services/SurveyService.js","../src/core/BaseAPIService.js","../src/core/APIService.js","../src/core/EventBus.js","../src/utils/helpers.js","../src/widgets/BaseWidget.js","../src/widgets/ButtonWidget.js","../src/widgets/ChangelogWidget.js","../src/widgets/InlineWidget.js","../src/core/WebSocketService.js","../src/widgets/messenger/MessengerState.js","../src/widgets/messenger/components/MessengerLauncher.js","../src/widgets/messenger/components/NavigationTabs.js","../src/widgets/messenger/components/MessengerPanel.js","../src/widgets/messenger/views/ChangelogView.js","../src/widgets/messenger/views/ChatView.js","../src/widgets/messenger/views/ConversationsView.js","../src/widgets/messenger/views/HelpView.js","../src/widgets/messenger/views/HomeView.js","../src/widgets/messenger/views/PreChatFormView.js","../src/widgets/MessengerWidget.js","../src/styles/messengerCustomStyles.js","../src/widgets/SurveyWidget.js","../src/widgets/TabWidget.js","../src/widgets/WidgetFactory.js","../src/core/FeedbackSDK.js","../src/index.js","../src/styles/styles.js"],"sourcesContent":["export const MOCK_CHANGELOGS = [\n\t{\n\t\tid: 'changelog_1',\n\t\ttitle:\n\t\t\t'Feature prioritization, multiple roadmaps, and feature request analytics.',\n\t\texcerpt:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tdescription:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=',\n\t\tslug: 'feature-prioritization-roadmaps-analytics',\n\t\tpublished_at: '2025-03-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'New Feature', color: '#10B981' },\n\t\t\t{ name: 'Analytics', color: '#6366F1' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_2',\n\t\ttitle: 'Dark mode support and UI improvements',\n\t\texcerpt:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tdescription:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+',\n\t\tslug: 'dark-mode-ui-improvements',\n\t\tpublished_at: '2025-03-01T10:00:00Z',\n\t\tlabels: [{ name: 'Enhancement', color: '#8B5CF6' }],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_3',\n\t\ttitle: 'Performance improvements and bug fixes',\n\t\texcerpt:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tdescription:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tslug: 'performance-improvements-bug-fixes',\n\t\tpublished_at: '2025-02-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'Bug Fix', color: '#EF4444' },\n\t\t\t{ name: 'Performance', color: '#F59E0B' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n];\n\nexport const MOCK_CONVERSATIONS = [\n\t{\n\t\tid: 'conv_1',\n\t\tsubject: 'Question about pricing',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 1,\n\t\tassigned_user: {\n\t\t\tid: 'user_1',\n\t\t\tname: 'Sarah',\n\t\t\tavatar: null,\n\t\t},\n\t},\n\t{\n\t\tid: 'conv_2',\n\t\tsubject: 'Feature request',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(\n\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000\n\t\t).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 0,\n\t\tassigned_user: {\n\t\t\tid: 'user_2',\n\t\t\tname: 'Tom',\n\t\t\tavatar: null,\n\t\t},\n\t},\n];\n\nexport const MOCK_MESSAGES = {\n\tconv_1: [\n\t\t{\n\t\t\tid: 'msg_1',\n\t\t\tcontent: \"Hi there! 👋 I'm Sarah. How can I help you today?\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Sarah',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 50 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_2',\n\t\t\tcontent: 'Hi! I have a question about your enterprise pricing.',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n\tconv_2: [\n\t\t{\n\t\t\tid: 'msg_3',\n\t\t\tcontent: \"Hello! I'm Tom from the product team.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_4',\n\t\t\tcontent: 'I would love to see a dark mode feature!',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(\n\t\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000 - 30 * 60 * 1000\n\t\t\t).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_5',\n\t\t\tcontent:\n\t\t\t\t\"Great suggestion! That feature will be available next week. I'll let you know when it's ready.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n};\n\nexport const MOCK_HELP_COLLECTIONS = [\n\t{\n\t\tid: 'collection_1',\n\t\ttitle: 'Product Overview',\n\t\tdescription: 'See how your AI-first customer service solution works.',\n\t\tarticleCount: 24,\n\t\ticon: 'ph-book-open',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_2',\n\t\ttitle: 'Getting Started',\n\t\tdescription: 'Everything you need to know to get started with Product7.',\n\t\tarticleCount: 30,\n\t\ticon: 'ph-rocket',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_3',\n\t\ttitle: 'AI Agent',\n\t\tdescription:\n\t\t\t'Resolving customer questions instantly and accurately—from live chat to email.',\n\t\tarticleCount: 82,\n\t\ticon: 'ph-robot',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_4',\n\t\ttitle: 'Channels',\n\t\tdescription:\n\t\t\t'Enabling the channels you use to communicate with customers, all from the Inbox.',\n\t\tarticleCount: 45,\n\t\ticon: 'ph-chat-circle',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_5',\n\t\ttitle: 'Billing & Payments',\n\t\tdescription: 'Manage your subscription, invoices, and payment methods.',\n\t\tarticleCount: 12,\n\t\ticon: 'ph-credit-card',\n\t\turl: '#',\n\t},\n];\n\nexport const MOCK_SURVEYS = [\n\t{\n\t\tid: 'mock_nps_survey',\n\t\ttype: 'nps',\n\t\ttitle: 'How likely are you to recommend us?',\n\t\tdescription: 'Your feedback helps us improve',\n\t\tlow_label: 'Not likely',\n\t\thigh_label: 'Very likely',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\ttype: 'csat',\n\t\ttitle: 'How satisfied are you?',\n\t\tdescription: 'Rate your experience with our product',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\ttype: 'ces',\n\t\ttitle: 'How easy was it?',\n\t\tdescription: 'Rate the ease of completing your task',\n\t\tlow_label: 'Very difficult',\n\t\thigh_label: 'Very easy',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n];\n","export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function getDeviceInfo() {\n\tif (typeof navigator === 'undefined') {\n\t\treturn { device: null, browser: null, os: null };\n\t}\n\n\tconst ua = navigator.userAgent;\n\n\tlet device = 'desktop';\n\tif (/Mobi|Android/i.test(ua)) {\n\t\tdevice = /Tablet|iPad/i.test(ua) ? 'tablet' : 'mobile';\n\t}\n\n\tlet browser = 'unknown';\n\tif (ua.includes('Firefox')) browser = 'firefox';\n\telse if (ua.includes('Edg')) browser = 'edge';\n\telse if (ua.includes('Chrome')) browser = 'chrome';\n\telse if (ua.includes('Safari')) browser = 'safari';\n\telse if (ua.includes('Opera') || ua.includes('OPR')) browser = 'opera';\n\n\tlet os = 'unknown';\n\tif (ua.includes('Windows')) os = 'windows';\n\telse if (ua.includes('Mac')) os = 'macos';\n\telse if (ua.includes('Linux')) os = 'linux';\n\telse if (ua.includes('Android')) os = 'android';\n\telse if (ua.includes('iPhone') || ua.includes('iPad')) os = 'ios';\n\n\treturn { device, browser, os };\n}\n","import { MOCK_CHANGELOGS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class ChangelogService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { success: true, data: MOCK_CHANGELOGS };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/changelogs',\n\t\t\t\toptions\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n}\n","import { delay } from '../utils/helpers.js';\n\nexport class FeedbackService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync submitFeedback(feedbackData) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(500);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_post_' + Date.now(),\n\t\t\t\t\ttitle: feedbackData.title,\n\t\t\t\t\tcontent: feedbackData.content,\n\t\t\t\t},\n\t\t\t\tmessage: 'Feedback submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardId,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class MessengerService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getMessengerSettings() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tgreeting_message: 'Hi there! How can we help?',\n\t\t\t\t\tteam_name: 'Support Team',\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_CONVERSATIONS,\n\t\t\t\tmeta: { total: MOCK_CONVERSATIONS.length, page: 1, limit: 20 },\n\t\t\t};\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/messenger/conversations',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversation(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst conv = MOCK_CONVERSATIONS.find((c) => c.id === conversationId);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { ...conv, messages: MOCK_MESSAGES[conversationId] || [] },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}`,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync startConversation(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tcontent: data.content,\n\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t}),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getUnreadCount() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tconst count = MOCK_CONVERSATIONS.reduce(\n\t\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { unread_count: count, unread_conversations: count > 0 ? 1 : 0 },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/unread', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/read`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getMessages(conversationId, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_MESSAGES[conversationId] || [],\n\t\t\t\tmeta: { total: 0, page: 1, limit: 50 },\n\t\t\t};\n\t\t}\n\n\t\tconst params = { ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tcontact_id: 'mock_contact_' + Date.now(),\n\t\t\t\t\temail: data.email,\n\t\t\t\t\tname: data.name || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/identify', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\temail: data.email,\n\t\t\t\tname: data.name || '',\n\t\t\t\tphone: data.phone || '',\n\t\t\t\tcompany: data.company || '',\n\t\t\t\tavatar_url: data.avatar_url || '',\n\t\t\t\tmetadata: data.metadata || {},\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/typing`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ is_typing: isTyping }),\n\t\t\t}\n\t\t);\n\t}\n}\n","export class SDKError extends Error {\n\tconstructor(message, cause) {\n\t\tsuper(message);\n\t\tthis.name = 'SDKError';\n\t\tthis.cause = cause;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, SDKError);\n\t\t}\n\t}\n}\n\nexport class APIError extends Error {\n\tconstructor(status, message, response) {\n\t\tsuper(message);\n\t\tthis.name = 'APIError';\n\t\tthis.status = status;\n\t\tthis.response = response;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, APIError);\n\t\t}\n\t}\n\n\tisNetworkError() {\n\t\treturn this.status === 0;\n\t}\n\n\tisClientError() {\n\t\treturn this.status >= 400 && this.status < 500;\n\t}\n\n\tisServerError() {\n\t\treturn this.status >= 500 && this.status < 600;\n\t}\n}\n\nexport class WidgetError extends Error {\n\tconstructor(message, widgetType, widgetId) {\n\t\tsuper(message);\n\t\tthis.name = 'WidgetError';\n\t\tthis.widgetType = widgetType;\n\t\tthis.widgetId = widgetId;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, WidgetError);\n\t\t}\n\t}\n}\n\nexport class ConfigError extends Error {\n\tconstructor(message, configKey) {\n\t\tsuper(message);\n\t\tthis.name = 'ConfigError';\n\t\tthis.configKey = configKey;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ConfigError);\n\t\t}\n\t}\n}\n\nexport class ValidationError extends Error {\n\tconstructor(message, field, value) {\n\t\tsuper(message);\n\t\tthis.name = 'ValidationError';\n\t\tthis.field = field;\n\t\tthis.value = value;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ValidationError);\n\t\t}\n\t}\n}\n\nexport class ErrorHandler {\n\tconstructor(debug = false) {\n\t\tthis.debug = debug;\n\t}\n\n\thandle(error, context = '') {\n\t\tconst errorInfo = {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tcontext,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (error instanceof APIError) {\n\t\t\terrorInfo.status = error.status;\n\t\t\terrorInfo.type = 'api';\n\t\t} else if (error instanceof WidgetError) {\n\t\t\terrorInfo.widgetType = error.widgetType;\n\t\t\terrorInfo.widgetId = error.widgetId;\n\t\t\terrorInfo.type = 'widget';\n\t\t} else if (error instanceof ConfigError) {\n\t\t\terrorInfo.configKey = error.configKey;\n\t\t\terrorInfo.type = 'config';\n\t\t} else if (error instanceof ValidationError) {\n\t\t\terrorInfo.field = error.field;\n\t\t\terrorInfo.value = error.value;\n\t\t\terrorInfo.type = 'validation';\n\t\t} else {\n\t\t\terrorInfo.type = 'unknown';\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.error('[FeedbackSDK Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[FeedbackSDK Error]', error.message);\n\t\t}\n\n\t\treturn errorInfo;\n\t}\n\n\tgetUserMessage(error) {\n\t\tif (error instanceof APIError) {\n\t\t\tif (error.isNetworkError()) {\n\t\t\t\treturn 'Network error. Please check your connection and try again.';\n\t\t\t} else if (error.isClientError()) {\n\t\t\t\treturn 'Invalid request. Please check your input and try again.';\n\t\t\t} else if (error.isServerError()) {\n\t\t\t\treturn 'Server error. Please try again later.';\n\t\t\t}\n\t\t\treturn 'Failed to submit feedback. Please try again.';\n\t\t}\n\n\t\tif (error instanceof ValidationError) {\n\t\t\treturn `Please check your ${error.field}: ${error.message}`;\n\t\t}\n\n\t\tif (error instanceof ConfigError) {\n\t\t\treturn 'Configuration error. Please check your SDK setup.';\n\t\t}\n\n\t\tif (error instanceof WidgetError) {\n\t\t\treturn 'Widget error. Please try refreshing the page.';\n\t\t}\n\n\t\treturn 'An unexpected error occurred. Please try again.';\n\t}\n}\n","import { APIError } from '../../utils/errors.js';\nimport { MOCK_SURVEYS } from '../mock-data';\nimport { delay, getDeviceInfo } from '../utils/helpers.js';\n\nexport class SurveyService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { success: true, data: MOCK_SURVEYS };\n\t\t}\n\n\t\tconst params = {\n\t\t\turl:\n\t\t\t\tcontext.url ||\n\t\t\t\t(typeof window !== 'undefined' ? window.location.href : ''),\n\t\t\t...getDeviceInfo(),\n\t\t\t...(context.userProperties && {\n\t\t\t\tuser_properties: context.userProperties,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/surveys/active',\n\t\t\t\tparams\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_response_' + Date.now(),\n\t\t\t\t\tsurvey_id: surveyId,\n\t\t\t\t\t...responseData,\n\t\t\t\t},\n\t\t\t\tmessage: 'Survey response submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\trating: responseData.rating,\n\t\t\tfeedback: responseData.feedback || '',\n\t\t\tanswers: responseData.answers || {},\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.userContext = config.userContext || null;\n\t\tthis.mock = config.mock || false;\n\t\tthis.env = config.env || 'production';\n\t\tthis.baseURL = this._getBaseURL(config);\n\n\t\tthis._loadStoredSession();\n\t}\n\n\t_getBaseURL(config) {\n\t\tif (config.apiUrl) return config.apiUrl;\n\n\t\tconst ENV_URLS = {\n\t\t\tproduction: {\n\t\t\t\tbase: 'https://api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tstaging: {\n\t\t\t\tbase: 'https://staging.api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.staging.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tlocalstack: {\n\t\t\t\tbase: 'http://localhost:1323/api/v1',\n\t\t\t\twithWorkspace: (ws) => `http://${ws}.localhost:1323/api/v1`,\n\t\t\t},\n\t\t};\n\n\t\tconst envConfig = ENV_URLS[this.env] || ENV_URLS.production;\n\t\treturn this.workspace\n\t\t\t? envConfig.withWorkspace(this.workspace)\n\t\t\t: envConfig.base;\n\t}\n\n\tasync init(userContext = null) {\n\t\tif (userContext) {\n\t\t\tthis.userContext = userContext;\n\t\t}\n\n\t\tif (this.isSessionValid()) {\n\t\t\treturn { sessionToken: this.sessionToken };\n\t\t}\n\n\t\tif (!this.workspace || !this.userContext) {\n\t\t\tthrow new APIError(\n\t\t\t\t400,\n\t\t\t\t`Missing ${!this.workspace ? 'workspace' : 'user context'} for initialization`\n\t\t\t);\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn this._initMockSession();\n\t\t}\n\n\t\treturn this._initRealSession();\n\t}\n\n\tasync _initMockSession() {\n\t\tthis.sessionToken = 'mock_session_' + Date.now();\n\t\tthis.sessionExpiry = new Date(Date.now() + 3600 * 1000);\n\t\tthis._storeSession();\n\t\treturn {\n\t\t\tsessionToken: this.sessionToken,\n\t\t\tconfig: {\n\t\t\t\tprimaryColor: '#21244A',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\ttextColor: '#1F2937',\n\t\t\t\tboardId: 'feature-requests',\n\t\t\t\tsize: 'medium',\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t},\n\t\t\texpiresIn: 3600,\n\t\t};\n\t}\n\n\tasync _initRealSession() {\n\t\tconst payload = {\n\t\t\tworkspace: this.workspace,\n\t\t\tuser: this.userContext,\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this._makeRequest('/widget/init', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\n\t\t\tthis.sessionToken = response.session_token;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + response.expires_in * 1000);\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: response.config || {},\n\t\t\t\texpiresIn: response.expires_in,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new APIError(\n\t\t\t\terror.status || 500,\n\t\t\t\t`Failed to initialize widget: ${error.message}`,\n\t\t\t\terror.response\n\t\t\t);\n\t\t}\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.userContext = userContext;\n\t\tthis._storeData('feedbackSDK_userContext', userContext);\n\t}\n\n\tgetUserContext() {\n\t\treturn this.userContext;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis._removeData('feedbackSDK_session');\n\t\tthis._removeData('feedbackSDK_userContext');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('feedbackSDK_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { MessengerService } from '../api/services/MessengerService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\n\nexport class APIService extends BaseAPIService {\n\tconstructor(config = {}) {\n\t\tsuper(config);\n\n\t\tthis.feedback = new FeedbackService(this);\n\t\tthis.survey = new SurveyService(this);\n\t\tthis.messenger = new MessengerService(this);\n\t\tthis.help = new HelpService(this);\n\t\tthis.changelog = new ChangelogService(this);\n\t}\n\n\tasync submitFeedback(data) {\n\t\treturn this.feedback.submitFeedback(data);\n\t}\n\n\tasync getActiveSurveys(context) {\n\t\treturn this.survey.getActiveSurveys(context);\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\treturn this.survey.submitSurveyResponse(surveyId, responseData);\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\treturn this.survey.dismissSurvey(surveyId);\n\t}\n\n\tasync getMessengerSettings() {\n\t\treturn this.messenger.getMessengerSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log(\n\t\t\t\t'[APIService] startConversation: session invalid, calling init...'\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[APIService] startConversation: init result, token:',\n\t\t\t\t\tthis.sessionToken ? 'set' : 'null'\n\t\t\t\t);\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[APIService] startConversation: init failed:',\n\t\t\t\t\tinitError.message\n\t\t\t\t);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error(\n\t\t\t\t'[APIService] startConversation: no session token after init'\n\t\t\t);\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log(\n\t\t\t'[APIService] startConversation: sending to',\n\t\t\t`${this.baseURL}/widget/messenger/conversations`,\n\t\t\t'mock:',\n\t\t\tthis.mock\n\t\t);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.messenger.identifyContact(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\tasync getChangelogs(options) {\n\t\treturn this.changelog.getChangelogs(options);\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken =\n\t\t\t\tsessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('feedbackSDK_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[FeedbackSDK] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30;\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardId: this.sdk.config.boardId,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true,\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\tif (this.options.suppressAfterSubmission && this._hasRecentlySubmitted()) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\treason: 'recently_submitted',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof container === 'string') {\n\t\t\tcontainer = document.querySelector(container);\n\t\t}\n\n\t\tif (!container) {\n\t\t\tcontainer = document.body;\n\t\t}\n\n\t\tthis.container = container;\n\t\tthis.element = this._render();\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis.mounted = true;\n\t\tthis._attachEvents();\n\t\tthis.onMount();\n\n\t\tif (this.options.autoShow) {\n\t\t\tthis.show();\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('widget:mounted', { widget: this });\n\t\treturn this;\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t\treturn this;\n\t}\n\n\topenPanel() {\n\t\tthis.state.isOpen = true;\n\n\t\tif (this.options.displayMode === 'modal') {\n\t\t\tthis._showLoadingModal();\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._hideLoadingModal();\n\t\t\t\tthis._renderPanel();\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tif (this.panelElement) {\n\t\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t\t}\n\t\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 600);\n\t\t} else {\n\t\t\tthis._renderPanel();\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this.panelElement) {\n\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t}\n\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t_showLoadingModal() {\n\t\tthis.state.isLoading = true;\n\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\tthis.loadingElement = document.createElement('div');\n\t\tthis.loadingElement.className = 'feedback-loading-modal';\n\t\tthis.loadingElement.innerHTML = `\n\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t`;\n\t\tdocument.body.appendChild(this.loadingElement);\n\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.backdropElement.classList.add('show');\n\t\t\tthis.loadingElement.classList.add('show');\n\t\t});\n\t}\n\n\t_hideLoadingModal() {\n\t\tthis.state.isLoading = false;\n\t\tif (this.loadingElement) {\n\t\t\tthis.loadingElement.remove();\n\t\t\tthis.loadingElement = null;\n\t\t}\n\t}\n\n\tclosePanel() {\n\t\tif (this.panelElement) {\n\t\t\tthis.panelElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\t\tthis.panelElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t\tthis._resetForm();\n\t\t}, 300);\n\t}\n\n\tasync submitFeedback() {\n\t\tif (this.state.isSubmitting) return;\n\n\t\tthis._hideError();\n\n\t\ttry {\n\t\t\tthis.state.isSubmitting = true;\n\t\t\tthis._updateSubmitButton();\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: this.state.title || 'Feedback',\n\t\t\t\tcontent: this.state.content,\n\t\t\t\temail: this.state.email,\n\t\t\t\tboard_id: this.options.boardId,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.content.trim()) {\n\t\t\t\tthis._showError('Please enter your feedback message.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst response = await this.apiService.submitFeedback(payload);\n\n\t\t\tthis._trackSubmission();\n\n\t\t\tthis._showSuccessMessage();\n\t\t\tthis.closePanel();\n\n\t\t\tthis.sdk.eventBus.emit('feedback:submitted', {\n\t\t\t\twidget: this,\n\t\t\t\tfeedback: response,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._showError('Failed to submit feedback. Please try again.');\n\t\t\tthis.sdk.eventBus.emit('feedback:error', { widget: this, error });\n\t\t} finally {\n\t\t\tthis.state.isSubmitting = false;\n\t\t\tthis._updateSubmitButton();\n\t\t}\n\t}\n\n\thandleConfigUpdate(newConfig) {\n\t\tthis.options.theme = newConfig.theme;\n\t\tif (this.element) {\n\t\t\tthis._updateTheme();\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.destroyed) return;\n\n\t\tthis.onDestroy();\n\t\tthis.closePanel();\n\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\n\t\tthis.destroyed = true;\n\t\tthis.mounted = false;\n\t\tthis.sdk.eventBus.emit('widget:destroyed', { widget: this });\n\t}\n\n\tonMount() {}\n\tonDestroy() {}\n\n\t_trackSubmission() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst data = {\n\t\t\t\tsubmittedAt: Date.now(),\n\t\t\t\tboardId: this.options.boardId,\n\t\t\t};\n\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(data));\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to track feedback submission:', e);\n\t\t}\n\t}\n\n\t_hasRecentlySubmitted() {\n\t\tconst cooldownMs = this.options.suppressionDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.sdk.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.sdk.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\tconst submittedAt = data.submittedAt;\n\n\t\t\treturn now - submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearSubmissionTracking() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear submission tracking:', e);\n\t\t}\n\t}\n\n\tshouldShow() {\n\t\tif (!this.options.suppressAfterSubmission) return true;\n\t\treturn !this._hasRecentlySubmitted();\n\t}\n\n\t_render() {\n\t\tthrow new Error('_render() must be implemented by concrete widget');\n\t}\n\n\t_attachEvents() {\n\t\t// Override in concrete widgets\n\t}\n\n\t_bindMethods() {\n\t\tthis.openPanel = this.openPanel.bind(this);\n\t\tthis.closePanel = this.closePanel.bind(this);\n\t\tthis.submitFeedback = this.submitFeedback.bind(this);\n\t}\n\n\t_renderPanel() {\n\t\tif (this.panelElement) return;\n\n\t\tif (this.options.showBackdrop && !this.backdropElement) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\t\tthis.backdropElement.addEventListener('click', this.closePanel);\n\t\t}\n\n\t\tconst modeClass =\n\t\t\tthis.options.displayMode === 'modal'\n\t\t\t\t? 'feedback-modal'\n\t\t\t\t: 'feedback-panel';\n\t\tconst sizeClass = `size-${this.options.size}`;\n\t\tthis.panelElement = document.createElement('div');\n\t\tthis.panelElement.className = `${modeClass} ${sizeClass}`;\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--primary-color',\n\t\t\tthis.options.primaryColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--bg-color',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty('--text-color', this.options.textColor);\n\t\tthis.panelElement.innerHTML = this._getPanelHTML();\n\n\t\tdocument.body.appendChild(this.panelElement);\n\t\tthis._attachPanelEvents();\n\n\t\tconst firstInput = this.panelElement.querySelector('input, textarea');\n\t\tif (firstInput) {\n\t\t\tsetTimeout(() => firstInput.focus(), 350);\n\t\t}\n\t}\n\n\t_getPanelHTML() {\n\t\treturn `\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-header\">\n <h3>Send Feedback</h3>\n <button class=\"sdk-close-btn\" type=\"button\" aria-label=\"Close\">×</button>\n </div>\n <div class=\"feedback-panel-body\">\n <form class=\"feedback-form\">\n <div class=\"sdk-form-group\">\n <label class=\"sdk-label\" for=\"feedback-title-${this.id}\">Title (optional)</label>\n <input \n type=\"text\" \n id=\"feedback-title-${this.id}\" \n name=\"title\" \n class=\"sdk-input\"\n placeholder=\"Brief description of your feedback\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"sdk-form-group\">\n <label class=\"sdk-label\" for=\"feedback-content-${this.id}\">Message *</label>\n <textarea \n id=\"feedback-content-${this.id}\" \n name=\"content\" \n class=\"sdk-textarea\"\n placeholder=\"Tell us what you think...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"feedback-error\" role=\"alert\"></div>\n <div class=\"feedback-form-actions\">\n <button type=\"submit\" class=\"sdk-btn-primary sdk-btn-block\">\n ${this.state.isSubmitting ? 'Sending...' : 'Send Feedback'}\n </button>\n </div>\n </form>\n </div>\n </div>\n `;\n\t}\n\n\t_attachPanelEvents() {\n\t\tconst panel = this.panelElement;\n\n\t\tpanel\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', this.closePanel);\n\n\t\tconst form = panel.querySelector('.feedback-form');\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('input[name=\"title\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.title = e.target.value;\n\t\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tconst handleEscape = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closePanel();\n\t\t\t\tdocument.removeEventListener('keydown', handleEscape);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t}\n\n\t_updateSubmitButton() {\n\t\tif (this.panelElement) {\n\t\t\tconst submitBtn = this.panelElement.querySelector('.sdk-btn-primary');\n\t\t\tif (submitBtn) {\n\t\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t\t? 'Sending...'\n\t\t\t\t\t: 'Send Feedback';\n\t\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t\t}\n\t\t}\n\t}\n\n\t_showError(message) {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.textContent = message;\n\t\t\t\terrorElement.classList.add('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_hideError() {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.classList.remove('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'sdk-notification sdk-notification-success';\n\t\tnotification.innerHTML = `\n <div class=\"sdk-notification-content\">\n <div class=\"sdk-notification-icon\">✓</div>\n <span class=\"sdk-notification-text\">Feedback submitted successfully!</span>\n <button class=\"sdk-close-btn\" aria-label=\"Close\">×</button>\n </div>\n `;\n\n\t\tdocument.body.appendChild(notification);\n\n\t\tconst closeBtn = notification.querySelector('.sdk-close-btn');\n\t\tconst closeNotification = () => {\n\t\t\tif (notification.parentNode) {\n\t\t\t\tnotification.style.opacity = '0';\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (notification.parentNode) {\n\t\t\t\t\t\tnotification.parentNode.removeChild(notification);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t};\n\n\t\tcloseBtn.addEventListener('click', closeNotification);\n\n\t\tsetTimeout(closeNotification, 4000);\n\t}\n\n\t_resetForm() {\n\t\tthis.state.title = '';\n\t\tthis.state.content = '';\n\t\tthis.state.email = '';\n\t\tthis.state.errors = {};\n\t}\n\n\t_updateTheme() {\n\t\t// No longer needed - single theme\n\t}\n\n\topenModal() {\n\t\tthis.openPanel();\n\t}\n\n\tcloseModal() {\n\t\tthis.closePanel();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class ButtonWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'button' });\n\t\tthis.isMinimized = false;\n\t}\n\n\t_render() {\n\t\tconst button = document.createElement('div');\n\t\tbutton.className = `feedback-widget-button position-${this.options.position}`;\n\t\tbutton.innerHTML = `\n <button class=\"feedback-trigger-btn\" type=\"button\">\n <svg class=\"feedback-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" fill=\"currentColor\">\n <path d=\"M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z\"/>\n </svg>\n <span class=\"feedback-text\">Feedback</span>\n \n <div class=\"feedback-minimize-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z\"/>\n </svg>\n </div>\n \n <div class=\"feedback-expand-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z\"/>\n </svg>\n </div>\n </button>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(button.style, this.options.customStyles);\n\t\t}\n\n\t\treturn button;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.feedback-trigger-btn');\n\t\tconst minimizeIcon = this.element.querySelector('.feedback-minimize-icon');\n\t\tconst expandIcon = this.element.querySelector('.feedback-expand-icon');\n\t\tconst isControlIcon = (target) => {\n\t\t\tif (!(target instanceof Element)) return false;\n\t\t\treturn Boolean(\n\t\t\t\ttarget.closest('.feedback-minimize-icon') ||\n\t\t\t\t\ttarget.closest('.feedback-expand-icon')\n\t\t\t);\n\t\t};\n\t\tconst openIfAllowed = (target) => {\n\t\t\tif (isControlIcon(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this.isMinimized) {\n\t\t\t\tthis.openPanel();\n\t\t\t}\n\t\t};\n\n\t\tminimizeIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.minimize();\n\t\t});\n\n\t\texpandIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.restore();\n\t\t});\n\n\t\tbutton.addEventListener('click', (e) => {\n\t\t\topenIfAllowed(e.target);\n\t\t});\n\n\t\t// Pointer events improve consistency across touch and mouse devices.\n\t\tbutton.addEventListener('pointerup', (e) => {\n\t\t\tif (e.pointerType === 'mouse') return;\n\t\t\topenIfAllowed(e.target);\n\t\t});\n\t}\n\n\tminimize() {\n\t\tthis.isMinimized = true;\n\t\tthis.element.classList.add('minimized');\n\t}\n\n\trestore() {\n\t\tthis.isMinimized = false;\n\t\tthis.element.classList.remove('minimized');\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tupdateText(text) {\n\t\tconst textEl = this.element?.querySelector('.feedback-text');\n\t\tif (textEl) {\n\t\t\ttextEl.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class ChangelogWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'changelog' });\n\t\tthis.changelogs = [];\n\t\tthis.isLoading = false;\n\t\tthis.modalElement = null;\n\t\tthis.sidebarElement = null;\n\t\tthis.currentIndex = 0;\n\t}\n\n\t_render() {\n\t\tconst trigger = document.createElement('div');\n\t\ttrigger.className = `changelog-widget position-${this.options.position}`;\n\t\ttrigger.innerHTML = `\n\t\t\t<button class=\"changelog-trigger-btn\" type=\"button\" aria-label=\"View Updates\">\n\t\t\t\t<svg class=\"changelog-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t\t\t<path d=\"M5.8 21L7.4 14L2 9.2L9.2 8.6L12 2L14.8 8.6L22 9.2L16.6 14L18.2 21L12 17.3L5.8 21Z\"/>\n\t\t\t\t</svg>\n\t\t\t\t<span class=\"changelog-text\">${this.options.triggerText || \"What's New\"}</span>\n\t\t\t\t<span class=\"changelog-confetti-emoji\">🎉</span>\n\t\t\t\t${this.options.showBadge ? '<span class=\"changelog-badge\"></span>' : ''}\n\t\t\t</button>\n\t\t`;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(trigger.style, this.options.customStyles);\n\t\t}\n\n\t\treturn trigger;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.changelog-trigger-btn');\n\t\tbutton.addEventListener('click', () => {\n\t\t\tthis.openSidebar();\n\t\t});\n\t}\n\n\tasync openModal() {\n\t\tif (this.modalElement) return;\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createModal();\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis.currentIndex = 0;\n\t\tthis._renderCurrentChangelog();\n\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.modalElement) {\n\t\t\t\tthis.modalElement.classList.add('open');\n\t\t\t}\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\tcloseModal() {\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.modalElement) {\n\t\t\tthis.modalElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.modalElement && this.modalElement.parentNode) {\n\t\t\t\tthis.modalElement.parentNode.removeChild(this.modalElement);\n\t\t\t\tthis.modalElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createModal() {\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'changelog-modal-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\t\tthis.backdropElement.addEventListener('click', () => this.closeModal());\n\n\t\tthis.modalElement = document.createElement('div');\n\t\tthis.modalElement.className = 'changelog-modal';\n\t\tthis.modalElement.innerHTML = `\n\t\t\t<div class=\"changelog-modal-container\">\n\t\t\t\t<button class=\"changelog-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t<div class=\"changelog-modal-content\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.modalElement);\n\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-container')\n\t\t\t.addEventListener('click', (e) => e.stopPropagation());\n\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-close')\n\t\t\t.addEventListener('click', () => this.closeModal());\n\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') this.closeModal();\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\tasync openSidebar() {\n\t\tif (this.listModalElement) return;\n\n\t\tif (this.modalElement) {\n\t\t\tthis.closeModal();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 350));\n\t\t}\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createListModal();\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis._renderChangelogList();\n\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.listModalElement) {\n\t\t\t\tthis.listModalElement.classList.add('open');\n\t\t\t\tthis._showConfetti();\n\t\t\t}\n\t\t\tif (this.listModalBackdropElement) {\n\t\t\t\tthis.listModalBackdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\t_showConfetti() {\n\t\tconst colors = [\n\t\t\t'#FF6B6B',\n\t\t\t'#4ECDC4',\n\t\t\t'#FFE66D',\n\t\t\t'#95E1D3',\n\t\t\t'#F38181',\n\t\t\t'#AA96DA',\n\t\t\t'#FCBAD3',\n\t\t\t'#A8D8EA',\n\t\t];\n\t\tconst confettiCount = 50;\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'changelog-confetti-container';\n\t\tdocument.body.appendChild(container);\n\n\t\tfor (let i = 0; i < confettiCount; i++) {\n\t\t\tconst confetti = document.createElement('div');\n\t\t\tconfetti.className = 'changelog-confetti';\n\t\t\tconfetti.style.left = Math.random() * 100 + '%';\n\t\t\tconfetti.style.backgroundColor =\n\t\t\t\tcolors[Math.floor(Math.random() * colors.length)];\n\t\t\tconfetti.style.animationDelay = Math.random() * 0.5 + 's';\n\t\t\tconfetti.style.animationDuration = Math.random() * 1 + 1.5 + 's';\n\n\t\t\tconst shapes = ['circle', 'square', 'rectangle'];\n\t\t\tconst shape = shapes[Math.floor(Math.random() * shapes.length)];\n\t\t\tif (shape === 'circle') {\n\t\t\t\tconfetti.style.borderRadius = '50%';\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t} else if (shape === 'rectangle') {\n\t\t\t\tconfetti.style.width = Math.random() * 4 + 3 + 'px';\n\t\t\t\tconfetti.style.height = Math.random() * 10 + 8 + 'px';\n\t\t\t} else {\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t}\n\n\t\t\tcontainer.appendChild(confetti);\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tif (container.parentNode) container.parentNode.removeChild(container);\n\t\t}, 2500);\n\t}\n\n\tcloseSidebar() {\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.listModalElement) {\n\t\t\tthis.listModalElement.classList.remove('open');\n\t\t}\n\t\tif (this.listModalBackdropElement) {\n\t\t\tthis.listModalBackdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.listModalElement && this.listModalElement.parentNode) {\n\t\t\t\tthis.listModalElement.parentNode.removeChild(this.listModalElement);\n\t\t\t\tthis.listModalElement = null;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tthis.listModalBackdropElement &&\n\t\t\t\tthis.listModalBackdropElement.parentNode\n\t\t\t) {\n\t\t\t\tthis.listModalBackdropElement.parentNode.removeChild(\n\t\t\t\t\tthis.listModalBackdropElement\n\t\t\t\t);\n\t\t\t\tthis.listModalBackdropElement = null;\n\t\t\t}\n\t\t\tif (this._listModalEscapeHandler) {\n\t\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createListModal() {\n\t\tthis.listModalBackdropElement = document.createElement('div');\n\t\tthis.listModalBackdropElement.className = 'changelog-list-modal-backdrop';\n\t\tdocument.body.appendChild(this.listModalBackdropElement);\n\t\tthis.listModalBackdropElement.addEventListener('click', () =>\n\t\t\tthis.closeSidebar()\n\t\t);\n\n\t\tthis.listModalElement = document.createElement('div');\n\t\tthis.listModalElement.className = 'changelog-list-modal';\n\t\tthis.listModalElement.innerHTML = `\n\t\t\t<div class=\"changelog-list-modal-container\">\n\t\t\t\t<div class=\"changelog-list-modal-header\">\n\t\t\t\t\t<h2>${this.options.title || \"What's New\"} 🎉</h2>\n\t\t\t\t\t<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-list-modal-body\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.listModalElement);\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-container')\n\t\t\t.addEventListener('click', (e) => e.stopPropagation());\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-close')\n\t\t\t.addEventListener('click', () => this.closeSidebar());\n\n\t\tthis._listModalEscapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') this.closeSidebar();\n\t\t};\n\t\tdocument.addEventListener('keydown', this._listModalEscapeHandler);\n\t}\n\n\t_renderChangelogList() {\n\t\tconst body = this.listModalElement.querySelector(\n\t\t\t'.changelog-list-modal-body'\n\t\t);\n\n\t\tif (this.isLoading) return;\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tbody.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tbody.innerHTML = `\n\t\t\t<div class=\"changelog-list\">\n\t\t\t\t${this.changelogs.map((changelog, index) => this._renderChangelogListItem(changelog, index)).join('')}\n\t\t\t</div>\n\t\t`;\n\n\t\tbody.querySelectorAll('.changelog-list-item').forEach((item, index) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(this.changelogs[index]);\n\t\t\t});\n\t\t});\n\t}\n\n\t_renderChangelogListItem(changelog, index) {\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst date = changelog.published_at\n\t\t\t? this._formatDate(changelog.published_at)\n\t\t\t: '';\n\t\tconst description = this._truncateDescription(\n\t\t\tchangelog.excerpt || changelog.description,\n\t\t\t120\n\t\t);\n\n\t\treturn `\n\t\t\t<div class=\"changelog-list-item\" data-index=\"${index}\">\n\t\t\t\t<div class=\"changelog-list-item-main\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasImage\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-list-item-image\">\n\t\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"changelog-list-item-content\">\n\t\t\t\t\t\t${date ? `<span class=\"changelog-list-item-date\">${date}</span>` : ''}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchangelog.labels && changelog.labels.length > 0\n\t\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t\t<div class=\"changelog-list-item-labels\">\n\t\t\t\t\t\t\t\t${changelog.labels\n\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t(label) => `\n\t\t\t\t\t\t\t\t\t<span class=\"changelog-label\" style=\"background-color: ${label.color || '#E5E7EB'}; color: ${this._getContrastColor(label.color || '#E5E7EB')}\">${label.name}</span>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<h3 class=\"changelog-list-item-title\">${changelog.title}</h3>\n\t\t\t\t\t\t${description ? `<p class=\"changelog-list-item-description\">${description}</p>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tasync _loadChangelogs() {\n\t\tthis.isLoading = true;\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs();\n\t\t\tthis.changelogs = result.data || [];\n\t\t\tthis.sdk.eventBus.emit('changelog:loaded', {\n\t\t\t\tchangelogs: this.changelogs,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.changelogs = [];\n\t\t\tthis.sdk.eventBus.emit('changelog:error', { error });\n\t\t} finally {\n\t\t\tthis.isLoading = false;\n\t\t}\n\t}\n\n\t_renderCurrentChangelog() {\n\t\tconst content = this.modalElement.querySelector('.changelog-modal-content');\n\n\t\tif (this.isLoading) return;\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tcontent.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst changelog = this.changelogs[this.currentIndex];\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst hasMultiple = this.changelogs.length > 1;\n\t\tconst description = this._truncateDescription(\n\t\t\tchangelog.excerpt || changelog.description,\n\t\t\t160\n\t\t);\n\n\t\tcontent.innerHTML = `\n\t\t\t<div class=\"changelog-popup-item\">\n\t\t\t\t${\n\t\t\t\t\thasImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"changelog-popup-image\">\n\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"changelog-popup-body\">\n\t\t\t\t\t<h2 class=\"changelog-popup-title\">${changelog.title}</h2>\n\t\t\t\t\t${description ? `<p class=\"changelog-popup-description\">${description}</p>` : ''}\n\t\t\t\t\t<button class=\"changelog-popup-btn\" type=\"button\">\n\t\t\t\t\t\t${this.options.viewButtonText || 'View Update'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-popup-footer\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasMultiple\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-popup-dots\">\n\t\t\t\t\t\t\t${this.changelogs\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t(_, i) => `\n\t\t\t\t\t\t\t\t<span class=\"changelog-dot ${i === this.currentIndex ? 'active' : ''}\" data-index=\"${i}\"></span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<button class=\"changelog-view-all-btn\" type=\"button\">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t\t\t\t\t<path d=\"M5 12h14M12 5l7 7-7 7\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tcontent\n\t\t\t.querySelector('.changelog-popup-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(changelog);\n\t\t\t});\n\n\t\tcontent\n\t\t\t.querySelector('.changelog-view-all-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.closeModal();\n\t\t\t\tsetTimeout(() => this.openSidebar(), 350);\n\t\t\t});\n\n\t\tif (hasMultiple) {\n\t\t\tcontent.querySelectorAll('.changelog-dot').forEach((dot) => {\n\t\t\t\tdot.addEventListener('click', (e) => {\n\t\t\t\t\tthis.currentIndex = parseInt(e.target.dataset.index, 10);\n\t\t\t\t\tthis._renderCurrentChangelog();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleViewUpdate(changelog) {\n\t\tthis.sdk.eventBus.emit('changelog:view', { changelog });\n\n\t\tconst changelogBase = (this.options.changelogBaseUrl || '').replace(\n\t\t\t/\\/$/,\n\t\t\t''\n\t\t);\n\t\tconst url =\n\t\t\tchangelog.url ||\n\t\t\t(changelog.slug && changelogBase\n\t\t\t\t? `${changelogBase}/${changelog.slug}`\n\t\t\t\t: null) ||\n\t\t\tchangelogBase ||\n\t\t\tnull;\n\n\t\tif (url) {\n\t\t\tif (this.options.openInNewTab !== false) {\n\t\t\t\twindow.open(url, '_blank', 'noopener,noreferrer');\n\t\t\t} else {\n\t\t\t\twindow.location.href = url;\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.options.onViewUpdate === 'function') {\n\t\t\tthis.options.onViewUpdate(changelog);\n\t\t}\n\t}\n\n\t_stripHtml(html) {\n\t\tconst tmp = document.createElement('div');\n\t\ttmp.innerHTML = html;\n\t\treturn (tmp.textContent || tmp.innerText || '').trim();\n\t}\n\n\t_truncateDescription(html, maxLength = 120) {\n\t\tif (!html) return '';\n\t\tconst plain = this._stripHtml(html);\n\t\tif (plain.length <= maxLength) return plain;\n\t\treturn plain.substring(0, maxLength).trimEnd() + '...';\n\t}\n\n\t_formatDate(dateString) {\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleDateString('en-US', {\n\t\t\tyear: 'numeric',\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t}\n\n\t_getContrastColor(hexColor) {\n\t\tconst hex = hexColor.replace('#', '');\n\t\tconst r = parseInt(hex.substr(0, 2), 16);\n\t\tconst g = parseInt(hex.substr(2, 2), 16);\n\t\tconst b = parseInt(hex.substr(4, 2), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#1F2937' : '#FFFFFF';\n\t}\n\n\thideBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) badge.style.display = 'none';\n\t}\n\n\tshowBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) badge.style.display = 'block';\n\t}\n\n\tnextChangelog() {\n\t\tif (this.currentIndex < this.changelogs.length - 1) {\n\t\t\tthis.currentIndex++;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tprevChangelog() {\n\t\tif (this.currentIndex > 0) {\n\t\t\tthis.currentIndex--;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tasync refresh() {\n\t\tthis.changelogs = [];\n\t\tawait this._loadChangelogs();\n\t\tif (this.modalElement) {\n\t\t\tthis.currentIndex = 0;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t\tif (this.listModalElement) {\n\t\t\tthis._renderChangelogList();\n\t\t}\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tdestroy() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t}\n\t\tif (this._listModalEscapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t}\n\t\tthis.closeModal();\n\t\tthis.closeSidebar();\n\t\tsuper.destroy();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class InlineWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'inline' });\n\t}\n\n\t_render() {\n\t\tconst widget = document.createElement('div');\n\t\twidget.className = 'feedback-widget feedback-widget-inline';\n\t\twidget.innerHTML = `\n <div class=\"feedback-inline-content\">\n <h3>Send us your feedback</h3>\n <form class=\"feedback-inline-form\">\n <div class=\"sdk-form-group\">\n <input \n type=\"text\" \n name=\"title\" \n class=\"sdk-input\"\n placeholder=\"Title (optional)\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"sdk-form-group\">\n <textarea \n name=\"content\" \n class=\"sdk-textarea\"\n placeholder=\"Your feedback...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"sdk-form-group\">\n <input \n type=\"email\" \n name=\"email\" \n class=\"sdk-input\"\n placeholder=\"Email (optional)\"\n value=\"${this.state.email}\"\n />\n </div>\n <button type=\"submit\" class=\"sdk-btn-primary sdk-btn-block\">\n Send Feedback\n </button>\n <div class=\"feedback-error\"></div>\n </form>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(widget.style, this.options.customStyles);\n\t\t}\n\n\t\treturn widget;\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('.feedback-inline-form');\n\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tform.querySelector('input[name=\"title\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.title = e.target.value;\n\t\t});\n\n\t\tform\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tform.querySelector('input[name=\"email\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.email = e.target.value;\n\t\t});\n\t}\n\n\topenModal() {\n\t\tconst textarea = this.element.querySelector('textarea[name=\"content\"]');\n\t\tif (textarea) {\n\t\t\ttextarea.focus();\n\t\t}\n\t}\n\n\tcloseModal() {\n\t\t// Inline widget doesn't use modal\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst widget = this.element.querySelector('.feedback-inline-content');\n\t\tconst originalContent = widget.innerHTML;\n\n\t\twidget.innerHTML = `\n <div class=\"feedback-success\">\n <div class=\"sdk-notification-icon\">✓</div>\n <h3>Thank you!</h3>\n <p>Your feedback has been submitted successfully.</p>\n <button class=\"sdk-btn-primary\">Send Another</button>\n </div>\n `;\n\n\t\tconst resetBtn = widget.querySelector('.sdk-btn-primary');\n\t\tresetBtn.addEventListener('click', () => {\n\t\t\twidget.innerHTML = originalContent;\n\t\t\tthis._attachEvents();\n\t\t\tthis._resetForm();\n\t\t});\n\t}\n\n\t_showError(message) {\n\t\tconst errorElement = this.element.querySelector('.feedback-error');\n\t\tif (errorElement) {\n\t\t\terrorElement.textContent = message;\n\t\t\terrorElement.classList.add('show');\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (errorElement) {\n\t\t\t\t\terrorElement.classList.remove('show');\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\t_updateSubmitButton() {\n\t\tconst submitBtn = this.element.querySelector('.sdk-btn-primary');\n\t\tif (submitBtn) {\n\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t? 'Sending...'\n\t\t\t\t: 'Send Feedback';\n\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t}\n\t}\n\n\tupdateTitle(title) {\n\t\tconst titleElement = this.element?.querySelector('h3');\n\t\tif (titleElement) {\n\t\t\ttitleElement.textContent = title;\n\t\t}\n\t}\n\n\tsetPlaceholder(field, placeholder) {\n\t\tconst input = this.element?.querySelector(`[name=\"${field}\"]`);\n\t\tif (input) {\n\t\t\tinput.placeholder = placeholder;\n\t\t}\n\t}\n}\n","/**\n * WebSocketService - Real-time communication for messenger widget\n */\n\nexport class WebSocketService {\n\tconstructor(config = {}) {\n\t\tthis.baseURL = config.baseURL || '';\n\t\tthis.workspace = config.workspace || '';\n\t\tthis.sessionToken = config.sessionToken || null;\n\t\tthis.mock = config.mock || false;\n\n\t\tthis.ws = null;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis.maxReconnectAttempts = 5;\n\t\tthis.reconnectDelay = 1000;\n\t\tthis.pingInterval = null;\n\t\tthis.isConnected = false;\n\n\t\t// Event listeners\n\t\tthis._listeners = new Map();\n\n\t\t// Bind methods\n\t\tthis._onOpen = this._onOpen.bind(this);\n\t\tthis._onMessage = this._onMessage.bind(this);\n\t\tthis._onClose = this._onClose.bind(this);\n\t\tthis._onError = this._onError.bind(this);\n\t}\n\n\t/**\n\t * Connect to WebSocket server\n\t */\n\tconnect(sessionToken = null) {\n\t\tif (sessionToken) {\n\t\t\tthis.sessionToken = sessionToken;\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.warn('[WebSocket] No session token provided');\n\t\t\treturn;\n\t\t}\n\n\t\t// Mock mode - simulate connection\n\t\tif (this.mock) {\n\t\t\tthis.isConnected = true;\n\t\t\tthis._emit('connected', {});\n\t\t\tthis._startMockResponses();\n\t\t\treturn;\n\t\t}\n\n\t\t// Build WebSocket URL\n\t\tconst wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tlet wsURL = this.baseURL.replace(/^https?:/, wsProtocol);\n\t\twsURL = wsURL.replace('/api/v1', '');\n\t\twsURL = `${wsURL}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;\n\n\t\ttry {\n\t\t\tthis.ws = new WebSocket(wsURL);\n\t\t\tthis.ws.onopen = this._onOpen;\n\t\t\tthis.ws.onmessage = this._onMessage;\n\t\t\tthis.ws.onclose = this._onClose;\n\t\t\tthis.ws.onerror = this._onError;\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Connection error:', error);\n\t\t\tthis._scheduleReconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from WebSocket server\n\t */\n\tdisconnect() {\n\t\tthis.isConnected = false;\n\t\tthis.reconnectAttempts = this.maxReconnectAttempts; // Prevent reconnection\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\tthis.ws.close();\n\t\t\tthis.ws = null;\n\t\t}\n\n\t\tif (this._mockInterval) {\n\t\t\tclearInterval(this._mockInterval);\n\t\t\tthis._mockInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to events\n\t * @param {string} event - Event name\n\t * @param {Function} callback - Event handler\n\t * @returns {Function} Unsubscribe function\n\t */\n\ton(event, callback) {\n\t\tif (!this._listeners.has(event)) {\n\t\t\tthis._listeners.set(event, new Set());\n\t\t}\n\t\tthis._listeners.get(event).add(callback);\n\t\treturn () => this._listeners.get(event).delete(callback);\n\t}\n\n\t/**\n\t * Remove event listener\n\t */\n\toff(event, callback) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).delete(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Send message through WebSocket\n\t */\n\tsend(type, payload = {}) {\n\t\tif (!this.isConnected) {\n\t\t\tconsole.warn('[WebSocket] Not connected, cannot send message');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\t// Mock mode - just log\n\t\t\tconsole.log('[WebSocket Mock] Sending:', type, payload);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\tthis.ws.send(JSON.stringify({ type, payload }));\n\t\t}\n\t}\n\n\t// Private methods\n\n\t_onOpen() {\n\t\tconsole.log('[WebSocket] Connected');\n\t\tthis.isConnected = true;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis._emit('connected', {});\n\n\t\t// Start ping interval to keep connection alive\n\t\tthis.pingInterval = setInterval(() => {\n\t\t\tthis.send('ping', {});\n\t\t}, 30000);\n\t}\n\n\t_onMessage(event) {\n\t\ttry {\n\t\t\tconst data = JSON.parse(event.data);\n\t\t\tconst { type, payload } = data;\n\n\t\t\t// Handle different event types\n\t\t\tswitch (type) {\n\t\t\t\tcase 'message:new':\n\t\t\t\t\tthis._emit('message', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:started':\n\t\t\t\t\tthis._emit('typing_started', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:stopped':\n\t\t\t\t\tthis._emit('typing_stopped', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:updated':\n\t\t\t\t\tthis._emit('conversation_updated', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:closed':\n\t\t\t\t\tthis._emit('conversation_closed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'availability:changed':\n\t\t\t\t\tthis._emit('availability_changed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'pong':\n\t\t\t\t\t// Ping response, ignore\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log('[WebSocket] Unknown event:', type, payload);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Failed to parse message:', error);\n\t\t}\n\t}\n\n\t_onClose(event) {\n\t\tconsole.log('[WebSocket] Disconnected:', event.code, event.reason);\n\t\tthis.isConnected = false;\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tthis._emit('disconnected', { code: event.code, reason: event.reason });\n\t\tthis._scheduleReconnect();\n\t}\n\n\t_onError(error) {\n\t\tconsole.error('[WebSocket] Error:', error);\n\t\tthis._emit('error', { error });\n\t}\n\n\t_scheduleReconnect() {\n\t\tif (this.reconnectAttempts >= this.maxReconnectAttempts) {\n\t\t\tconsole.log('[WebSocket] Max reconnect attempts reached');\n\t\t\tthis._emit('reconnect_failed', {});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reconnectAttempts++;\n\t\tconst delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\t\tconsole.log(\n\t\t\t`[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`\n\t\t);\n\n\t\tsetTimeout(() => {\n\t\t\tthis.connect();\n\t\t}, delay);\n\t}\n\n\t_emit(event, data) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`[WebSocket] Error in ${event} handler:`, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Mock support for development\n\t_startMockResponses() {\n\t\t// Simulate agent typing and responses\n\t\tthis._mockInterval = setInterval(() => {\n\t\t\t// Randomly emit typing or message events for demo\n\t\t\tconst random = Math.random();\n\t\t\tif (random < 0.1) {\n\t\t\t\tthis._emit('typing_started', {\n\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\tuser_name: 'Sarah',\n\t\t\t\t\tis_agent: true,\n\t\t\t\t});\n\n\t\t\t\t// Stop typing after 2 seconds\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._emit('typing_stopped', {\n\t\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\t});\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t}, 10000);\n\t}\n\n\t/**\n\t * Simulate receiving a message (for mock mode)\n\t */\n\tsimulateMessage(conversationId, message) {\n\t\tif (this.mock) {\n\t\t\tthis._emit('message', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t\tmessage: {\n\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\tcontent: message.content,\n\t\t\t\t\tsender_type: message.sender_type || 'agent',\n\t\t\t\t\tsender_name: message.sender_name || 'Support',\n\t\t\t\t\tsender_avatar: message.sender_avatar || null,\n\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n}\n","export class MessengerState {\n\tconstructor(options = {}) {\n\t\tthis.currentView = 'home';\n\t\tthis.isOpen = false;\n\t\tthis.unreadCount = 0;\n\t\tthis.activeConversationId = null;\n\n\t\tthis.conversations = [];\n\t\tthis.messages = {};\n\n\t\tthis.helpArticles = [];\n\t\tthis.helpSearchQuery = '';\n\n\t\tthis.homeChangelogItems = [];\n\t\tthis.changelogItems = [];\n\n\t\tthis.teamName = options.teamName || 'Support';\n\t\tthis.teamAvatars = options.teamAvatars || [];\n\t\tthis.welcomeMessage = options.welcomeMessage || 'How can we help?';\n\n\t\tthis.userContext = options.userContext || null;\n\t\tthis.isIdentified = false;\n\t\tthis.pendingMessage = null;\n\n\t\tthis.enableHelp = options.enableHelp !== false;\n\t\tthis.enableChangelog = options.enableChangelog !== false;\n\n\t\tthis.agentsOnline = false;\n\t\tthis.onlineCount = 0;\n\t\tthis.responseTime = 'Usually replies within a few minutes';\n\n\t\tthis.typingUsers = {};\n\n\t\tthis.isLoading = false;\n\t\tthis.isLoadingMessages = false;\n\n\t\tthis.urls = options.urls || {\n\t\t\tfeedback: null,\n\t\t\tchangelog: null,\n\t\t\thelp: null,\n\t\t\troadmap: null,\n\t\t};\n\n\t\tthis._listeners = new Set();\n\t}\n\n\tsubscribe(callback) {\n\t\tthis._listeners.add(callback);\n\t\treturn () => this._listeners.delete(callback);\n\t}\n\n\t_notify(changeType, data) {\n\t\tthis._listeners.forEach((cb) => cb(changeType, data, this));\n\t}\n\n\tsetView(view) {\n\t\tconst previousView = this.currentView;\n\t\tthis.currentView = view;\n\t\tthis._notify('viewChange', { previousView, currentView: view });\n\t}\n\n\tsetOpen(isOpen) {\n\t\tthis.isOpen = isOpen;\n\t\tthis._notify('openChange', { isOpen });\n\t}\n\n\tsetActiveConversation(conversationId) {\n\t\tconst previousConversationId = this.activeConversationId;\n\t\tthis.activeConversationId = conversationId;\n\t\tthis._notify('conversationChange', {\n\t\t\tconversationId,\n\t\t\tpreviousConversationId,\n\t\t});\n\t}\n\n\tsetIdentified(isIdentified, userContext = null) {\n\t\tthis.isIdentified = isIdentified;\n\t\tif (userContext) {\n\t\t\tthis.userContext = { ...this.userContext, ...userContext };\n\t\t}\n\t\tthis._notify('identificationChange', { isIdentified, userContext });\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.conversations = conversations;\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationsUpdate', { conversations });\n\t}\n\n\taddConversation(conversation) {\n\t\tthis.conversations.unshift(conversation);\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationAdded', { conversation });\n\t}\n\n\tsetMessages(conversationId, messages) {\n\t\tthis.messages[conversationId] = messages;\n\t\tthis._notify('messagesUpdate', { conversationId, messages });\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tif (!this.messages[conversationId]) {\n\t\t\tthis.messages[conversationId] = [];\n\t\t}\n\t\tthis.messages[conversationId].push(message);\n\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv) {\n\t\t\tconv.lastMessage = message.content;\n\t\t\tconv.lastMessageTime = message.timestamp;\n\t\t\tif (!message.isOwn) {\n\t\t\t\tconv.unread = (conv.unread || 0) + 1;\n\t\t\t\tthis._updateUnreadCount();\n\t\t\t}\n\t\t}\n\n\t\tthis._notify('messageAdded', { conversationId, message });\n\t}\n\n\tupdateConversation(conversationId, updates) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (!conv) {\n\t\t\treturn null;\n\t\t}\n\n\t\tObject.assign(conv, updates);\n\t\tthis._notify('conversationUpdated', { conversationId, conversation: conv });\n\t\treturn conv;\n\t}\n\n\tmarkAsRead(conversationId) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv && conv.unread > 0) {\n\t\t\tconv.unread = 0;\n\t\t\tthis._updateUnreadCount();\n\t\t\tthis._notify('conversationRead', { conversationId });\n\t\t}\n\t}\n\n\t_updateUnreadCount() {\n\t\tthis.unreadCount = this.conversations.reduce(\n\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t0\n\t\t);\n\t\tthis._notify('unreadCountChange', { count: this.unreadCount });\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.helpArticles = articles;\n\t\tthis._notify('helpArticlesUpdate', { articles });\n\t}\n\n\tsetHelpSearchQuery(query) {\n\t\tthis.helpSearchQuery = query;\n\t\tthis._notify('helpSearchChange', { query });\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.homeChangelogItems = items;\n\t\tthis._notify('homeChangelogUpdate', { items });\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.changelogItems = items;\n\t\tthis._notify('changelogUpdate', { items });\n\t}\n\n\tgetActiveConversation() {\n\t\treturn this.conversations.find((c) => c.id === this.activeConversationId);\n\t}\n\n\tgetActiveMessages() {\n\t\treturn this.messages[this.activeConversationId] || [];\n\t}\n\n\tsetTeamAvatarsFromAgents(agents) {\n\t\tif (!agents || agents.length === 0) return;\n\n\t\tthis.teamAvatars = agents.map((agent) => {\n\t\t\tif (agent.picture) return agent.picture;\n\t\t\treturn agent.full_name || '?';\n\t\t});\n\t\tthis._notify('teamAvatarsUpdate', { teamAvatars: this.teamAvatars });\n\t}\n\n\tgetFilteredHelpArticles() {\n\t\tif (!this.helpSearchQuery) {\n\t\t\treturn this.helpArticles;\n\t\t}\n\t\tconst query = this.helpSearchQuery.toLowerCase();\n\t\treturn this.helpArticles.filter(\n\t\t\t(article) =>\n\t\t\t\tarticle.title.toLowerCase().includes(query) ||\n\t\t\t\t(article.description &&\n\t\t\t\t\tarticle.description.toLowerCase().includes(query))\n\t\t);\n\t}\n\n\treset() {\n\t\tthis.currentView = 'home';\n\t\tthis.activeConversationId = null;\n\t\tthis.helpSearchQuery = '';\n\t\tthis._notify('reset', {});\n\t}\n}\n","export class MessengerLauncher {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-launcher messenger-launcher-${this.options.position}`;\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._updateIcon();\n\t\t\t}\n\t\t\tif (type === 'unreadCountChange') {\n\t\t\t\tthis._updateBadge();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst badgeHtml =\n\t\t\tthis.state.unreadCount > 0\n\t\t\t\t? `<span class=\"messenger-launcher-badge\">${this.state.unreadCount > 9 ? '9+' : this.state.unreadCount}</span>`\n\t\t\t\t: '';\n\n\t\tthis.element.innerHTML = `\n <button class=\"messenger-launcher-btn\" aria-label=\"Open messenger\">\n <span class=\"messenger-launcher-icon messenger-launcher-icon-chat\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M144,140a12,12,0,1,1-12-12A12,12,0,0,1,144,140Zm44-12a12,12,0,1,0,12,12A12,12,0,0,0,188,128Zm51.34,83.47a16,16,0,0,1-19.87,19.87l-24.71-7.27A80,80,0,0,1,86.43,183.42a79,79,0,0,1-25.19-7.35l-24.71,7.27a16,16,0,0,1-19.87-19.87l7.27-24.71A80,80,0,1,1,169.58,72.59a80,80,0,0,1,62.49,114.17ZM81.3,166.3a79.94,79.94,0,0,1,70.38-93.87A64,64,0,0,0,39.55,134.19a8,8,0,0,1,.63,6L32,168l27.76-8.17a8,8,0,0,1,6,.63A63.45,63.45,0,0,0,81.3,166.3Zm135.15,15.89a64,64,0,1,0-26.26,26.26,8,8,0,0,1,6-.63L224,216l-8.17-27.76A8,8,0,0,1,216.45,182.19Z\"></path>\n </svg>\n </span>\n <span class=\"messenger-launcher-icon messenger-launcher-icon-close\" style=\"display: none;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n </svg>\n </span>\n ${badgeHtml}\n </button>\n `;\n\n\t\tconst btn = this.element.querySelector('.messenger-launcher-btn');\n\t\tif (btn && this.options.primaryColor) {\n\t\t\tbtn.style.setProperty(\n\t\t\t\t'background',\n\t\t\t\tthis.options.primaryColor,\n\t\t\t\t'important'\n\t\t\t);\n\t\t}\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-launcher-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(!this.state.isOpen);\n\t\t\t});\n\t}\n\n\t_updateIcon() {\n\t\tconst chatIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-chat'\n\t\t);\n\t\tconst closeIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-close'\n\t\t);\n\n\t\tif (this.state.isOpen) {\n\t\t\tchatIcon.style.display = 'none';\n\t\t\tcloseIcon.style.display = 'flex';\n\t\t\tthis.element.classList.add('messenger-launcher-open');\n\t\t} else {\n\t\t\tchatIcon.style.display = 'flex';\n\t\t\tcloseIcon.style.display = 'none';\n\t\t\tthis.element.classList.remove('messenger-launcher-open');\n\t\t}\n\t}\n\n\t_updateBadge() {\n\t\tconst existingBadge = this.element.querySelector(\n\t\t\t'.messenger-launcher-badge'\n\t\t);\n\t\tif (existingBadge) {\n\t\t\texistingBadge.remove();\n\t\t}\n\n\t\tif (this.state.unreadCount > 0 && !this.state.isOpen) {\n\t\t\tconst badge = document.createElement('span');\n\t\t\tbadge.className = 'messenger-launcher-badge';\n\t\t\tbadge.textContent =\n\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\tthis.element.querySelector('.messenger-launcher-btn').appendChild(badge);\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class NavigationTabs {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-panel-nav';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange' || type === 'unreadCountChange') {\n\t\t\t\tthis._updateActiveTab();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_getTabs() {\n\t\tconst tabs = [\n\t\t\t{ id: 'home', label: 'Home', icon: this._getHomeIcon() },\n\t\t\t{\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: this._getMessagesIcon(),\n\t\t\t\tbadge: this.state.unreadCount,\n\t\t\t},\n\t\t];\n\n\t\tif (this.state.enableHelp) {\n\t\t\ttabs.push({ id: 'help', label: 'Help', icon: this._getHelpIcon() });\n\t\t}\n\n\t\tif (this.state.enableChangelog) {\n\t\t\ttabs.push({\n\t\t\t\tid: 'changelog',\n\t\t\t\tlabel: 'Changelog',\n\t\t\t\ticon: this._getChangelogIcon(),\n\t\t\t});\n\t\t}\n\n\t\treturn tabs;\n\t}\n\n\t_updateContent() {\n\t\tconst tabs = this._getTabs();\n\t\tconst tabsHtml = tabs\n\t\t\t.map((tab) => {\n\t\t\t\tconst isActive = this.state.currentView === tab.id;\n\t\t\t\tconst badgeHtml =\n\t\t\t\t\ttab.badge && tab.badge > 0\n\t\t\t\t\t\t? `<span class=\"messenger-nav-badge\">${tab.badge > 9 ? '9+' : tab.badge}</span>`\n\t\t\t\t\t\t: '';\n\n\t\t\t\treturn `\n\t\t\t\t<button class=\"messenger-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t<span class=\"messenger-nav-icon\">${tab.icon}</span>\n\t\t\t\t\t<span class=\"messenger-nav-label\">${tab.label}</span>\n\t\t\t\t\t${badgeHtml}\n\t\t\t\t</button>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-nav-tabs\">\n\t\t\t\t${tabsHtml}\n\t\t\t</div>\n\t\t\t<div class=\"messenger-nav-footer\">\n\t\t\t\t<a href=\"https://product7.io\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"messenger-powered-by\">\n\t\t\t\t\t<svg width=\"12\" height=\"14\" viewBox=\"0 0 28 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.0615 5.28044C8.5161 4.42949 3.30825 11.1456 5.89967 17.6588C6.9321 20.2538 9.06268 22.2644 11.8777 23.1968C16.2682 24.6507 18.4038 22.3222 19.0483 23.9691C19.4055 24.8894 18.7282 25.3209 17.988 25.4938C10.9146 27.15 5.15304 22.7566 3.5869 17.5531C1.52205 10.6941 5.98684 4.6667 11.3483 3.41065C17.8801 1.88094 24.0325 6.19355 24.3926 12.7175C24.7448 19.0921 18.6217 24.5978 11.927 22.2036C10.8789 21.8285 8.8419 20.6682 8.46823 19.858C8.06026 18.9727 8.80261 18.1725 9.68285 18.3576C10.2223 18.4726 10.3116 18.8706 11.3161 19.5372C14.4549 21.6213 19.1276 20.6132 21.2046 17.0972C23.991 12.3817 21.0481 6.05351 15.06 5.27758L15.0615 5.28044Z\" fill=\"#21244A\"/>\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.2492 2.19833C11.944 1.71463 8.88819 3.07214 6.91479 4.49682C2.27067 7.85488 0.76169 14.5038 3.49672 19.8731C4.08535 21.0096 4.84379 22.0497 5.7459 22.9576L7.16343 24.2515C7.67214 24.9131 7.27203 25.7176 6.64115 25.9269C5.13502 26.4271 2.0499 21.8172 1.42044 20.5383C0.0872204 17.8297 -0.312889 14.9047 0.242977 11.503C1.66908 2.77063 11.221 -2.51652 19.7197 1.21021C27.7548 4.73331 30.2733 15.4555 23.9351 22.0773C23.3107 22.7296 21.6352 24.4823 20.6278 23.8907C20.0076 23.5263 19.8933 22.6446 20.5192 22.1238C21.0301 21.6986 21.4759 21.435 21.9896 20.9734C23.6665 19.4688 25.2562 16.8752 25.3477 13.5636C25.4427 10.2055 24.1266 7.5848 22.3904 5.74859C20.6392 3.89665 18.6751 2.69919 15.2456 2.19691L15.2492 2.19833Z\" fill=\"#F69F06\"/>\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.48332 27.2217C7.93817 26.265 8.89987 25.3776 10.1352 25.8641C15.5653 27.9926 18.3081 25.5269 19.0255 27.0823C19.2655 27.6039 19.0448 28.1619 18.7354 28.3863C17.9895 28.9257 14.82 28.9343 13.9262 28.8714C12.9071 28.8053 11.897 28.6377 10.9111 28.3713C10.0888 28.1348 8.88057 27.9247 8.48189 27.2281L8.48332 27.2217Z\" fill=\"#21244A\"/>\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.8722 31.0607C15.7765 32.1381 14.579 32.0331 13.5766 31.9545C12.5742 31.8759 11.5203 31.8502 11.601 30.7013C11.6789 29.5882 12.8035 29.7532 13.8274 29.8332C14.4425 29.8811 15.9951 29.681 15.8722 31.0607Z\" fill=\"#21244A\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\tPowered by <strong>Product7</strong>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element.addEventListener('click', (e) => {\n\t\t\tconst tab = e.target.closest('.messenger-nav-tab');\n\t\t\tif (tab) {\n\t\t\t\tconst tabId = tab.dataset.tab;\n\t\t\t\tthis.state.setView(tabId);\n\t\t\t}\n\t\t});\n\t}\n\n\t_updateActiveTab() {\n\t\tconst tabs = this.element.querySelectorAll('.messenger-nav-tab');\n\t\ttabs.forEach((tab) => {\n\t\t\tconst isActive = tab.dataset.tab === this.state.currentView;\n\t\t\ttab.classList.toggle('active', isActive);\n\n\t\t\tif (tab.dataset.tab === 'messages') {\n\t\t\t\tconst existingBadge = tab.querySelector('.messenger-nav-badge');\n\t\t\t\tif (existingBadge) existingBadge.remove();\n\n\t\t\t\tif (this.state.unreadCount > 0) {\n\t\t\t\t\tconst badge = document.createElement('span');\n\t\t\t\t\tbadge.className = 'messenger-nav-badge';\n\t\t\t\t\tbadge.textContent =\n\t\t\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\t\t\ttab.appendChild(badge);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t_getHomeIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<path d=\"M40,216H216V120a8,8,0,0,0-2.34-5.66l-80-80a8,8,0,0,0-11.32,0l-80,80A8,8,0,0,0,40,120Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\t_getMessagesIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<circle cx=\"128\" cy=\"128\" r=\"12\"/>\n\t\t\t<circle cx=\"84\" cy=\"128\" r=\"12\"/>\n\t\t\t<circle cx=\"172\" cy=\"128\" r=\"12\"/>\n\t\t\t<path d=\"M79.93,211.11a96,96,0,1,0-35-35h0L32.42,213.46a8,8,0,0,0,10.12,10.12l37.39-12.47Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\t_getHelpIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<circle cx=\"128\" cy=\"128\" r=\"96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t<circle cx=\"128\" cy=\"180\" r=\"12\"/>\n\t\t\t<path d=\"M128,144v-8a28,28,0,1,0-28-28\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\t_getChangelogIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<path d=\"M160,80V200.67a8,8,0,0,0,3.56,6.65l11,7.33a8,8,0,0,0,12.2-4.72L200,160\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t<path d=\"M40,200a8,8,0,0,0,13.15,6.12C105.55,162.16,160,160,160,160h40a40,40,0,0,0,0-80H160S105.55,77.84,53.15,33.89A8,8,0,0,0,40,40Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { NavigationTabs } from './NavigationTabs.js';\n\nexport class MessengerPanel {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis.navigationTabs = null;\n\t\tthis.currentViewComponent = null;\n\t\tthis.viewRegistry = {};\n\t\tthis._unsubscribe = null;\n\t}\n\n\tregisterView(name, ViewClass) {\n\t\tthis.viewRegistry[name] = ViewClass;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-panel messenger-panel-${this.options.position}`;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-panel-content\">\n\t\t\t\t<div class=\"messenger-panel-views\"></div>\n\t\t\t\t<div class=\"messenger-panel-nav\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.navigationTabs = new NavigationTabs(this.state, this.options);\n\t\tconst navContainer = this.element.querySelector('.messenger-panel-nav');\n\t\tnavContainer.appendChild(this.navigationTabs.render());\n\n\t\tthis._renderCurrentView();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange') {\n\t\t\t\tthis._renderCurrentView();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_renderCurrentView() {\n\t\tconst viewsContainer = this.element.querySelector('.messenger-panel-views');\n\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\n\t\tviewsContainer.innerHTML = '';\n\n\t\tconst ViewClass = this.viewRegistry[this.state.currentView];\n\t\tif (ViewClass) {\n\t\t\tthis.currentViewComponent = new ViewClass(this.state, this.options);\n\t\t\tviewsContainer.appendChild(this.currentViewComponent.render());\n\t\t} else {\n\t\t\tviewsContainer.innerHTML = `<div class=\"messenger-empty-state\">\n\t\t\t\t<p>View not found: ${this.state.currentView}</p>\n\t\t\t</div>`;\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tthis.element.classList.add('open');\n\t\t\t});\n\t\t}\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.classList.remove('open');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.display = 'none';\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t}\n\t}\n\n\tsetHeader(headerContent) {\n\t\tconst header = this.element.querySelector('.messenger-panel-header');\n\t\tif (header) {\n\t\t\theader.innerHTML = headerContent;\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.navigationTabs) {\n\t\t\tthis.navigationTabs.destroy();\n\t\t}\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ChangelogView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-changelog-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'changelogUpdate') {\n\t\t\t\tthis._updateChangelogList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-changelog-header\">\n\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-changelog-body\">\n\t\t\t\t<div class=\"messenger-changelog-list\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateChangelogList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateChangelogList() {\n\t\tconst changelogContainer = this.element.querySelector(\n\t\t\t'.messenger-changelog-list'\n\t\t);\n\t\tconst changelogItems = this.state.changelogItems;\n\n\t\tif (changelogItems.length === 0) {\n\t\t\tchangelogContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tchangelogContainer.innerHTML = changelogItems\n\t\t\t.map((item) => this._renderChangelogCard(item))\n\t\t\t.join('');\n\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_renderChangelogCard(item) {\n\t\tconst tagsHtml =\n\t\t\titem.tags && item.tags.length > 0\n\t\t\t\t? `<div class=\"messenger-changelog-tags\">\n\t\t\t\t${item.tags.map((tag) => `<span class=\"sdk-badge sdk-badge-primary messenger-changelog-tag\">${tag}</span>`).join('')}\n\t\t\t</div>`\n\t\t\t\t: '';\n\n\t\tconst dateStr = this._formatDate(item.publishedAt || item.date);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-changelog-content\">\n\t\t\t\t\t${tagsHtml}\n\t\t\t\t\t<h3 class=\"messenger-changelog-title\">${item.title}</h3>\n\t\t\t\t\t${item.description ? `<p class=\"messenger-changelog-description\">${this._truncateText(item.description, 100)}</p>` : ''}\n\t\t\t\t\t<div class=\"messenger-changelog-meta\">\n\t\t\t\t\t\t<span class=\"messenger-changelog-date\">${dateStr}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\">S</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">${avatarItems}</div>`;\n\t}\n\n\t_renderEmptyState() {\n\t\treturn `\n\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleDateString('en-US', {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\tyear: 'numeric',\n\t\t});\n\t}\n\n\t_truncateText(text, maxLength) {\n\t\tif (!text) return '';\n\t\tif (text.length <= maxLength) return text;\n\t\treturn text.substring(0, maxLength).trim() + '...';\n\t}\n\n\t_attachEvents() {\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_attachChangelogEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-changelog-card')\n\t\t\t.forEach((card) => {\n\t\t\t\tcard.addEventListener('click', () => {\n\t\t\t\t\tconst changelogId = card.dataset.changelogId;\n\t\t\t\t\tconst changelogItem = this.state.changelogItems.find(\n\t\t\t\t\t\t(n) => n.id === changelogId\n\t\t\t\t\t);\n\t\t\t\t\tif (changelogItem && changelogItem.url) {\n\t\t\t\t\t\twindow.open(changelogItem.url, '_blank');\n\t\t\t\t\t} else if (this.options.onChangelogClick) {\n\t\t\t\t\t\tthis.options.onChangelogClick(changelogItem);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ChatView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t\tthis._typingTimeout = null;\n\t\tthis._isTyping = false;\n\t\tthis._typingIndicator = null;\n\t\tthis._isConversationClosed = false;\n\t\tthis._pendingAttachments = [];\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-chat-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (\n\t\t\t\ttype === 'messageAdded' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t\tthis._appendMessage(data.message);\n\t\t\t\tthis._scrollToBottom();\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStarted' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._showTypingIndicator(data.userName);\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStopped' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t} else if (\n\t\t\t\ttype === 'conversationUpdated' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t} else if (\n\t\t\t\ttype === 'messagesUpdate' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst conversation = this.state.getActiveConversation();\n\t\tconst messages = this.state.getActiveMessages();\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\t\tconst isClosed = !isNewConversation && conversation?.status === 'closed';\n\t\tthis._isConversationClosed = isClosed;\n\n\t\tconst messagesHtml =\n\t\t\tmessages.length === 0\n\t\t\t\t? this._renderEmptyState(isNewConversation)\n\t\t\t\t: messages.map((msg) => this._renderMessage(msg)).join('');\n\n\t\tconst title = isNewConversation\n\t\t\t? 'New conversation'\n\t\t\t: conversation?.title || 'Chat with team';\n\t\tconst placeholder = isNewConversation\n\t\t\t? 'Start typing your message...'\n\t\t\t: isClosed\n\t\t\t\t? 'Conversation closed'\n\t\t\t\t: 'Write a message...';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-chat-header\">\n\t\t\t\t<button class=\"sdk-btn-icon messenger-back-btn\" aria-label=\"Back\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-chat-header-info\">\n\t\t\t\t\t<span class=\"messenger-chat-title\">${title}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-chat-messages\">\n\t\t\t\t${messagesHtml}\n\t\t\t\t${\n\t\t\t\t\tisClosed\n\t\t\t\t\t\t? `\n\t\t\t\t<div class=\"messenger-closed-banner\">\n\t\t\t\t\t<i class=\"ph ph-check-circle\"></i>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-typing-indicator\">\n\t\t\t\t\t<div class=\"messenger-typing-dots\">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"messenger-typing-text\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${\n\t\t\t\tisClosed\n\t\t\t\t\t? ''\n\t\t\t\t\t: `\n\t\t\t<div class=\"messenger-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"messenger-chat-compose\">\n\t\t\t\t<button class=\"sdk-btn-icon messenger-compose-attach\" aria-label=\"Attach file\">\n\t\t\t\t\t<i class=\"ph ph-paperclip\"></i>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-compose-input-wrapper\">\n\t\t\t\t\t<textarea class=\"messenger-compose-input\" placeholder=\"${placeholder}\" rows=\"1\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"messenger-compose-send\" aria-label=\"Send\" disabled>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14L118.42,148.9l47.24-47.25a8,8,0,0,0-11.31-11.31L107.1,137.58,24,98.22l.14,0L216,40Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<input type=\"file\" class=\"messenger-compose-file-input\" multiple accept=\"image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip\" />\n\t\t\t</div>\n\t\t\t`\n\t\t\t}\n\t\t`;\n\n\t\tthis._typingIndicator = this.element.querySelector(\n\t\t\t'.messenger-typing-indicator'\n\t\t);\n\t\tthis._attachEvents();\n\t\tthis._scrollToBottom();\n\t\tthis._renderAttachmentPreviews();\n\t}\n\n\t_renderEmptyState(isNewConversation = false) {\n\t\tconst avatarHtml = this._renderTeamAvatars();\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\t\tconst isOnline = this.state.agentsOnline;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-chat-empty\">\n\t\t\t\t<div class=\"messenger-chat-empty-avatars\">${avatarHtml}</div>\n\t\t\t\t<h3>${isNewConversation ? 'Start a new conversation' : 'Start the conversation'}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class=\"messenger-chat-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot ${isOnline ? 'messenger-availability-online' : 'messenger-availability-away'}\"></span>\n\t\t\t\t\t<span>${isOnline ? \"We're online now\" : responseTime}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageAttachments(attachments) {\n\t\tif (!attachments || attachments.length === 0) return '';\n\t\treturn attachments\n\t\t\t.map((att) => {\n\t\t\t\tif (att.type === 'image') {\n\t\t\t\t\treturn `<img class=\"messenger-message-image\" src=\"${this._escapeHtml(att.url)}\" alt=\"${this._escapeHtml(att.name || 'image')}\" data-url=\"${this._escapeHtml(att.url)}\" />`;\n\t\t\t\t}\n\t\t\t\treturn `<a class=\"messenger-message-file\" href=\"${this._escapeHtml(att.url)}\" data-url=\"${this._escapeHtml(att.url)}\" data-name=\"${this._escapeHtml(att.name || 'file')}\">\n\t\t\t\t<i class=\"ph ph-file\"></i>\n\t\t\t\t<span>${this._escapeHtml(att.name || 'file')}</span>\n\t\t\t\t<i class=\"ph ph-download-simple messenger-file-download-icon\"></i>\n\t\t\t</a>`;\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\t_renderMessage(message) {\n\t\tconst isOwn = message.isOwn;\n\t\tconst messageClass = isOwn\n\t\t\t? 'messenger-message-own'\n\t\t\t: 'messenger-message-received';\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\t\tconst attachmentsHtml = this._renderMessageAttachments(message.attachments);\n\n\t\tconst contentHtml = message.content\n\t\t\t? `<div class=\"messenger-message-content\">${this._formatMessageContent(message.content)}</div>`\n\t\t\t: '';\n\t\tconst bubbleHtml = contentHtml\n\t\t\t? `<div class=\"messenger-message-bubble\">${contentHtml}</div>`\n\t\t\t: '';\n\n\t\tif (isOwn) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarHtml = this._renderSenderAvatar(message.sender);\n\t\treturn `\n\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t<div class=\"messenger-message-sender\">${message.sender?.name || 'Support'}</div>\n\t\t\t\t<div class=\"messenger-message-row\">\n\t\t\t\t\t<div class=\"messenger-message-avatar\">${avatarHtml}</div>\n\t\t\t\t\t<div class=\"messenger-message-wrapper\">\n\t\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSenderAvatar(sender) {\n\t\tif (sender?.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${sender.avatarUrl}\" alt=\"${sender.name}\" /></div>`;\n\t\t}\n\t\tconst initial = (sender?.name || 'S').charAt(0).toUpperCase();\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${initial}</div>`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_formatMessageTime(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\treturn date.toLocaleTimeString('en-US', {\n\t\t\thour: 'numeric',\n\t\t\tminute: '2-digit',\n\t\t\thour12: true,\n\t\t});\n\t}\n\n\t_formatMessageContent(content) {\n\t\tif (!content) return '';\n\t\treturn content\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.messenger-chat-empty');\n\t\tif (emptyState) {\n\t\t\temptyState.remove();\n\t\t}\n\n\t\tconst messageHtml = this._renderMessage(message);\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = messageHtml;\n\t\tmessagesContainer.appendChild(tempDiv.firstElementChild);\n\t}\n\n\t_scrollToBottom() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n\t\t\t}, 50);\n\t\t}\n\t}\n\n\t_updateSendButtonState() {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\t\tif (input && sendBtn) {\n\t\t\tsendBtn.disabled =\n\t\t\t\t!input.value.trim() && this._pendingAttachments.length === 0;\n\t\t}\n\t}\n\n\t_renderAttachmentPreviews() {\n\t\tconst container = this.element.querySelector(\n\t\t\t'.messenger-compose-attachments-preview'\n\t\t);\n\t\tif (!container) return;\n\n\t\tif (this._pendingAttachments.length === 0) {\n\t\t\tcontainer.innerHTML = '';\n\t\t\tcontainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.display = 'flex';\n\t\tcontainer.innerHTML = this._pendingAttachments\n\t\t\t.map((att, i) => {\n\t\t\t\tconst isImage = att.type.startsWith('image');\n\t\t\t\tconst thumb = isImage\n\t\t\t\t\t? `<img class=\"messenger-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t\t: `<div class=\"messenger-attachment-thumb messenger-attachment-file-icon\"><i class=\"ph ph-file\"></i></div>`;\n\t\t\t\treturn `\n\t\t\t\t<div class=\"messenger-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"messenger-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">×</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tcontainer\n\t\t\t.querySelectorAll('.messenger-attachment-remove')\n\t\t\t.forEach((btn) => {\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-back-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('messages');\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\n\t\tif (input && sendBtn) {\n\t\t\tinput.addEventListener('input', () => {\n\t\t\t\tinput.style.height = 'auto';\n\t\t\t\tinput.style.height = Math.min(input.scrollHeight, 120) + 'px';\n\t\t\t\tthis._updateSendButtonState();\n\n\t\t\t\tif (input.value.trim()) {\n\t\t\t\t\tthis._startTyping();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._sendMessage();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsendBtn.addEventListener('click', () => {\n\t\t\t\tthis._sendMessage();\n\t\t\t});\n\t\t}\n\n\t\tconst attachBtn = this.element.querySelector('.messenger-compose-attach');\n\t\tconst fileInput = this.element.querySelector(\n\t\t\t'.messenger-compose-file-input'\n\t\t);\n\n\t\tif (attachBtn && fileInput) {\n\t\t\tattachBtn.addEventListener('click', () => {\n\t\t\t\tfileInput.click();\n\t\t\t});\n\n\t\t\tfileInput.addEventListener('change', (e) => {\n\t\t\t\tconst files = e.target.files;\n\t\t\t\tif (!files) return;\n\t\t\t\tArray.from(files).forEach((file) => {\n\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\treader.onload = (ev) => {\n\t\t\t\t\t\tthis._pendingAttachments.push({\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tpreview: ev.target.result,\n\t\t\t\t\t\t\ttype: file.type,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t\t};\n\t\t\t\t\treader.readAsDataURL(file);\n\t\t\t\t});\n\t\t\t\tfileInput.value = '';\n\t\t\t});\n\t\t}\n\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tmessagesContainer.addEventListener('click', (e) => {\n\t\t\t\tconst fileLink = e.target.closest('.messenger-message-file');\n\t\t\t\tif (fileLink) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst url = fileLink.dataset.url;\n\t\t\t\t\tconst name = fileLink.dataset.name;\n\t\t\t\t\tthis._downloadFile(url, name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst img = e.target.closest('.messenger-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst content = input.value.trim();\n\t\tconst hasAttachments = this._pendingAttachments.length > 0;\n\n\t\tif (!content && !hasAttachments) return;\n\n\t\tthis._stopTyping();\n\n\t\tconst attachmentsToSend = [...this._pendingAttachments];\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\n\t\tif (isNewConversation) {\n\t\t\tif (this.options.onStartConversation) {\n\t\t\t\tthis.options.onStartConversation(content, attachmentsToSend);\n\t\t\t}\n\t\t} else {\n\t\t\tconst message = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tattachments: attachmentsToSend.map((a) => ({\n\t\t\t\t\turl: a.preview,\n\t\t\t\t\ttype: a.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: a.file.name,\n\t\t\t\t})),\n\t\t\t};\n\n\t\t\tthis.state.addMessage(this.state.activeConversationId, message);\n\n\t\t\tif (this.options.onSendMessage) {\n\t\t\t\tthis.options.onSendMessage(\n\t\t\t\t\tthis.state.activeConversationId,\n\t\t\t\t\tmessage,\n\t\t\t\t\tattachmentsToSend\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tinput.value = '';\n\t\tinput.style.height = 'auto';\n\t\tthis._pendingAttachments = [];\n\t\tthis._renderAttachmentPreviews();\n\t\tthis._updateSendButtonState();\n\t}\n\n\t_startTyping() {\n\t\tif (this._isConversationClosed) return;\n\t\tif (!this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = true;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, true);\n\t\t\t}\n\t\t}\n\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._typingTimeout = setTimeout(() => {\n\t\t\tthis._stopTyping();\n\t\t}, 3000);\n\t}\n\n\t_stopTyping() {\n\t\tif (this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = false;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, false);\n\t\t\t}\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t\tthis._typingTimeout = null;\n\t\t}\n\t}\n\n\t_showTypingIndicator(userName) {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'flex';\n\t\t\tconst textEl = this._typingIndicator.querySelector(\n\t\t\t\t'.messenger-typing-text'\n\t\t\t);\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = `${userName || 'Support'} is typing...`;\n\t\t\t}\n\t\t\tthis._scrollToBottom();\n\t\t}\n\t}\n\n\t_hideTypingIndicator() {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._stopTyping();\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ConversationsView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t\tthis.avatarColors = [\n\t\t\t'#155EEF',\n\t\t\t'#8b5cf6',\n\t\t\t'#10b981',\n\t\t\t'#f59e0b',\n\t\t\t'#ef4444',\n\t\t\t'#ec4899',\n\t\t\t'#06b6d4',\n\t\t];\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-conversations-view';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'conversationAdded' ||\n\t\t\t\ttype === 'conversationRead' ||\n\t\t\t\ttype === 'conversationUpdated'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_getAvatarColor(name) {\n\t\t// Generate consistent color based on name\n\t\tconst charCode = (name || 'S').charCodeAt(0);\n\t\treturn this.avatarColors[charCode % this.avatarColors.length];\n\t}\n\n\t_updateContent() {\n\t\tconst conversations = this.state.conversations;\n\n\t\tlet conversationsHtml;\n\t\tif (conversations.length === 0) {\n\t\t\tconversationsHtml = `\n <div class=\"messenger-empty-state\">\n <div class=\"messenger-empty-state-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z\"></path>\n </svg>\n </div>\n <h3>No conversations yet</h3>\n <p>Start a new conversation with our team</p>\n </div>\n `;\n\t\t} else {\n\t\t\tconversationsHtml = `\n <div class=\"messenger-conversations-list\">\n ${conversations.map((conv) => this._renderConversationItem(conv)).join('')}\n </div>\n `;\n\t\t}\n\n\t\tthis.element.innerHTML = `\n <div class=\"messenger-conversations-header\">\n <h2>Messages</h2>\n <button class=\"sdk-close-btn\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n </svg>\n </button>\n </div>\n\n <div class=\"messenger-conversations-body\">\n ${conversationsHtml}\n </div>\n\n <div class=\"messenger-conversations-footer\">\n <button class=\"messenger-new-message-btn\">\n <span>Send us a message</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" style=\"flex-shrink: 0;\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"144\" y1=\"128\" x2=\"80\" y2=\"128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <path d=\"M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n </button>\n </div>\n `;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderConversationItem(conversation) {\n\t\tconst unreadClass = conversation.unread > 0 ? 'unread' : '';\n\t\tconst timeAgo = this._formatTimeAgo(conversation.lastMessageTime);\n\t\tconst avatarsHtml = this._renderConversationAvatars(\n\t\t\tconversation.participants\n\t\t);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-conversation-item ${unreadClass}\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"messenger-conversation-avatars\">\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-conversation-content\">\n\t\t\t\t\t<div class=\"messenger-conversation-header\">\n\t\t\t\t\t\t<span class=\"messenger-conversation-title\">${conversation.title || 'Chat with team'}</span>\n\t\t\t\t\t\t<span class=\"messenger-conversation-time\">${timeAgo}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-conversation-preview\">\n\t\t\t\t\t\t${conversation.unread > 0 ? '<span class=\"messenger-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t<span class=\"messenger-conversation-message\">${this._truncateMessage(conversation.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderConversationAvatars(participants) {\n\t\tif (!participants || participants.length === 0) {\n\t\t\tconst color = this._getAvatarColor('S');\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\" style=\"background-color: ${color};\">S</div>`;\n\t\t}\n\n\t\tconst p = participants[0];\n\t\tif (p.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${p.avatarUrl}\" alt=\"${p.name}\" /></div>`;\n\t\t}\n\t\tconst initial = (p.name || 'S').charAt(0).toUpperCase();\n\t\tconst color = this._getAvatarColor(p.name);\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\" style=\"background-color: ${color};\">${initial}</div>`;\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\tconst color1 = this._getAvatarColor('S');\n\t\t\tconst color2 = this._getAvatarColor('T');\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\" style=\"background-color: ${color1};\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\" style=\"background-color: ${color2};\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar, index) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\tconst initial = avatar.charAt(0).toUpperCase();\n\t\t\t\tconst color = this._getAvatarColor(avatar);\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\" style=\"background-color: ${color};\">${initial}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_formatTimeAgo(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\tconst now = new Date();\n\t\tconst diffMs = now - date;\n\t\tconst diffMins = Math.floor(diffMs / 60000);\n\t\tconst diffHours = Math.floor(diffMs / 3600000);\n\t\tconst diffDays = Math.floor(diffMs / 86400000);\n\n\t\tif (diffMins < 1) return 'now';\n\t\tif (diffMins < 60) return `${diffMins}m`;\n\t\tif (diffHours < 24) return `${diffHours}h`;\n\t\tif (diffDays < 7) return `${diffDays}d`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_truncateMessage(message) {\n\t\tif (!message) return 'No messages yet';\n\t\tconst maxLength = 50;\n\t\tif (message.length <= maxLength) return message;\n\t\treturn message.substring(0, maxLength) + '...';\n\t}\n\n\t_attachEvents() {\n\t\tconst closeBtn = this.element.querySelector('.sdk-close-btn');\n\t\tif (closeBtn) {\n\t\t\tcloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-conversation-item')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst convId = item.dataset.conversationId;\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.markAsRead(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst newMsgBtn = this.element.querySelector('.messenger-new-message-btn');\n\t\tif (newMsgBtn) {\n\t\t\tnewMsgBtn.addEventListener('click', () => {\n\t\t\t\tthis._startNewConversation();\n\t\t\t});\n\t\t}\n\t}\n\n\t_startNewConversation() {\n\t\t// If there's an open conversation, route to it instead of creating new\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.state.setActiveConversation(openConversation.id);\n\t\t\tthis.state.markAsRead(openConversation.id);\n\t\t\tthis.state.setView('chat');\n\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\tthis.options.onSelectConversation(openConversation.id);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.state.setActiveConversation(null);\n\t\t\tif (this.options.onStartNewConversation) {\n\t\t\t\tthis.options.onStartNewConversation();\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class HelpView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-help-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'helpArticlesUpdate' || type === 'helpSearchChange') {\n\t\t\t\tthis._updateCollectionsList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst searchQuery = this.state.helpSearchQuery || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-help-header\">\n\t\t\t\t<div class=\"messenger-help-header-top\">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclass=\"messenger-help-search-input\"\n\t\t\t\t\tplaceholder=\"Search for help...\"\n\t\t\t\t\tvalue=\"${searchQuery}\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-help-body\">\n\t\t\t\t<div class=\"messenger-help-collections\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateCollectionsList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateCollectionsList() {\n\t\tconst collectionsContainer = this.element.querySelector(\n\t\t\t'.messenger-help-collections'\n\t\t);\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst searchQuery = (this.state.helpSearchQuery || '').toLowerCase();\n\n\t\tconst filteredCollections = searchQuery\n\t\t\t? collections.filter(\n\t\t\t\t\t(c) =>\n\t\t\t\t\t\tc.title.toLowerCase().includes(searchQuery) ||\n\t\t\t\t\t\t(c.description && c.description.toLowerCase().includes(searchQuery))\n\t\t\t\t)\n\t\t\t: collections;\n\n\t\tconst headerEl = this.element.querySelector(\n\t\t\t'.messenger-help-collections-header'\n\t\t);\n\t\tif (headerEl) {\n\t\t\theaderEl.textContent = `${filteredCollections.length} collections`;\n\t\t}\n\n\t\tif (filteredCollections.length === 0) {\n\t\t\tcollectionsContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tcollectionsContainer.innerHTML = filteredCollections\n\t\t\t.map((collection) => this._renderCollectionItem(collection))\n\t\t\t.join('');\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_renderCollectionItem(collection) {\n\t\tconst articleCount = collection.articleCount || 0;\n\t\treturn `\n\t\t\t<div class=\"messenger-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t<div class=\"messenger-help-collection-content\">\n\t\t\t\t\t<h3 class=\"messenger-help-collection-title\">${collection.title}</h3>\n\t\t\t\t\t<p class=\"messenger-help-collection-desc\">${collection.description || ''}</p>\n\t\t\t\t\t<span class=\"messenger-help-collection-count\">${articleCount} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\" class=\"messenger-help-collection-arrow\">\n\t\t\t\t\t<path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\"></path>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderEmptyState() {\n\t\tconst isSearching = this.state.helpSearchQuery;\n\n\t\tif (isSearching) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst searchInput = this.element.querySelector(\n\t\t\t'.messenger-help-search-input'\n\t\t);\n\t\tlet searchTimeout;\n\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\tclearTimeout(searchTimeout);\n\t\t\tsearchTimeout = setTimeout(() => {\n\t\t\t\tthis.state.setHelpSearchQuery(e.target.value);\n\t\t\t}, 300);\n\t\t});\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_attachCollectionEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-help-collection')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst collectionId = item.dataset.collectionId;\n\t\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t\t(c) => c.id === collectionId\n\t\t\t\t\t);\n\t\t\t\t\tif (collection && collection.url) {\n\t\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class HomeView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-home-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'homeChangelogUpdate' ||\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'availabilityUpdate'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-home-scroll\">\n\t\t\t\t<div class=\"messenger-home-header\">\n\t\t\t\t\t<div class=\"messenger-home-header-top\">\n\t\t\t\t\t\t<div class=\"messenger-home-logo\">\n\t\t\t\t\t\t\t${this.options.logoUrl ? `<img src=\"${this.options.logoUrl}\" alt=\"${this.state.teamName}\" />` : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-home-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-home-welcome\">\n\t\t\t\t\t\t<span class=\"messenger-home-greeting\">Hi there 👋</span>\n\t\t\t\t\t\t<span class=\"messenger-home-question\">${this.state.welcomeMessage}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"messenger-home-body\">\n\t\t\t\t\t${this._renderMessageButton()}\n\t\t\t\t\t${this._renderFeaturedCard()}\n\t\t\t\t\t${recentChangelogHtml}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tconst colors = ['#5856d6', '#007aff', '#34c759', '#ff9500'];\n\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-lg\" style=\"background: ${colors[0]};\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-lg\" style=\"background: ${colors[1]};\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 4)\n\t\t\t.map((avatar, index) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-lg\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-lg\" style=\"background: ${colors[index % colors.length]};\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_renderAvailabilityStatus() {\n\t\tconst isOnline = this.state.agentsOnline;\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\n\t\tif (isOnline) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-online\"></span>\n\t\t\t\t\t<span class=\"messenger-availability-text\">We're online now</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-away\"></span>\n\t\t\t\t<span class=\"messenger-availability-text\">${responseTime}</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageButton() {\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tconst sendIcon = `\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" style=\"flex-shrink: 0;\">\n\t\t\t\t<rect width=\"256\" height=\"256\" fill=\"none\"/>\n\t\t\t\t<line x1=\"144\" y1=\"128\" x2=\"80\" y2=\"128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t\t<path d=\"M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t</svg>\n\t\t`;\n\n\t\tconst caretIcon = `\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" style=\"flex-shrink: 0;\">\n\t\t\t\t<rect width=\"256\" height=\"256\" fill=\"none\"/>\n\t\t\t\t<polyline points=\"96 48 176 128 96 208\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t</svg>\n\t\t`;\n\n\t\tif (openConversation) {\n\t\t\treturn `\n\t\t\t\t<button class=\"messenger-home-message-btn messenger-home-continue-btn\" data-conversation-id=\"${openConversation.id}\">\n\t\t\t\t\t<div class=\"messenger-home-continue-info\">\n\t\t\t\t\t\t<span class=\"messenger-home-continue-label\">Continue conversation</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t${sendIcon}\n\t\t\t\t</button>\n\t\t\t\t<button class=\"messenger-home-message-btn messenger-feedback-btn\" data-action=\"feedback\">\n\t\t\t\t\t<span class=\"messenger-home-continue-label\">Leave us feedback</span>\n\t\t\t\t\t${caretIcon}\n\t\t\t\t</button>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<button class=\"messenger-home-message-btn\">\n\t\t\t\t<span>Start a conversation</span>\n\t\t\t\t${sendIcon}\n\t\t\t</button>\n\t\t\t<button class=\"messenger-home-message-btn messenger-feedback-btn\" data-action=\"feedback\">\n\t\t\t\t<span>Leave us feedback</span>\n\t\t\t\t${caretIcon}\n\t\t\t</button>\n\t\t`;\n\t}\n\n\t_renderFeaturedCard() {\n\t\tif (!this.options.featuredContent) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst { title, description, imageUrl, action } =\n\t\t\tthis.options.featuredContent;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-featured\">\n\t\t\t\t${imageUrl ? `<img src=\"${imageUrl}\" alt=\"${title}\" class=\"messenger-home-featured-image\" onerror=\"this.style.display='none';\" />` : ''}\n\t\t\t\t<div class=\"messenger-home-featured-content\">\n\t\t\t\t\t<h3>${title}</h3>\n\t\t\t\t\t<p>${description}</p>\n\t\t\t\t</div>\n\t\t\t\t${action ? `<button class=\"sdk-btn sdk-btn-primary messenger-home-featured-btn\" data-action=\"${action.type}\" data-value=\"${action.value}\">${action.label}</button>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderRecentChangelog() {\n\t\tconst changelogItems = this.state.homeChangelogItems;\n\t\tif (changelogItems.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst changelogHtml = changelogItems\n\t\t\t.map(\n\t\t\t\t(item) => `\n\t\t\t<div class=\"messenger-home-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-home-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t\t${item.coverText ? `<span class=\"messenger-home-changelog-cover-text\">${item.coverText}</span>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-home-changelog-card-content\">\n\t\t\t\t\t<h4 class=\"messenger-home-changelog-card-title\">${item.title}</h4>\n\t\t\t\t\t<p class=\"messenger-home-changelog-card-desc\">${item.description || ''}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-changelog-section\">\n\t\t\t\t${changelogHtml}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffDays = Math.floor((now - date) / (1000 * 60 * 60 * 24));\n\n\t\tif (diffDays === 0) return 'Today';\n\t\tif (diffDays === 1) return 'Yesterday';\n\t\tif (diffDays < 7) return `${diffDays}d ago`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst msgBtn = this.element.querySelector(\n\t\t\t'.messenger-home-message-btn:not(.messenger-feedback-btn)'\n\t\t);\n\t\tif (msgBtn) {\n\t\t\tmsgBtn.addEventListener('click', () => {\n\t\t\t\tconst convId = msgBtn.dataset.conversationId;\n\t\t\t\tif (convId) {\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.state.setActiveConversation(null);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst feedbackBtn = this.element.querySelector('.messenger-feedback-btn');\n\t\tif (feedbackBtn) {\n\t\t\tfeedbackBtn.addEventListener('click', () => {\n\t\t\t\tconst url = this.state.urls?.feedback;\n\n\t\t\t\tif (this.options.onFeedbackClick) {\n\t\t\t\t\tthis.options.onFeedbackClick();\n\t\t\t\t} else if (url) {\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'[Messenger] No feedback destination configured. Set `feedbackUrl` in MessengerWidget options.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-home-changelog-card')\n\t\t\t.forEach((card) => {\n\t\t\t\tcard.addEventListener('click', () => {\n\t\t\t\t\tconst item = this.state.homeChangelogItems.find(\n\t\t\t\t\t\t(i) => i.id === card.dataset.changelogId\n\t\t\t\t\t);\n\t\t\t\t\tif (item?.url) {\n\t\t\t\t\t\twindow.open(item.url, '_blank');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.state.setView('changelog');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst seeAllBtn = this.element.querySelector(\n\t\t\t'.messenger-home-changelog-all'\n\t\t);\n\t\tif (seeAllBtn) {\n\t\t\tseeAllBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('changelog');\n\t\t\t});\n\t\t}\n\n\t\tconst featuredBtn = this.element.querySelector(\n\t\t\t'.messenger-home-featured-btn'\n\t\t);\n\t\tif (featuredBtn) {\n\t\t\tfeaturedBtn.addEventListener('click', () => {\n\t\t\t\tconst action = featuredBtn.dataset.action;\n\t\t\t\tconst value = featuredBtn.dataset.value;\n\t\t\t\tif (action === 'url') {\n\t\t\t\t\twindow.open(value, '_blank');\n\t\t\t\t} else if (action === 'view') {\n\t\t\t\t\tthis.state.setView(value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class PreChatFormView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._isSubmitting = false;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-prechat-view';\n\n\t\tthis._updateContent();\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst existingName = this.state.userContext?.name || '';\n\t\tconst existingEmail = this.state.userContext?.email || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-prechat-overlay\">\n\t\t\t\t<div class=\"messenger-prechat-card\">\n\t\t\t\t\t<h4 class=\"messenger-prechat-title\">Get notified when we reply</h4>\n\t\t\t\t\t<form class=\"sdk-form-group\" novalidate>\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-name\"\n\t\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\t\tplaceholder=\"Name (optional)\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingName)}\"\n\t\t\t\t\t\t\t\tautocomplete=\"name\"\n\t\t\t\t\t\t\t\tclass=\"sdk-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-email\"\n\t\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t\tplaceholder=\"Email address\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingEmail)}\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t\tclass=\"sdk-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class=\"messenger-prechat-error\" id=\"messenger-email-error\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-prechat-actions\">\n\t\t\t\t\t\t\t<button type=\"button\" class=\"sdk-btn sdk-btn-secondary messenger-prechat-skip\">Skip</button>\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"sdk-btn sdk-btn-primary sdk-btn-block messenger-prechat-submit\" disabled>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-text\">Continue</span>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-loading\">\n\t\t\t\t\t\t\t\t\t<i class=\"ph ph-spinner\"></i>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('form');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst skipBtn = this.element.querySelector('.messenger-prechat-skip');\n\n\t\tconst validateForm = () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tconst isEmailValid = this._isValidEmail(email);\n\t\t\tsubmitBtn.disabled = !isEmailValid;\n\t\t\treturn isEmailValid;\n\t\t};\n\n\t\temailInput.addEventListener('input', () => {\n\t\t\tthis._clearError('messenger-email-error');\n\t\t\tvalidateForm();\n\t\t});\n\n\t\temailInput.addEventListener('blur', () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tif (email && !this._isValidEmail(email)) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t}\n\t\t});\n\n\t\tskipBtn.addEventListener('click', () => {\n\t\t\tthis.state.setView('chat');\n\t\t});\n\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this._isSubmitting) return;\n\t\t\tif (!validateForm()) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._handleSubmit();\n\t\t});\n\n\t\tvalidateForm();\n\n\t\tsetTimeout(() => emailInput.focus(), 100);\n\t}\n\n\t_isValidEmail(email) {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\treturn emailRegex.test(email);\n\t}\n\n\t_showError(elementId, message) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = message;\n\t\t\terrorEl.style.display = 'block';\n\t\t}\n\t}\n\n\t_clearError(elementId) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = '';\n\t\t\terrorEl.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst nameInput = this.element.querySelector('#messenger-prechat-name');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst submitText = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-text'\n\t\t);\n\t\tconst submitLoading = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-loading'\n\t\t);\n\n\t\tconst name = nameInput.value.trim();\n\t\tconst email = emailInput.value.trim();\n\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitText.style.display = 'none';\n\t\tsubmitLoading.style.display = 'inline-flex';\n\n\t\ttry {\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\tthis.state.setIdentified(true, { name, email });\n\n\t\t\tthis._isSubmitting = false;\n\n\t\t\tconst pendingMessage = this.state.pendingMessage;\n\t\t\tif (pendingMessage && this.options.onStartConversation) {\n\t\t\t\tthis.state.pendingMessage = null;\n\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\tawait this.options.onStartConversation(\n\t\t\t\t\tpendingMessage.content,\n\t\t\t\t\tpendingMessage.attachments\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[PreChatFormView] Error submitting form:', error);\n\t\t\tthis._showError(\n\t\t\t\t'messenger-email-error',\n\t\t\t\t'Something went wrong. Please try again.'\n\t\t\t);\n\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitText.style.display = 'inline';\n\t\t\tsubmitLoading.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { WebSocketService } from '../core/WebSocketService.js';\nimport {\n\tapplyMessengerCustomStyles,\n\tremoveMessengerCustomStyles,\n} from '../styles/messengerCustomStyles.js';\nimport { BaseWidget } from './BaseWidget.js';\nimport { MessengerState } from './messenger/MessengerState.js';\nimport { MessengerLauncher } from './messenger/components/MessengerLauncher.js';\nimport { MessengerPanel } from './messenger/components/MessengerPanel.js';\nimport { ChangelogView } from './messenger/views/ChangelogView.js';\nimport { ChatView } from './messenger/views/ChatView.js';\nimport { ConversationsView } from './messenger/views/ConversationsView.js';\nimport { HelpView } from './messenger/views/HelpView.js';\nimport { HomeView } from './messenger/views/HomeView.js';\nimport { PreChatFormView } from './messenger/views/PreChatFormView.js';\n\nexport class MessengerWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'messenger' });\n\n\t\tthis.messengerOptions = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || 'light',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\ttextColor: options.textColor || '#1d1d1f',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\tlogoUrl: options.logoUrl || 'https://product7.io/p7logo.svg',\n\t\t\tteamName: options.teamName || 'Support',\n\t\t\tteamAvatars: options.teamAvatars || [],\n\t\t\twelcomeMessage: options.welcomeMessage || 'How can we help?',\n\t\t\tenableHelp: options.enableHelp !== false,\n\t\t\tenableChangelog: options.enableChangelog !== false,\n\t\t\tfeaturedContent: options.featuredContent || null,\n\t\t\tfeedbackUrl: options.feedbackUrl || null,\n\t\t\tchangelogUrl: options.changelogUrl || null,\n\t\t\thelpUrl: options.helpUrl || null,\n\t\t\troadmapUrl: options.roadmapUrl || null,\n\t\t\tonSendMessage: options.onSendMessage || null,\n\t\t\tonFeedbackClick: options.onFeedbackClick || null,\n\t\t\tonArticleClick: options.onArticleClick || null,\n\t\t\tonChangelogClick: options.onChangelogClick || null,\n\t\t};\n\n\t\tthis.messengerState = new MessengerState({\n\t\t\tteamName: this.messengerOptions.teamName,\n\t\t\tteamAvatars: this.messengerOptions.teamAvatars,\n\t\t\twelcomeMessage: this.messengerOptions.welcomeMessage,\n\t\t\tenableHelp: this.messengerOptions.enableHelp,\n\t\t\tenableChangelog: this.messengerOptions.enableChangelog,\n\t\t\tuserContext: this.sdk?.apiService?.getUserContext() || null,\n\t\t\turls: {\n\t\t\t\tfeedback: this.messengerOptions.feedbackUrl,\n\t\t\t\tchangelog: this.messengerOptions.changelogUrl,\n\t\t\t\thelp: this.messengerOptions.helpUrl,\n\t\t\t\troadmap: this.messengerOptions.roadmapUrl,\n\t\t\t},\n\t\t});\n\n\t\tthis.launcher = null;\n\t\tthis.panel = null;\n\t\tthis.wsService = null;\n\t\tthis._wsUnsubscribers = [];\n\n\t\tthis._handleOpenChange = this._handleOpenChange.bind(this);\n\t\tthis._handleWebSocketMessage = this._handleWebSocketMessage.bind(this);\n\t\tthis._handleTypingStarted = this._handleTypingStarted.bind(this);\n\t\tthis._handleTypingStopped = this._handleTypingStopped.bind(this);\n\t\tthis._handleConversationClosed = this._handleConversationClosed.bind(this);\n\t}\n\n\t_render() {\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = `messenger-widget theme-${this.messengerOptions.theme}`;\n\t\tcontainer.style.zIndex = '999999';\n\n\t\tapplyMessengerCustomStyles({\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\ttextColor: this.messengerOptions.textColor,\n\t\t\tbackgroundColor: this.messengerOptions.backgroundColor,\n\t\t\ttheme: this.messengerOptions.theme,\n\t\t});\n\n\t\tthis.launcher = new MessengerLauncher(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t});\n\t\tcontainer.appendChild(this.launcher.render());\n\n\t\tthis.panel = new MessengerPanel(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\ttheme: this.messengerOptions.theme,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\tlogoUrl: this.messengerOptions.logoUrl,\n\t\t\tfeaturedContent: this.messengerOptions.featuredContent,\n\t\t\tonSendMessage:\n\t\t\t\tthis.messengerOptions.onSendMessage ||\n\t\t\t\tthis._handleSendMessage.bind(this),\n\t\t\tonStartConversation: this._handleStartConversation.bind(this),\n\t\t\tonTyping: this.sendTypingIndicator.bind(this),\n\t\t\tonSelectConversation: this._handleSelectConversation.bind(this),\n\t\t\tonStartNewConversation: this._handleNewConversationClick.bind(this),\n\t\t\tonIdentifyContact: this._handleIdentifyContact.bind(this),\n\t\t\tonFeedbackClick: this.messengerOptions.onFeedbackClick,\n\t\t\tonArticleClick: this.messengerOptions.onArticleClick,\n\t\t\tonChangelogClick: this.messengerOptions.onChangelogClick,\n\t\t});\n\n\t\tthis.panel.registerView('home', HomeView);\n\t\tthis.panel.registerView('messages', ConversationsView);\n\t\tthis.panel.registerView('chat', ChatView);\n\t\tthis.panel.registerView('prechat', PreChatFormView);\n\t\tthis.panel.registerView('help', HelpView);\n\t\tthis.panel.registerView('changelog', ChangelogView);\n\n\t\tcontainer.appendChild(this.panel.render());\n\t\tthis.panel.hide();\n\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\tthis._stateUnsubscribe = this.messengerState.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._handleOpenChange(data.isOpen);\n\t\t\t}\n\t\t\tif (type === 'conversationChange') {\n\t\t\t\tthis._handleActiveConversationChange(\n\t\t\t\t\tdata.conversationId,\n\t\t\t\t\tdata.previousConversationId\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\t_handleOpenChange(isOpen) {\n\t\tif (isOpen) {\n\t\t\tthis.panel.show();\n\t\t\tthis.sdk.eventBus.emit('messenger:opened', { widget: this });\n\t\t} else {\n\t\t\tthis.panel.hide();\n\t\t\tthis.messengerState.reset();\n\t\t\tthis.sdk.eventBus.emit('messenger:closed', { widget: this });\n\t\t}\n\t}\n\n\t_handleActiveConversationChange(conversationId, previousConversationId) {\n\t\tif (previousConversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:unsubscribe', {\n\t\t\t\tconversation_id: previousConversationId,\n\t\t\t});\n\t\t}\n\t\tif (conversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _handleStartConversation(messageContent, pendingAttachments) {\n\t\ttry {\n\t\t\tif (!this.messengerState.isIdentified) {\n\t\t\t\tthis.messengerState.pendingMessage = {\n\t\t\t\t\tcontent: messageContent,\n\t\t\t\t\tattachments: pendingAttachments,\n\t\t\t\t};\n\t\t\t\tthis.messengerState.setView('prechat');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t\t(c) => c.status === 'open'\n\t\t\t);\n\n\t\t\tif (openConversation) {\n\t\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\t\tawait this._handleSendMessage(\n\t\t\t\t\topenConversation.id,\n\t\t\t\t\t{ content: messageContent },\n\t\t\t\t\tpendingAttachments\n\t\t\t\t);\n\t\t\t\treturn openConversation;\n\t\t\t}\n\n\t\t\treturn await this.startNewConversation(\n\t\t\t\tmessageContent,\n\t\t\t\t'',\n\t\t\t\tpendingAttachments\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync _handleSelectConversation(conversationId) {\n\t\ttry {\n\t\t\tawait this.fetchMessages(conversationId);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t}\n\t}\n\n\t_handleNewConversationClick() {\n\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\tthis.messengerState.setView('chat');\n\t\t\tthis._handleSelectConversation(openConversation.id);\n\t\t} else {\n\t\t\tthis.messengerState.setActiveConversation(null);\n\t\t\tthis.messengerState.setView('chat');\n\t\t}\n\t}\n\n\tasync _handleIdentifyContact(contactData) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.identifyContact({\n\t\t\t\tname: contactData.name,\n\t\t\t\temail: contactData.email,\n\t\t\t});\n\n\t\t\tif (response.status) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[MessengerWidget] Contact identified:',\n\t\t\t\t\tresponse.data.contact_id\n\t\t\t\t);\n\t\t\t\tthis.messengerState.setIdentified(true, {\n\t\t\t\t\tname: contactData.name,\n\t\t\t\t\temail: contactData.email,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to identify contact:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tmarkAsIdentified(name, email) {\n\t\tthis.messengerState.setIdentified(true, { name, email });\n\t\tconsole.log('[MessengerWidget] Marked as identified:', email);\n\t}\n\n\tasync _handleUploadFile(base64Data, filename) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.uploadFile(base64Data, filename);\n\t\t\tif (response.status && response.url) {\n\t\t\t\treturn response.url;\n\t\t\t}\n\t\t\tthrow new Error('Upload failed');\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to upload file:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync _uploadPendingAttachments(pendingAttachments) {\n\t\tif (!pendingAttachments || pendingAttachments.length === 0) return [];\n\n\t\tconst uploaded = [];\n\t\tfor (const att of pendingAttachments) {\n\t\t\ttry {\n\t\t\t\tconst cdnUrl = await this._handleUploadFile(att.preview, att.file.name);\n\t\t\t\tuploaded.push({\n\t\t\t\t\turl: cdnUrl,\n\t\t\t\t\ttype: att.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: att.file.name,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[MessengerWidget] Skipping failed attachment upload:',\n\t\t\t\t\tatt.file.name,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn uploaded;\n\t}\n\n\tasync _handleSendMessage(conversationId, message, pendingAttachments) {\n\t\tthis.sdk.eventBus.emit('messenger:messageSent', {\n\t\t\twidget: this,\n\t\t\tconversationId,\n\t\t\tmessage,\n\t\t});\n\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconst response = await this.apiService.sendMessage(conversationId, {\n\t\t\t\tcontent: message.content,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconsole.log('[MessengerWidget] Message sent:', response.data.id);\n\t\t\t}\n\n\t\t\tif (this.apiService?.mock) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst mockResponse = {\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: \"Thanks for your message! We'll get back to you soon.\",\n\t\t\t\t\t\tisOwn: false,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname: 'Support Team',\n\t\t\t\t\t\t\tavatarUrl: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tthis.messengerState.addMessage(conversationId, mockResponse);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to send message:', error);\n\t\t}\n\t}\n\n\t_handleWebSocketMessage(data) {\n\t\tconst { conversation_id, message } = data;\n\n\t\tlet attachments = [];\n\t\tif (message.attachments) {\n\t\t\ttry {\n\t\t\t\tattachments =\n\t\t\t\t\ttypeof message.attachments === 'string'\n\t\t\t\t\t\t? JSON.parse(message.attachments)\n\t\t\t\t\t\t: message.attachments;\n\t\t\t} catch (e) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\n\t\tconst localMessage = {\n\t\t\tid: message.id,\n\t\t\tcontent: message.content,\n\t\t\tisOwn: message.sender_type === 'customer',\n\t\t\ttimestamp: message.created_at,\n\t\t\tattachments: attachments.length > 0 ? attachments : undefined,\n\t\t\tsender: {\n\t\t\t\tname: message.sender_name || 'Support',\n\t\t\t\tavatarUrl: message.sender_avatar || null,\n\t\t\t},\n\t\t};\n\n\t\tthis.messengerState.addMessage(conversation_id, localMessage);\n\n\t\tif (\n\t\t\t!this.messengerState.isOpen ||\n\t\t\tthis.messengerState.activeConversationId !== conversation_id\n\t\t) {\n\t\t\tthis._updateUnreadCount();\n\t\t}\n\t}\n\n\t_handleTypingStarted(data) {\n\t\tif (data.is_agent) {\n\t\t\tthis.messengerState._notify('typingStarted', {\n\t\t\t\tconversationId: data.conversation_id,\n\t\t\t\tuserName: data.user_name,\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleTypingStopped(data) {\n\t\tthis.messengerState._notify('typingStopped', {\n\t\t\tconversationId: data.conversation_id,\n\t\t});\n\t}\n\n\t_handleConversationClosed(data) {\n\t\tconst conversationId =\n\t\t\tdata?.conversation_id || data?.id || data?.conversation?.id;\n\t\tif (!conversationId) return;\n\n\t\tthis.messengerState.updateConversation(conversationId, {\n\t\t\tstatus: 'closed',\n\t\t});\n\t}\n\n\tasync _updateUnreadCount() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getUnreadCount();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.unreadCount = response.data.unread_count || 0;\n\t\t\t\tthis.messengerState._notify('unreadCountChange', {\n\t\t\t\t\tcount: this.messengerState.unreadCount,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to get unread count:', error);\n\t\t}\n\t}\n\n\t_initWebSocket() {\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis.wsService = new WebSocketService({\n\t\t\tbaseURL: this.apiService.baseURL,\n\t\t\tworkspace: this.apiService.workspace,\n\t\t\tsessionToken: this.apiService.sessionToken,\n\t\t\tmock: this.apiService.mock,\n\t\t});\n\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('message', this._handleWebSocketMessage)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_started', this._handleTypingStarted)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_stopped', this._handleTypingStopped)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('conversation_closed', this._handleConversationClosed)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket connected');\n\t\t\t\tif (this.messengerState.activeConversationId) {\n\t\t\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\t\t\tconversation_id: this.messengerState.activeConversationId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('disconnected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket disconnected');\n\t\t\t})\n\t\t);\n\n\t\tthis.wsService.connect();\n\t}\n\n\topen() {\n\t\tthis.messengerState.setOpen(true);\n\t}\n\n\tclose() {\n\t\tthis.messengerState.setOpen(false);\n\t}\n\n\ttoggle() {\n\t\tthis.messengerState.setOpen(!this.messengerState.isOpen);\n\t}\n\n\tnavigateTo(view) {\n\t\tthis.messengerState.setView(view);\n\t\tif (!this.messengerState.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.messengerState.setConversations(conversations);\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tthis.messengerState.addMessage(conversationId, message);\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.messengerState.setHelpArticles(articles);\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.messengerState.setHomeChangelogItems(items);\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.messengerState.setChangelogItems(items);\n\t}\n\n\tsetUnreadCount(count) {\n\t\tthis.messengerState.unreadCount = count;\n\t\tthis.messengerState._notify('unreadCountChange', { count });\n\t}\n\n\tgetState() {\n\t\treturn {\n\t\t\tisOpen: this.messengerState.isOpen,\n\t\t\tcurrentView: this.messengerState.currentView,\n\t\t\tunreadCount: this.messengerState.unreadCount,\n\t\t\tconversations: this.messengerState.conversations,\n\t\t};\n\t}\n\n\tasync loadInitialData() {\n\t\ttry {\n\t\t\tconst conversations = await this._fetchConversations();\n\t\t\tthis.messengerState.setConversations(conversations);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to load conversations:', error);\n\t\t}\n\n\t\tif (this.messengerOptions.enableHelp) {\n\t\t\ttry {\n\t\t\t\tconst articles = await this._fetchHelpArticles();\n\t\t\t\tthis.messengerState.setHelpArticles(articles);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load help articles:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.messengerOptions.enableChangelog) {\n\t\t\ttry {\n\t\t\t\tconst { homeItems, changelogItems } = await this._fetchChangelog();\n\t\t\t\tthis.messengerState.setHomeChangelogItems(homeItems);\n\t\t\t\tthis.messengerState.setChangelogItems(changelogItems);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load changelog:', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _fetchConversations() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversations();\n\t\t\tif (response.status && response.data) {\n\t\t\t\treturn response.data.map((conv) => ({\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle:\n\t\t\t\t\t\tconv.subject ||\n\t\t\t\t\t\t`Chat with ${conv.assigned_user?.name || 'Support'}`,\n\t\t\t\t\tparticipants: conv.assigned_user\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: conv.assigned_user.name,\n\t\t\t\t\t\t\t\t\tavatarUrl: conv.assigned_user.avatar,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: conv.preview || conv.snippet || '',\n\t\t\t\t\tlastMessageTime: conv.last_message_at,\n\t\t\t\t\tunread: conv.unread || 0,\n\t\t\t\t\tstatus: conv.status,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch conversations:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync _fetchHelpArticles() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getHelpCollections();\n\t\t\tif (response.success && response.data) {\n\t\t\t\tconst collections = response.data.collections || response.data;\n\t\t\t\tconst helpBase = (this.messengerOptions.helpUrl || '').replace(\n\t\t\t\t\t/\\/$/,\n\t\t\t\t\t''\n\t\t\t\t);\n\n\t\t\t\treturn collections.map((collection) => ({\n\t\t\t\t\tid: collection.id,\n\t\t\t\t\ttitle: collection.title,\n\t\t\t\t\tdescription: collection.description || '',\n\t\t\t\t\tarticleCount: collection.article_count || 0,\n\t\t\t\t\turl:\n\t\t\t\t\t\tcollection.url_slug && helpBase\n\t\t\t\t\t\t\t? `${helpBase}/collections/${collection.url_slug}`\n\t\t\t\t\t\t\t: helpBase || null,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch help articles:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync fetchMessages(conversationId) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversation(conversationId);\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst messages = (response.data.messages || []).map((msg) => {\n\t\t\t\t\tlet attachments;\n\t\t\t\t\tif (msg.attachments) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattachments =\n\t\t\t\t\t\t\t\ttypeof msg.attachments === 'string'\n\t\t\t\t\t\t\t\t\t? JSON.parse(msg.attachments)\n\t\t\t\t\t\t\t\t\t: msg.attachments;\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t\tisOwn: msg.sender_type === 'customer',\n\t\t\t\t\t\ttimestamp: msg.created_at,\n\t\t\t\t\t\tattachments:\n\t\t\t\t\t\t\tattachments && attachments.length > 0 ? attachments : undefined,\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\tmsg.sender_name ||\n\t\t\t\t\t\t\t\t(msg.sender_type === 'customer' ? 'You' : 'Support'),\n\t\t\t\t\t\t\tavatarUrl: msg.sender_avatar || null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tthis.messengerState.setMessages(conversationId, messages);\n\n\t\t\t\tawait this.apiService.markConversationAsRead(conversationId);\n\t\t\t\tthis.messengerState.markAsRead(conversationId);\n\n\t\t\t\treturn messages;\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync startNewConversation(message, subject = '', pendingAttachments = []) {\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconst response = await this.apiService.startConversation({\n\t\t\t\tmessage,\n\t\t\t\tsubject,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst conv = response.data;\n\t\t\t\tconst newConversation = {\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle: conv.subject || 'New conversation',\n\t\t\t\t\tparticipants: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: message,\n\t\t\t\t\tlastMessageTime: conv.created_at || new Date().toISOString(),\n\t\t\t\t\tunread: 0,\n\t\t\t\t\tstatus: 'open',\n\t\t\t\t};\n\n\t\t\t\tthis.messengerState.addConversation(newConversation);\n\n\t\t\t\tthis.messengerState.setMessages(conv.id, [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: message,\n\t\t\t\t\t\tisOwn: true,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tthis.messengerState.setActiveConversation(conv.id);\n\t\t\t\tthis.messengerState.setView('chat');\n\n\t\t\t\treturn conv;\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\ttry {\n\t\t\tawait this.apiService.sendTypingIndicator(conversationId, isTyping);\n\t\t} catch (error) {\n\t\t\t// silent fail\n\t\t}\n\t}\n\n\tasync checkAgentAvailability() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.checkAgentsOnline();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.agentsOnline = response.data.agents_online;\n\t\t\t\tthis.messengerState.onlineCount = response.data.online_count || 0;\n\t\t\t\tthis.messengerState.responseTime = response.data.response_time || '';\n\n\t\t\t\tif (response.data.available_agents) {\n\t\t\t\t\tthis.messengerState.setTeamAvatarsFromAgents(\n\t\t\t\t\t\tresponse.data.available_agents\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.messengerState._notify('availabilityUpdate', response.data);\n\t\t\t\treturn response.data;\n\t\t\t}\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to check availability:', error);\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t}\n\t}\n\n\tasync _fetchChangelog() {\n\t\tif (this.apiService?.mock) {\n\t\t\treturn {\n\t\t\t\thomeItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_5',\n\t\t\t\t\t\ttitle: 'New integrations available',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Connect with more tools you love and streamline your workflow.',\n\t\t\t\t\t\ttags: ['Integration'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1674027444485-cec3da58eef4?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 14 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_2',\n\t\t\t\t\t\ttitle: 'A new era of Insights has arrived',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1666875753105-c63a6f3bdc86?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 5 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_1',\n\t\t\t\t\t\ttitle: 'The 2025 Customer Service Transformation Report',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.',\n\t\t\t\t\t\ttags: ['Report'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1762330467475-a565d04e1808?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 2 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tchangelogItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_4',\n\t\t\t\t\t\ttitle: 'Enhanced conversation analytics',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Get deeper insights into your customer conversations with our new analytics dashboard.',\n\t\t\t\t\t\ttags: ['Analytics'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1523961131990-5ea7c61b2107?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 10 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_3',\n\t\t\t\t\t\ttitle: 'Escalation guidance for complex issues',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'New AI-powered escalation guidance helps your team handle complex customer issues more effectively.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1764773516703-b246ac2ad5ef?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 7 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await this.apiService.getChangelogs({ limit: 20 });\n\n\t\t\tif (response.success && response.data) {\n\t\t\t\tconst changelogs = Array.isArray(response.data) ? response.data : [];\n\t\t\t\tconst changelogBase = (\n\t\t\t\t\tthis.messengerOptions.changelogUrl || ''\n\t\t\t\t).replace(/\\/$/, '');\n\n\t\t\t\tconst mappedItems = changelogs.map((item) => ({\n\t\t\t\t\tid: item.id,\n\t\t\t\t\ttitle: item.title,\n\t\t\t\t\tdescription: item.excerpt || item.description || '',\n\t\t\t\t\ttags: item.labels ? item.labels.map((label) => label.name) : [],\n\t\t\t\t\tcoverImage: item.cover_image || null,\n\t\t\t\t\tpublishedAt: item.published_at,\n\t\t\t\t\turl:\n\t\t\t\t\t\titem.slug && changelogBase\n\t\t\t\t\t\t\t? `${changelogBase}/${item.slug}`\n\t\t\t\t\t\t\t: changelogBase || null,\n\t\t\t\t}));\n\n\t\t\t\treturn {\n\t\t\t\t\thomeItems: mappedItems.slice(0, 3),\n\t\t\t\t\tchangelogItems: mappedItems,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { homeItems: [], changelogItems: [] };\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch changelog:', error);\n\t\t\treturn { homeItems: [], changelogItems: [] };\n\t\t}\n\t}\n\n\tasync onMount() {\n\t\tthis.loadInitialData();\n\n\t\tif (this.apiService?.sessionToken) {\n\t\t\tthis._initWebSocket();\n\t\t}\n\n\t\tthis.checkAgentAvailability();\n\n\t\tthis._availabilityInterval = setInterval(() => {\n\t\t\tthis.checkAgentAvailability();\n\t\t}, 60000);\n\t}\n\n\tonDestroy() {\n\t\tif (this._stateUnsubscribe) {\n\t\t\tthis._stateUnsubscribe();\n\t\t}\n\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis._wsUnsubscribers.forEach((unsub) => unsub());\n\t\tthis._wsUnsubscribers = [];\n\n\t\tif (this._availabilityInterval) {\n\t\t\tclearInterval(this._availabilityInterval);\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tremoveMessengerCustomStyles();\n\n\t\tif (this.launcher) {\n\t\t\tthis.launcher.destroy();\n\t\t}\n\t\tif (this.panel) {\n\t\t\tthis.panel.destroy();\n\t\t}\n\t\tthis.onDestroy();\n\t\tsuper.destroy();\n\t}\n}\n","export function applyMessengerCustomStyles(options = {}) {\n\tconst {\n\t\tprimaryColor = '#155EEF',\n\t\ttextColor = '#1d1d1f',\n\t\tbackgroundColor = '#ffffff',\n\t\ttheme = 'light',\n\t} = options;\n\n\tlet styleElement = document.getElementById(\n\t\t'product7-messenger-custom-styles'\n\t);\n\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.id = 'product7-messenger-custom-styles';\n\t\tdocument.head.appendChild(styleElement);\n\t}\n\n\tconst adjustColor = (hex, percent, alpha = 1) => {\n\t\tconst num = parseInt(hex.replace('#', ''), 16);\n\t\tconst r = Math.max(0, Math.min(255, (num >> 16) + percent));\n\t\tconst g = Math.max(0, Math.min(255, ((num >> 8) & 0x00ff) + percent));\n\t\tconst b = Math.max(0, Math.min(255, (num & 0x0000ff) + percent));\n\n\t\tif (alpha < 1) {\n\t\t\treturn `rgba(${r}, ${g}, ${b}, ${alpha})`;\n\t\t}\n\n\t\treturn '#' + ((r << 16) | (g << 8) | b).toString(16).padStart(6, '0');\n\t};\n\n\tstyleElement.textContent = `\n\t\t#product7-messenger-widget {\n\t\t\t--color-primary: ${primaryColor} !important;\n\t\t\t--color-primary-hover: ${adjustColor(primaryColor, -10)} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn:hover {\n\t\t\tbox-shadow: 0 8px 24px ${adjustColor(primaryColor, 0, 0.3)} !important;\n\t\t}\n\n\t\t.sdk-btn-primary {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t\tborder-color: ${primaryColor} !important;\n\t\t}\n\n\t\t.sdk-btn-primary:hover {\n\t\t\tbackground: ${adjustColor(primaryColor, -10)} !important;\n\t\t\tborder-color: ${adjustColor(primaryColor, -10)} !important;\n\t\t}\n\n\t\t.messenger-compose-send {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t}\n\n\t\t.messenger-compose-send:hover:not(:disabled) {\n\t\t\tbackground: ${adjustColor(primaryColor, -10)} !important;\n\t\t}\n\n\t\t.messenger-nav-tab.active .messenger-nav-icon,\n\t\t.messenger-nav-tab.active .messenger-nav-label {\n\t\t\tcolor: ${primaryColor} !important;\n\t\t}\n\n\t\t.messenger-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${adjustColor(primaryColor, 0, 0.08)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t${\n\t\t\tbackgroundColor !== '#ffffff'\n\t\t\t\t? `\n\t\t.messenger-panel-content {\n\t\t\tbackground: ${backgroundColor} !important;\n\t\t}\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\n\t\t${\n\t\t\ttextColor !== '#1d1d1f'\n\t\t\t\t? `\n\t\t.messenger-panel-content,\n\t\t.messenger-view {\n\t\t\tcolor: ${textColor} !important;\n\t\t}\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\t`;\n\n\tconsole.log('✅ Custom messenger styles applied:', { primaryColor, theme });\n}\n\nexport function removeMessengerCustomStyles() {\n\tconst styleElement = document.getElementById(\n\t\t'product7-messenger-custom-styles'\n\t);\n\tif (styleElement && styleElement.parentNode) {\n\t\tstyleElement.parentNode.removeChild(styleElement);\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class SurveyWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'survey' });\n\n\t\tthis.surveyOptions = {\n\t\t\tsurveyId: options.surveyId || null,\n\t\t\tsurveyType: options.surveyType || 'nps',\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttitle: options.title || null,\n\t\t\tdescription: options.description || null,\n\t\t\tlowLabel: options.lowLabel || null,\n\t\t\thighLabel: options.highLabel || null,\n\t\t\tcustomQuestions: options.customQuestions || [],\n\t\t\tonSubmit: options.onSubmit || null,\n\t\t\tonDismiss: options.onDismiss || null,\n\t\t};\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\t_render() {\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'feedback-survey-container';\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\t// Events are attached when survey is shown\n\t}\n\n\tshow() {\n\t\tthis._renderSurvey();\n\t\tthis.surveyState.isVisible = true;\n\t\tthis.sdk.eventBus.emit('survey:shown', {\n\t\t\twidget: this,\n\t\t\ttype: this.surveyOptions.surveyType,\n\t\t});\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tthis._closeSurvey();\n\t\treturn this;\n\t}\n\n\t_renderSurvey() {\n\t\tthis._closeSurvey();\n\n\t\tconst config = this._getSurveyConfig();\n\n\t\tif (this.surveyOptions.position === 'center') {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'feedback-survey-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t\tthis.backdropElement.addEventListener('click', () =>\n\t\t\t\tthis._handleDismiss()\n\t\t\t);\n\t\t}\n\n\t\tthis.surveyElement = document.createElement('div');\n\t\tthis.surveyElement.className = `feedback-survey feedback-survey-${this.surveyOptions.position}`;\n\n\t\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\">×</button>\n\t\t\t<h3 class=\"feedback-survey-title\">${config.title}</h3>\n\t\t\t<p class=\"feedback-survey-description\">${config.description}</p>\n\t\t\t<div class=\"feedback-survey-content\">${config.html}</div>\n\t\t\t<div class=\"feedback-survey-feedback\">\n\t\t\t\t<textarea class=\"feedback-survey-textarea\" placeholder=\"Any additional feedback? (optional)\"></textarea>\n\t\t\t</div>\n\t\t\t<button class=\"feedback-survey-submit\">Submit</button>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.surveyElement);\n\t\tthis._attachSurveyEvents();\n\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.surveyElement.style.opacity = '1';\n\t\t\tthis.surveyElement.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(1)'\n\t\t\t\t\t: 'translateY(0)';\n\t\t});\n\t}\n\n\t_getSurveyConfig() {\n\t\tconst configs = {\n\t\t\tnps: {\n\t\t\t\ttitle:\n\t\t\t\t\tthis.surveyOptions.title || 'How likely are you to recommend us?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'On a scale of 0-10, how likely are you to recommend our product to a friend or colleague?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-nps\">\n\t\t\t\t\t\t${[...Array(11).keys()]\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(n) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-nps-btn\" data-score=\"${n}\">${n}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Not likely'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very likely'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcsat: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How satisfied are you?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How would you rate your overall satisfaction with our product?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-csat\">\n\t\t\t\t\t\t${['😞', '😕', '😐', '🙂', '😄']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(emoji, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-csat-btn\" data-score=\"${i + 1}\">${emoji}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Very dissatisfied'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very satisfied'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tces: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How easy was it?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How easy was it to accomplish your task today?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-ces\">\n\t\t\t\t\t\t${['Very Difficult', 'Difficult', 'Neutral', 'Easy', 'Very Easy']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(label, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-ces-btn\" data-score=\"${i + 1}\">${label}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcustom: {\n\t\t\t\ttitle: this.surveyOptions.title || 'Quick Feedback',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'Help us improve by answering a few questions.',\n\t\t\t\thtml: this._renderCustomQuestions(),\n\t\t\t},\n\t\t};\n\n\t\treturn configs[this.surveyOptions.surveyType] || configs.nps;\n\t}\n\n\t_renderCustomQuestions() {\n\t\tif (\n\t\t\t!this.surveyOptions.customQuestions ||\n\t\t\tthis.surveyOptions.customQuestions.length === 0\n\t\t) {\n\t\t\treturn `\n\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t<label class=\"sdk-label\">What feature do you use most?</label>\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"feature\">\n\t\t\t\t\t\t<option value=\"\">Select a feature</option>\n\t\t\t\t\t\t<option value=\"feedback\">Feedback Collection</option>\n\t\t\t\t\t\t<option value=\"surveys\">Surveys</option>\n\t\t\t\t\t\t<option value=\"analytics\">Analytics</option>\n\t\t\t\t\t\t<option value=\"integrations\">Integrations</option>\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t<label class=\"sdk-label\">How often do you use it?</label>\n\t\t\t\t\t<div class=\"feedback-survey-frequency\">\n\t\t\t\t\t\t${['Daily', 'Weekly', 'Monthly', 'Rarely']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(freq) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-freq-btn\" data-freq=\"${freq}\">${freq}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn this.surveyOptions.customQuestions\n\t\t\t.map(\n\t\t\t\t(q, index) => `\n\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t<label class=\"sdk-label\">${q.label}</label>\n\t\t\t\t${this._renderQuestionInput(q, index)}\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\t}\n\n\t_renderQuestionInput(question, index) {\n\t\tswitch (question.type) {\n\t\t\tcase 'select':\n\t\t\t\treturn `\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"${question.id || index}\">\n\t\t\t\t\t\t<option value=\"\">${question.placeholder || 'Select an option'}</option>\n\t\t\t\t\t\t${question.options.map((opt) => `<option value=\"${opt.value}\">${opt.label}</option>`).join('')}\n\t\t\t\t\t</select>\n\t\t\t\t`;\n\t\t\tcase 'text':\n\t\t\t\treturn `\n\t\t\t\t\t<input type=\"text\" class=\"feedback-survey-input\" data-question=\"${question.id || index}\" placeholder=\"${question.placeholder || ''}\">\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\t_attachSurveyEvents() {\n\t\tif (!this.surveyElement) return;\n\n\t\tconst closeBtn = this.surveyElement.querySelector('.feedback-survey-close');\n\t\tcloseBtn.addEventListener('click', () => this._handleDismiss());\n\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.addEventListener('click', () => this._handleSubmit());\n\n\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-textarea'\n\t\t);\n\t\ttextarea.addEventListener('input', (e) => {\n\t\t\tthis.surveyState.feedback = e.target.value;\n\t\t});\n\n\t\tthis._attachTypeSpecificEvents();\n\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis._handleDismiss();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\t_attachTypeSpecificEvents() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\tif (type === 'nps') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectNPS(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'csat') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCSAT(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'ces') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCES(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'custom') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectFrequency(btn.dataset.freq)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-select')\n\t\t\t\t.forEach((select) => {\n\t\t\t\t\tselect.addEventListener('change', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[select.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-input')\n\t\t\t\t.forEach((input) => {\n\t\t\t\t\tinput.addEventListener('input', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[input.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t}\n\n\t_selectNPS(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectCSAT(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectCES(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectFrequency(freq) {\n\t\tthis.surveyState.customAnswers.frequency = freq;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tif (btn.dataset.freq === freq) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\tif (\n\t\t\t(type === 'nps' || type === 'csat' || type === 'ces') &&\n\t\t\tthis.surveyState.score === null\n\t\t) {\n\t\t\tthis._showError('Please select a rating');\n\t\t\treturn;\n\t\t}\n\n\t\tconst responseData = {\n\t\t\trating: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tanswers: this.surveyState.customAnswers,\n\t\t};\n\n\t\tconst response = {\n\t\t\ttype: type,\n\t\t\tscore: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tcustomAnswers: this.surveyState.customAnswers,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (this.surveyOptions.onSubmit) {\n\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t}\n\n\t\ttry {\n\t\t\tconst surveyId =\n\t\t\t\tthis.surveyOptions.surveyId || `local_${type}_${Date.now()}`;\n\t\t\tawait this.apiService.submitSurveyResponse(surveyId, responseData);\n\t\t} catch (error) {\n\t\t\tconsole.error('[SurveyWidget] Failed to submit survey:', error);\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\n\t\tthis._closeSurvey();\n\t\tthis._showSuccessNotification();\n\t}\n\n\tasync _handleDismiss() {\n\t\tif (this.surveyOptions.surveyId) {\n\t\t\ttry {\n\t\t\t\tawait this.apiService.dismissSurvey(this.surveyOptions.surveyId);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[SurveyWidget] Failed to dismiss survey:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.surveyOptions.onDismiss) {\n\t\t\tthis.surveyOptions.onDismiss();\n\t\t}\n\t\tthis.sdk.eventBus.emit('survey:dismissed', { widget: this });\n\t\tthis._closeSurvey();\n\t}\n\n\t_showError(message) {\n\t\tconst existing = this.surveyElement.querySelector('.feedback-survey-error');\n\t\tif (existing) existing.remove();\n\n\t\tconst error = document.createElement('div');\n\t\terror.className = 'feedback-survey-error';\n\t\terror.textContent = message;\n\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.parentNode.insertBefore(error, submitBtn);\n\n\t\tsetTimeout(() => error.remove(), 3000);\n\t}\n\n\t_showSuccessNotification() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'feedback-survey-success';\n\t\tnotification.innerHTML = `\n\t\t\t<div>\n\t\t\t\t<span style=\"font-size: 18px;\">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t`;\n\t\tdocument.body.appendChild(notification);\n\n\t\tsetTimeout(() => {\n\t\t\tnotification.style.opacity = '0';\n\t\t\tnotification.style.transition = 'opacity 0.3s ease';\n\t\t\tsetTimeout(() => notification.remove(), 300);\n\t\t}, 3000);\n\t}\n\n\t_closeSurvey() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t\tthis._escapeHandler = null;\n\t\t}\n\n\t\tconst surveyEl = this.surveyElement;\n\t\tconst backdropEl = this.backdropElement;\n\n\t\tif (surveyEl) {\n\t\t\tsurveyEl.style.opacity = '0';\n\t\t\tsurveyEl.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(0.95)'\n\t\t\t\t\t: 'translateY(20px)';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (surveyEl && surveyEl.parentNode) {\n\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.surveyElement = null;\n\t\t}\n\n\t\tif (backdropEl) {\n\t\t\tbackdropEl.style.opacity = '0';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (backdropEl && backdropEl.parentNode) {\n\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\tdestroy() {\n\t\tthis._closeSurvey();\n\t\tsuper.destroy();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class TabWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'tab' });\n\t}\n\n\t_render() {\n\t\tconst tab = document.createElement('div');\n\t\ttab.className = `feedback-widget feedback-widget-tab position-${this.options.position}`;\n\t\ttab.innerHTML = `\n <div class=\"feedback-tab-trigger\">\n <span class=\"feedback-tab-text\">Feedback</span>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(tab.style, this.options.customStyles);\n\t\t}\n\n\t\treturn tab;\n\t}\n\n\t_attachEvents() {\n\t\tconst tab = this.element.querySelector('.feedback-tab-trigger');\n\t\ttab.addEventListener('click', this.openModal);\n\t}\n\n\tupdateText(text) {\n\t\tconst textElement = this.element?.querySelector('.feedback-tab-text');\n\t\tif (textElement) {\n\t\t\ttextElement.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}\n","import { SDKError } from '../utils/errors.js';\nimport { ButtonWidget } from './ButtonWidget.js';\nimport { ChangelogWidget } from './ChangelogWidget.js';\nimport { InlineWidget } from './InlineWidget.js';\nimport { MessengerWidget } from './MessengerWidget.js';\nimport { SurveyWidget } from './SurveyWidget.js';\nimport { TabWidget } from './TabWidget.js';\n\nexport class WidgetFactory {\n\tstatic widgets = new Map([\n\t\t['button', ButtonWidget],\n\t\t['tab', TabWidget],\n\t\t['inline', InlineWidget],\n\t\t['survey', SurveyWidget],\n\t\t['messenger', MessengerWidget],\n\t\t['changelog', ChangelogWidget],\n\t]);\n\n\tstatic register(type, WidgetClass) {\n\t\tif (typeof type !== 'string' || !type.trim()) {\n\t\t\tthrow new SDKError('Widget type must be a non-empty string');\n\t\t}\n\n\t\tif (typeof WidgetClass !== 'function') {\n\t\t\tthrow new SDKError('Widget class must be a constructor function');\n\t\t}\n\n\t\tthis.widgets.set(type, WidgetClass);\n\t}\n\n\tstatic create(type, options = {}) {\n\t\tconst WidgetClass = this.widgets.get(type);\n\n\t\tif (!WidgetClass) {\n\t\t\tconst availableTypes = Array.from(this.widgets.keys()).join(', ');\n\t\t\tthrow new SDKError(\n\t\t\t\t`Unknown widget type: ${type}. Available types: ${availableTypes}`\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\treturn new WidgetClass(options);\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to create widget of type '${type}': ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tstatic getAvailableTypes() {\n\t\treturn Array.from(this.widgets.keys());\n\t}\n\n\tstatic isTypeRegistered(type) {\n\t\treturn this.widgets.has(type);\n\t}\n\n\tstatic unregister(type) {\n\t\treturn this.widgets.delete(type);\n\t}\n\n\tstatic clear() {\n\t\tthis.widgets.clear();\n\t}\n\n\tstatic getWidgetClass(type) {\n\t\treturn this.widgets.get(type);\n\t}\n}\n","import { ConfigError, SDKError } from '../utils/errors.js';\nimport { deepMerge, generateId } from '../utils/helpers.js';\nimport { WidgetFactory } from '../widgets/WidgetFactory.js';\nimport { APIService } from './APIService.js';\nimport { EventBus } from './EventBus.js';\n\nexport class FeedbackSDK {\n\tconstructor(config = {}) {\n\t\tthis.config = this._validateAndMergeConfig(config);\n\t\tthis.initialized = false;\n\t\tthis.widgets = new Map();\n\t\tthis.eventBus = new EventBus();\n\n\t\tthis.apiService = new APIService({\n\t\t\tapiUrl: this.config.apiUrl,\n\t\t\tworkspace: this.config.workspace,\n\t\t\tsiteId: this.config.siteId,\n\t\t\tsessionToken: this.config.sessionToken,\n\t\t\tuserContext: this.config.userContext,\n\t\t\tmock: this.config.mock,\n\t\t\tdebug: this.config.debug,\n\t\t\tenv: this.config.env,\n\t\t});\n\n\t\tthis._bindMethods();\n\t}\n\n\tasync init() {\n\t\tif (this.initialized) {\n\t\t\treturn { alreadyInitialized: true };\n\t\t}\n\n\t\ttry {\n\t\t\tconst initData = await this.apiService.init(this.config.userContext);\n\n\t\t\tif (initData.config) {\n\t\t\t\tthis.config = deepMerge(initData.config, this.config);\n\t\t\t}\n\n\t\t\tthis.initialized = true;\n\t\t\tthis.eventBus.emit('sdk:initialized', {\n\t\t\t\tconfig: this.config,\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tinitialized: true,\n\t\t\t\tconfig: initData.config || {},\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to initialize SDK: ${error.message}`, error);\n\t\t}\n\t}\n\n\tcreateWidget(type = 'button', options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before creating widgets. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst widgetId = generateId('widget');\n\t\tconst widgetOptions = {\n\t\t\tid: widgetId,\n\t\t\tsdk: this,\n\t\t\tapiService: this.apiService,\n\t\t\t...this.config,\n\t\t\t...options,\n\t\t};\n\n\t\ttry {\n\t\t\tconst widget = WidgetFactory.create(type, widgetOptions);\n\t\t\tthis.widgets.set(widgetId, widget);\n\t\t\tthis.eventBus.emit('widget:created', { widget, type });\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(`Failed to create widget: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetWidget(id) {\n\t\treturn this.widgets.get(id);\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getActiveSurveys(context);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to fetch active surveys: ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tasync showSurveyById(surveyId, options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveys = await this.getActiveSurveys();\n\t\tconst surveyConfig = surveys.find((s) => s.id === surveyId);\n\n\t\tif (!surveyConfig) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Survey with ID '${surveyId}' not found or not active`\n\t\t\t);\n\t\t}\n\n\t\treturn this.showSurvey({\n\t\t\tsurveyId: surveyConfig.id,\n\t\t\tsurveyType: surveyConfig.type,\n\t\t\ttitle: surveyConfig.title,\n\t\t\tdescription: surveyConfig.description,\n\t\t\tlowLabel: surveyConfig.low_label,\n\t\t\thighLabel: surveyConfig.high_label,\n\t\t\tcustomQuestions: surveyConfig.questions,\n\t\t\t...options,\n\t\t});\n\t}\n\n\tshowSurvey(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveyWidget = this.createWidget('survey', {\n\t\t\tsurveyId: options.surveyId,\n\t\t\tsurveyType: options.surveyType || options.type || 'nps',\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title,\n\t\t\tdescription: options.description,\n\t\t\tlowLabel: options.lowLabel,\n\t\t\thighLabel: options.highLabel,\n\t\t\tcustomQuestions: options.customQuestions,\n\t\t\tonSubmit: options.onSubmit,\n\t\t\tonDismiss: options.onDismiss,\n\t\t});\n\n\t\tsurveyWidget.mount();\n\t\tsurveyWidget.show();\n\n\t\treturn surveyWidget;\n\t}\n\n\tshowChangelog(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing changelog. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst changelogWidget = this.createWidget('changelog', {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title || \"What's New\",\n\t\t\ttriggerText: options.triggerText || \"What's New\",\n\t\t\tshowBadge: options.showBadge !== false,\n\t\t\tviewButtonText: options.viewButtonText || 'View Update',\n\t\t\tchangelogBaseUrl: options.changelogBaseUrl,\n\t\t\topenInNewTab: options.openInNewTab,\n\t\t\tonViewUpdate: options.onViewUpdate,\n\t\t});\n\n\t\tchangelogWidget.mount();\n\t\tchangelogWidget.show();\n\n\t\treturn changelogWidget;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching changelogs. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs(options);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to fetch changelogs: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetAllWidgets() {\n\t\treturn Array.from(this.widgets.values());\n\t}\n\n\tdestroyWidget(id) {\n\t\tconst widget = this.widgets.get(id);\n\t\tif (widget) {\n\t\t\twidget.destroy();\n\t\t\tthis.widgets.delete(id);\n\t\t\tthis.eventBus.emit('widget:removed', { widgetId: id });\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdestroyAllWidgets() {\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.destroy();\n\t\t}\n\t\tthis.widgets.clear();\n\t\tthis.eventBus.emit('widgets:cleared');\n\t}\n\n\tupdateConfig(newConfig) {\n\t\tconst oldConfig = { ...this.config };\n\t\tthis.config = this._validateAndMergeConfig(newConfig, this.config);\n\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.handleConfigUpdate(this.config);\n\t\t}\n\n\t\tthis.eventBus.emit('config:updated', {\n\t\t\toldConfig,\n\t\t\tnewConfig: this.config,\n\t\t});\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.config.userContext = userContext;\n\t\tif (this.apiService) {\n\t\t\tthis.apiService.setUserContext(userContext);\n\t\t}\n\t\tthis.eventBus.emit('user:updated', { userContext });\n\t}\n\n\tgetUserContext() {\n\t\treturn (\n\t\t\tthis.config.userContext ||\n\t\t\t(this.apiService ? this.apiService.getUserContext() : null)\n\t\t);\n\t}\n\n\tasync reinitialize(newUserContext = null) {\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\n\t\tif (newUserContext) {\n\t\t\tthis.setUserContext(newUserContext);\n\t\t}\n\n\t\treturn this.init();\n\t}\n\n\ton(event, callback) {\n\t\tthis.eventBus.on(event, callback);\n\t\treturn this;\n\t}\n\n\toff(event, callback) {\n\t\tthis.eventBus.off(event, callback);\n\t\treturn this;\n\t}\n\n\tonce(event, callback) {\n\t\tthis.eventBus.once(event, callback);\n\t\treturn this;\n\t}\n\n\temit(event, data) {\n\t\tthis.eventBus.emit(event, data);\n\t\treturn this;\n\t}\n\n\tdestroy() {\n\t\tthis.destroyAllWidgets();\n\t\tthis.eventBus.removeAllListeners();\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.eventBus.emit('sdk:destroyed');\n\t}\n\n\thasFeedbackBeenSubmitted(cooldownDays = 30) {\n\t\tconst cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\treturn now - data.submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearFeedbackSubmissionTracking() {\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t\tthis.eventBus.emit('feedback:trackingCleared');\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear feedback tracking:', e);\n\t\t}\n\t}\n\n\t_detectEnvironment() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn 'production';\n\t\t}\n\n\t\tconst hostname = window.location.hostname.toLowerCase();\n\n\t\tif (\n\t\t\thostname.includes('staging') ||\n\t\t\thostname.includes('localhost') ||\n\t\t\thostname.includes('127.0.0.1') ||\n\t\t\thostname.includes('.local')\n\t\t) {\n\t\t\treturn 'staging';\n\t\t}\n\n\t\treturn 'production';\n\t}\n\n\t_validateAndMergeConfig(newConfig, existingConfig = {}) {\n\t\tconst defaultConfig = {\n\t\t\tapiUrl: null,\n\t\t\tworkspace: null,\n\t\t\tuserContext: null,\n\t\t\tposition: 'bottom-right',\n\t\t\ttheme: 'light',\n\t\t\tboardId: 'general',\n\t\t\tautoShow: true,\n\t\t\tdebug: false,\n\t\t\tmock: false,\n\t\t\tenv: this._detectEnvironment(),\n\t\t};\n\n\t\tconst mergedConfig = deepMerge(\n\t\t\tdeepMerge(defaultConfig, existingConfig),\n\t\t\tnewConfig\n\t\t);\n\n\t\tif (!newConfig.env && !existingConfig.env) {\n\t\t\tmergedConfig.env = this._detectEnvironment();\n\t\t}\n\n\t\tif (!mergedConfig.workspace) {\n\t\t\tthrow new ConfigError('Missing required configuration: workspace');\n\t\t}\n\n\t\tif (mergedConfig.userContext) {\n\t\t\tthis._validateUserContext(mergedConfig.userContext);\n\t\t}\n\n\t\treturn mergedConfig;\n\t}\n\n\t_validateUserContext(userContext) {\n\t\tif (!userContext.user_id && !userContext.email) {\n\t\t\tthrow new ConfigError(\n\t\t\t\t'User context must include at least user_id or email'\n\t\t\t);\n\t\t}\n\n\t\tconst validStructure = {\n\t\t\tuser_id: 'string',\n\t\t\temail: 'string',\n\t\t\tname: 'string',\n\t\t\tcustom_fields: 'object',\n\t\t\tcompany: 'object',\n\t\t};\n\n\t\tfor (const [key, expectedType] of Object.entries(validStructure)) {\n\t\t\tif (userContext[key] && typeof userContext[key] !== expectedType) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`User context field '${key}' must be of type '${expectedType}'`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t_bindMethods() {\n\t\tthis.createWidget = this.createWidget.bind(this);\n\t\tthis.destroyWidget = this.destroyWidget.bind(this);\n\t\tthis.updateConfig = this.updateConfig.bind(this);\n\t}\n\n\tstatic create(config) {\n\t\treturn new FeedbackSDK(config);\n\t}\n\n\tstatic async createAndInit(config) {\n\t\tconst sdk = new FeedbackSDK(config);\n\t\tawait sdk.init();\n\t\treturn sdk;\n\t}\n\n\tstatic extractUserContextFromAuth(authData) {\n\t\tif (!authData) return null;\n\n\t\treturn {\n\t\t\tuser_id: authData.sub || authData.id || authData.user_id,\n\t\t\temail: authData.email,\n\t\t\tname: authData.name || authData.display_name || authData.full_name,\n\t\t\tcustom_fields: {\n\t\t\t\trole: authData.role,\n\t\t\t\tplan: authData.plan || authData.subscription?.plan,\n\t\t\t\t...(authData.custom_fields || {}),\n\t\t\t},\n\t\t\tcompany:\n\t\t\t\tauthData.company || authData.organization\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tid: authData.company?.id || authData.organization?.id,\n\t\t\t\t\t\t\tname: authData.company?.name || authData.organization?.name,\n\t\t\t\t\t\t\tmonthly_spend: authData.company?.monthly_spend,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n}\n","import { APIService } from './core/APIService.js';\nimport { EventBus } from './core/EventBus.js';\nimport { FeedbackSDK } from './core/FeedbackSDK.js';\nimport { CSS_STYLES } from './styles/styles.js';\nimport {\n\tAPIError,\n\tConfigError,\n\tSDKError,\n\tValidationError,\n\tWidgetError,\n} from './utils/errors.js';\nimport * as helpers from './utils/helpers.js';\nimport { BaseWidget } from './widgets/BaseWidget.js';\nimport { ButtonWidget } from './widgets/ButtonWidget.js';\nimport { ChangelogWidget } from './widgets/ChangelogWidget.js';\nimport { InlineWidget } from './widgets/InlineWidget.js';\nimport { MessengerWidget } from './widgets/MessengerWidget.js';\nimport { SurveyWidget } from './widgets/SurveyWidget.js';\nimport { TabWidget } from './widgets/TabWidget.js';\nimport { WidgetFactory } from './widgets/WidgetFactory.js';\n\nfunction injectStyles() {\n\tif (\n\t\ttypeof document !== 'undefined' &&\n\t\t!document.querySelector('#feedback-sdk-styles')\n\t) {\n\t\tconst style = document.createElement('style');\n\t\tstyle.id = 'feedback-sdk-styles';\n\t\tstyle.textContent = CSS_STYLES;\n\t\tdocument.head.appendChild(style);\n\t}\n}\n\nfunction autoInit() {\n\tif (typeof window !== 'undefined' && window.FeedbackSDKConfig) {\n\t\tinjectStyles();\n\n\t\tconst config = { ...window.FeedbackSDKConfig };\n\t\tconst sdk = new FeedbackSDK(config);\n\n\t\tsdk\n\t\t\t.init()\n\t\t\t.then((initData) => {\n\t\t\t\twindow.FeedbackSDK.instance = sdk;\n\n\t\t\t\tif (window.FeedbackSDKConfig.autoCreate) {\n\t\t\t\t\tconst widgets = Array.isArray(window.FeedbackSDKConfig.autoCreate)\n\t\t\t\t\t\t? window.FeedbackSDKConfig.autoCreate\n\t\t\t\t\t\t: [window.FeedbackSDKConfig.autoCreate];\n\n\t\t\t\t\twidgets.forEach((widgetConfig) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst widget = sdk.createWidget(\n\t\t\t\t\t\t\t\twidgetConfig.type || 'button',\n\t\t\t\t\t\t\t\twidgetConfig\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\twidget.mount(widgetConfig.container);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('[FeedbackSDK] Failed to create widget:', error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKReady', {\n\t\t\t\t\t\tdetail: { sdk, config, initData },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[FeedbackSDK] Auto-initialization failed:', error);\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKError', {\n\t\t\t\t\t\tdetail: { error, config, phase: 'initialization' },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nfunction handleDOMReady() {\n\tif (typeof document !== 'undefined') {\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', autoInit);\n\t\t} else {\n\t\t\tsetTimeout(autoInit, 0);\n\t\t}\n\t}\n}\n\nconst FeedbackSDKExport = {\n\tFeedbackSDK,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tTabWidget,\n\tInlineWidget,\n\tSurveyWidget,\n\tMessengerWidget,\n\tWidgetFactory,\n\tEventBus,\n\tAPIService,\n\tSDKError,\n\tAPIError,\n\tWidgetError,\n\tConfigError,\n\tValidationError,\n\thelpers,\n\tcreate: (config) => {\n\t\tinjectStyles();\n\t\treturn new FeedbackSDK(config);\n\t},\n\tversion: '1.0.0',\n\tinstance: null,\n\n\tisReady: () => Boolean(FeedbackSDKExport.instance),\n\tgetInstance: () => FeedbackSDKExport.instance,\n\n\tsetUserContext: (userContext) => {\n\t\tif (FeedbackSDKExport.instance) {\n\t\t\tFeedbackSDKExport.instance.setUserContext(userContext);\n\t\t} else {\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.FeedbackSDKUserContext = userContext;\n\t\t\t}\n\t\t}\n\t},\n\n\tinitWithUser: async (config, userContext) => {\n\t\tinjectStyles();\n\t\tconst fullConfig = { ...config, userContext };\n\t\tconst sdk = new FeedbackSDK(fullConfig);\n\t\tawait sdk.init();\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.FeedbackSDK.instance = sdk;\n\t\t}\n\n\t\treturn sdk;\n\t},\n\n\tonReady: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (FeedbackSDKExport.isReady()) {\n\t\t\t\tcallback(FeedbackSDKExport.instance);\n\t\t\t} else {\n\t\t\t\twindow.addEventListener(\n\t\t\t\t\t'FeedbackSDKReady',\n\t\t\t\t\t(event) => {\n\t\t\t\t\t\tcallback(event.detail.sdk, event.detail);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tonError: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.addEventListener('FeedbackSDKError', (event) => {\n\t\t\t\tcallback(event.detail.error, event.detail);\n\t\t\t});\n\t\t}\n\t},\n\n\textractUserContext: FeedbackSDK.extractUserContextFromAuth,\n};\n\nif (typeof window !== 'undefined') {\n\twindow.FeedbackSDK = FeedbackSDKExport;\n\thandleDOMReady();\n}\n\nexport default FeedbackSDKExport;\n\nexport {\n\tAPIError,\n\tAPIService,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tConfigError,\n\tEventBus,\n\tFeedbackSDK,\n\thelpers,\n\tInlineWidget,\n\tMessengerWidget,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\n};\n","import { baseStyles } from './base.js';\nimport { changelogStyles } from './changelog.js';\nimport { componentsStyles } from './components.js';\nimport { designTokens } from './design-tokens.js';\nimport { feedbackStyles } from './feedback.js';\nimport { messengerStyles } from './messenger.js';\nimport { surveyStyles } from './survey.js';\n\nexport const CSS_STYLES =\n\tdesignTokens +\n\tbaseStyles +\n\tcomponentsStyles +\n\tfeedbackStyles +\n\tchangelogStyles +\n\tsurveyStyles +\n\tmessengerStyles;\n\nexport {\n\tbaseStyles,\n\tchangelogStyles,\n\tcomponentsStyles,\n\tdesignTokens,\n\tfeedbackStyles,\n\tmessengerStyles,\n\tsurveyStyles,\n};\n"],"names":["MOCK_CHANGELOGS","id","title","excerpt","description","cover_image","slug","published_at","labels","name","color","status","MOCK_CONVERSATIONS","subject","last_message_at","Date","now","toISOString","created_at","unread","assigned_user","avatar","MOCK_MESSAGES","conv_1","content","sender_type","sender_name","sender_avatar","conv_2","MOCK_HELP_COLLECTIONS","articleCount","icon","url","MOCK_SURVEYS","type","low_label","high_label","trigger","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","options","_ensureSession","mock","success","data","_handleAuthRetry","async","endpoint","_getEndpointWithParams","_makeRequest","method","headers","Authorization","sessionToken","FeedbackService","submitFeedback","feedbackData","message","payload","board","board_id","boardId","attachments","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","MessengerService","getMessengerSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","getMessages","identifyContact","contact_id","email","is_new","phone","company","avatar_url","metadata","sendTypingIndicator","isTyping","is_typing","SDKError","Error","cause","super","captureStackTrace","APIError","response","isNetworkError","isClientError","isServerError","WidgetError","widgetType","widgetId","ConfigError","configKey","ValidationError","field","value","SurveyService","getActiveSurveys","context","window","location","href","userProperties","user_properties","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","userContext","env","baseURL","_getBaseURL","_loadStoredSession","apiUrl","ENV_URLS","production","base","withWorkspace","ws","staging","localstack","envConfig","init","isSessionValid","_initMockSession","_initRealSession","_storeSession","primaryColor","backgroundColor","textColor","size","displayMode","expiresIn","user","session_token","expires_in","error","args","apply","setUserContext","_storeData","getUserContext","clearSession","_removeData","localStorage","sessionData","token","expiry","stored","getItem","parse","key","setItem","removeItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","APIService","survey","messenger","help","changelog","available_agents","full_name","picture","console","log","initError","uploadFile","base64Data","filename","file","submitRating","startsWith","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","Array","isArray","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","undefined","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","required","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","_hasRecentlySubmitted","eventBus","widget","reason","querySelector","_render","appendChild","_attachEvents","onMount","show","style","display","hide","openPanel","_showLoadingModal","_hideLoadingModal","_renderPanel","requestAnimationFrame","classList","add","className","loadingElement","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessMessage","handleConfigUpdate","newConfig","theme","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","addEventListener","modeClass","sizeClass","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","notification","closeNotification","opacity","openModal","closeModal","ButtonWidget","isMinimized","button","assign","minimizeIcon","expandIcon","openIfAllowed","Element","Boolean","closest","isControlIcon","stopPropagation","minimize","restore","pointerType","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","currentIndex","triggerText","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","listModalBackdropElement","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","_truncateDescription","label","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBase","changelogBaseUrl","openInNewTab","open","onViewUpdate","_stripHtml","html","tmp","innerText","maxLength","plain","trimEnd","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","originalContent","updateTitle","titleElement","setPlaceholder","placeholder","input","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_listeners","_onOpen","_onMessage","_onClose","_onError","connect","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","close","_mockInterval","Set","delete","send","readyState","OPEN","setInterval","code","conversation_id","user_id","user_name","is_agent","simulateMessage","MessengerState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","welcomeMessage","isIdentified","pendingMessage","enableHelp","enableChangelog","agentsOnline","onlineCount","responseTime","typingUsers","isLoadingMessages","urls","roadmap","subscribe","_notify","changeType","cb","setView","view","previousView","setOpen","setActiveConversation","previousConversationId","setIdentified","setConversations","_updateUnreadCount","addConversation","conversation","setMessages","addMessage","conv","lastMessage","lastMessageTime","timestamp","isOwn","updateConversation","updates","markAsRead","setHelpArticles","articles","setHelpSearchQuery","setHomeChangelogItems","items","setChangelogItems","getActiveConversation","getActiveMessages","setTeamAvatarsFromAgents","agents","agent","getFilteredHelpArticles","article","reset","MessengerLauncher","_unsubscribe","render","_updateContent","_updateIcon","_updateBadge","badgeHtml","btn","chatIcon","closeIcon","existingBadge","NavigationTabs","_updateActiveTab","_getTabs","tabs","_getHomeIcon","_getMessagesIcon","_getHelpIcon","_getChangelogIcon","tabsHtml","tab","isActive","tabId","toggle","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","setHeader","headerContent","header","ChangelogView","_updateChangelogList","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","tagsHtml","tags","tag","dateStr","publishedAt","coverImage","_truncateText","_renderTeamAvatars","avatars","slice","charAt","toUpperCase","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_pendingAttachments","_hideTypingIndicator","_appendMessage","_scrollToBottom","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","msg","_renderMessage","_renderAttachmentPreviews","avatarHtml","isOnline","_renderMessageAttachments","att","_escapeHtml","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","avatarUrl","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollTop","scrollHeight","_updateSendButtonState","sendBtn","preview","idx","currentTarget","min","_startTyping","shiftKey","_sendMessage","attachBtn","fileInput","click","files","from","reader","FileReader","onload","ev","readAsDataURL","fileLink","_downloadFile","img","src","blob","blobUrl","URL","createObjectURL","a","download","revokeObjectURL","hasAttachments","_stopTyping","attachmentsToSend","onStartConversation","onSendMessage","onTyping","ConversationsView","avatarColors","_getAvatarColor","charCode","charCodeAt","conversationsHtml","_renderConversationItem","unreadClass","timeAgo","_formatTimeAgo","avatarsHtml","_renderConversationAvatars","participants","_truncateMessage","p","initial","_renderAvatarStack","diffMs","diffMins","diffHours","diffDays","closeBtn","convId","onSelectConversation","newMsgBtn","_startNewConversation","openConversation","onStartNewConversation","HelpView","_updateCollectionsList","searchQuery","collectionsContainer","collections","filteredCollections","headerEl","collection","_renderCollectionItem","_attachCollectionEvents","searchTimeout","collectionId","onArticleClick","HomeView","recentChangelogHtml","_renderRecentChangelog","logoUrl","_renderMessageButton","_renderFeaturedCard","_renderAvailabilityStatus","sendIcon","caretIcon","featuredContent","action","coverText","msgBtn","feedbackBtn","onFeedbackClick","seeAllBtn","featuredBtn","PreChatFormView","_isSubmitting","existingName","existingEmail","emailInput","skipBtn","validateForm","isEmailValid","_isValidEmail","_clearError","_handleSubmit","elementId","errorEl","nameInput","submitText","submitLoading","onIdentifyContact","MessengerWidget","messengerOptions","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","messengerState","launcher","wsService","_wsUnsubscribers","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","zIndex","styleElement","getElementById","head","adjustColor","percent","alpha","num","r","max","g","b","padStart","applyMessengerCustomStyles","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","markAsIdentified","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","mockResponse","localMessage","_initWebSocket","navigateTo","setUnreadCount","getState","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","helpBase","article_count","url_slug","newConversation","checkAgentAvailability","mappedItems","_availabilityInterval","unsub","removeMessengerCustomStyles","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","customQuestions","onSubmit","onDismiss","surveyState","score","customAnswers","isVisible","_renderSurvey","_closeSurvey","_getSurveyConfig","_handleDismiss","surveyElement","_attachSurveyEvents","transform","configs","nps","csat","emoji","ces","custom","_renderCustomQuestions","_renderQuestionInput","freq","question","opt","_attachTypeSpecificEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","frequency","_showSuccessNotification","existing","insertBefore","transition","surveyEl","backdropEl","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","initData","createWidget","widgetOptions","getWidget","showSurveyById","surveyConfig","s","showSurvey","questions","surveyWidget","showChangelog","changelogWidget","getAllWidgets","values","destroyWidget","destroyAllWidgets","updateConfig","oldConfig","reinitialize","newUserContext","removeAllListeners","hasFeedbackBeenSubmitted","cooldownDays","clearFeedbackSubmissionTracking","_detectEnvironment","hostname","existingConfig","mergedConfig","_validateUserContext","validStructure","custom_fields","expectedType","createAndInit","extractUserContextFromAuth","authData","sub","display_name","role","plan","subscription","organization","monthly_spend","injectStyles","designTokens","autoInit","FeedbackSDKConfig","then","instance","autoCreate","widgetConfig","CustomEvent","detail","dispatchEvent","catch","phase","FeedbackSDKExport","helpers","version","isReady","getInstance","FeedbackSDKUserContext","initWithUser","fullConfig","onReady","onError","extractUserContext"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"feedback-sdk.min.js","sources":["../src/api/mock-data/index.js","../src/api/utils/helpers.js","../src/api/services/ChangelogService.js","../src/api/services/FeedbackService.js","../src/api/services/HelpService.js","../src/api/services/MessengerService.js","../src/utils/errors.js","../src/api/services/SurveyService.js","../src/core/BaseAPIService.js","../src/core/APIService.js","../src/core/EventBus.js","../src/utils/helpers.js","../src/widgets/BaseWidget.js","../src/widgets/ButtonWidget.js","../src/widgets/ChangelogWidget.js","../src/widgets/InlineWidget.js","../src/core/WebSocketService.js","../src/widgets/messenger/MessengerState.js","../src/widgets/messenger/components/MessengerLauncher.js","../src/widgets/messenger/components/NavigationTabs.js","../src/widgets/messenger/components/MessengerPanel.js","../src/widgets/messenger/views/ChangelogView.js","../src/widgets/messenger/views/ChatView.js","../src/widgets/messenger/views/ConversationsView.js","../src/widgets/messenger/views/HelpView.js","../src/widgets/messenger/views/HomeView.js","../src/widgets/messenger/views/PreChatFormView.js","../src/widgets/MessengerWidget.js","../src/styles/messengerCustomStyles.js","../src/widgets/SurveyWidget.js","../src/widgets/TabWidget.js","../src/widgets/WidgetFactory.js","../src/core/FeedbackSDK.js","../src/index.js","../src/styles/styles.js"],"sourcesContent":["export const MOCK_CHANGELOGS = [\n\t{\n\t\tid: 'changelog_1',\n\t\ttitle:\n\t\t\t'Feature prioritization, multiple roadmaps, and feature request analytics.',\n\t\texcerpt:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tdescription:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=',\n\t\tslug: 'feature-prioritization-roadmaps-analytics',\n\t\tpublished_at: '2025-03-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'New Feature', color: '#10B981' },\n\t\t\t{ name: 'Analytics', color: '#6366F1' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_2',\n\t\ttitle: 'Dark mode support and UI improvements',\n\t\texcerpt:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tdescription:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+',\n\t\tslug: 'dark-mode-ui-improvements',\n\t\tpublished_at: '2025-03-01T10:00:00Z',\n\t\tlabels: [{ name: 'Enhancement', color: '#8B5CF6' }],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_3',\n\t\ttitle: 'Performance improvements and bug fixes',\n\t\texcerpt:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tdescription:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tslug: 'performance-improvements-bug-fixes',\n\t\tpublished_at: '2025-02-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'Bug Fix', color: '#EF4444' },\n\t\t\t{ name: 'Performance', color: '#F59E0B' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n];\n\nexport const MOCK_CONVERSATIONS = [\n\t{\n\t\tid: 'conv_1',\n\t\tsubject: 'Question about pricing',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 1,\n\t\tassigned_user: {\n\t\t\tid: 'user_1',\n\t\t\tname: 'Sarah',\n\t\t\tavatar: null,\n\t\t},\n\t},\n\t{\n\t\tid: 'conv_2',\n\t\tsubject: 'Feature request',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(\n\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000\n\t\t).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 0,\n\t\tassigned_user: {\n\t\t\tid: 'user_2',\n\t\t\tname: 'Tom',\n\t\t\tavatar: null,\n\t\t},\n\t},\n];\n\nexport const MOCK_MESSAGES = {\n\tconv_1: [\n\t\t{\n\t\t\tid: 'msg_1',\n\t\t\tcontent: \"Hi there! 👋 I'm Sarah. How can I help you today?\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Sarah',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 50 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_2',\n\t\t\tcontent: 'Hi! I have a question about your enterprise pricing.',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n\tconv_2: [\n\t\t{\n\t\t\tid: 'msg_3',\n\t\t\tcontent: \"Hello! I'm Tom from the product team.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_4',\n\t\t\tcontent: 'I would love to see a dark mode feature!',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(\n\t\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000 - 30 * 60 * 1000\n\t\t\t).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_5',\n\t\t\tcontent:\n\t\t\t\t\"Great suggestion! That feature will be available next week. I'll let you know when it's ready.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n};\n\nexport const MOCK_HELP_COLLECTIONS = [\n\t{\n\t\tid: 'collection_1',\n\t\ttitle: 'Product Overview',\n\t\tdescription: 'See how your AI-first customer service solution works.',\n\t\tarticleCount: 24,\n\t\ticon: 'ph-book-open',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_2',\n\t\ttitle: 'Getting Started',\n\t\tdescription: 'Everything you need to know to get started with Product7.',\n\t\tarticleCount: 30,\n\t\ticon: 'ph-rocket',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_3',\n\t\ttitle: 'AI Agent',\n\t\tdescription:\n\t\t\t'Resolving customer questions instantly and accurately—from live chat to email.',\n\t\tarticleCount: 82,\n\t\ticon: 'ph-robot',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_4',\n\t\ttitle: 'Channels',\n\t\tdescription:\n\t\t\t'Enabling the channels you use to communicate with customers, all from the Inbox.',\n\t\tarticleCount: 45,\n\t\ticon: 'ph-chat-circle',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_5',\n\t\ttitle: 'Billing & Payments',\n\t\tdescription: 'Manage your subscription, invoices, and payment methods.',\n\t\tarticleCount: 12,\n\t\ticon: 'ph-credit-card',\n\t\turl: '#',\n\t},\n];\n\nexport const MOCK_SURVEYS = [\n\t{\n\t\tid: 'mock_nps_survey',\n\t\ttype: 'nps',\n\t\ttitle: 'How likely are you to recommend us?',\n\t\tdescription: 'Your feedback helps us improve',\n\t\tlow_label: 'Not likely',\n\t\thigh_label: 'Very likely',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\ttype: 'csat',\n\t\ttitle: 'How satisfied are you?',\n\t\tdescription: 'Rate your experience with our product',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\ttype: 'ces',\n\t\ttitle: 'How easy was it?',\n\t\tdescription: 'Rate the ease of completing your task',\n\t\tlow_label: 'Very difficult',\n\t\thigh_label: 'Very easy',\n\t\ttrigger: 'manual',\n\t\tstatus: 'active',\n\t},\n];\n","export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function getDeviceInfo() {\n\tif (typeof navigator === 'undefined') {\n\t\treturn { device: null, browser: null, os: null };\n\t}\n\n\tconst ua = navigator.userAgent;\n\n\tlet device = 'desktop';\n\tif (/Mobi|Android/i.test(ua)) {\n\t\tdevice = /Tablet|iPad/i.test(ua) ? 'tablet' : 'mobile';\n\t}\n\n\tlet browser = 'unknown';\n\tif (ua.includes('Firefox')) browser = 'firefox';\n\telse if (ua.includes('Edg')) browser = 'edge';\n\telse if (ua.includes('Chrome')) browser = 'chrome';\n\telse if (ua.includes('Safari')) browser = 'safari';\n\telse if (ua.includes('Opera') || ua.includes('OPR')) browser = 'opera';\n\n\tlet os = 'unknown';\n\tif (ua.includes('Windows')) os = 'windows';\n\telse if (ua.includes('Mac')) os = 'macos';\n\telse if (ua.includes('Linux')) os = 'linux';\n\telse if (ua.includes('Android')) os = 'android';\n\telse if (ua.includes('iPhone') || ua.includes('iPad')) os = 'ios';\n\n\treturn { device, browser, os };\n}\n","import { MOCK_CHANGELOGS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class ChangelogService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { success: true, data: MOCK_CHANGELOGS };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/changelogs',\n\t\t\t\toptions\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n}\n","import { delay } from '../utils/helpers.js';\n\nexport class FeedbackService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync submitFeedback(feedbackData) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(500);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_post_' + Date.now(),\n\t\t\t\t\ttitle: feedbackData.title,\n\t\t\t\t\tcontent: feedbackData.content,\n\t\t\t\t},\n\t\t\t\tmessage: 'Feedback submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardId,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data';\nimport { delay } from '../utils/helpers.js';\n\nexport class MessengerService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getMessengerSettings() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tgreeting_message: 'Hi there! How can we help?',\n\t\t\t\t\tteam_name: 'Support Team',\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_CONVERSATIONS,\n\t\t\t\tmeta: { total: MOCK_CONVERSATIONS.length, page: 1, limit: 20 },\n\t\t\t};\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/messenger/conversations',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversation(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst conv = MOCK_CONVERSATIONS.find((c) => c.id === conversationId);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { ...conv, messages: MOCK_MESSAGES[conversationId] || [] },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}`,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync startConversation(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tcontent: data.content,\n\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t}),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getUnreadCount() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tconst count = MOCK_CONVERSATIONS.reduce(\n\t\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { unread_count: count, unread_conversations: count > 0 ? 1 : 0 },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/unread', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/read`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getMessages(conversationId, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_MESSAGES[conversationId] || [],\n\t\t\t\tmeta: { total: 0, page: 1, limit: 50 },\n\t\t\t};\n\t\t}\n\n\t\tconst params = { ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tcontact_id: 'mock_contact_' + Date.now(),\n\t\t\t\t\temail: data.email,\n\t\t\t\t\tname: data.name || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/identify', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\temail: data.email,\n\t\t\t\tname: data.name || '',\n\t\t\t\tphone: data.phone || '',\n\t\t\t\tcompany: data.company || '',\n\t\t\t\tavatar_url: data.avatar_url || '',\n\t\t\t\tmetadata: data.metadata || {},\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/typing`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ is_typing: isTyping }),\n\t\t\t}\n\t\t);\n\t}\n}\n","export class SDKError extends Error {\n\tconstructor(message, cause) {\n\t\tsuper(message);\n\t\tthis.name = 'SDKError';\n\t\tthis.cause = cause;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, SDKError);\n\t\t}\n\t}\n}\n\nexport class APIError extends Error {\n\tconstructor(status, message, response) {\n\t\tsuper(message);\n\t\tthis.name = 'APIError';\n\t\tthis.status = status;\n\t\tthis.response = response;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, APIError);\n\t\t}\n\t}\n\n\tisNetworkError() {\n\t\treturn this.status === 0;\n\t}\n\n\tisClientError() {\n\t\treturn this.status >= 400 && this.status < 500;\n\t}\n\n\tisServerError() {\n\t\treturn this.status >= 500 && this.status < 600;\n\t}\n}\n\nexport class WidgetError extends Error {\n\tconstructor(message, widgetType, widgetId) {\n\t\tsuper(message);\n\t\tthis.name = 'WidgetError';\n\t\tthis.widgetType = widgetType;\n\t\tthis.widgetId = widgetId;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, WidgetError);\n\t\t}\n\t}\n}\n\nexport class ConfigError extends Error {\n\tconstructor(message, configKey) {\n\t\tsuper(message);\n\t\tthis.name = 'ConfigError';\n\t\tthis.configKey = configKey;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ConfigError);\n\t\t}\n\t}\n}\n\nexport class ValidationError extends Error {\n\tconstructor(message, field, value) {\n\t\tsuper(message);\n\t\tthis.name = 'ValidationError';\n\t\tthis.field = field;\n\t\tthis.value = value;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ValidationError);\n\t\t}\n\t}\n}\n\nexport class ErrorHandler {\n\tconstructor(debug = false) {\n\t\tthis.debug = debug;\n\t}\n\n\thandle(error, context = '') {\n\t\tconst errorInfo = {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tcontext,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (error instanceof APIError) {\n\t\t\terrorInfo.status = error.status;\n\t\t\terrorInfo.type = 'api';\n\t\t} else if (error instanceof WidgetError) {\n\t\t\terrorInfo.widgetType = error.widgetType;\n\t\t\terrorInfo.widgetId = error.widgetId;\n\t\t\terrorInfo.type = 'widget';\n\t\t} else if (error instanceof ConfigError) {\n\t\t\terrorInfo.configKey = error.configKey;\n\t\t\terrorInfo.type = 'config';\n\t\t} else if (error instanceof ValidationError) {\n\t\t\terrorInfo.field = error.field;\n\t\t\terrorInfo.value = error.value;\n\t\t\terrorInfo.type = 'validation';\n\t\t} else {\n\t\t\terrorInfo.type = 'unknown';\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.error('[FeedbackSDK Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[FeedbackSDK Error]', error.message);\n\t\t}\n\n\t\treturn errorInfo;\n\t}\n\n\tgetUserMessage(error) {\n\t\tif (error instanceof APIError) {\n\t\t\tif (error.isNetworkError()) {\n\t\t\t\treturn 'Network error. Please check your connection and try again.';\n\t\t\t} else if (error.isClientError()) {\n\t\t\t\treturn 'Invalid request. Please check your input and try again.';\n\t\t\t} else if (error.isServerError()) {\n\t\t\t\treturn 'Server error. Please try again later.';\n\t\t\t}\n\t\t\treturn 'Failed to submit feedback. Please try again.';\n\t\t}\n\n\t\tif (error instanceof ValidationError) {\n\t\t\treturn `Please check your ${error.field}: ${error.message}`;\n\t\t}\n\n\t\tif (error instanceof ConfigError) {\n\t\t\treturn 'Configuration error. Please check your SDK setup.';\n\t\t}\n\n\t\tif (error instanceof WidgetError) {\n\t\t\treturn 'Widget error. Please try refreshing the page.';\n\t\t}\n\n\t\treturn 'An unexpected error occurred. Please try again.';\n\t}\n}\n","import { APIError } from '../../utils/errors.js';\nimport { MOCK_SURVEYS } from '../mock-data';\nimport { delay, getDeviceInfo } from '../utils/helpers.js';\n\nexport class SurveyService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { success: true, data: MOCK_SURVEYS };\n\t\t}\n\n\t\tconst params = {\n\t\t\turl:\n\t\t\t\tcontext.url ||\n\t\t\t\t(typeof window !== 'undefined' ? window.location.href : ''),\n\t\t\t...getDeviceInfo(),\n\t\t\t...(context.userProperties && {\n\t\t\t\tuser_properties: context.userProperties,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/surveys/active',\n\t\t\t\tparams\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_response_' + Date.now(),\n\t\t\t\t\tsurvey_id: surveyId,\n\t\t\t\t\t...responseData,\n\t\t\t\t},\n\t\t\t\tmessage: 'Survey response submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst payload = {\n\t\t\trating: responseData.rating,\n\t\t\tfeedback: responseData.feedback || '',\n\t\t\tanswers: responseData.answers || {},\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.userContext = config.userContext || null;\n\t\tthis.mock = config.mock || false;\n\t\tthis.env = config.env || 'production';\n\t\tthis.baseURL = this._getBaseURL(config);\n\n\t\tthis._loadStoredSession();\n\t}\n\n\t_getBaseURL(config) {\n\t\tif (config.apiUrl) return config.apiUrl;\n\n\t\tconst ENV_URLS = {\n\t\t\tproduction: {\n\t\t\t\tbase: 'https://api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tstaging: {\n\t\t\t\tbase: 'https://staging.api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.staging.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tlocalstack: {\n\t\t\t\tbase: 'http://localhost:1323/api/v1',\n\t\t\t\twithWorkspace: (ws) => `http://${ws}.localhost:1323/api/v1`,\n\t\t\t},\n\t\t};\n\n\t\tconst envConfig = ENV_URLS[this.env] || ENV_URLS.production;\n\t\treturn this.workspace\n\t\t\t? envConfig.withWorkspace(this.workspace)\n\t\t\t: envConfig.base;\n\t}\n\n\tasync init(userContext = null) {\n\t\tif (userContext) {\n\t\t\tthis.userContext = userContext;\n\t\t}\n\n\t\tif (this.isSessionValid()) {\n\t\t\treturn { sessionToken: this.sessionToken };\n\t\t}\n\n\t\tif (!this.workspace || !this.userContext) {\n\t\t\tthrow new APIError(\n\t\t\t\t400,\n\t\t\t\t`Missing ${!this.workspace ? 'workspace' : 'user context'} for initialization`\n\t\t\t);\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn this._initMockSession();\n\t\t}\n\n\t\treturn this._initRealSession();\n\t}\n\n\tasync _initMockSession() {\n\t\tthis.sessionToken = 'mock_session_' + Date.now();\n\t\tthis.sessionExpiry = new Date(Date.now() + 3600 * 1000);\n\t\tthis._storeSession();\n\t\treturn {\n\t\t\tsessionToken: this.sessionToken,\n\t\t\tconfig: {\n\t\t\t\tprimaryColor: '#21244A',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\ttextColor: '#1F2937',\n\t\t\t\tboardId: 'feature-requests',\n\t\t\t\tsize: 'medium',\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t},\n\t\t\texpiresIn: 3600,\n\t\t};\n\t}\n\n\tasync _initRealSession() {\n\t\tconst payload = {\n\t\t\tworkspace: this.workspace,\n\t\t\tuser: this.userContext,\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this._makeRequest('/widget/init', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\n\t\t\tthis.sessionToken = response.session_token;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + response.expires_in * 1000);\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: response.config || {},\n\t\t\t\texpiresIn: response.expires_in,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new APIError(\n\t\t\t\terror.status || 500,\n\t\t\t\t`Failed to initialize widget: ${error.message}`,\n\t\t\t\terror.response\n\t\t\t);\n\t\t}\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.userContext = userContext;\n\t\tthis._storeData('feedbackSDK_userContext', userContext);\n\t}\n\n\tgetUserContext() {\n\t\treturn this.userContext;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis._removeData('feedbackSDK_session');\n\t\tthis._removeData('feedbackSDK_userContext');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('feedbackSDK_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { MessengerService } from '../api/services/MessengerService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\n\nexport class APIService extends BaseAPIService {\n\tconstructor(config = {}) {\n\t\tsuper(config);\n\n\t\tthis.feedback = new FeedbackService(this);\n\t\tthis.survey = new SurveyService(this);\n\t\tthis.messenger = new MessengerService(this);\n\t\tthis.help = new HelpService(this);\n\t\tthis.changelog = new ChangelogService(this);\n\t}\n\n\tasync submitFeedback(data) {\n\t\treturn this.feedback.submitFeedback(data);\n\t}\n\n\tasync getActiveSurveys(context) {\n\t\treturn this.survey.getActiveSurveys(context);\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\treturn this.survey.submitSurveyResponse(surveyId, responseData);\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\treturn this.survey.dismissSurvey(surveyId);\n\t}\n\n\tasync getMessengerSettings() {\n\t\treturn this.messenger.getMessengerSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log(\n\t\t\t\t'[APIService] startConversation: session invalid, calling init...'\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[APIService] startConversation: init result, token:',\n\t\t\t\t\tthis.sessionToken ? 'set' : 'null'\n\t\t\t\t);\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[APIService] startConversation: init failed:',\n\t\t\t\t\tinitError.message\n\t\t\t\t);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error(\n\t\t\t\t'[APIService] startConversation: no session token after init'\n\t\t\t);\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log(\n\t\t\t'[APIService] startConversation: sending to',\n\t\t\t`${this.baseURL}/widget/messenger/conversations`,\n\t\t\t'mock:',\n\t\t\tthis.mock\n\t\t);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.messenger.identifyContact(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\tasync getChangelogs(options) {\n\t\treturn this.changelog.getChangelogs(options);\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken =\n\t\t\t\tsessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('feedbackSDK_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[FeedbackSDK] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30;\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardId: this.sdk.config.boardId,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true,\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\tif (this.options.suppressAfterSubmission && this._hasRecentlySubmitted()) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\treason: 'recently_submitted',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof container === 'string') {\n\t\t\tcontainer = document.querySelector(container);\n\t\t}\n\n\t\tif (!container) {\n\t\t\tcontainer = document.body;\n\t\t}\n\n\t\tthis.container = container;\n\t\tthis.element = this._render();\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis.mounted = true;\n\t\tthis._attachEvents();\n\t\tthis.onMount();\n\n\t\tif (this.options.autoShow) {\n\t\t\tthis.show();\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('widget:mounted', { widget: this });\n\t\treturn this;\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t\treturn this;\n\t}\n\n\topenPanel() {\n\t\tthis.state.isOpen = true;\n\n\t\tif (this.options.displayMode === 'modal') {\n\t\t\tthis._showLoadingModal();\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._hideLoadingModal();\n\t\t\t\tthis._renderPanel();\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tif (this.panelElement) {\n\t\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t\t}\n\t\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}, 600);\n\t\t} else {\n\t\t\tthis._renderPanel();\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tif (this.panelElement) {\n\t\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t\t}\n\t\t\t\tif (this.backdropElement) {\n\t\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t_showLoadingModal() {\n\t\tthis.state.isLoading = true;\n\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\tthis.loadingElement = document.createElement('div');\n\t\tthis.loadingElement.className = 'feedback-loading-modal';\n\t\tthis.loadingElement.innerHTML = `\n\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t`;\n\t\tdocument.body.appendChild(this.loadingElement);\n\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.backdropElement.classList.add('show');\n\t\t\tthis.loadingElement.classList.add('show');\n\t\t});\n\t}\n\n\t_hideLoadingModal() {\n\t\tthis.state.isLoading = false;\n\t\tif (this.loadingElement) {\n\t\t\tthis.loadingElement.remove();\n\t\t\tthis.loadingElement = null;\n\t\t}\n\t}\n\n\tclosePanel() {\n\t\tif (this.panelElement) {\n\t\t\tthis.panelElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\t\tthis.panelElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t\tthis._resetForm();\n\t\t}, 300);\n\t}\n\n\tasync submitFeedback() {\n\t\tif (this.state.isSubmitting) return;\n\n\t\tthis._hideError();\n\n\t\ttry {\n\t\t\tthis.state.isSubmitting = true;\n\t\t\tthis._updateSubmitButton();\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: this.state.title || 'Feedback',\n\t\t\t\tcontent: this.state.content,\n\t\t\t\temail: this.state.email,\n\t\t\t\tboard_id: this.options.boardId,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.content.trim()) {\n\t\t\t\tthis._showError('Please enter your feedback message.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst response = await this.apiService.submitFeedback(payload);\n\n\t\t\tthis._trackSubmission();\n\n\t\t\tthis._showSuccessMessage();\n\t\t\tthis.closePanel();\n\n\t\t\tthis.sdk.eventBus.emit('feedback:submitted', {\n\t\t\t\twidget: this,\n\t\t\t\tfeedback: response,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._showError('Failed to submit feedback. Please try again.');\n\t\t\tthis.sdk.eventBus.emit('feedback:error', { widget: this, error });\n\t\t} finally {\n\t\t\tthis.state.isSubmitting = false;\n\t\t\tthis._updateSubmitButton();\n\t\t}\n\t}\n\n\thandleConfigUpdate(newConfig) {\n\t\tthis.options.theme = newConfig.theme;\n\t\tif (this.element) {\n\t\t\tthis._updateTheme();\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.destroyed) return;\n\n\t\tthis.onDestroy();\n\t\tthis.closePanel();\n\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\n\t\tthis.destroyed = true;\n\t\tthis.mounted = false;\n\t\tthis.sdk.eventBus.emit('widget:destroyed', { widget: this });\n\t}\n\n\tonMount() {}\n\tonDestroy() {}\n\n\t_trackSubmission() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst data = {\n\t\t\t\tsubmittedAt: Date.now(),\n\t\t\t\tboardId: this.options.boardId,\n\t\t\t};\n\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(data));\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to track feedback submission:', e);\n\t\t}\n\t}\n\n\t_hasRecentlySubmitted() {\n\t\tconst cooldownMs = this.options.suppressionDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.sdk.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.sdk.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\tconst submittedAt = data.submittedAt;\n\n\t\t\treturn now - submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearSubmissionTracking() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear submission tracking:', e);\n\t\t}\n\t}\n\n\tshouldShow() {\n\t\tif (!this.options.suppressAfterSubmission) return true;\n\t\treturn !this._hasRecentlySubmitted();\n\t}\n\n\t_render() {\n\t\tthrow new Error('_render() must be implemented by concrete widget');\n\t}\n\n\t_attachEvents() {\n\t\t// Override in concrete widgets\n\t}\n\n\t_bindMethods() {\n\t\tthis.openPanel = this.openPanel.bind(this);\n\t\tthis.closePanel = this.closePanel.bind(this);\n\t\tthis.submitFeedback = this.submitFeedback.bind(this);\n\t}\n\n\t_renderPanel() {\n\t\tif (this.panelElement) return;\n\n\t\tif (this.options.showBackdrop && !this.backdropElement) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\t\tthis.backdropElement.addEventListener('click', this.closePanel);\n\t\t}\n\n\t\tconst modeClass =\n\t\t\tthis.options.displayMode === 'modal'\n\t\t\t\t? 'feedback-modal'\n\t\t\t\t: 'feedback-panel';\n\t\tconst sizeClass = `size-${this.options.size}`;\n\t\tthis.panelElement = document.createElement('div');\n\t\tthis.panelElement.className = `${modeClass} ${sizeClass}`;\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--primary-color',\n\t\t\tthis.options.primaryColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--bg-color',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty('--text-color', this.options.textColor);\n\t\tthis.panelElement.innerHTML = this._getPanelHTML();\n\n\t\tdocument.body.appendChild(this.panelElement);\n\t\tthis._attachPanelEvents();\n\n\t\tconst firstInput = this.panelElement.querySelector('input, textarea');\n\t\tif (firstInput) {\n\t\t\tsetTimeout(() => firstInput.focus(), 350);\n\t\t}\n\t}\n\n\t_getPanelHTML() {\n\t\treturn `\n <div class=\"feedback-panel-content\">\n <div class=\"feedback-panel-header\">\n <h3>Send Feedback</h3>\n <button class=\"sdk-close-btn\" type=\"button\" aria-label=\"Close\">×</button>\n </div>\n <div class=\"feedback-panel-body\">\n <form class=\"feedback-form\">\n <div class=\"sdk-form-group\">\n <label class=\"sdk-label\" for=\"feedback-title-${this.id}\">Title (optional)</label>\n <input \n type=\"text\" \n id=\"feedback-title-${this.id}\" \n name=\"title\" \n class=\"sdk-input\"\n placeholder=\"Brief description of your feedback\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"sdk-form-group\">\n <label class=\"sdk-label\" for=\"feedback-content-${this.id}\">Message *</label>\n <textarea \n id=\"feedback-content-${this.id}\" \n name=\"content\" \n class=\"sdk-textarea\"\n placeholder=\"Tell us what you think...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"feedback-error\" role=\"alert\"></div>\n <div class=\"feedback-form-actions\">\n <button type=\"submit\" class=\"sdk-btn-primary sdk-btn-block\">\n ${this.state.isSubmitting ? 'Sending...' : 'Send Feedback'}\n </button>\n </div>\n </form>\n </div>\n </div>\n `;\n\t}\n\n\t_attachPanelEvents() {\n\t\tconst panel = this.panelElement;\n\n\t\tpanel\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', this.closePanel);\n\n\t\tconst form = panel.querySelector('.feedback-form');\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('input[name=\"title\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.title = e.target.value;\n\t\t\t});\n\n\t\tpanel\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tconst handleEscape = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis.closePanel();\n\t\t\t\tdocument.removeEventListener('keydown', handleEscape);\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', handleEscape);\n\t}\n\n\t_updateSubmitButton() {\n\t\tif (this.panelElement) {\n\t\t\tconst submitBtn = this.panelElement.querySelector('.sdk-btn-primary');\n\t\t\tif (submitBtn) {\n\t\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t\t? 'Sending...'\n\t\t\t\t\t: 'Send Feedback';\n\t\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t\t}\n\t\t}\n\t}\n\n\t_showError(message) {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.textContent = message;\n\t\t\t\terrorElement.classList.add('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_hideError() {\n\t\tif (this.panelElement) {\n\t\t\tconst errorElement = this.panelElement.querySelector('.feedback-error');\n\t\t\tif (errorElement) {\n\t\t\t\terrorElement.classList.remove('show');\n\t\t\t}\n\t\t}\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'sdk-notification sdk-notification-success';\n\t\tnotification.innerHTML = `\n <div class=\"sdk-notification-content\">\n <div class=\"sdk-notification-icon\">✓</div>\n <span class=\"sdk-notification-text\">Feedback submitted successfully!</span>\n <button class=\"sdk-close-btn\" aria-label=\"Close\">×</button>\n </div>\n `;\n\n\t\tdocument.body.appendChild(notification);\n\n\t\tconst closeBtn = notification.querySelector('.sdk-close-btn');\n\t\tconst closeNotification = () => {\n\t\t\tif (notification.parentNode) {\n\t\t\t\tnotification.style.opacity = '0';\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (notification.parentNode) {\n\t\t\t\t\t\tnotification.parentNode.removeChild(notification);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t};\n\n\t\tcloseBtn.addEventListener('click', closeNotification);\n\n\t\tsetTimeout(closeNotification, 4000);\n\t}\n\n\t_resetForm() {\n\t\tthis.state.title = '';\n\t\tthis.state.content = '';\n\t\tthis.state.email = '';\n\t\tthis.state.errors = {};\n\t}\n\n\t_updateTheme() {\n\t\t// No longer needed - single theme\n\t}\n\n\topenModal() {\n\t\tthis.openPanel();\n\t}\n\n\tcloseModal() {\n\t\tthis.closePanel();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class ButtonWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'button' });\n\t\tthis.isMinimized = false;\n\t\tthis._hiddenForOpenPanel = false;\n\t}\n\n\t_render() {\n\t\tconst button = document.createElement('div');\n\t\tbutton.className = `feedback-widget-button position-${this.options.position}`;\n\t\tbutton.innerHTML = `\n <button class=\"feedback-trigger-btn\" type=\"button\">\n <svg class=\"feedback-icon\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" fill=\"currentColor\">\n <path d=\"M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z\"/>\n </svg>\n <span class=\"feedback-text\">Feedback</span>\n \n <div class=\"feedback-minimize-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z\"/>\n </svg>\n </div>\n \n <div class=\"feedback-expand-icon\">\n <svg viewBox=\"0 0 256 256\">\n <path d=\"M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z\"/>\n </svg>\n </div>\n </button>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(button.style, this.options.customStyles);\n\t\t}\n\n\t\treturn button;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.feedback-trigger-btn');\n\t\tconst minimizeIcon = this.element.querySelector('.feedback-minimize-icon');\n\t\tconst expandIcon = this.element.querySelector('.feedback-expand-icon');\n\t\tconst isControlIcon = (target) => {\n\t\t\tif (!(target instanceof Element)) return false;\n\t\t\treturn Boolean(\n\t\t\t\ttarget.closest('.feedback-minimize-icon') ||\n\t\t\t\t\ttarget.closest('.feedback-expand-icon')\n\t\t\t);\n\t\t};\n\t\tconst openIfAllowed = (target) => {\n\t\t\tif (isControlIcon(target)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!this.isMinimized) {\n\t\t\t\tthis.openPanel();\n\t\t\t}\n\t\t};\n\n\t\tminimizeIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.minimize();\n\t\t});\n\n\t\texpandIcon.addEventListener('click', (e) => {\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tthis.restore();\n\t\t});\n\n\t\tbutton.addEventListener('click', (e) => {\n\t\t\topenIfAllowed(e.target);\n\t\t});\n\n\t\t// Pointer events improve consistency across touch and mouse devices.\n\t\tbutton.addEventListener('pointerup', (e) => {\n\t\t\tif (e.pointerType === 'mouse') return;\n\t\t\topenIfAllowed(e.target);\n\t\t});\n\t}\n\n\tminimize() {\n\t\tthis.isMinimized = true;\n\t\tthis.element.classList.add('minimized');\n\t}\n\n\trestore() {\n\t\tthis.isMinimized = false;\n\t\tthis.element.classList.remove('minimized');\n\t}\n\n\topenPanel() {\n\t\tif (!this.state.isOpen) {\n\t\t\tthis._hiddenForOpenPanel = true;\n\t\t\tthis.hide();\n\t\t}\n\t\tsuper.openPanel();\n\t}\n\n\tclosePanel() {\n\t\tconst shouldRestoreButton = this._hiddenForOpenPanel;\n\t\tsuper.closePanel();\n\n\t\tif (shouldRestoreButton) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!this.destroyed) {\n\t\t\t\t\tthis.show();\n\t\t\t\t}\n\t\t\t\tthis._hiddenForOpenPanel = false;\n\t\t\t}, 320);\n\t\t}\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tupdateText(text) {\n\t\tconst textEl = this.element?.querySelector('.feedback-text');\n\t\tif (textEl) {\n\t\t\ttextEl.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class ChangelogWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'changelog' });\n\t\tthis.changelogs = [];\n\t\tthis.isLoading = false;\n\t\tthis.modalElement = null;\n\t\tthis.sidebarElement = null;\n\t\tthis.currentIndex = 0;\n\t}\n\n\t_render() {\n\t\tconst trigger = document.createElement('div');\n\t\ttrigger.className = `changelog-widget position-${this.options.position}`;\n\t\ttrigger.innerHTML = `\n\t\t\t<button class=\"changelog-trigger-btn\" type=\"button\" aria-label=\"View Updates\">\n\t\t\t\t<svg class=\"changelog-icon\" width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n\t\t\t\t\t<path d=\"M5.8 21L7.4 14L2 9.2L9.2 8.6L12 2L14.8 8.6L22 9.2L16.6 14L18.2 21L12 17.3L5.8 21Z\"/>\n\t\t\t\t</svg>\n\t\t\t\t<span class=\"changelog-text\">${this.options.triggerText || \"What's New\"}</span>\n\t\t\t\t<span class=\"changelog-confetti-emoji\">🎉</span>\n\t\t\t\t${this.options.showBadge ? '<span class=\"changelog-badge\"></span>' : ''}\n\t\t\t</button>\n\t\t`;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(trigger.style, this.options.customStyles);\n\t\t}\n\n\t\treturn trigger;\n\t}\n\n\t_attachEvents() {\n\t\tconst button = this.element.querySelector('.changelog-trigger-btn');\n\t\tbutton.addEventListener('click', () => {\n\t\t\tthis.openSidebar();\n\t\t});\n\t}\n\n\tasync openModal() {\n\t\tif (this.modalElement) return;\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createModal();\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis.currentIndex = 0;\n\t\tthis._renderCurrentChangelog();\n\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.modalElement) {\n\t\t\t\tthis.modalElement.classList.add('open');\n\t\t\t}\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\tcloseModal() {\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.modalElement) {\n\t\t\tthis.modalElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.modalElement && this.modalElement.parentNode) {\n\t\t\t\tthis.modalElement.parentNode.removeChild(this.modalElement);\n\t\t\t\tthis.modalElement = null;\n\t\t\t}\n\t\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\t\tthis.backdropElement = null;\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createModal() {\n\t\tthis.backdropElement = document.createElement('div');\n\t\tthis.backdropElement.className = 'changelog-modal-backdrop';\n\t\tdocument.body.appendChild(this.backdropElement);\n\t\tthis.backdropElement.addEventListener('click', () => this.closeModal());\n\n\t\tthis.modalElement = document.createElement('div');\n\t\tthis.modalElement.className = 'changelog-modal';\n\t\tthis.modalElement.innerHTML = `\n\t\t\t<div class=\"changelog-modal-container\">\n\t\t\t\t<button class=\"changelog-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t<div class=\"changelog-modal-content\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.modalElement);\n\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-container')\n\t\t\t.addEventListener('click', (e) => e.stopPropagation());\n\n\t\tthis.modalElement\n\t\t\t.querySelector('.changelog-modal-close')\n\t\t\t.addEventListener('click', () => this.closeModal());\n\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') this.closeModal();\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\tasync openSidebar() {\n\t\tif (this.listModalElement) return;\n\n\t\tif (this.modalElement) {\n\t\t\tthis.closeModal();\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 350));\n\t\t}\n\n\t\tthis.state.isOpen = true;\n\t\tthis._createListModal();\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tawait this._loadChangelogs();\n\t\t}\n\n\t\tthis._renderChangelogList();\n\n\t\tdocument.body.style.overflow = 'hidden';\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.listModalElement) {\n\t\t\t\tthis.listModalElement.classList.add('open');\n\t\t\t\tthis._showConfetti();\n\t\t\t}\n\t\t\tif (this.listModalBackdropElement) {\n\t\t\t\tthis.listModalBackdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\t_showConfetti() {\n\t\tconst colors = [\n\t\t\t'#FF6B6B',\n\t\t\t'#4ECDC4',\n\t\t\t'#FFE66D',\n\t\t\t'#95E1D3',\n\t\t\t'#F38181',\n\t\t\t'#AA96DA',\n\t\t\t'#FCBAD3',\n\t\t\t'#A8D8EA',\n\t\t];\n\t\tconst confettiCount = 50;\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'changelog-confetti-container';\n\t\tdocument.body.appendChild(container);\n\n\t\tfor (let i = 0; i < confettiCount; i++) {\n\t\t\tconst confetti = document.createElement('div');\n\t\t\tconfetti.className = 'changelog-confetti';\n\t\t\tconfetti.style.left = Math.random() * 100 + '%';\n\t\t\tconfetti.style.backgroundColor =\n\t\t\t\tcolors[Math.floor(Math.random() * colors.length)];\n\t\t\tconfetti.style.animationDelay = Math.random() * 0.5 + 's';\n\t\t\tconfetti.style.animationDuration = Math.random() * 1 + 1.5 + 's';\n\n\t\t\tconst shapes = ['circle', 'square', 'rectangle'];\n\t\t\tconst shape = shapes[Math.floor(Math.random() * shapes.length)];\n\t\t\tif (shape === 'circle') {\n\t\t\t\tconfetti.style.borderRadius = '50%';\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t} else if (shape === 'rectangle') {\n\t\t\t\tconfetti.style.width = Math.random() * 4 + 3 + 'px';\n\t\t\t\tconfetti.style.height = Math.random() * 10 + 8 + 'px';\n\t\t\t} else {\n\t\t\t\tconfetti.style.width = Math.random() * 8 + 4 + 'px';\n\t\t\t\tconfetti.style.height = confetti.style.width;\n\t\t\t}\n\n\t\t\tcontainer.appendChild(confetti);\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tif (container.parentNode) container.parentNode.removeChild(container);\n\t\t}, 2500);\n\t}\n\n\tcloseSidebar() {\n\t\tdocument.body.style.overflow = '';\n\n\t\tif (this.listModalElement) {\n\t\t\tthis.listModalElement.classList.remove('open');\n\t\t}\n\t\tif (this.listModalBackdropElement) {\n\t\t\tthis.listModalBackdropElement.classList.remove('show');\n\t\t}\n\n\t\tsetTimeout(() => {\n\t\t\tthis.state.isOpen = false;\n\t\t\tif (this.listModalElement && this.listModalElement.parentNode) {\n\t\t\t\tthis.listModalElement.parentNode.removeChild(this.listModalElement);\n\t\t\t\tthis.listModalElement = null;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tthis.listModalBackdropElement &&\n\t\t\t\tthis.listModalBackdropElement.parentNode\n\t\t\t) {\n\t\t\t\tthis.listModalBackdropElement.parentNode.removeChild(\n\t\t\t\t\tthis.listModalBackdropElement\n\t\t\t\t);\n\t\t\t\tthis.listModalBackdropElement = null;\n\t\t\t}\n\t\t\tif (this._listModalEscapeHandler) {\n\t\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\t_createListModal() {\n\t\tthis.listModalBackdropElement = document.createElement('div');\n\t\tthis.listModalBackdropElement.className = 'changelog-list-modal-backdrop';\n\t\tdocument.body.appendChild(this.listModalBackdropElement);\n\t\tthis.listModalBackdropElement.addEventListener('click', () =>\n\t\t\tthis.closeSidebar()\n\t\t);\n\n\t\tthis.listModalElement = document.createElement('div');\n\t\tthis.listModalElement.className = 'changelog-list-modal';\n\t\tthis.listModalElement.innerHTML = `\n\t\t\t<div class=\"changelog-list-modal-container\">\n\t\t\t\t<div class=\"changelog-list-modal-header\">\n\t\t\t\t\t<h2>${this.options.title || \"What's New\"} 🎉</h2>\n\t\t\t\t\t<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">×</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-list-modal-body\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.listModalElement);\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-container')\n\t\t\t.addEventListener('click', (e) => e.stopPropagation());\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-close')\n\t\t\t.addEventListener('click', () => this.closeSidebar());\n\n\t\tthis._listModalEscapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') this.closeSidebar();\n\t\t};\n\t\tdocument.addEventListener('keydown', this._listModalEscapeHandler);\n\t}\n\n\t_renderChangelogList() {\n\t\tconst body = this.listModalElement.querySelector(\n\t\t\t'.changelog-list-modal-body'\n\t\t);\n\n\t\tif (this.isLoading) return;\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tbody.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tbody.innerHTML = `\n\t\t\t<div class=\"changelog-list\">\n\t\t\t\t${this.changelogs.map((changelog, index) => this._renderChangelogListItem(changelog, index)).join('')}\n\t\t\t</div>\n\t\t`;\n\n\t\tbody.querySelectorAll('.changelog-list-item').forEach((item, index) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(this.changelogs[index]);\n\t\t\t});\n\t\t});\n\t}\n\n\t_renderChangelogListItem(changelog, index) {\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst date = changelog.published_at\n\t\t\t? this._formatDate(changelog.published_at)\n\t\t\t: '';\n\t\tconst description = this._truncateDescription(\n\t\t\tchangelog.excerpt || changelog.description,\n\t\t\t120\n\t\t);\n\n\t\treturn `\n\t\t\t<div class=\"changelog-list-item\" data-index=\"${index}\">\n\t\t\t\t<div class=\"changelog-list-item-main\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasImage\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-list-item-image\">\n\t\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<div class=\"changelog-list-item-content\">\n\t\t\t\t\t\t${date ? `<span class=\"changelog-list-item-date\">${date}</span>` : ''}\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tchangelog.labels && changelog.labels.length > 0\n\t\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t\t<div class=\"changelog-list-item-labels\">\n\t\t\t\t\t\t\t\t${changelog.labels\n\t\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t\t(label) => `\n\t\t\t\t\t\t\t\t\t<span class=\"changelog-label\" style=\"background-color: ${label.color || '#E5E7EB'}; color: ${this._getContrastColor(label.color || '#E5E7EB')}\">${label.name}</span>\n\t\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t: ''\n\t\t\t\t\t\t}\n\t\t\t\t\t\t<h3 class=\"changelog-list-item-title\">${changelog.title}</h3>\n\t\t\t\t\t\t${description ? `<p class=\"changelog-list-item-description\">${description}</p>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\tasync _loadChangelogs() {\n\t\tthis.isLoading = true;\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs();\n\t\t\tthis.changelogs = result.data || [];\n\t\t\tthis.sdk.eventBus.emit('changelog:loaded', {\n\t\t\t\tchangelogs: this.changelogs,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis.changelogs = [];\n\t\t\tthis.sdk.eventBus.emit('changelog:error', { error });\n\t\t} finally {\n\t\t\tthis.isLoading = false;\n\t\t}\n\t}\n\n\t_renderCurrentChangelog() {\n\t\tconst content = this.modalElement.querySelector('.changelog-modal-content');\n\n\t\tif (this.isLoading) return;\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tcontent.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tconst changelog = this.changelogs[this.currentIndex];\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst hasMultiple = this.changelogs.length > 1;\n\t\tconst description = this._truncateDescription(\n\t\t\tchangelog.excerpt || changelog.description,\n\t\t\t160\n\t\t);\n\n\t\tcontent.innerHTML = `\n\t\t\t<div class=\"changelog-popup-item\">\n\t\t\t\t${\n\t\t\t\t\thasImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"changelog-popup-image\">\n\t\t\t\t\t\t<img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"changelog-popup-body\">\n\t\t\t\t\t<h2 class=\"changelog-popup-title\">${changelog.title}</h2>\n\t\t\t\t\t${description ? `<p class=\"changelog-popup-description\">${description}</p>` : ''}\n\t\t\t\t\t<button class=\"changelog-popup-btn\" type=\"button\">\n\t\t\t\t\t\t${this.options.viewButtonText || 'View Update'}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-popup-footer\">\n\t\t\t\t\t${\n\t\t\t\t\t\thasMultiple\n\t\t\t\t\t\t\t? `\n\t\t\t\t\t\t<div class=\"changelog-popup-dots\">\n\t\t\t\t\t\t\t${this.changelogs\n\t\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t\t(_, i) => `\n\t\t\t\t\t\t\t\t<span class=\"changelog-dot ${i === this.currentIndex ? 'active' : ''}\" data-index=\"${i}\"></span>\n\t\t\t\t\t\t\t`\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`\n\t\t\t\t\t\t\t: ''\n\t\t\t\t\t}\n\t\t\t\t\t<button class=\"changelog-view-all-btn\" type=\"button\">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">\n\t\t\t\t\t\t\t<path d=\"M5 12h14M12 5l7 7-7 7\"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tcontent\n\t\t\t.querySelector('.changelog-popup-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(changelog);\n\t\t\t});\n\n\t\tcontent\n\t\t\t.querySelector('.changelog-view-all-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.closeModal();\n\t\t\t\tsetTimeout(() => this.openSidebar(), 350);\n\t\t\t});\n\n\t\tif (hasMultiple) {\n\t\t\tcontent.querySelectorAll('.changelog-dot').forEach((dot) => {\n\t\t\t\tdot.addEventListener('click', (e) => {\n\t\t\t\t\tthis.currentIndex = parseInt(e.target.dataset.index, 10);\n\t\t\t\t\tthis._renderCurrentChangelog();\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleViewUpdate(changelog) {\n\t\tthis.sdk.eventBus.emit('changelog:view', { changelog });\n\n\t\tconst changelogBase = (this.options.changelogBaseUrl || '').replace(\n\t\t\t/\\/$/,\n\t\t\t''\n\t\t);\n\t\tconst url =\n\t\t\tchangelog.url ||\n\t\t\t(changelog.slug && changelogBase\n\t\t\t\t? `${changelogBase}/${changelog.slug}`\n\t\t\t\t: null) ||\n\t\t\tchangelogBase ||\n\t\t\tnull;\n\n\t\tif (url) {\n\t\t\tif (this.options.openInNewTab !== false) {\n\t\t\t\twindow.open(url, '_blank', 'noopener,noreferrer');\n\t\t\t} else {\n\t\t\t\twindow.location.href = url;\n\t\t\t}\n\t\t}\n\n\t\tif (typeof this.options.onViewUpdate === 'function') {\n\t\t\tthis.options.onViewUpdate(changelog);\n\t\t}\n\t}\n\n\t_stripHtml(html) {\n\t\tconst tmp = document.createElement('div');\n\t\ttmp.innerHTML = html;\n\t\treturn (tmp.textContent || tmp.innerText || '').trim();\n\t}\n\n\t_truncateDescription(html, maxLength = 120) {\n\t\tif (!html) return '';\n\t\tconst plain = this._stripHtml(html);\n\t\tif (plain.length <= maxLength) return plain;\n\t\treturn plain.substring(0, maxLength).trimEnd() + '...';\n\t}\n\n\t_formatDate(dateString) {\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleDateString('en-US', {\n\t\t\tyear: 'numeric',\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t});\n\t}\n\n\t_getContrastColor(hexColor) {\n\t\tconst hex = hexColor.replace('#', '');\n\t\tconst r = parseInt(hex.substr(0, 2), 16);\n\t\tconst g = parseInt(hex.substr(2, 2), 16);\n\t\tconst b = parseInt(hex.substr(4, 2), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#1F2937' : '#FFFFFF';\n\t}\n\n\thideBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) badge.style.display = 'none';\n\t}\n\n\tshowBadge() {\n\t\tconst badge = this.element?.querySelector('.changelog-badge');\n\t\tif (badge) badge.style.display = 'block';\n\t}\n\n\tnextChangelog() {\n\t\tif (this.currentIndex < this.changelogs.length - 1) {\n\t\t\tthis.currentIndex++;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tprevChangelog() {\n\t\tif (this.currentIndex > 0) {\n\t\t\tthis.currentIndex--;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t}\n\n\tasync refresh() {\n\t\tthis.changelogs = [];\n\t\tawait this._loadChangelogs();\n\t\tif (this.modalElement) {\n\t\t\tthis.currentIndex = 0;\n\t\t\tthis._renderCurrentChangelog();\n\t\t}\n\t\tif (this.listModalElement) {\n\t\t\tthis._renderChangelogList();\n\t\t}\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\t}\n\n\tdestroy() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t}\n\t\tif (this._listModalEscapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._listModalEscapeHandler);\n\t\t}\n\t\tthis.closeModal();\n\t\tthis.closeSidebar();\n\t\tsuper.destroy();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class InlineWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'inline' });\n\t}\n\n\t_render() {\n\t\tconst widget = document.createElement('div');\n\t\twidget.className = 'feedback-widget feedback-widget-inline';\n\t\twidget.innerHTML = `\n <div class=\"feedback-inline-content\">\n <h3>Send us your feedback</h3>\n <form class=\"feedback-inline-form\">\n <div class=\"sdk-form-group\">\n <input \n type=\"text\" \n name=\"title\" \n class=\"sdk-input\"\n placeholder=\"Title (optional)\"\n value=\"${this.state.title}\"\n />\n </div>\n <div class=\"sdk-form-group\">\n <textarea \n name=\"content\" \n class=\"sdk-textarea\"\n placeholder=\"Your feedback...\"\n required\n >${this.state.content}</textarea>\n </div>\n <div class=\"sdk-form-group\">\n <input \n type=\"email\" \n name=\"email\" \n class=\"sdk-input\"\n placeholder=\"Email (optional)\"\n value=\"${this.state.email}\"\n />\n </div>\n <button type=\"submit\" class=\"sdk-btn-primary sdk-btn-block\">\n Send Feedback\n </button>\n <div class=\"feedback-error\"></div>\n </form>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(widget.style, this.options.customStyles);\n\t\t}\n\n\t\treturn widget;\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('.feedback-inline-form');\n\n\t\tform.addEventListener('submit', (e) => {\n\t\t\te.preventDefault();\n\t\t\tthis.submitFeedback();\n\t\t});\n\n\t\tform.querySelector('input[name=\"title\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.title = e.target.value;\n\t\t});\n\n\t\tform\n\t\t\t.querySelector('textarea[name=\"content\"]')\n\t\t\t.addEventListener('input', (e) => {\n\t\t\t\tthis.state.content = e.target.value;\n\t\t\t});\n\n\t\tform.querySelector('input[name=\"email\"]').addEventListener('input', (e) => {\n\t\t\tthis.state.email = e.target.value;\n\t\t});\n\t}\n\n\topenModal() {\n\t\tconst textarea = this.element.querySelector('textarea[name=\"content\"]');\n\t\tif (textarea) {\n\t\t\ttextarea.focus();\n\t\t}\n\t}\n\n\tcloseModal() {\n\t\t// Inline widget doesn't use modal\n\t}\n\n\t_showSuccessMessage() {\n\t\tconst widget = this.element.querySelector('.feedback-inline-content');\n\t\tconst originalContent = widget.innerHTML;\n\n\t\twidget.innerHTML = `\n <div class=\"feedback-success\">\n <div class=\"sdk-notification-icon\">✓</div>\n <h3>Thank you!</h3>\n <p>Your feedback has been submitted successfully.</p>\n <button class=\"sdk-btn-primary\">Send Another</button>\n </div>\n `;\n\n\t\tconst resetBtn = widget.querySelector('.sdk-btn-primary');\n\t\tresetBtn.addEventListener('click', () => {\n\t\t\twidget.innerHTML = originalContent;\n\t\t\tthis._attachEvents();\n\t\t\tthis._resetForm();\n\t\t});\n\t}\n\n\t_showError(message) {\n\t\tconst errorElement = this.element.querySelector('.feedback-error');\n\t\tif (errorElement) {\n\t\t\terrorElement.textContent = message;\n\t\t\terrorElement.classList.add('show');\n\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (errorElement) {\n\t\t\t\t\terrorElement.classList.remove('show');\n\t\t\t\t}\n\t\t\t}, 5000);\n\t\t}\n\t}\n\n\t_updateSubmitButton() {\n\t\tconst submitBtn = this.element.querySelector('.sdk-btn-primary');\n\t\tif (submitBtn) {\n\t\t\tsubmitBtn.textContent = this.state.isSubmitting\n\t\t\t\t? 'Sending...'\n\t\t\t\t: 'Send Feedback';\n\t\t\tsubmitBtn.disabled = this.state.isSubmitting;\n\t\t}\n\t}\n\n\tupdateTitle(title) {\n\t\tconst titleElement = this.element?.querySelector('h3');\n\t\tif (titleElement) {\n\t\t\ttitleElement.textContent = title;\n\t\t}\n\t}\n\n\tsetPlaceholder(field, placeholder) {\n\t\tconst input = this.element?.querySelector(`[name=\"${field}\"]`);\n\t\tif (input) {\n\t\t\tinput.placeholder = placeholder;\n\t\t}\n\t}\n}\n","/**\n * WebSocketService - Real-time communication for messenger widget\n */\n\nexport class WebSocketService {\n\tconstructor(config = {}) {\n\t\tthis.baseURL = config.baseURL || '';\n\t\tthis.workspace = config.workspace || '';\n\t\tthis.sessionToken = config.sessionToken || null;\n\t\tthis.mock = config.mock || false;\n\n\t\tthis.ws = null;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis.maxReconnectAttempts = 5;\n\t\tthis.reconnectDelay = 1000;\n\t\tthis.pingInterval = null;\n\t\tthis.isConnected = false;\n\n\t\t// Event listeners\n\t\tthis._listeners = new Map();\n\n\t\t// Bind methods\n\t\tthis._onOpen = this._onOpen.bind(this);\n\t\tthis._onMessage = this._onMessage.bind(this);\n\t\tthis._onClose = this._onClose.bind(this);\n\t\tthis._onError = this._onError.bind(this);\n\t}\n\n\t/**\n\t * Connect to WebSocket server\n\t */\n\tconnect(sessionToken = null) {\n\t\tif (sessionToken) {\n\t\t\tthis.sessionToken = sessionToken;\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.warn('[WebSocket] No session token provided');\n\t\t\treturn;\n\t\t}\n\n\t\t// Mock mode - simulate connection\n\t\tif (this.mock) {\n\t\t\tthis.isConnected = true;\n\t\t\tthis._emit('connected', {});\n\t\t\tthis._startMockResponses();\n\t\t\treturn;\n\t\t}\n\n\t\t// Build WebSocket URL\n\t\tconst wsProtocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';\n\t\tlet wsURL = this.baseURL.replace(/^https?:/, wsProtocol);\n\t\twsURL = wsURL.replace('/api/v1', '');\n\t\twsURL = `${wsURL}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;\n\n\t\ttry {\n\t\t\tthis.ws = new WebSocket(wsURL);\n\t\t\tthis.ws.onopen = this._onOpen;\n\t\t\tthis.ws.onmessage = this._onMessage;\n\t\t\tthis.ws.onclose = this._onClose;\n\t\t\tthis.ws.onerror = this._onError;\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Connection error:', error);\n\t\t\tthis._scheduleReconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnect from WebSocket server\n\t */\n\tdisconnect() {\n\t\tthis.isConnected = false;\n\t\tthis.reconnectAttempts = this.maxReconnectAttempts; // Prevent reconnection\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tif (this.ws) {\n\t\t\tthis.ws.close();\n\t\t\tthis.ws = null;\n\t\t}\n\n\t\tif (this._mockInterval) {\n\t\t\tclearInterval(this._mockInterval);\n\t\t\tthis._mockInterval = null;\n\t\t}\n\t}\n\n\t/**\n\t * Subscribe to events\n\t * @param {string} event - Event name\n\t * @param {Function} callback - Event handler\n\t * @returns {Function} Unsubscribe function\n\t */\n\ton(event, callback) {\n\t\tif (!this._listeners.has(event)) {\n\t\t\tthis._listeners.set(event, new Set());\n\t\t}\n\t\tthis._listeners.get(event).add(callback);\n\t\treturn () => this._listeners.get(event).delete(callback);\n\t}\n\n\t/**\n\t * Remove event listener\n\t */\n\toff(event, callback) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).delete(callback);\n\t\t}\n\t}\n\n\t/**\n\t * Send message through WebSocket\n\t */\n\tsend(type, payload = {}) {\n\t\tif (!this.isConnected) {\n\t\t\tconsole.warn('[WebSocket] Not connected, cannot send message');\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\t// Mock mode - just log\n\t\t\tconsole.log('[WebSocket Mock] Sending:', type, payload);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.ws && this.ws.readyState === WebSocket.OPEN) {\n\t\t\tthis.ws.send(JSON.stringify({ type, payload }));\n\t\t}\n\t}\n\n\t// Private methods\n\n\t_onOpen() {\n\t\tconsole.log('[WebSocket] Connected');\n\t\tthis.isConnected = true;\n\t\tthis.reconnectAttempts = 0;\n\t\tthis._emit('connected', {});\n\n\t\t// Start ping interval to keep connection alive\n\t\tthis.pingInterval = setInterval(() => {\n\t\t\tthis.send('ping', {});\n\t\t}, 30000);\n\t}\n\n\t_onMessage(event) {\n\t\ttry {\n\t\t\tconst data = JSON.parse(event.data);\n\t\t\tconst { type, payload } = data;\n\n\t\t\t// Handle different event types\n\t\t\tswitch (type) {\n\t\t\t\tcase 'message:new':\n\t\t\t\t\tthis._emit('message', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:started':\n\t\t\t\t\tthis._emit('typing_started', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'typing:stopped':\n\t\t\t\t\tthis._emit('typing_stopped', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:updated':\n\t\t\t\t\tthis._emit('conversation_updated', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'conversation:closed':\n\t\t\t\t\tthis._emit('conversation_closed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'availability:changed':\n\t\t\t\t\tthis._emit('availability_changed', payload);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'pong':\n\t\t\t\t\t// Ping response, ignore\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log('[WebSocket] Unknown event:', type, payload);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[WebSocket] Failed to parse message:', error);\n\t\t}\n\t}\n\n\t_onClose(event) {\n\t\tconsole.log('[WebSocket] Disconnected:', event.code, event.reason);\n\t\tthis.isConnected = false;\n\n\t\tif (this.pingInterval) {\n\t\t\tclearInterval(this.pingInterval);\n\t\t\tthis.pingInterval = null;\n\t\t}\n\n\t\tthis._emit('disconnected', { code: event.code, reason: event.reason });\n\t\tthis._scheduleReconnect();\n\t}\n\n\t_onError(error) {\n\t\tconsole.error('[WebSocket] Error:', error);\n\t\tthis._emit('error', { error });\n\t}\n\n\t_scheduleReconnect() {\n\t\tif (this.reconnectAttempts >= this.maxReconnectAttempts) {\n\t\t\tconsole.log('[WebSocket] Max reconnect attempts reached');\n\t\t\tthis._emit('reconnect_failed', {});\n\t\t\treturn;\n\t\t}\n\n\t\tthis.reconnectAttempts++;\n\t\tconst delay = this.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1);\n\t\tconsole.log(\n\t\t\t`[WebSocket] Reconnecting in ${delay}ms (attempt ${this.reconnectAttempts})`\n\t\t);\n\n\t\tsetTimeout(() => {\n\t\t\tthis.connect();\n\t\t}, delay);\n\t}\n\n\t_emit(event, data) {\n\t\tif (this._listeners.has(event)) {\n\t\t\tthis._listeners.get(event).forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error(`[WebSocket] Error in ${event} handler:`, error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// Mock support for development\n\t_startMockResponses() {\n\t\t// Simulate agent typing and responses\n\t\tthis._mockInterval = setInterval(() => {\n\t\t\t// Randomly emit typing or message events for demo\n\t\t\tconst random = Math.random();\n\t\t\tif (random < 0.1) {\n\t\t\t\tthis._emit('typing_started', {\n\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\tuser_name: 'Sarah',\n\t\t\t\t\tis_agent: true,\n\t\t\t\t});\n\n\t\t\t\t// Stop typing after 2 seconds\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tthis._emit('typing_stopped', {\n\t\t\t\t\t\tconversation_id: 'conv_1',\n\t\t\t\t\t\tuser_id: 'agent_1',\n\t\t\t\t\t});\n\t\t\t\t}, 2000);\n\t\t\t}\n\t\t}, 10000);\n\t}\n\n\t/**\n\t * Simulate receiving a message (for mock mode)\n\t */\n\tsimulateMessage(conversationId, message) {\n\t\tif (this.mock) {\n\t\t\tthis._emit('message', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t\tmessage: {\n\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\tcontent: message.content,\n\t\t\t\t\tsender_type: message.sender_type || 'agent',\n\t\t\t\t\tsender_name: message.sender_name || 'Support',\n\t\t\t\t\tsender_avatar: message.sender_avatar || null,\n\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t},\n\t\t\t});\n\t\t}\n\t}\n}\n","export class MessengerState {\n\tconstructor(options = {}) {\n\t\tthis.currentView = 'home';\n\t\tthis.isOpen = false;\n\t\tthis.unreadCount = 0;\n\t\tthis.activeConversationId = null;\n\n\t\tthis.conversations = [];\n\t\tthis.messages = {};\n\n\t\tthis.helpArticles = [];\n\t\tthis.helpSearchQuery = '';\n\n\t\tthis.homeChangelogItems = [];\n\t\tthis.changelogItems = [];\n\n\t\tthis.teamName = options.teamName || 'Support';\n\t\tthis.teamAvatars = options.teamAvatars || [];\n\t\tthis.welcomeMessage = options.welcomeMessage || 'How can we help?';\n\n\t\tthis.userContext = options.userContext || null;\n\t\tthis.isIdentified = false;\n\t\tthis.pendingMessage = null;\n\n\t\tthis.enableHelp = options.enableHelp !== false;\n\t\tthis.enableChangelog = options.enableChangelog !== false;\n\n\t\tthis.agentsOnline = false;\n\t\tthis.onlineCount = 0;\n\t\tthis.responseTime = 'Usually replies within a few minutes';\n\n\t\tthis.typingUsers = {};\n\n\t\tthis.isLoading = false;\n\t\tthis.isLoadingMessages = false;\n\n\t\tthis.urls = options.urls || {\n\t\t\tfeedback: null,\n\t\t\tchangelog: null,\n\t\t\thelp: null,\n\t\t\troadmap: null,\n\t\t};\n\n\t\tthis._listeners = new Set();\n\t}\n\n\tsubscribe(callback) {\n\t\tthis._listeners.add(callback);\n\t\treturn () => this._listeners.delete(callback);\n\t}\n\n\t_notify(changeType, data) {\n\t\tthis._listeners.forEach((cb) => cb(changeType, data, this));\n\t}\n\n\tsetView(view) {\n\t\tconst previousView = this.currentView;\n\t\tthis.currentView = view;\n\t\tthis._notify('viewChange', { previousView, currentView: view });\n\t}\n\n\tsetOpen(isOpen) {\n\t\tthis.isOpen = isOpen;\n\t\tthis._notify('openChange', { isOpen });\n\t}\n\n\tsetActiveConversation(conversationId) {\n\t\tconst previousConversationId = this.activeConversationId;\n\t\tthis.activeConversationId = conversationId;\n\t\tthis._notify('conversationChange', {\n\t\t\tconversationId,\n\t\t\tpreviousConversationId,\n\t\t});\n\t}\n\n\tsetIdentified(isIdentified, userContext = null) {\n\t\tthis.isIdentified = isIdentified;\n\t\tif (userContext) {\n\t\t\tthis.userContext = { ...this.userContext, ...userContext };\n\t\t}\n\t\tthis._notify('identificationChange', { isIdentified, userContext });\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.conversations = conversations;\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationsUpdate', { conversations });\n\t}\n\n\taddConversation(conversation) {\n\t\tthis.conversations.unshift(conversation);\n\t\tthis._updateUnreadCount();\n\t\tthis._notify('conversationAdded', { conversation });\n\t}\n\n\tsetMessages(conversationId, messages) {\n\t\tthis.messages[conversationId] = messages;\n\t\tthis._notify('messagesUpdate', { conversationId, messages });\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tif (!this.messages[conversationId]) {\n\t\t\tthis.messages[conversationId] = [];\n\t\t}\n\t\tthis.messages[conversationId].push(message);\n\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv) {\n\t\t\tconv.lastMessage = message.content;\n\t\t\tconv.lastMessageTime = message.timestamp;\n\t\t\tif (!message.isOwn) {\n\t\t\t\tconv.unread = (conv.unread || 0) + 1;\n\t\t\t\tthis._updateUnreadCount();\n\t\t\t}\n\t\t}\n\n\t\tthis._notify('messageAdded', { conversationId, message });\n\t}\n\n\tupdateConversation(conversationId, updates) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (!conv) {\n\t\t\treturn null;\n\t\t}\n\n\t\tObject.assign(conv, updates);\n\t\tthis._notify('conversationUpdated', { conversationId, conversation: conv });\n\t\treturn conv;\n\t}\n\n\tmarkAsRead(conversationId) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (conv && conv.unread > 0) {\n\t\t\tconv.unread = 0;\n\t\t\tthis._updateUnreadCount();\n\t\t\tthis._notify('conversationRead', { conversationId });\n\t\t}\n\t}\n\n\t_updateUnreadCount() {\n\t\tthis.unreadCount = this.conversations.reduce(\n\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t0\n\t\t);\n\t\tthis._notify('unreadCountChange', { count: this.unreadCount });\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.helpArticles = articles;\n\t\tthis._notify('helpArticlesUpdate', { articles });\n\t}\n\n\tsetHelpSearchQuery(query) {\n\t\tthis.helpSearchQuery = query;\n\t\tthis._notify('helpSearchChange', { query });\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.homeChangelogItems = items;\n\t\tthis._notify('homeChangelogUpdate', { items });\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.changelogItems = items;\n\t\tthis._notify('changelogUpdate', { items });\n\t}\n\n\tgetActiveConversation() {\n\t\treturn this.conversations.find((c) => c.id === this.activeConversationId);\n\t}\n\n\tgetActiveMessages() {\n\t\treturn this.messages[this.activeConversationId] || [];\n\t}\n\n\tsetTeamAvatarsFromAgents(agents) {\n\t\tif (!agents || agents.length === 0) return;\n\n\t\tthis.teamAvatars = agents.map((agent) => {\n\t\t\tif (agent.picture) return agent.picture;\n\t\t\treturn agent.full_name || '?';\n\t\t});\n\t\tthis._notify('teamAvatarsUpdate', { teamAvatars: this.teamAvatars });\n\t}\n\n\tgetFilteredHelpArticles() {\n\t\tif (!this.helpSearchQuery) {\n\t\t\treturn this.helpArticles;\n\t\t}\n\t\tconst query = this.helpSearchQuery.toLowerCase();\n\t\treturn this.helpArticles.filter(\n\t\t\t(article) =>\n\t\t\t\tarticle.title.toLowerCase().includes(query) ||\n\t\t\t\t(article.description &&\n\t\t\t\t\tarticle.description.toLowerCase().includes(query))\n\t\t);\n\t}\n\n\treset() {\n\t\tthis.currentView = 'home';\n\t\tthis.activeConversationId = null;\n\t\tthis.helpSearchQuery = '';\n\t\tthis._notify('reset', {});\n\t}\n}\n","export class MessengerLauncher {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-launcher messenger-launcher-${this.options.position}`;\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._updateIcon();\n\t\t\t}\n\t\t\tif (type === 'unreadCountChange') {\n\t\t\t\tthis._updateBadge();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst badgeHtml =\n\t\t\tthis.state.unreadCount > 0\n\t\t\t\t? `<span class=\"messenger-launcher-badge\">${this.state.unreadCount > 9 ? '9+' : this.state.unreadCount}</span>`\n\t\t\t\t: '';\n\n\t\tthis.element.innerHTML = `\n <button class=\"messenger-launcher-btn\" aria-label=\"Open messenger\">\n <span class=\"messenger-launcher-icon messenger-launcher-icon-chat\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M144,140a12,12,0,1,1-12-12A12,12,0,0,1,144,140Zm44-12a12,12,0,1,0,12,12A12,12,0,0,0,188,128Zm51.34,83.47a16,16,0,0,1-19.87,19.87l-24.71-7.27A80,80,0,0,1,86.43,183.42a79,79,0,0,1-25.19-7.35l-24.71,7.27a16,16,0,0,1-19.87-19.87l7.27-24.71A80,80,0,1,1,169.58,72.59a80,80,0,0,1,62.49,114.17ZM81.3,166.3a79.94,79.94,0,0,1,70.38-93.87A64,64,0,0,0,39.55,134.19a8,8,0,0,1,.63,6L32,168l27.76-8.17a8,8,0,0,1,6,.63A63.45,63.45,0,0,0,81.3,166.3Zm135.15,15.89a64,64,0,1,0-26.26,26.26,8,8,0,0,1,6-.63L224,216l-8.17-27.76A8,8,0,0,1,216.45,182.19Z\"></path>\n </svg>\n </span>\n <span class=\"messenger-launcher-icon messenger-launcher-icon-close\" style=\"display: none;\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n </svg>\n </span>\n ${badgeHtml}\n </button>\n `;\n\n\t\tconst btn = this.element.querySelector('.messenger-launcher-btn');\n\t\tif (btn && this.options.primaryColor) {\n\t\t\tbtn.style.setProperty(\n\t\t\t\t'background',\n\t\t\t\tthis.options.primaryColor,\n\t\t\t\t'important'\n\t\t\t);\n\t\t}\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-launcher-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(!this.state.isOpen);\n\t\t\t});\n\t}\n\n\t_updateIcon() {\n\t\tconst chatIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-chat'\n\t\t);\n\t\tconst closeIcon = this.element.querySelector(\n\t\t\t'.messenger-launcher-icon-close'\n\t\t);\n\n\t\tif (this.state.isOpen) {\n\t\t\tchatIcon.style.display = 'none';\n\t\t\tcloseIcon.style.display = 'flex';\n\t\t\tthis.element.classList.add('messenger-launcher-open');\n\t\t} else {\n\t\t\tchatIcon.style.display = 'flex';\n\t\t\tcloseIcon.style.display = 'none';\n\t\t\tthis.element.classList.remove('messenger-launcher-open');\n\t\t}\n\t}\n\n\t_updateBadge() {\n\t\tconst existingBadge = this.element.querySelector(\n\t\t\t'.messenger-launcher-badge'\n\t\t);\n\t\tif (existingBadge) {\n\t\t\texistingBadge.remove();\n\t\t}\n\n\t\tif (this.state.unreadCount > 0 && !this.state.isOpen) {\n\t\t\tconst badge = document.createElement('span');\n\t\t\tbadge.className = 'messenger-launcher-badge';\n\t\t\tbadge.textContent =\n\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\tthis.element.querySelector('.messenger-launcher-btn').appendChild(badge);\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class NavigationTabs {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-panel-nav';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange' || type === 'unreadCountChange') {\n\t\t\t\tthis._updateActiveTab();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_getTabs() {\n\t\tconst tabs = [\n\t\t\t{ id: 'home', label: 'Home', icon: this._getHomeIcon() },\n\t\t\t{\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: this._getMessagesIcon(),\n\t\t\t\tbadge: this.state.unreadCount,\n\t\t\t},\n\t\t];\n\n\t\tif (this.state.enableHelp) {\n\t\t\ttabs.push({ id: 'help', label: 'Help', icon: this._getHelpIcon() });\n\t\t}\n\n\t\tif (this.state.enableChangelog) {\n\t\t\ttabs.push({\n\t\t\t\tid: 'changelog',\n\t\t\t\tlabel: 'Changelog',\n\t\t\t\ticon: this._getChangelogIcon(),\n\t\t\t});\n\t\t}\n\n\t\treturn tabs;\n\t}\n\n\t_updateContent() {\n\t\tconst tabs = this._getTabs();\n\t\tconst tabsHtml = tabs\n\t\t\t.map((tab) => {\n\t\t\t\tconst isActive = this.state.currentView === tab.id;\n\t\t\t\tconst badgeHtml =\n\t\t\t\t\ttab.badge && tab.badge > 0\n\t\t\t\t\t\t? `<span class=\"messenger-nav-badge\">${tab.badge > 9 ? '9+' : tab.badge}</span>`\n\t\t\t\t\t\t: '';\n\n\t\t\t\treturn `\n\t\t\t\t<button class=\"messenger-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t<span class=\"messenger-nav-icon\">${tab.icon}</span>\n\t\t\t\t\t<span class=\"messenger-nav-label\">${tab.label}</span>\n\t\t\t\t\t${badgeHtml}\n\t\t\t\t</button>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-nav-tabs\">\n\t\t\t\t${tabsHtml}\n\t\t\t</div>\n\t\t\t<div class=\"messenger-nav-footer\">\n\t\t\t\t<a href=\"https://product7.io\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"messenger-powered-by\">\n\t\t\t\t\t<svg width=\"12\" height=\"14\" viewBox=\"0 0 28 32\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.0615 5.28044C8.5161 4.42949 3.30825 11.1456 5.89967 17.6588C6.9321 20.2538 9.06268 22.2644 11.8777 23.1968C16.2682 24.6507 18.4038 22.3222 19.0483 23.9691C19.4055 24.8894 18.7282 25.3209 17.988 25.4938C10.9146 27.15 5.15304 22.7566 3.5869 17.5531C1.52205 10.6941 5.98684 4.6667 11.3483 3.41065C17.8801 1.88094 24.0325 6.19355 24.3926 12.7175C24.7448 19.0921 18.6217 24.5978 11.927 22.2036C10.8789 21.8285 8.8419 20.6682 8.46823 19.858C8.06026 18.9727 8.80261 18.1725 9.68285 18.3576C10.2223 18.4726 10.3116 18.8706 11.3161 19.5372C14.4549 21.6213 19.1276 20.6132 21.2046 17.0972C23.991 12.3817 21.0481 6.05351 15.06 5.27758L15.0615 5.28044Z\" fill=\"#21244A\"/>\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.2492 2.19833C11.944 1.71463 8.88819 3.07214 6.91479 4.49682C2.27067 7.85488 0.76169 14.5038 3.49672 19.8731C4.08535 21.0096 4.84379 22.0497 5.7459 22.9576L7.16343 24.2515C7.67214 24.9131 7.27203 25.7176 6.64115 25.9269C5.13502 26.4271 2.0499 21.8172 1.42044 20.5383C0.0872204 17.8297 -0.312889 14.9047 0.242977 11.503C1.66908 2.77063 11.221 -2.51652 19.7197 1.21021C27.7548 4.73331 30.2733 15.4555 23.9351 22.0773C23.3107 22.7296 21.6352 24.4823 20.6278 23.8907C20.0076 23.5263 19.8933 22.6446 20.5192 22.1238C21.0301 21.6986 21.4759 21.435 21.9896 20.9734C23.6665 19.4688 25.2562 16.8752 25.3477 13.5636C25.4427 10.2055 24.1266 7.5848 22.3904 5.74859C20.6392 3.89665 18.6751 2.69919 15.2456 2.19691L15.2492 2.19833Z\" fill=\"#F69F06\"/>\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M8.48332 27.2217C7.93817 26.265 8.89987 25.3776 10.1352 25.8641C15.5653 27.9926 18.3081 25.5269 19.0255 27.0823C19.2655 27.6039 19.0448 28.1619 18.7354 28.3863C17.9895 28.9257 14.82 28.9343 13.9262 28.8714C12.9071 28.8053 11.897 28.6377 10.9111 28.3713C10.0888 28.1348 8.88057 27.9247 8.48189 27.2281L8.48332 27.2217Z\" fill=\"#21244A\"/>\n\t\t\t\t\t\t<path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M15.8722 31.0607C15.7765 32.1381 14.579 32.0331 13.5766 31.9545C12.5742 31.8759 11.5203 31.8502 11.601 30.7013C11.6789 29.5882 12.8035 29.7532 13.8274 29.8332C14.4425 29.8811 15.9951 29.681 15.8722 31.0607Z\" fill=\"#21244A\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\tPowered by <strong>Product7</strong>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element.addEventListener('click', (e) => {\n\t\t\tconst tab = e.target.closest('.messenger-nav-tab');\n\t\t\tif (tab) {\n\t\t\t\tconst tabId = tab.dataset.tab;\n\t\t\t\tthis.state.setView(tabId);\n\t\t\t}\n\t\t});\n\t}\n\n\t_updateActiveTab() {\n\t\tconst tabs = this.element.querySelectorAll('.messenger-nav-tab');\n\t\ttabs.forEach((tab) => {\n\t\t\tconst isActive = tab.dataset.tab === this.state.currentView;\n\t\t\ttab.classList.toggle('active', isActive);\n\n\t\t\tif (tab.dataset.tab === 'messages') {\n\t\t\t\tconst existingBadge = tab.querySelector('.messenger-nav-badge');\n\t\t\t\tif (existingBadge) existingBadge.remove();\n\n\t\t\t\tif (this.state.unreadCount > 0) {\n\t\t\t\t\tconst badge = document.createElement('span');\n\t\t\t\t\tbadge.className = 'messenger-nav-badge';\n\t\t\t\t\tbadge.textContent =\n\t\t\t\t\t\tthis.state.unreadCount > 9 ? '9+' : this.state.unreadCount;\n\t\t\t\t\ttab.appendChild(badge);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t_getHomeIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<path d=\"M40,216H216V120a8,8,0,0,0-2.34-5.66l-80-80a8,8,0,0,0-11.32,0l-80,80A8,8,0,0,0,40,120Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\t_getMessagesIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<circle cx=\"128\" cy=\"128\" r=\"12\"/>\n\t\t\t<circle cx=\"84\" cy=\"128\" r=\"12\"/>\n\t\t\t<circle cx=\"172\" cy=\"128\" r=\"12\"/>\n\t\t\t<path d=\"M79.93,211.11a96,96,0,1,0-35-35h0L32.42,213.46a8,8,0,0,0,10.12,10.12l37.39-12.47Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\t_getHelpIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<circle cx=\"128\" cy=\"128\" r=\"96\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t<circle cx=\"128\" cy=\"180\" r=\"12\"/>\n\t\t\t<path d=\"M128,144v-8a28,28,0,1,0-28-28\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\t_getChangelogIcon() {\n\t\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 256 256\">\n\t\t\t<path d=\"M160,80V200.67a8,8,0,0,0,3.56,6.65l11,7.33a8,8,0,0,0,12.2-4.72L200,160\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t<path d=\"M40,200a8,8,0,0,0,13.15,6.12C105.55,162.16,160,160,160,160h40a40,40,0,0,0,0-80H160S105.55,77.84,53.15,33.89A8,8,0,0,0,40,40Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t</svg>`;\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { NavigationTabs } from './NavigationTabs.js';\n\nexport class MessengerPanel {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\t...options,\n\t\t};\n\t\tthis.element = null;\n\t\tthis.navigationTabs = null;\n\t\tthis.currentViewComponent = null;\n\t\tthis.viewRegistry = {};\n\t\tthis._unsubscribe = null;\n\t}\n\n\tregisterView(name, ViewClass) {\n\t\tthis.viewRegistry[name] = ViewClass;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = `messenger-panel messenger-panel-${this.options.position}`;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-panel-content\">\n\t\t\t\t<div class=\"messenger-panel-views\"></div>\n\t\t\t\t<div class=\"messenger-panel-nav\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.navigationTabs = new NavigationTabs(this.state, this.options);\n\t\tconst navContainer = this.element.querySelector('.messenger-panel-nav');\n\t\tnavContainer.appendChild(this.navigationTabs.render());\n\n\t\tthis._renderCurrentView();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'viewChange') {\n\t\t\t\tthis._renderCurrentView();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_renderCurrentView() {\n\t\tconst viewsContainer = this.element.querySelector('.messenger-panel-views');\n\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\n\t\tviewsContainer.innerHTML = '';\n\n\t\tconst ViewClass = this.viewRegistry[this.state.currentView];\n\t\tif (ViewClass) {\n\t\t\tthis.currentViewComponent = new ViewClass(this.state, this.options);\n\t\t\tviewsContainer.appendChild(this.currentViewComponent.render());\n\t\t} else {\n\t\t\tviewsContainer.innerHTML = `<div class=\"messenger-empty-state\">\n\t\t\t\t<p>View not found: ${this.state.currentView}</p>\n\t\t\t</div>`;\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tthis.element.classList.add('open');\n\t\t\t});\n\t\t}\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.classList.remove('open');\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (this.element) {\n\t\t\t\t\tthis.element.style.display = 'none';\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t}\n\t}\n\n\tsetHeader(headerContent) {\n\t\tconst header = this.element.querySelector('.messenger-panel-header');\n\t\tif (header) {\n\t\t\theader.innerHTML = headerContent;\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.navigationTabs) {\n\t\t\tthis.navigationTabs.destroy();\n\t\t}\n\t\tif (this.currentViewComponent && this.currentViewComponent.destroy) {\n\t\t\tthis.currentViewComponent.destroy();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ChangelogView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-changelog-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'changelogUpdate') {\n\t\t\t\tthis._updateChangelogList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-changelog-header\">\n\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-changelog-body\">\n\t\t\t\t<div class=\"messenger-changelog-list\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateChangelogList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateChangelogList() {\n\t\tconst changelogContainer = this.element.querySelector(\n\t\t\t'.messenger-changelog-list'\n\t\t);\n\t\tconst changelogItems = this.state.changelogItems;\n\n\t\tif (changelogItems.length === 0) {\n\t\t\tchangelogContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tchangelogContainer.innerHTML = changelogItems\n\t\t\t.map((item) => this._renderChangelogCard(item))\n\t\t\t.join('');\n\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_renderChangelogCard(item) {\n\t\tconst tagsHtml =\n\t\t\titem.tags && item.tags.length > 0\n\t\t\t\t? `<div class=\"messenger-changelog-tags\">\n\t\t\t\t${item.tags.map((tag) => `<span class=\"sdk-badge sdk-badge-primary messenger-changelog-tag\">${tag}</span>`).join('')}\n\t\t\t</div>`\n\t\t\t\t: '';\n\n\t\tconst dateStr = this._formatDate(item.publishedAt || item.date);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-changelog-content\">\n\t\t\t\t\t${tagsHtml}\n\t\t\t\t\t<h3 class=\"messenger-changelog-title\">${item.title}</h3>\n\t\t\t\t\t${item.description ? `<p class=\"messenger-changelog-description\">${this._truncateText(item.description, 100)}</p>` : ''}\n\t\t\t\t\t<div class=\"messenger-changelog-meta\">\n\t\t\t\t\t\t<span class=\"messenger-changelog-date\">${dateStr}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\">S</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack messenger-avatar-stack-tiny\">${avatarItems}</div>`;\n\t}\n\n\t_renderEmptyState() {\n\t\treturn `\n\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\treturn date.toLocaleDateString('en-US', {\n\t\t\tmonth: 'short',\n\t\t\tday: 'numeric',\n\t\t\tyear: 'numeric',\n\t\t});\n\t}\n\n\t_truncateText(text, maxLength) {\n\t\tif (!text) return '';\n\t\tif (text.length <= maxLength) return text;\n\t\treturn text.substring(0, maxLength).trim() + '...';\n\t}\n\n\t_attachEvents() {\n\t\tthis._attachChangelogEvents();\n\t}\n\n\t_attachChangelogEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-changelog-card')\n\t\t\t.forEach((card) => {\n\t\t\t\tcard.addEventListener('click', () => {\n\t\t\t\t\tconst changelogId = card.dataset.changelogId;\n\t\t\t\t\tconst changelogItem = this.state.changelogItems.find(\n\t\t\t\t\t\t(n) => n.id === changelogId\n\t\t\t\t\t);\n\t\t\t\t\tif (changelogItem && changelogItem.url) {\n\t\t\t\t\t\twindow.open(changelogItem.url, '_blank');\n\t\t\t\t\t} else if (this.options.onChangelogClick) {\n\t\t\t\t\t\tthis.options.onChangelogClick(changelogItem);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ChatView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t\tthis._typingTimeout = null;\n\t\tthis._isTyping = false;\n\t\tthis._typingIndicator = null;\n\t\tthis._isConversationClosed = false;\n\t\tthis._pendingAttachments = [];\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-chat-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type, data) => {\n\t\t\tif (\n\t\t\t\ttype === 'messageAdded' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t\tthis._appendMessage(data.message);\n\t\t\t\tthis._scrollToBottom();\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStarted' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._showTypingIndicator(data.userName);\n\t\t\t} else if (\n\t\t\t\ttype === 'typingStopped' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._hideTypingIndicator();\n\t\t\t} else if (\n\t\t\t\ttype === 'conversationUpdated' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t} else if (\n\t\t\t\ttype === 'messagesUpdate' &&\n\t\t\t\tdata.conversationId === this.state.activeConversationId\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst conversation = this.state.getActiveConversation();\n\t\tconst messages = this.state.getActiveMessages();\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\t\tconst isClosed = !isNewConversation && conversation?.status === 'closed';\n\t\tthis._isConversationClosed = isClosed;\n\n\t\tconst messagesHtml =\n\t\t\tmessages.length === 0\n\t\t\t\t? this._renderEmptyState(isNewConversation)\n\t\t\t\t: messages.map((msg) => this._renderMessage(msg)).join('');\n\n\t\tconst title = isNewConversation\n\t\t\t? 'New conversation'\n\t\t\t: conversation?.title || 'Chat with team';\n\t\tconst placeholder = isNewConversation\n\t\t\t? 'Start typing your message...'\n\t\t\t: isClosed\n\t\t\t\t? 'Conversation closed'\n\t\t\t\t: 'Write a message...';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-chat-header\">\n\t\t\t\t<button class=\"sdk-btn-icon messenger-back-btn\" aria-label=\"Back\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-chat-header-info\">\n\t\t\t\t\t<span class=\"messenger-chat-title\">${title}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-chat-messages\">\n\t\t\t\t${messagesHtml}\n\t\t\t\t${\n\t\t\t\t\tisClosed\n\t\t\t\t\t\t? `\n\t\t\t\t<div class=\"messenger-closed-banner\">\n\t\t\t\t\t<i class=\"ph ph-check-circle\"></i>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-typing-indicator\">\n\t\t\t\t\t<div class=\"messenger-typing-dots\">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class=\"messenger-typing-text\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${\n\t\t\t\tisClosed\n\t\t\t\t\t? ''\n\t\t\t\t\t: `\n\t\t\t<div class=\"messenger-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"messenger-chat-compose\">\n\t\t\t\t<button class=\"sdk-btn-icon messenger-compose-attach\" aria-label=\"Attach file\">\n\t\t\t\t\t<i class=\"ph ph-paperclip\"></i>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-compose-input-wrapper\">\n\t\t\t\t\t<textarea class=\"messenger-compose-input\" placeholder=\"${placeholder}\" rows=\"1\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class=\"messenger-compose-send\" aria-label=\"Send\" disabled>\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14L118.42,148.9l47.24-47.25a8,8,0,0,0-11.31-11.31L107.1,137.58,24,98.22l.14,0L216,40Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<input type=\"file\" class=\"messenger-compose-file-input\" multiple accept=\"image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip\" />\n\t\t\t</div>\n\t\t\t`\n\t\t\t}\n\t\t`;\n\n\t\tthis._typingIndicator = this.element.querySelector(\n\t\t\t'.messenger-typing-indicator'\n\t\t);\n\t\tthis._attachEvents();\n\t\tthis._scrollToBottom();\n\t\tthis._renderAttachmentPreviews();\n\t}\n\n\t_renderEmptyState(isNewConversation = false) {\n\t\tconst avatarHtml = this._renderTeamAvatars();\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\t\tconst isOnline = this.state.agentsOnline;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-chat-empty\">\n\t\t\t\t<div class=\"messenger-chat-empty-avatars\">${avatarHtml}</div>\n\t\t\t\t<h3>${isNewConversation ? 'Start a new conversation' : 'Start the conversation'}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class=\"messenger-chat-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot ${isOnline ? 'messenger-availability-online' : 'messenger-availability-away'}\"></span>\n\t\t\t\t\t<span>${isOnline ? \"We're online now\" : responseTime}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageAttachments(attachments) {\n\t\tif (!attachments || attachments.length === 0) return '';\n\t\treturn attachments\n\t\t\t.map((att) => {\n\t\t\t\tif (att.type === 'image') {\n\t\t\t\t\treturn `<img class=\"messenger-message-image\" src=\"${this._escapeHtml(att.url)}\" alt=\"${this._escapeHtml(att.name || 'image')}\" data-url=\"${this._escapeHtml(att.url)}\" />`;\n\t\t\t\t}\n\t\t\t\treturn `<a class=\"messenger-message-file\" href=\"${this._escapeHtml(att.url)}\" data-url=\"${this._escapeHtml(att.url)}\" data-name=\"${this._escapeHtml(att.name || 'file')}\">\n\t\t\t\t<i class=\"ph ph-file\"></i>\n\t\t\t\t<span>${this._escapeHtml(att.name || 'file')}</span>\n\t\t\t\t<i class=\"ph ph-download-simple messenger-file-download-icon\"></i>\n\t\t\t</a>`;\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\t_renderMessage(message) {\n\t\tconst isOwn = message.isOwn;\n\t\tconst messageClass = isOwn\n\t\t\t? 'messenger-message-own'\n\t\t\t: 'messenger-message-received';\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\t\tconst attachmentsHtml = this._renderMessageAttachments(message.attachments);\n\n\t\tconst contentHtml = message.content\n\t\t\t? `<div class=\"messenger-message-content\">${this._formatMessageContent(message.content)}</div>`\n\t\t\t: '';\n\t\tconst bubbleHtml = contentHtml\n\t\t\t? `<div class=\"messenger-message-bubble\">${contentHtml}</div>`\n\t\t\t: '';\n\n\t\tif (isOwn) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarHtml = this._renderSenderAvatar(message.sender);\n\t\treturn `\n\t\t\t<div class=\"messenger-message ${messageClass}\">\n\t\t\t\t<div class=\"messenger-message-sender\">${message.sender?.name || 'Support'}</div>\n\t\t\t\t<div class=\"messenger-message-row\">\n\t\t\t\t\t<div class=\"messenger-message-avatar\">${avatarHtml}</div>\n\t\t\t\t\t<div class=\"messenger-message-wrapper\">\n\t\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-message-time\">${timeStr}</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSenderAvatar(sender) {\n\t\tif (sender?.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${sender.avatarUrl}\" alt=\"${sender.name}\" /></div>`;\n\t\t}\n\t\tconst initial = (sender?.name || 'S').charAt(0).toUpperCase();\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${initial}</div>`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_formatMessageTime(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\treturn date.toLocaleTimeString('en-US', {\n\t\t\thour: 'numeric',\n\t\t\tminute: '2-digit',\n\t\t\thour12: true,\n\t\t});\n\t}\n\n\t_formatMessageContent(content) {\n\t\tif (!content) return '';\n\t\treturn content\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.messenger-chat-empty');\n\t\tif (emptyState) {\n\t\t\temptyState.remove();\n\t\t}\n\n\t\tconst messageHtml = this._renderMessage(message);\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = messageHtml;\n\t\tmessagesContainer.appendChild(tempDiv.firstElementChild);\n\t}\n\n\t_scrollToBottom() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n\t\t\t}, 50);\n\t\t}\n\t}\n\n\t_updateSendButtonState() {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\t\tif (input && sendBtn) {\n\t\t\tsendBtn.disabled =\n\t\t\t\t!input.value.trim() && this._pendingAttachments.length === 0;\n\t\t}\n\t}\n\n\t_renderAttachmentPreviews() {\n\t\tconst container = this.element.querySelector(\n\t\t\t'.messenger-compose-attachments-preview'\n\t\t);\n\t\tif (!container) return;\n\n\t\tif (this._pendingAttachments.length === 0) {\n\t\t\tcontainer.innerHTML = '';\n\t\t\tcontainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.display = 'flex';\n\t\tcontainer.innerHTML = this._pendingAttachments\n\t\t\t.map((att, i) => {\n\t\t\t\tconst isImage = att.type.startsWith('image');\n\t\t\t\tconst thumb = isImage\n\t\t\t\t\t? `<img class=\"messenger-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t\t: `<div class=\"messenger-attachment-thumb messenger-attachment-file-icon\"><i class=\"ph ph-file\"></i></div>`;\n\t\t\t\treturn `\n\t\t\t\t<div class=\"messenger-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"messenger-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">×</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tcontainer\n\t\t\t.querySelectorAll('.messenger-attachment-remove')\n\t\t\t.forEach((btn) => {\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-back-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('messages');\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\n\t\tif (input && sendBtn) {\n\t\t\tinput.addEventListener('input', () => {\n\t\t\t\tinput.style.height = 'auto';\n\t\t\t\tinput.style.height = Math.min(input.scrollHeight, 120) + 'px';\n\t\t\t\tthis._updateSendButtonState();\n\n\t\t\t\tif (input.value.trim()) {\n\t\t\t\t\tthis._startTyping();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._sendMessage();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsendBtn.addEventListener('click', () => {\n\t\t\t\tthis._sendMessage();\n\t\t\t});\n\t\t}\n\n\t\tconst attachBtn = this.element.querySelector('.messenger-compose-attach');\n\t\tconst fileInput = this.element.querySelector(\n\t\t\t'.messenger-compose-file-input'\n\t\t);\n\n\t\tif (attachBtn && fileInput) {\n\t\t\tattachBtn.addEventListener('click', () => {\n\t\t\t\tfileInput.click();\n\t\t\t});\n\n\t\t\tfileInput.addEventListener('change', (e) => {\n\t\t\t\tconst files = e.target.files;\n\t\t\t\tif (!files) return;\n\t\t\t\tArray.from(files).forEach((file) => {\n\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\treader.onload = (ev) => {\n\t\t\t\t\t\tthis._pendingAttachments.push({\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tpreview: ev.target.result,\n\t\t\t\t\t\t\ttype: file.type,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t\t};\n\t\t\t\t\treader.readAsDataURL(file);\n\t\t\t\t});\n\t\t\t\tfileInput.value = '';\n\t\t\t});\n\t\t}\n\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tmessagesContainer.addEventListener('click', (e) => {\n\t\t\t\tconst fileLink = e.target.closest('.messenger-message-file');\n\t\t\t\tif (fileLink) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst url = fileLink.dataset.url;\n\t\t\t\t\tconst name = fileLink.dataset.name;\n\t\t\t\t\tthis._downloadFile(url, name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst img = e.target.closest('.messenger-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst content = input.value.trim();\n\t\tconst hasAttachments = this._pendingAttachments.length > 0;\n\n\t\tif (!content && !hasAttachments) return;\n\n\t\tthis._stopTyping();\n\n\t\tconst attachmentsToSend = [...this._pendingAttachments];\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\n\t\tif (isNewConversation) {\n\t\t\tif (this.options.onStartConversation) {\n\t\t\t\tthis.options.onStartConversation(content, attachmentsToSend);\n\t\t\t}\n\t\t} else {\n\t\t\tconst message = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\tattachments: attachmentsToSend.map((a) => ({\n\t\t\t\t\turl: a.preview,\n\t\t\t\t\ttype: a.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: a.file.name,\n\t\t\t\t})),\n\t\t\t};\n\n\t\t\tthis.state.addMessage(this.state.activeConversationId, message);\n\n\t\t\tif (this.options.onSendMessage) {\n\t\t\t\tthis.options.onSendMessage(\n\t\t\t\t\tthis.state.activeConversationId,\n\t\t\t\t\tmessage,\n\t\t\t\t\tattachmentsToSend\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tinput.value = '';\n\t\tinput.style.height = 'auto';\n\t\tthis._pendingAttachments = [];\n\t\tthis._renderAttachmentPreviews();\n\t\tthis._updateSendButtonState();\n\t}\n\n\t_startTyping() {\n\t\tif (this._isConversationClosed) return;\n\t\tif (!this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = true;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, true);\n\t\t\t}\n\t\t}\n\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._typingTimeout = setTimeout(() => {\n\t\t\tthis._stopTyping();\n\t\t}, 3000);\n\t}\n\n\t_stopTyping() {\n\t\tif (this._isTyping && this.state.activeConversationId) {\n\t\t\tthis._isTyping = false;\n\t\t\tif (this.options.onTyping) {\n\t\t\t\tthis.options.onTyping(this.state.activeConversationId, false);\n\t\t\t}\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t\tthis._typingTimeout = null;\n\t\t}\n\t}\n\n\t_showTypingIndicator(userName) {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'flex';\n\t\t\tconst textEl = this._typingIndicator.querySelector(\n\t\t\t\t'.messenger-typing-text'\n\t\t\t);\n\t\t\tif (textEl) {\n\t\t\t\ttextEl.textContent = `${userName || 'Support'} is typing...`;\n\t\t\t}\n\t\t\tthis._scrollToBottom();\n\t\t}\n\t}\n\n\t_hideTypingIndicator() {\n\t\tif (this._typingIndicator) {\n\t\t\tthis._typingIndicator.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this._typingTimeout) {\n\t\t\tclearTimeout(this._typingTimeout);\n\t\t}\n\t\tthis._stopTyping();\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class ConversationsView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t\tthis.avatarColors = [\n\t\t\t'#155EEF',\n\t\t\t'#8b5cf6',\n\t\t\t'#10b981',\n\t\t\t'#f59e0b',\n\t\t\t'#ef4444',\n\t\t\t'#ec4899',\n\t\t\t'#06b6d4',\n\t\t];\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-conversations-view';\n\n\t\tthis._updateContent();\n\t\tthis._attachEvents();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'conversationAdded' ||\n\t\t\t\ttype === 'conversationRead' ||\n\t\t\t\ttype === 'conversationUpdated'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_getAvatarColor(name) {\n\t\t// Generate consistent color based on name\n\t\tconst charCode = (name || 'S').charCodeAt(0);\n\t\treturn this.avatarColors[charCode % this.avatarColors.length];\n\t}\n\n\t_updateContent() {\n\t\tconst conversations = this.state.conversations;\n\n\t\tlet conversationsHtml;\n\t\tif (conversations.length === 0) {\n\t\t\tconversationsHtml = `\n <div class=\"messenger-empty-state\">\n <div class=\"messenger-empty-state-icon\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z\"></path>\n </svg>\n </div>\n <h3>No conversations yet</h3>\n <p>Start a new conversation with our team</p>\n </div>\n `;\n\t\t} else {\n\t\t\tconversationsHtml = `\n <div class=\"messenger-conversations-list\">\n ${conversations.map((conv) => this._renderConversationItem(conv)).join('')}\n </div>\n `;\n\t\t}\n\n\t\tthis.element.innerHTML = `\n <div class=\"messenger-conversations-header\">\n <h2>Messages</h2>\n <button class=\"sdk-close-btn\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n <path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n </svg>\n </button>\n </div>\n\n <div class=\"messenger-conversations-body\">\n ${conversationsHtml}\n </div>\n\n <div class=\"messenger-conversations-footer\">\n <button class=\"messenger-new-message-btn\">\n <span>Send us a message</span>\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" style=\"flex-shrink: 0;\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"144\" y1=\"128\" x2=\"80\" y2=\"128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <path d=\"M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n </button>\n </div>\n `;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderConversationItem(conversation) {\n\t\tconst unreadClass = conversation.unread > 0 ? 'unread' : '';\n\t\tconst timeAgo = this._formatTimeAgo(conversation.lastMessageTime);\n\t\tconst avatarsHtml = this._renderConversationAvatars(\n\t\t\tconversation.participants\n\t\t);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-conversation-item ${unreadClass}\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"messenger-conversation-avatars\">\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-conversation-content\">\n\t\t\t\t\t<div class=\"messenger-conversation-header\">\n\t\t\t\t\t\t<span class=\"messenger-conversation-title\">${conversation.title || 'Chat with team'}</span>\n\t\t\t\t\t\t<span class=\"messenger-conversation-time\">${timeAgo}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-conversation-preview\">\n\t\t\t\t\t\t${conversation.unread > 0 ? '<span class=\"messenger-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t<span class=\"messenger-conversation-message\">${this._truncateMessage(conversation.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderConversationAvatars(participants) {\n\t\tif (!participants || participants.length === 0) {\n\t\t\tconst color = this._getAvatarColor('S');\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\" style=\"background-color: ${color};\">S</div>`;\n\t\t}\n\n\t\tconst p = participants[0];\n\t\tif (p.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${p.avatarUrl}\" alt=\"${p.name}\" /></div>`;\n\t\t}\n\t\tconst initial = (p.name || 'S').charAt(0).toUpperCase();\n\t\tconst color = this._getAvatarColor(p.name);\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\" style=\"background-color: ${color};\">${initial}</div>`;\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\tconst color1 = this._getAvatarColor('S');\n\t\t\tconst color2 = this._getAvatarColor('T');\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\" style=\"background-color: ${color1};\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-sm\" style=\"background-color: ${color2};\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 2)\n\t\t\t.map((avatar, index) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\tconst initial = avatar.charAt(0).toUpperCase();\n\t\t\t\tconst color = this._getAvatarColor(avatar);\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\" style=\"background-color: ${color};\">${initial}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_formatTimeAgo(timestamp) {\n\t\tif (!timestamp) return '';\n\t\tconst date = new Date(timestamp);\n\t\tconst now = new Date();\n\t\tconst diffMs = now - date;\n\t\tconst diffMins = Math.floor(diffMs / 60000);\n\t\tconst diffHours = Math.floor(diffMs / 3600000);\n\t\tconst diffDays = Math.floor(diffMs / 86400000);\n\n\t\tif (diffMins < 1) return 'now';\n\t\tif (diffMins < 60) return `${diffMins}m`;\n\t\tif (diffHours < 24) return `${diffHours}h`;\n\t\tif (diffDays < 7) return `${diffDays}d`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_truncateMessage(message) {\n\t\tif (!message) return 'No messages yet';\n\t\tconst maxLength = 50;\n\t\tif (message.length <= maxLength) return message;\n\t\treturn message.substring(0, maxLength) + '...';\n\t}\n\n\t_attachEvents() {\n\t\tconst closeBtn = this.element.querySelector('.sdk-close-btn');\n\t\tif (closeBtn) {\n\t\t\tcloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-conversation-item')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst convId = item.dataset.conversationId;\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.markAsRead(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst newMsgBtn = this.element.querySelector('.messenger-new-message-btn');\n\t\tif (newMsgBtn) {\n\t\t\tnewMsgBtn.addEventListener('click', () => {\n\t\t\t\tthis._startNewConversation();\n\t\t\t});\n\t\t}\n\t}\n\n\t_startNewConversation() {\n\t\t// If there's an open conversation, route to it instead of creating new\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.state.setActiveConversation(openConversation.id);\n\t\t\tthis.state.markAsRead(openConversation.id);\n\t\t\tthis.state.setView('chat');\n\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\tthis.options.onSelectConversation(openConversation.id);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.state.setActiveConversation(null);\n\t\t\tif (this.options.onStartNewConversation) {\n\t\t\t\tthis.options.onStartNewConversation();\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class HelpView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-help-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (type === 'helpArticlesUpdate' || type === 'helpSearchChange') {\n\t\t\t\tthis._updateCollectionsList();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst searchQuery = this.state.helpSearchQuery || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-help-header\">\n\t\t\t\t<div class=\"messenger-help-header-top\">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclass=\"messenger-help-search-input\"\n\t\t\t\t\tplaceholder=\"Search for help...\"\n\t\t\t\t\tvalue=\"${searchQuery}\"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div class=\"messenger-help-body\">\n\t\t\t\t<div class=\"messenger-help-collections\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._updateCollectionsList();\n\t\tthis._attachEvents();\n\t}\n\n\t_updateCollectionsList() {\n\t\tconst collectionsContainer = this.element.querySelector(\n\t\t\t'.messenger-help-collections'\n\t\t);\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst searchQuery = (this.state.helpSearchQuery || '').toLowerCase();\n\n\t\tconst filteredCollections = searchQuery\n\t\t\t? collections.filter(\n\t\t\t\t\t(c) =>\n\t\t\t\t\t\tc.title.toLowerCase().includes(searchQuery) ||\n\t\t\t\t\t\t(c.description && c.description.toLowerCase().includes(searchQuery))\n\t\t\t\t)\n\t\t\t: collections;\n\n\t\tconst headerEl = this.element.querySelector(\n\t\t\t'.messenger-help-collections-header'\n\t\t);\n\t\tif (headerEl) {\n\t\t\theaderEl.textContent = `${filteredCollections.length} collections`;\n\t\t}\n\n\t\tif (filteredCollections.length === 0) {\n\t\t\tcollectionsContainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tcollectionsContainer.innerHTML = filteredCollections\n\t\t\t.map((collection) => this._renderCollectionItem(collection))\n\t\t\t.join('');\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_renderCollectionItem(collection) {\n\t\tconst articleCount = collection.articleCount || 0;\n\t\treturn `\n\t\t\t<div class=\"messenger-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t<div class=\"messenger-help-collection-content\">\n\t\t\t\t\t<h3 class=\"messenger-help-collection-title\">${collection.title}</h3>\n\t\t\t\t\t<p class=\"messenger-help-collection-desc\">${collection.description || ''}</p>\n\t\t\t\t\t<span class=\"messenger-help-collection-count\">${articleCount} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\" class=\"messenger-help-collection-arrow\">\n\t\t\t\t\t<path d=\"M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z\"></path>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderEmptyState() {\n\t\tconst isSearching = this.state.helpSearchQuery;\n\n\t\tif (isSearching) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t<path d=\"M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z\"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-empty-state\">\n\t\t\t\t<div class=\"messenger-empty-state-icon\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"48\" height=\"48\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<path d=\"M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z\"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst searchInput = this.element.querySelector(\n\t\t\t'.messenger-help-search-input'\n\t\t);\n\t\tlet searchTimeout;\n\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\tclearTimeout(searchTimeout);\n\t\t\tsearchTimeout = setTimeout(() => {\n\t\t\t\tthis.state.setHelpSearchQuery(e.target.value);\n\t\t\t}, 300);\n\t\t});\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_attachCollectionEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-help-collection')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst collectionId = item.dataset.collectionId;\n\t\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t\t(c) => c.id === collectionId\n\t\t\t\t\t);\n\t\t\t\t\tif (collection && collection.url) {\n\t\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class HomeView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-home-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'homeChangelogUpdate' ||\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'availabilityUpdate'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-home-scroll\">\n\t\t\t\t<div class=\"messenger-home-header\">\n\t\t\t\t\t<div class=\"messenger-home-header-top\">\n\t\t\t\t\t\t<div class=\"messenger-home-logo\">\n\t\t\t\t\t\t\t${this.options.logoUrl ? `<img src=\"${this.options.logoUrl}\" alt=\"${this.state.teamName}\" />` : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-home-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t\t<button class=\"sdk-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"#000000\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t\t\t<path d=\"M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z\"></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"messenger-home-welcome\">\n\t\t\t\t\t\t<span class=\"messenger-home-greeting\">Hi there 👋</span>\n\t\t\t\t\t\t<span class=\"messenger-home-question\">${this.state.welcomeMessage}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"messenger-home-body\">\n\t\t\t\t\t${this._renderMessageButton()}\n\t\t\t\t\t${this._renderFeaturedCard()}\n\t\t\t\t\t${recentChangelogHtml}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderAvatarStack() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tconst colors = ['#5856d6', '#007aff', '#34c759', '#ff9500'];\n\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-lg\" style=\"background: ${colors[0]};\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-lg\" style=\"background: ${colors[1]};\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 4)\n\t\t\t.map((avatar, index) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-lg\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-lg\" style=\"background: ${colors[index % colors.length]};\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_renderAvailabilityStatus() {\n\t\tconst isOnline = this.state.agentsOnline;\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\n\t\tif (isOnline) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-online\"></span>\n\t\t\t\t\t<span class=\"messenger-availability-text\">We're online now</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-availability\">\n\t\t\t\t<span class=\"messenger-availability-dot messenger-availability-away\"></span>\n\t\t\t\t<span class=\"messenger-availability-text\">${responseTime}</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderMessageButton() {\n\t\tconst openConversation = this.state.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tconst sendIcon = `\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" style=\"flex-shrink: 0;\">\n\t\t\t\t<rect width=\"256\" height=\"256\" fill=\"none\"/>\n\t\t\t\t<line x1=\"144\" y1=\"128\" x2=\"80\" y2=\"128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t\t<path d=\"M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t</svg>\n\t\t`;\n\n\t\tconst caretIcon = `\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 256 256\" style=\"flex-shrink: 0;\">\n\t\t\t\t<rect width=\"256\" height=\"256\" fill=\"none\"/>\n\t\t\t\t<polyline points=\"96 48 176 128 96 208\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n\t\t\t</svg>\n\t\t`;\n\n\t\tif (openConversation) {\n\t\t\treturn `\n\t\t\t\t<button class=\"messenger-home-message-btn messenger-home-continue-btn\" data-conversation-id=\"${openConversation.id}\">\n\t\t\t\t\t<div class=\"messenger-home-continue-info\">\n\t\t\t\t\t\t<span class=\"messenger-home-continue-label\">Continue conversation</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t${sendIcon}\n\t\t\t\t</button>\n\t\t\t\t<button class=\"messenger-home-message-btn messenger-feedback-btn\" data-action=\"feedback\">\n\t\t\t\t\t<span class=\"messenger-home-continue-label\">Leave us feedback</span>\n\t\t\t\t\t${caretIcon}\n\t\t\t\t</button>\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<button class=\"messenger-home-message-btn\">\n\t\t\t\t<span>Start a conversation</span>\n\t\t\t\t${sendIcon}\n\t\t\t</button>\n\t\t\t<button class=\"messenger-home-message-btn messenger-feedback-btn\" data-action=\"feedback\">\n\t\t\t\t<span>Leave us feedback</span>\n\t\t\t\t${caretIcon}\n\t\t\t</button>\n\t\t`;\n\t}\n\n\t_renderFeaturedCard() {\n\t\tif (!this.options.featuredContent) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst { title, description, imageUrl, action } =\n\t\t\tthis.options.featuredContent;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-featured\">\n\t\t\t\t${imageUrl ? `<img src=\"${imageUrl}\" alt=\"${title}\" class=\"messenger-home-featured-image\" onerror=\"this.style.display='none';\" />` : ''}\n\t\t\t\t<div class=\"messenger-home-featured-content\">\n\t\t\t\t\t<h3>${title}</h3>\n\t\t\t\t\t<p>${description}</p>\n\t\t\t\t</div>\n\t\t\t\t${action ? `<button class=\"sdk-btn sdk-btn-primary messenger-home-featured-btn\" data-action=\"${action.type}\" data-value=\"${action.value}\">${action.label}</button>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderRecentChangelog() {\n\t\tconst changelogItems = this.state.homeChangelogItems;\n\t\tif (changelogItems.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst changelogHtml = changelogItems\n\t\t\t.map(\n\t\t\t\t(item) => `\n\t\t\t<div class=\"messenger-home-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${\n\t\t\t\t\titem.coverImage\n\t\t\t\t\t\t? `\n\t\t\t\t\t<div class=\"messenger-home-changelog-cover\">\n\t\t\t\t\t\t<img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.style.display='none';\" />\n\t\t\t\t\t\t${item.coverText ? `<span class=\"messenger-home-changelog-cover-text\">${item.coverText}</span>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t\t<div class=\"messenger-home-changelog-card-content\">\n\t\t\t\t\t<h4 class=\"messenger-home-changelog-card-title\">${item.title}</h4>\n\t\t\t\t\t<p class=\"messenger-home-changelog-card-desc\">${item.description || ''}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-changelog-section\">\n\t\t\t\t${changelogHtml}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_formatDate(dateString) {\n\t\tif (!dateString) return '';\n\t\tconst date = new Date(dateString);\n\t\tconst now = new Date();\n\t\tconst diffDays = Math.floor((now - date) / (1000 * 60 * 60 * 24));\n\n\t\tif (diffDays === 0) return 'Today';\n\t\tif (diffDays === 1) return 'Yesterday';\n\t\tif (diffDays < 7) return `${diffDays}d ago`;\n\t\treturn date.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst msgBtn = this.element.querySelector(\n\t\t\t'.messenger-home-message-btn:not(.messenger-feedback-btn)'\n\t\t);\n\t\tif (msgBtn) {\n\t\t\tmsgBtn.addEventListener('click', () => {\n\t\t\t\tconst convId = msgBtn.dataset.conversationId;\n\t\t\t\tif (convId) {\n\t\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis.state.setActiveConversation(null);\n\t\t\t\t\tthis.state.setView('chat');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst feedbackBtn = this.element.querySelector('.messenger-feedback-btn');\n\t\tif (feedbackBtn) {\n\t\t\tfeedbackBtn.addEventListener('click', () => {\n\t\t\t\tconst url = this.state.urls?.feedback;\n\n\t\t\t\tif (this.options.onFeedbackClick) {\n\t\t\t\t\tthis.options.onFeedbackClick();\n\t\t\t\t} else if (url) {\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t} else {\n\t\t\t\t\tconsole.warn(\n\t\t\t\t\t\t'[Messenger] No feedback destination configured. Set `feedbackUrl` in MessengerWidget options.'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-home-changelog-card')\n\t\t\t.forEach((card) => {\n\t\t\t\tcard.addEventListener('click', () => {\n\t\t\t\t\tconst item = this.state.homeChangelogItems.find(\n\t\t\t\t\t\t(i) => i.id === card.dataset.changelogId\n\t\t\t\t\t);\n\t\t\t\t\tif (item?.url) {\n\t\t\t\t\t\twindow.open(item.url, '_blank');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.state.setView('changelog');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\n\t\tconst seeAllBtn = this.element.querySelector(\n\t\t\t'.messenger-home-changelog-all'\n\t\t);\n\t\tif (seeAllBtn) {\n\t\t\tseeAllBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('changelog');\n\t\t\t});\n\t\t}\n\n\t\tconst featuredBtn = this.element.querySelector(\n\t\t\t'.messenger-home-featured-btn'\n\t\t);\n\t\tif (featuredBtn) {\n\t\t\tfeaturedBtn.addEventListener('click', () => {\n\t\t\t\tconst action = featuredBtn.dataset.action;\n\t\t\t\tconst value = featuredBtn.dataset.value;\n\t\t\t\tif (action === 'url') {\n\t\t\t\t\twindow.open(value, '_blank');\n\t\t\t\t} else if (action === 'view') {\n\t\t\t\t\tthis.state.setView(value);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) {\n\t\t\tthis._unsubscribe();\n\t\t}\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","export class PreChatFormView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._isSubmitting = false;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-prechat-view';\n\n\t\tthis._updateContent();\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst existingName = this.state.userContext?.name || '';\n\t\tconst existingEmail = this.state.userContext?.email || '';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-prechat-overlay\">\n\t\t\t\t<div class=\"messenger-prechat-card\">\n\t\t\t\t\t<h4 class=\"messenger-prechat-title\">Get notified when we reply</h4>\n\t\t\t\t\t<form class=\"sdk-form-group\" novalidate>\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-name\"\n\t\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\t\tplaceholder=\"Name (optional)\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingName)}\"\n\t\t\t\t\t\t\t\tautocomplete=\"name\"\n\t\t\t\t\t\t\t\tclass=\"sdk-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tid=\"messenger-prechat-email\"\n\t\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t\tplaceholder=\"Email address\"\n\t\t\t\t\t\t\t\tvalue=\"${this._escapeHtml(existingEmail)}\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t\tclass=\"sdk-input\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class=\"messenger-prechat-error\" id=\"messenger-email-error\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-prechat-actions\">\n\t\t\t\t\t\t\t<button type=\"button\" class=\"sdk-btn sdk-btn-secondary messenger-prechat-skip\">Skip</button>\n\t\t\t\t\t\t\t<button type=\"submit\" class=\"sdk-btn sdk-btn-primary sdk-btn-block messenger-prechat-submit\" disabled>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-text\">Continue</span>\n\t\t\t\t\t\t\t\t<span class=\"messenger-prechat-submit-loading\">\n\t\t\t\t\t\t\t\t\t<i class=\"ph ph-spinner\"></i>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-avatar-stack\">\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">S</div>\n\t\t\t\t\t<div class=\"sdk-avatar sdk-avatar-md\">T</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"messenger-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('form');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst skipBtn = this.element.querySelector('.messenger-prechat-skip');\n\n\t\tconst validateForm = () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tconst isEmailValid = this._isValidEmail(email);\n\t\t\tsubmitBtn.disabled = !isEmailValid;\n\t\t\treturn isEmailValid;\n\t\t};\n\n\t\temailInput.addEventListener('input', () => {\n\t\t\tthis._clearError('messenger-email-error');\n\t\t\tvalidateForm();\n\t\t});\n\n\t\temailInput.addEventListener('blur', () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tif (email && !this._isValidEmail(email)) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t}\n\t\t});\n\n\t\tskipBtn.addEventListener('click', () => {\n\t\t\tthis.state.setView('chat');\n\t\t});\n\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this._isSubmitting) return;\n\t\t\tif (!validateForm()) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._handleSubmit();\n\t\t});\n\n\t\tvalidateForm();\n\n\t\tsetTimeout(() => emailInput.focus(), 100);\n\t}\n\n\t_isValidEmail(email) {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\treturn emailRegex.test(email);\n\t}\n\n\t_showError(elementId, message) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = message;\n\t\t\terrorEl.style.display = 'block';\n\t\t}\n\t}\n\n\t_clearError(elementId) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = '';\n\t\t\terrorEl.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst nameInput = this.element.querySelector('#messenger-prechat-name');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst submitText = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-text'\n\t\t);\n\t\tconst submitLoading = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-loading'\n\t\t);\n\n\t\tconst name = nameInput.value.trim();\n\t\tconst email = emailInput.value.trim();\n\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitText.style.display = 'none';\n\t\tsubmitLoading.style.display = 'inline-flex';\n\n\t\ttry {\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\tthis.state.setIdentified(true, { name, email });\n\n\t\t\tthis._isSubmitting = false;\n\n\t\t\tconst pendingMessage = this.state.pendingMessage;\n\t\t\tif (pendingMessage && this.options.onStartConversation) {\n\t\t\t\tthis.state.pendingMessage = null;\n\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\tawait this.options.onStartConversation(\n\t\t\t\t\tpendingMessage.content,\n\t\t\t\t\tpendingMessage.attachments\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[PreChatFormView] Error submitting form:', error);\n\t\t\tthis._showError(\n\t\t\t\t'messenger-email-error',\n\t\t\t\t'Something went wrong. Please try again.'\n\t\t\t);\n\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitText.style.display = 'inline';\n\t\t\tsubmitLoading.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { WebSocketService } from '../core/WebSocketService.js';\nimport {\n\tapplyMessengerCustomStyles,\n\tremoveMessengerCustomStyles,\n} from '../styles/messengerCustomStyles.js';\nimport { BaseWidget } from './BaseWidget.js';\nimport { MessengerState } from './messenger/MessengerState.js';\nimport { MessengerLauncher } from './messenger/components/MessengerLauncher.js';\nimport { MessengerPanel } from './messenger/components/MessengerPanel.js';\nimport { ChangelogView } from './messenger/views/ChangelogView.js';\nimport { ChatView } from './messenger/views/ChatView.js';\nimport { ConversationsView } from './messenger/views/ConversationsView.js';\nimport { HelpView } from './messenger/views/HelpView.js';\nimport { HomeView } from './messenger/views/HomeView.js';\nimport { PreChatFormView } from './messenger/views/PreChatFormView.js';\n\nexport class MessengerWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'messenger' });\n\n\t\tthis.messengerOptions = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || 'light',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\ttextColor: options.textColor || '#1d1d1f',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\tlogoUrl: options.logoUrl || 'https://product7.io/p7logo.svg',\n\t\t\tteamName: options.teamName || 'Support',\n\t\t\tteamAvatars: options.teamAvatars || [],\n\t\t\twelcomeMessage: options.welcomeMessage || 'How can we help?',\n\t\t\tenableHelp: options.enableHelp !== false,\n\t\t\tenableChangelog: options.enableChangelog !== false,\n\t\t\tfeaturedContent: options.featuredContent || null,\n\t\t\tfeedbackUrl: options.feedbackUrl || null,\n\t\t\tchangelogUrl: options.changelogUrl || null,\n\t\t\thelpUrl: options.helpUrl || null,\n\t\t\troadmapUrl: options.roadmapUrl || null,\n\t\t\tonSendMessage: options.onSendMessage || null,\n\t\t\tonFeedbackClick: options.onFeedbackClick || null,\n\t\t\tonArticleClick: options.onArticleClick || null,\n\t\t\tonChangelogClick: options.onChangelogClick || null,\n\t\t};\n\n\t\tthis.messengerState = new MessengerState({\n\t\t\tteamName: this.messengerOptions.teamName,\n\t\t\tteamAvatars: this.messengerOptions.teamAvatars,\n\t\t\twelcomeMessage: this.messengerOptions.welcomeMessage,\n\t\t\tenableHelp: this.messengerOptions.enableHelp,\n\t\t\tenableChangelog: this.messengerOptions.enableChangelog,\n\t\t\tuserContext: this.sdk?.apiService?.getUserContext() || null,\n\t\t\turls: {\n\t\t\t\tfeedback: this.messengerOptions.feedbackUrl,\n\t\t\t\tchangelog: this.messengerOptions.changelogUrl,\n\t\t\t\thelp: this.messengerOptions.helpUrl,\n\t\t\t\troadmap: this.messengerOptions.roadmapUrl,\n\t\t\t},\n\t\t});\n\n\t\tthis.launcher = null;\n\t\tthis.panel = null;\n\t\tthis.wsService = null;\n\t\tthis._wsUnsubscribers = [];\n\n\t\tthis._handleOpenChange = this._handleOpenChange.bind(this);\n\t\tthis._handleWebSocketMessage = this._handleWebSocketMessage.bind(this);\n\t\tthis._handleTypingStarted = this._handleTypingStarted.bind(this);\n\t\tthis._handleTypingStopped = this._handleTypingStopped.bind(this);\n\t\tthis._handleConversationClosed = this._handleConversationClosed.bind(this);\n\t}\n\n\t_render() {\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = `messenger-widget theme-${this.messengerOptions.theme}`;\n\t\tcontainer.style.zIndex = '999999';\n\n\t\tapplyMessengerCustomStyles({\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\ttextColor: this.messengerOptions.textColor,\n\t\t\tbackgroundColor: this.messengerOptions.backgroundColor,\n\t\t\ttheme: this.messengerOptions.theme,\n\t\t});\n\n\t\tthis.launcher = new MessengerLauncher(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t});\n\t\tcontainer.appendChild(this.launcher.render());\n\n\t\tthis.panel = new MessengerPanel(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\ttheme: this.messengerOptions.theme,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\tlogoUrl: this.messengerOptions.logoUrl,\n\t\t\tfeaturedContent: this.messengerOptions.featuredContent,\n\t\t\tonSendMessage:\n\t\t\t\tthis.messengerOptions.onSendMessage ||\n\t\t\t\tthis._handleSendMessage.bind(this),\n\t\t\tonStartConversation: this._handleStartConversation.bind(this),\n\t\t\tonTyping: this.sendTypingIndicator.bind(this),\n\t\t\tonSelectConversation: this._handleSelectConversation.bind(this),\n\t\t\tonStartNewConversation: this._handleNewConversationClick.bind(this),\n\t\t\tonIdentifyContact: this._handleIdentifyContact.bind(this),\n\t\t\tonFeedbackClick: this.messengerOptions.onFeedbackClick,\n\t\t\tonArticleClick: this.messengerOptions.onArticleClick,\n\t\t\tonChangelogClick: this.messengerOptions.onChangelogClick,\n\t\t});\n\n\t\tthis.panel.registerView('home', HomeView);\n\t\tthis.panel.registerView('messages', ConversationsView);\n\t\tthis.panel.registerView('chat', ChatView);\n\t\tthis.panel.registerView('prechat', PreChatFormView);\n\t\tthis.panel.registerView('help', HelpView);\n\t\tthis.panel.registerView('changelog', ChangelogView);\n\n\t\tcontainer.appendChild(this.panel.render());\n\t\tthis.panel.hide();\n\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\tthis._stateUnsubscribe = this.messengerState.subscribe((type, data) => {\n\t\t\tif (type === 'openChange') {\n\t\t\t\tthis._handleOpenChange(data.isOpen);\n\t\t\t}\n\t\t\tif (type === 'conversationChange') {\n\t\t\t\tthis._handleActiveConversationChange(\n\t\t\t\t\tdata.conversationId,\n\t\t\t\t\tdata.previousConversationId\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\n\t_handleOpenChange(isOpen) {\n\t\tif (isOpen) {\n\t\t\tthis.panel.show();\n\t\t\tthis.sdk.eventBus.emit('messenger:opened', { widget: this });\n\t\t} else {\n\t\t\tthis.panel.hide();\n\t\t\tthis.messengerState.reset();\n\t\t\tthis.sdk.eventBus.emit('messenger:closed', { widget: this });\n\t\t}\n\t}\n\n\t_handleActiveConversationChange(conversationId, previousConversationId) {\n\t\tif (previousConversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:unsubscribe', {\n\t\t\t\tconversation_id: previousConversationId,\n\t\t\t});\n\t\t}\n\t\tif (conversationId && this.wsService) {\n\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\tconversation_id: conversationId,\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _handleStartConversation(messageContent, pendingAttachments) {\n\t\ttry {\n\t\t\tif (!this.messengerState.isIdentified) {\n\t\t\t\tthis.messengerState.pendingMessage = {\n\t\t\t\t\tcontent: messageContent,\n\t\t\t\t\tattachments: pendingAttachments,\n\t\t\t\t};\n\t\t\t\tthis.messengerState.setView('prechat');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t\t(c) => c.status === 'open'\n\t\t\t);\n\n\t\t\tif (openConversation) {\n\t\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\t\tawait this._handleSendMessage(\n\t\t\t\t\topenConversation.id,\n\t\t\t\t\t{ content: messageContent },\n\t\t\t\t\tpendingAttachments\n\t\t\t\t);\n\t\t\t\treturn openConversation;\n\t\t\t}\n\n\t\t\treturn await this.startNewConversation(\n\t\t\t\tmessageContent,\n\t\t\t\t'',\n\t\t\t\tpendingAttachments\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync _handleSelectConversation(conversationId) {\n\t\ttry {\n\t\t\tawait this.fetchMessages(conversationId);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t}\n\t}\n\n\t_handleNewConversationClick() {\n\t\tconst openConversation = this.messengerState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.messengerState.setActiveConversation(openConversation.id);\n\t\t\tthis.messengerState.setView('chat');\n\t\t\tthis._handleSelectConversation(openConversation.id);\n\t\t} else {\n\t\t\tthis.messengerState.setActiveConversation(null);\n\t\t\tthis.messengerState.setView('chat');\n\t\t}\n\t}\n\n\tasync _handleIdentifyContact(contactData) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.identifyContact({\n\t\t\t\tname: contactData.name,\n\t\t\t\temail: contactData.email,\n\t\t\t});\n\n\t\t\tif (response.status) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[MessengerWidget] Contact identified:',\n\t\t\t\t\tresponse.data.contact_id\n\t\t\t\t);\n\t\t\t\tthis.messengerState.setIdentified(true, {\n\t\t\t\t\tname: contactData.name,\n\t\t\t\t\temail: contactData.email,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to identify contact:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tmarkAsIdentified(name, email) {\n\t\tthis.messengerState.setIdentified(true, { name, email });\n\t\tconsole.log('[MessengerWidget] Marked as identified:', email);\n\t}\n\n\tasync _handleUploadFile(base64Data, filename) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.uploadFile(base64Data, filename);\n\t\t\tif (response.status && response.url) {\n\t\t\t\treturn response.url;\n\t\t\t}\n\t\t\tthrow new Error('Upload failed');\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to upload file:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync _uploadPendingAttachments(pendingAttachments) {\n\t\tif (!pendingAttachments || pendingAttachments.length === 0) return [];\n\n\t\tconst uploaded = [];\n\t\tfor (const att of pendingAttachments) {\n\t\t\ttry {\n\t\t\t\tconst cdnUrl = await this._handleUploadFile(att.preview, att.file.name);\n\t\t\t\tuploaded.push({\n\t\t\t\t\turl: cdnUrl,\n\t\t\t\t\ttype: att.type.startsWith('image') ? 'image' : 'file',\n\t\t\t\t\tname: att.file.name,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[MessengerWidget] Skipping failed attachment upload:',\n\t\t\t\t\tatt.file.name,\n\t\t\t\t\terr\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treturn uploaded;\n\t}\n\n\tasync _handleSendMessage(conversationId, message, pendingAttachments) {\n\t\tthis.sdk.eventBus.emit('messenger:messageSent', {\n\t\t\twidget: this,\n\t\t\tconversationId,\n\t\t\tmessage,\n\t\t});\n\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconst response = await this.apiService.sendMessage(conversationId, {\n\t\t\t\tcontent: message.content,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconsole.log('[MessengerWidget] Message sent:', response.data.id);\n\t\t\t}\n\n\t\t\tif (this.apiService?.mock) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst mockResponse = {\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: \"Thanks for your message! We'll get back to you soon.\",\n\t\t\t\t\t\tisOwn: false,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname: 'Support Team',\n\t\t\t\t\t\t\tavatarUrl: null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tthis.messengerState.addMessage(conversationId, mockResponse);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to send message:', error);\n\t\t}\n\t}\n\n\t_handleWebSocketMessage(data) {\n\t\tconst { conversation_id, message } = data;\n\n\t\tlet attachments = [];\n\t\tif (message.attachments) {\n\t\t\ttry {\n\t\t\t\tattachments =\n\t\t\t\t\ttypeof message.attachments === 'string'\n\t\t\t\t\t\t? JSON.parse(message.attachments)\n\t\t\t\t\t\t: message.attachments;\n\t\t\t} catch (e) {\n\t\t\t\t// ignore\n\t\t\t}\n\t\t}\n\n\t\tconst localMessage = {\n\t\t\tid: message.id,\n\t\t\tcontent: message.content,\n\t\t\tisOwn: message.sender_type === 'customer',\n\t\t\ttimestamp: message.created_at,\n\t\t\tattachments: attachments.length > 0 ? attachments : undefined,\n\t\t\tsender: {\n\t\t\t\tname: message.sender_name || 'Support',\n\t\t\t\tavatarUrl: message.sender_avatar || null,\n\t\t\t},\n\t\t};\n\n\t\tthis.messengerState.addMessage(conversation_id, localMessage);\n\n\t\tif (\n\t\t\t!this.messengerState.isOpen ||\n\t\t\tthis.messengerState.activeConversationId !== conversation_id\n\t\t) {\n\t\t\tthis._updateUnreadCount();\n\t\t}\n\t}\n\n\t_handleTypingStarted(data) {\n\t\tif (data.is_agent) {\n\t\t\tthis.messengerState._notify('typingStarted', {\n\t\t\t\tconversationId: data.conversation_id,\n\t\t\t\tuserName: data.user_name,\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleTypingStopped(data) {\n\t\tthis.messengerState._notify('typingStopped', {\n\t\t\tconversationId: data.conversation_id,\n\t\t});\n\t}\n\n\t_handleConversationClosed(data) {\n\t\tconst conversationId =\n\t\t\tdata?.conversation_id || data?.id || data?.conversation?.id;\n\t\tif (!conversationId) return;\n\n\t\tthis.messengerState.updateConversation(conversationId, {\n\t\t\tstatus: 'closed',\n\t\t});\n\t}\n\n\tasync _updateUnreadCount() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getUnreadCount();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.unreadCount = response.data.unread_count || 0;\n\t\t\t\tthis.messengerState._notify('unreadCountChange', {\n\t\t\t\t\tcount: this.messengerState.unreadCount,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to get unread count:', error);\n\t\t}\n\t}\n\n\t_initWebSocket() {\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis.wsService = new WebSocketService({\n\t\t\tbaseURL: this.apiService.baseURL,\n\t\t\tworkspace: this.apiService.workspace,\n\t\t\tsessionToken: this.apiService.sessionToken,\n\t\t\tmock: this.apiService.mock,\n\t\t});\n\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('message', this._handleWebSocketMessage)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_started', this._handleTypingStarted)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('typing_stopped', this._handleTypingStopped)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('conversation_closed', this._handleConversationClosed)\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket connected');\n\t\t\t\tif (this.messengerState.activeConversationId) {\n\t\t\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\t\t\tconversation_id: this.messengerState.activeConversationId,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('disconnected', () => {\n\t\t\t\tconsole.log('[MessengerWidget] WebSocket disconnected');\n\t\t\t})\n\t\t);\n\n\t\tthis.wsService.connect();\n\t}\n\n\topen() {\n\t\tthis.messengerState.setOpen(true);\n\t}\n\n\tclose() {\n\t\tthis.messengerState.setOpen(false);\n\t}\n\n\ttoggle() {\n\t\tthis.messengerState.setOpen(!this.messengerState.isOpen);\n\t}\n\n\tnavigateTo(view) {\n\t\tthis.messengerState.setView(view);\n\t\tif (!this.messengerState.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.messengerState.setConversations(conversations);\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tthis.messengerState.addMessage(conversationId, message);\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.messengerState.setHelpArticles(articles);\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.messengerState.setHomeChangelogItems(items);\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.messengerState.setChangelogItems(items);\n\t}\n\n\tsetUnreadCount(count) {\n\t\tthis.messengerState.unreadCount = count;\n\t\tthis.messengerState._notify('unreadCountChange', { count });\n\t}\n\n\tgetState() {\n\t\treturn {\n\t\t\tisOpen: this.messengerState.isOpen,\n\t\t\tcurrentView: this.messengerState.currentView,\n\t\t\tunreadCount: this.messengerState.unreadCount,\n\t\t\tconversations: this.messengerState.conversations,\n\t\t};\n\t}\n\n\tasync loadInitialData() {\n\t\ttry {\n\t\t\tconst conversations = await this._fetchConversations();\n\t\t\tthis.messengerState.setConversations(conversations);\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to load conversations:', error);\n\t\t}\n\n\t\tif (this.messengerOptions.enableHelp) {\n\t\t\ttry {\n\t\t\t\tconst articles = await this._fetchHelpArticles();\n\t\t\t\tthis.messengerState.setHelpArticles(articles);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load help articles:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.messengerOptions.enableChangelog) {\n\t\t\ttry {\n\t\t\t\tconst { homeItems, changelogItems } = await this._fetchChangelog();\n\t\t\t\tthis.messengerState.setHomeChangelogItems(homeItems);\n\t\t\t\tthis.messengerState.setChangelogItems(changelogItems);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[MessengerWidget] Failed to load changelog:', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync _fetchConversations() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversations();\n\t\t\tif (response.status && response.data) {\n\t\t\t\treturn response.data.map((conv) => ({\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle:\n\t\t\t\t\t\tconv.subject ||\n\t\t\t\t\t\t`Chat with ${conv.assigned_user?.name || 'Support'}`,\n\t\t\t\t\tparticipants: conv.assigned_user\n\t\t\t\t\t\t? [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tname: conv.assigned_user.name,\n\t\t\t\t\t\t\t\t\tavatarUrl: conv.assigned_user.avatar,\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: conv.preview || conv.snippet || '',\n\t\t\t\t\tlastMessageTime: conv.last_message_at,\n\t\t\t\t\tunread: conv.unread || 0,\n\t\t\t\t\tstatus: conv.status,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch conversations:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync _fetchHelpArticles() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getHelpCollections();\n\t\t\tif (response.success && response.data) {\n\t\t\t\tconst collections = response.data.collections || response.data;\n\t\t\t\tconst helpBase = (this.messengerOptions.helpUrl || '').replace(\n\t\t\t\t\t/\\/$/,\n\t\t\t\t\t''\n\t\t\t\t);\n\n\t\t\t\treturn collections.map((collection) => ({\n\t\t\t\t\tid: collection.id,\n\t\t\t\t\ttitle: collection.title,\n\t\t\t\t\tdescription: collection.description || '',\n\t\t\t\t\tarticleCount: collection.article_count || 0,\n\t\t\t\t\turl:\n\t\t\t\t\t\tcollection.url_slug && helpBase\n\t\t\t\t\t\t\t? `${helpBase}/collections/${collection.url_slug}`\n\t\t\t\t\t\t\t: helpBase || null,\n\t\t\t\t}));\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch help articles:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync fetchMessages(conversationId) {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getConversation(conversationId);\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst messages = (response.data.messages || []).map((msg) => {\n\t\t\t\t\tlet attachments;\n\t\t\t\t\tif (msg.attachments) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tattachments =\n\t\t\t\t\t\t\t\ttypeof msg.attachments === 'string'\n\t\t\t\t\t\t\t\t\t? JSON.parse(msg.attachments)\n\t\t\t\t\t\t\t\t\t: msg.attachments;\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\t// ignore\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tid: msg.id,\n\t\t\t\t\t\tcontent: msg.content,\n\t\t\t\t\t\tisOwn: msg.sender_type === 'customer',\n\t\t\t\t\t\ttimestamp: msg.created_at,\n\t\t\t\t\t\tattachments:\n\t\t\t\t\t\t\tattachments && attachments.length > 0 ? attachments : undefined,\n\t\t\t\t\t\tsender: {\n\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\tmsg.sender_name ||\n\t\t\t\t\t\t\t\t(msg.sender_type === 'customer' ? 'You' : 'Support'),\n\t\t\t\t\t\t\tavatarUrl: msg.sender_avatar || null,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t\tthis.messengerState.setMessages(conversationId, messages);\n\n\t\t\t\tawait this.apiService.markConversationAsRead(conversationId);\n\t\t\t\tthis.messengerState.markAsRead(conversationId);\n\n\t\t\t\treturn messages;\n\t\t\t}\n\t\t\treturn [];\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch messages:', error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tasync startNewConversation(message, subject = '', pendingAttachments = []) {\n\t\ttry {\n\t\t\tconst uploadedAttachments =\n\t\t\t\tawait this._uploadPendingAttachments(pendingAttachments);\n\n\t\t\tconst response = await this.apiService.startConversation({\n\t\t\t\tmessage,\n\t\t\t\tsubject,\n\t\t\t\tattachments: uploadedAttachments,\n\t\t\t});\n\n\t\t\tif (response.status && response.data) {\n\t\t\t\tconst conv = response.data;\n\t\t\t\tconst newConversation = {\n\t\t\t\t\tid: conv.id,\n\t\t\t\t\ttitle: conv.subject || 'New conversation',\n\t\t\t\t\tparticipants: [{ name: 'Support', avatarUrl: null }],\n\t\t\t\t\tlastMessage: message,\n\t\t\t\t\tlastMessageTime: conv.created_at || new Date().toISOString(),\n\t\t\t\t\tunread: 0,\n\t\t\t\t\tstatus: 'open',\n\t\t\t\t};\n\n\t\t\t\tthis.messengerState.addConversation(newConversation);\n\n\t\t\t\tthis.messengerState.setMessages(conv.id, [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: message,\n\t\t\t\t\t\tisOwn: true,\n\t\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\tthis.messengerState.setActiveConversation(conv.id);\n\t\t\t\tthis.messengerState.setView('chat');\n\n\t\t\t\treturn conv;\n\t\t\t}\n\t\t\treturn null;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to start conversation:', error);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\ttry {\n\t\t\tawait this.apiService.sendTypingIndicator(conversationId, isTyping);\n\t\t} catch (error) {\n\t\t\t// silent fail\n\t\t}\n\t}\n\n\tasync checkAgentAvailability() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.checkAgentsOnline();\n\t\t\tif (response.status && response.data) {\n\t\t\t\tthis.messengerState.agentsOnline = response.data.agents_online;\n\t\t\t\tthis.messengerState.onlineCount = response.data.online_count || 0;\n\t\t\t\tthis.messengerState.responseTime = response.data.response_time || '';\n\n\t\t\t\tif (response.data.available_agents) {\n\t\t\t\t\tthis.messengerState.setTeamAvatarsFromAgents(\n\t\t\t\t\t\tresponse.data.available_agents\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthis.messengerState._notify('availabilityUpdate', response.data);\n\t\t\t\treturn response.data;\n\t\t\t}\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to check availability:', error);\n\t\t\treturn { agents_online: false, online_count: 0 };\n\t\t}\n\t}\n\n\tasync _fetchChangelog() {\n\t\tif (this.apiService?.mock) {\n\t\t\treturn {\n\t\t\t\thomeItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_5',\n\t\t\t\t\t\ttitle: 'New integrations available',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Connect with more tools you love and streamline your workflow.',\n\t\t\t\t\t\ttags: ['Integration'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1674027444485-cec3da58eef4?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 14 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_2',\n\t\t\t\t\t\ttitle: 'A new era of Insights has arrived',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1666875753105-c63a6f3bdc86?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 5 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_1',\n\t\t\t\t\t\ttitle: 'The 2025 Customer Service Transformation Report',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.',\n\t\t\t\t\t\ttags: ['Report'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1762330467475-a565d04e1808?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 2 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tchangelogItems: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_4',\n\t\t\t\t\t\ttitle: 'Enhanced conversation analytics',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'Get deeper insights into your customer conversations with our new analytics dashboard.',\n\t\t\t\t\t\ttags: ['Analytics'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1523961131990-5ea7c61b2107?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 10 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'changelog_3',\n\t\t\t\t\t\ttitle: 'Escalation guidance for complex issues',\n\t\t\t\t\t\tdescription:\n\t\t\t\t\t\t\t'New AI-powered escalation guidance helps your team handle complex customer issues more effectively.',\n\t\t\t\t\t\ttags: ['New feature', 'AI'],\n\t\t\t\t\t\tcoverImage:\n\t\t\t\t\t\t\t'https://images.unsplash.com/photo-1764773516703-b246ac2ad5ef?w=500&auto=format&fit=crop&q=60',\n\t\t\t\t\t\tpublishedAt: new Date(\n\t\t\t\t\t\t\tDate.now() - 7 * 24 * 60 * 60 * 1000\n\t\t\t\t\t\t).toISOString(),\n\t\t\t\t\t\turl: '#',\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await this.apiService.getChangelogs({ limit: 20 });\n\n\t\t\tif (response.success && response.data) {\n\t\t\t\tconst changelogs = Array.isArray(response.data) ? response.data : [];\n\t\t\t\tconst changelogBase = (\n\t\t\t\t\tthis.messengerOptions.changelogUrl || ''\n\t\t\t\t).replace(/\\/$/, '');\n\n\t\t\t\tconst mappedItems = changelogs.map((item) => ({\n\t\t\t\t\tid: item.id,\n\t\t\t\t\ttitle: item.title,\n\t\t\t\t\tdescription: item.excerpt || item.description || '',\n\t\t\t\t\ttags: item.labels ? item.labels.map((label) => label.name) : [],\n\t\t\t\t\tcoverImage: item.cover_image || null,\n\t\t\t\t\tpublishedAt: item.published_at,\n\t\t\t\t\turl:\n\t\t\t\t\t\titem.slug && changelogBase\n\t\t\t\t\t\t\t? `${changelogBase}/${item.slug}`\n\t\t\t\t\t\t\t: changelogBase || null,\n\t\t\t\t}));\n\n\t\t\t\treturn {\n\t\t\t\t\thomeItems: mappedItems.slice(0, 3),\n\t\t\t\t\tchangelogItems: mappedItems,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn { homeItems: [], changelogItems: [] };\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to fetch changelog:', error);\n\t\t\treturn { homeItems: [], changelogItems: [] };\n\t\t}\n\t}\n\n\tasync onMount() {\n\t\tthis.loadInitialData();\n\n\t\tif (this.apiService?.sessionToken) {\n\t\t\tthis._initWebSocket();\n\t\t}\n\n\t\tthis.checkAgentAvailability();\n\n\t\tthis._availabilityInterval = setInterval(() => {\n\t\t\tthis.checkAgentAvailability();\n\t\t}, 60000);\n\t}\n\n\tonDestroy() {\n\t\tif (this._stateUnsubscribe) {\n\t\t\tthis._stateUnsubscribe();\n\t\t}\n\n\t\tif (this.wsService) {\n\t\t\tthis.wsService.disconnect();\n\t\t}\n\n\t\tthis._wsUnsubscribers.forEach((unsub) => unsub());\n\t\tthis._wsUnsubscribers = [];\n\n\t\tif (this._availabilityInterval) {\n\t\t\tclearInterval(this._availabilityInterval);\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tremoveMessengerCustomStyles();\n\n\t\tif (this.launcher) {\n\t\t\tthis.launcher.destroy();\n\t\t}\n\t\tif (this.panel) {\n\t\t\tthis.panel.destroy();\n\t\t}\n\t\tthis.onDestroy();\n\t\tsuper.destroy();\n\t}\n}\n","export function applyMessengerCustomStyles(options = {}) {\n\tconst {\n\t\tprimaryColor = '#155EEF',\n\t\ttextColor = '#1d1d1f',\n\t\tbackgroundColor = '#ffffff',\n\t\ttheme = 'light',\n\t} = options;\n\n\tlet styleElement = document.getElementById(\n\t\t'product7-messenger-custom-styles'\n\t);\n\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.id = 'product7-messenger-custom-styles';\n\t\tdocument.head.appendChild(styleElement);\n\t}\n\n\tconst adjustColor = (hex, percent, alpha = 1) => {\n\t\tconst num = parseInt(hex.replace('#', ''), 16);\n\t\tconst r = Math.max(0, Math.min(255, (num >> 16) + percent));\n\t\tconst g = Math.max(0, Math.min(255, ((num >> 8) & 0x00ff) + percent));\n\t\tconst b = Math.max(0, Math.min(255, (num & 0x0000ff) + percent));\n\n\t\tif (alpha < 1) {\n\t\t\treturn `rgba(${r}, ${g}, ${b}, ${alpha})`;\n\t\t}\n\n\t\treturn '#' + ((r << 16) | (g << 8) | b).toString(16).padStart(6, '0');\n\t};\n\n\tstyleElement.textContent = `\n\t\t#product7-messenger-widget {\n\t\t\t--color-primary: ${primaryColor} !important;\n\t\t\t--color-primary-hover: ${adjustColor(primaryColor, -10)} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn:hover {\n\t\t\tbox-shadow: 0 8px 24px ${adjustColor(primaryColor, 0, 0.3)} !important;\n\t\t}\n\n\t\t.sdk-btn-primary {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t\tborder-color: ${primaryColor} !important;\n\t\t}\n\n\t\t.sdk-btn-primary:hover {\n\t\t\tbackground: ${adjustColor(primaryColor, -10)} !important;\n\t\t\tborder-color: ${adjustColor(primaryColor, -10)} !important;\n\t\t}\n\n\t\t.messenger-compose-send {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t}\n\n\t\t.messenger-compose-send:hover:not(:disabled) {\n\t\t\tbackground: ${adjustColor(primaryColor, -10)} !important;\n\t\t}\n\n\t\t.messenger-nav-tab.active .messenger-nav-icon,\n\t\t.messenger-nav-tab.active .messenger-nav-label {\n\t\t\tcolor: ${primaryColor} !important;\n\t\t}\n\n\t\t.messenger-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${adjustColor(primaryColor, 0, 0.08)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t${\n\t\t\tbackgroundColor !== '#ffffff'\n\t\t\t\t? `\n\t\t.messenger-panel-content {\n\t\t\tbackground: ${backgroundColor} !important;\n\t\t}\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\n\t\t${\n\t\t\ttextColor !== '#1d1d1f'\n\t\t\t\t? `\n\t\t.messenger-panel-content,\n\t\t.messenger-view {\n\t\t\tcolor: ${textColor} !important;\n\t\t}\n\t\t`\n\t\t\t\t: ''\n\t\t}\n\t`;\n\n\tconsole.log('✅ Custom messenger styles applied:', { primaryColor, theme });\n}\n\nexport function removeMessengerCustomStyles() {\n\tconst styleElement = document.getElementById(\n\t\t'product7-messenger-custom-styles'\n\t);\n\tif (styleElement && styleElement.parentNode) {\n\t\tstyleElement.parentNode.removeChild(styleElement);\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class SurveyWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'survey' });\n\n\t\tthis.surveyOptions = {\n\t\t\tsurveyId: options.surveyId || null,\n\t\t\tsurveyType: options.surveyType || 'nps',\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttitle: options.title || null,\n\t\t\tdescription: options.description || null,\n\t\t\tlowLabel: options.lowLabel || null,\n\t\t\thighLabel: options.highLabel || null,\n\t\t\tcustomQuestions: options.customQuestions || [],\n\t\t\tonSubmit: options.onSubmit || null,\n\t\t\tonDismiss: options.onDismiss || null,\n\t\t};\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\t_render() {\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'feedback-survey-container';\n\t\treturn container;\n\t}\n\n\t_attachEvents() {\n\t\t// Events are attached when survey is shown\n\t}\n\n\tshow() {\n\t\tthis._renderSurvey();\n\t\tthis.surveyState.isVisible = true;\n\t\tthis.sdk.eventBus.emit('survey:shown', {\n\t\t\twidget: this,\n\t\t\ttype: this.surveyOptions.surveyType,\n\t\t});\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tthis._closeSurvey();\n\t\treturn this;\n\t}\n\n\t_renderSurvey() {\n\t\tthis._closeSurvey();\n\n\t\tconst config = this._getSurveyConfig();\n\n\t\tif (this.surveyOptions.position === 'center') {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'feedback-survey-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t\tthis.backdropElement.addEventListener('click', () =>\n\t\t\t\tthis._handleDismiss()\n\t\t\t);\n\t\t}\n\n\t\tthis.surveyElement = document.createElement('div');\n\t\tthis.surveyElement.className = `feedback-survey feedback-survey-${this.surveyOptions.position}`;\n\n\t\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\">×</button>\n\t\t\t<h3 class=\"feedback-survey-title\">${config.title}</h3>\n\t\t\t<p class=\"feedback-survey-description\">${config.description}</p>\n\t\t\t<div class=\"feedback-survey-content\">${config.html}</div>\n\t\t\t<div class=\"feedback-survey-feedback\">\n\t\t\t\t<textarea class=\"feedback-survey-textarea\" placeholder=\"Any additional feedback? (optional)\"></textarea>\n\t\t\t</div>\n\t\t\t<button class=\"feedback-survey-submit\">Submit</button>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.surveyElement);\n\t\tthis._attachSurveyEvents();\n\n\t\trequestAnimationFrame(() => {\n\t\t\tthis.surveyElement.style.opacity = '1';\n\t\t\tthis.surveyElement.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(1)'\n\t\t\t\t\t: 'translateY(0)';\n\t\t});\n\t}\n\n\t_getSurveyConfig() {\n\t\tconst configs = {\n\t\t\tnps: {\n\t\t\t\ttitle:\n\t\t\t\t\tthis.surveyOptions.title || 'How likely are you to recommend us?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'On a scale of 0-10, how likely are you to recommend our product to a friend or colleague?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-nps\">\n\t\t\t\t\t\t${[...Array(11).keys()]\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(n) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-nps-btn\" data-score=\"${n}\">${n}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Not likely'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very likely'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcsat: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How satisfied are you?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How would you rate your overall satisfaction with our product?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-csat\">\n\t\t\t\t\t\t${['😞', '😕', '😐', '🙂', '😄']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(emoji, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-csat-btn\" data-score=\"${i + 1}\">${emoji}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel || 'Very dissatisfied'}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel || 'Very satisfied'}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tces: {\n\t\t\t\ttitle: this.surveyOptions.title || 'How easy was it?',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'How easy was it to accomplish your task today?',\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"feedback-survey-ces\">\n\t\t\t\t\t\t${['Very Difficult', 'Difficult', 'Neutral', 'Easy', 'Very Easy']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(label, i) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-ces-btn\" data-score=\"${i + 1}\">${label}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcustom: {\n\t\t\t\ttitle: this.surveyOptions.title || 'Quick Feedback',\n\t\t\t\tdescription:\n\t\t\t\t\tthis.surveyOptions.description ||\n\t\t\t\t\t'Help us improve by answering a few questions.',\n\t\t\t\thtml: this._renderCustomQuestions(),\n\t\t\t},\n\t\t};\n\n\t\treturn configs[this.surveyOptions.surveyType] || configs.nps;\n\t}\n\n\t_renderCustomQuestions() {\n\t\tif (\n\t\t\t!this.surveyOptions.customQuestions ||\n\t\t\tthis.surveyOptions.customQuestions.length === 0\n\t\t) {\n\t\t\treturn `\n\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t<label class=\"sdk-label\">What feature do you use most?</label>\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"feature\">\n\t\t\t\t\t\t<option value=\"\">Select a feature</option>\n\t\t\t\t\t\t<option value=\"feedback\">Feedback Collection</option>\n\t\t\t\t\t\t<option value=\"surveys\">Surveys</option>\n\t\t\t\t\t\t<option value=\"analytics\">Analytics</option>\n\t\t\t\t\t\t<option value=\"integrations\">Integrations</option>\n\t\t\t\t\t</select>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t\t<label class=\"sdk-label\">How often do you use it?</label>\n\t\t\t\t\t<div class=\"feedback-survey-frequency\">\n\t\t\t\t\t\t${['Daily', 'Weekly', 'Monthly', 'Rarely']\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t(freq) => `\n\t\t\t\t\t\t\t<button class=\"feedback-survey-freq-btn\" data-freq=\"${freq}\">${freq}</button>\n\t\t\t\t\t\t`\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\treturn this.surveyOptions.customQuestions\n\t\t\t.map(\n\t\t\t\t(q, index) => `\n\t\t\t<div class=\"sdk-form-group\">\n\t\t\t\t<label class=\"sdk-label\">${q.label}</label>\n\t\t\t\t${this._renderQuestionInput(q, index)}\n\t\t\t</div>\n\t\t`\n\t\t\t)\n\t\t\t.join('');\n\t}\n\n\t_renderQuestionInput(question, index) {\n\t\tswitch (question.type) {\n\t\t\tcase 'select':\n\t\t\t\treturn `\n\t\t\t\t\t<select class=\"feedback-survey-select\" data-question=\"${question.id || index}\">\n\t\t\t\t\t\t<option value=\"\">${question.placeholder || 'Select an option'}</option>\n\t\t\t\t\t\t${question.options.map((opt) => `<option value=\"${opt.value}\">${opt.label}</option>`).join('')}\n\t\t\t\t\t</select>\n\t\t\t\t`;\n\t\t\tcase 'text':\n\t\t\t\treturn `\n\t\t\t\t\t<input type=\"text\" class=\"feedback-survey-input\" data-question=\"${question.id || index}\" placeholder=\"${question.placeholder || ''}\">\n\t\t\t\t`;\n\t\t\tdefault:\n\t\t\t\treturn '';\n\t\t}\n\t}\n\n\t_attachSurveyEvents() {\n\t\tif (!this.surveyElement) return;\n\n\t\tconst closeBtn = this.surveyElement.querySelector('.feedback-survey-close');\n\t\tcloseBtn.addEventListener('click', () => this._handleDismiss());\n\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.addEventListener('click', () => this._handleSubmit());\n\n\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-textarea'\n\t\t);\n\t\ttextarea.addEventListener('input', (e) => {\n\t\t\tthis.surveyState.feedback = e.target.value;\n\t\t});\n\n\t\tthis._attachTypeSpecificEvents();\n\n\t\tthis._escapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') {\n\t\t\t\tthis._handleDismiss();\n\t\t\t}\n\t\t};\n\t\tdocument.addEventListener('keydown', this._escapeHandler);\n\t}\n\n\t_attachTypeSpecificEvents() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\tif (type === 'nps') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectNPS(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'csat') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCSAT(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'ces') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectCES(parseInt(btn.dataset.score))\n\t\t\t\t\t);\n\t\t\t\t});\n\t\t}\n\n\t\tif (type === 'custom') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () =>\n\t\t\t\t\t\tthis._selectFrequency(btn.dataset.freq)\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-select')\n\t\t\t\t.forEach((select) => {\n\t\t\t\t\tselect.addEventListener('change', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[select.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-input')\n\t\t\t\t.forEach((input) => {\n\t\t\t\t\tinput.addEventListener('input', (e) => {\n\t\t\t\t\t\tthis.surveyState.customAnswers[input.dataset.question] =\n\t\t\t\t\t\t\te.target.value;\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t}\n\n\t_selectNPS(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectCSAT(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-csat-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectCES(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-ces-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\t_selectFrequency(freq) {\n\t\tthis.surveyState.customAnswers.frequency = freq;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-freq-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tif (btn.dataset.freq === freq) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst type = this.surveyOptions.surveyType;\n\n\t\tif (\n\t\t\t(type === 'nps' || type === 'csat' || type === 'ces') &&\n\t\t\tthis.surveyState.score === null\n\t\t) {\n\t\t\tthis._showError('Please select a rating');\n\t\t\treturn;\n\t\t}\n\n\t\tconst responseData = {\n\t\t\trating: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tanswers: this.surveyState.customAnswers,\n\t\t};\n\n\t\tconst response = {\n\t\t\ttype: type,\n\t\t\tscore: this.surveyState.score,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tcustomAnswers: this.surveyState.customAnswers,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (this.surveyOptions.onSubmit) {\n\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t}\n\n\t\ttry {\n\t\t\tconst surveyId =\n\t\t\t\tthis.surveyOptions.surveyId || `local_${type}_${Date.now()}`;\n\t\t\tawait this.apiService.submitSurveyResponse(surveyId, responseData);\n\t\t} catch (error) {\n\t\t\tconsole.error('[SurveyWidget] Failed to submit survey:', error);\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\n\t\tthis._closeSurvey();\n\t\tthis._showSuccessNotification();\n\t}\n\n\tasync _handleDismiss() {\n\t\tif (this.surveyOptions.surveyId) {\n\t\t\ttry {\n\t\t\t\tawait this.apiService.dismissSurvey(this.surveyOptions.surveyId);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[SurveyWidget] Failed to dismiss survey:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.surveyOptions.onDismiss) {\n\t\t\tthis.surveyOptions.onDismiss();\n\t\t}\n\t\tthis.sdk.eventBus.emit('survey:dismissed', { widget: this });\n\t\tthis._closeSurvey();\n\t}\n\n\t_showError(message) {\n\t\tconst existing = this.surveyElement.querySelector('.feedback-survey-error');\n\t\tif (existing) existing.remove();\n\n\t\tconst error = document.createElement('div');\n\t\terror.className = 'feedback-survey-error';\n\t\terror.textContent = message;\n\n\t\tconst submitBtn = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-submit'\n\t\t);\n\t\tsubmitBtn.parentNode.insertBefore(error, submitBtn);\n\n\t\tsetTimeout(() => error.remove(), 3000);\n\t}\n\n\t_showSuccessNotification() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className = 'feedback-survey-success';\n\t\tnotification.innerHTML = `\n\t\t\t<div>\n\t\t\t\t<span style=\"font-size: 18px;\">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t`;\n\t\tdocument.body.appendChild(notification);\n\n\t\tsetTimeout(() => {\n\t\t\tnotification.style.opacity = '0';\n\t\t\tnotification.style.transition = 'opacity 0.3s ease';\n\t\t\tsetTimeout(() => notification.remove(), 300);\n\t\t}, 3000);\n\t}\n\n\t_closeSurvey() {\n\t\tif (this._escapeHandler) {\n\t\t\tdocument.removeEventListener('keydown', this._escapeHandler);\n\t\t\tthis._escapeHandler = null;\n\t\t}\n\n\t\tconst surveyEl = this.surveyElement;\n\t\tconst backdropEl = this.backdropElement;\n\n\t\tif (surveyEl) {\n\t\t\tsurveyEl.style.opacity = '0';\n\t\t\tsurveyEl.style.transform =\n\t\t\t\tthis.surveyOptions.position === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(0.95)'\n\t\t\t\t\t: 'translateY(20px)';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (surveyEl && surveyEl.parentNode) {\n\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.surveyElement = null;\n\t\t}\n\n\t\tif (backdropEl) {\n\t\t\tbackdropEl.style.opacity = '0';\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (backdropEl && backdropEl.parentNode) {\n\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t}\n\t\t\t}, 300);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\n\t\tthis.surveyState = {\n\t\t\tscore: null,\n\t\t\tfeedback: '',\n\t\t\tcustomAnswers: {},\n\t\t\tisVisible: false,\n\t\t};\n\t}\n\n\tdestroy() {\n\t\tthis._closeSurvey();\n\t\tsuper.destroy();\n\t}\n}\n","import { BaseWidget } from './BaseWidget.js';\n\nexport class TabWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'tab' });\n\t}\n\n\t_render() {\n\t\tconst tab = document.createElement('div');\n\t\ttab.className = `feedback-widget feedback-widget-tab position-${this.options.position}`;\n\t\ttab.innerHTML = `\n <div class=\"feedback-tab-trigger\">\n <span class=\"feedback-tab-text\">Feedback</span>\n </div>\n `;\n\n\t\tif (this.options.customStyles) {\n\t\t\tObject.assign(tab.style, this.options.customStyles);\n\t\t}\n\n\t\treturn tab;\n\t}\n\n\t_attachEvents() {\n\t\tconst tab = this.element.querySelector('.feedback-tab-trigger');\n\t\ttab.addEventListener('click', this.openModal);\n\t}\n\n\tupdateText(text) {\n\t\tconst textElement = this.element?.querySelector('.feedback-tab-text');\n\t\tif (textElement) {\n\t\t\ttextElement.textContent = text;\n\t\t}\n\t}\n\n\tupdatePosition(position) {\n\t\tthis.options.position = position;\n\t\tif (this.element) {\n\t\t\tthis.element.className = this.element.className.replace(\n\t\t\t\t/position-\\w+-\\w+/,\n\t\t\t\t`position-${position}`\n\t\t\t);\n\t\t}\n\t}\n}\n","import { SDKError } from '../utils/errors.js';\nimport { ButtonWidget } from './ButtonWidget.js';\nimport { ChangelogWidget } from './ChangelogWidget.js';\nimport { InlineWidget } from './InlineWidget.js';\nimport { MessengerWidget } from './MessengerWidget.js';\nimport { SurveyWidget } from './SurveyWidget.js';\nimport { TabWidget } from './TabWidget.js';\n\nexport class WidgetFactory {\n\tstatic widgets = new Map([\n\t\t['button', ButtonWidget],\n\t\t['tab', TabWidget],\n\t\t['inline', InlineWidget],\n\t\t['survey', SurveyWidget],\n\t\t['messenger', MessengerWidget],\n\t\t['changelog', ChangelogWidget],\n\t]);\n\n\tstatic register(type, WidgetClass) {\n\t\tif (typeof type !== 'string' || !type.trim()) {\n\t\t\tthrow new SDKError('Widget type must be a non-empty string');\n\t\t}\n\n\t\tif (typeof WidgetClass !== 'function') {\n\t\t\tthrow new SDKError('Widget class must be a constructor function');\n\t\t}\n\n\t\tthis.widgets.set(type, WidgetClass);\n\t}\n\n\tstatic create(type, options = {}) {\n\t\tconst WidgetClass = this.widgets.get(type);\n\n\t\tif (!WidgetClass) {\n\t\t\tconst availableTypes = Array.from(this.widgets.keys()).join(', ');\n\t\t\tthrow new SDKError(\n\t\t\t\t`Unknown widget type: ${type}. Available types: ${availableTypes}`\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\treturn new WidgetClass(options);\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to create widget of type '${type}': ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tstatic getAvailableTypes() {\n\t\treturn Array.from(this.widgets.keys());\n\t}\n\n\tstatic isTypeRegistered(type) {\n\t\treturn this.widgets.has(type);\n\t}\n\n\tstatic unregister(type) {\n\t\treturn this.widgets.delete(type);\n\t}\n\n\tstatic clear() {\n\t\tthis.widgets.clear();\n\t}\n\n\tstatic getWidgetClass(type) {\n\t\treturn this.widgets.get(type);\n\t}\n}\n","import { ConfigError, SDKError } from '../utils/errors.js';\nimport { deepMerge, generateId } from '../utils/helpers.js';\nimport { WidgetFactory } from '../widgets/WidgetFactory.js';\nimport { APIService } from './APIService.js';\nimport { EventBus } from './EventBus.js';\n\nexport class FeedbackSDK {\n\tconstructor(config = {}) {\n\t\tthis.config = this._validateAndMergeConfig(config);\n\t\tthis.initialized = false;\n\t\tthis.widgets = new Map();\n\t\tthis.eventBus = new EventBus();\n\n\t\tthis.apiService = new APIService({\n\t\t\tapiUrl: this.config.apiUrl,\n\t\t\tworkspace: this.config.workspace,\n\t\t\tsiteId: this.config.siteId,\n\t\t\tsessionToken: this.config.sessionToken,\n\t\t\tuserContext: this.config.userContext,\n\t\t\tmock: this.config.mock,\n\t\t\tdebug: this.config.debug,\n\t\t\tenv: this.config.env,\n\t\t});\n\n\t\tthis._bindMethods();\n\t}\n\n\tasync init() {\n\t\tif (this.initialized) {\n\t\t\treturn { alreadyInitialized: true };\n\t\t}\n\n\t\ttry {\n\t\t\tconst initData = await this.apiService.init(this.config.userContext);\n\n\t\t\tif (initData.config) {\n\t\t\t\tthis.config = deepMerge(initData.config, this.config);\n\t\t\t}\n\n\t\t\tthis.initialized = true;\n\t\t\tthis.eventBus.emit('sdk:initialized', {\n\t\t\t\tconfig: this.config,\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tinitialized: true,\n\t\t\t\tconfig: initData.config || {},\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to initialize SDK: ${error.message}`, error);\n\t\t}\n\t}\n\n\tcreateWidget(type = 'button', options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before creating widgets. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst widgetId = generateId('widget');\n\t\tconst widgetOptions = {\n\t\t\tid: widgetId,\n\t\t\tsdk: this,\n\t\t\tapiService: this.apiService,\n\t\t\t...this.config,\n\t\t\t...options,\n\t\t};\n\n\t\ttry {\n\t\t\tconst widget = WidgetFactory.create(type, widgetOptions);\n\t\t\tthis.widgets.set(widgetId, widget);\n\t\t\tthis.eventBus.emit('widget:created', { widget, type });\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(`Failed to create widget: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetWidget(id) {\n\t\treturn this.widgets.get(id);\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getActiveSurveys(context);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to fetch active surveys: ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tasync showSurveyById(surveyId, options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveys = await this.getActiveSurveys();\n\t\tconst surveyConfig = surveys.find((s) => s.id === surveyId);\n\n\t\tif (!surveyConfig) {\n\t\t\tthrow new SDKError(\n\t\t\t\t`Survey with ID '${surveyId}' not found or not active`\n\t\t\t);\n\t\t}\n\n\t\treturn this.showSurvey({\n\t\t\tsurveyId: surveyConfig.id,\n\t\t\tsurveyType: surveyConfig.type,\n\t\t\ttitle: surveyConfig.title,\n\t\t\tdescription: surveyConfig.description,\n\t\t\tlowLabel: surveyConfig.low_label,\n\t\t\thighLabel: surveyConfig.high_label,\n\t\t\tcustomQuestions: surveyConfig.questions,\n\t\t\t...options,\n\t\t});\n\t}\n\n\tshowSurvey(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst surveyWidget = this.createWidget('survey', {\n\t\t\tsurveyId: options.surveyId,\n\t\t\tsurveyType: options.surveyType || options.type || 'nps',\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title,\n\t\t\tdescription: options.description,\n\t\t\tlowLabel: options.lowLabel,\n\t\t\thighLabel: options.highLabel,\n\t\t\tcustomQuestions: options.customQuestions,\n\t\t\tonSubmit: options.onSubmit,\n\t\t\tonDismiss: options.onDismiss,\n\t\t});\n\n\t\tsurveyWidget.mount();\n\t\tsurveyWidget.show();\n\n\t\treturn surveyWidget;\n\t}\n\n\tshowChangelog(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing changelog. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst changelogWidget = this.createWidget('changelog', {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: options.theme || this.config.theme || 'light',\n\t\t\ttitle: options.title || \"What's New\",\n\t\t\ttriggerText: options.triggerText || \"What's New\",\n\t\t\tshowBadge: options.showBadge !== false,\n\t\t\tviewButtonText: options.viewButtonText || 'View Update',\n\t\t\tchangelogBaseUrl: options.changelogBaseUrl,\n\t\t\topenInNewTab: options.openInNewTab,\n\t\t\tonViewUpdate: options.onViewUpdate,\n\t\t});\n\n\t\tchangelogWidget.mount();\n\t\tchangelogWidget.show();\n\n\t\treturn changelogWidget;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching changelogs. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs(options);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to fetch changelogs: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetAllWidgets() {\n\t\treturn Array.from(this.widgets.values());\n\t}\n\n\tdestroyWidget(id) {\n\t\tconst widget = this.widgets.get(id);\n\t\tif (widget) {\n\t\t\twidget.destroy();\n\t\t\tthis.widgets.delete(id);\n\t\t\tthis.eventBus.emit('widget:removed', { widgetId: id });\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdestroyAllWidgets() {\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.destroy();\n\t\t}\n\t\tthis.widgets.clear();\n\t\tthis.eventBus.emit('widgets:cleared');\n\t}\n\n\tupdateConfig(newConfig) {\n\t\tconst oldConfig = { ...this.config };\n\t\tthis.config = this._validateAndMergeConfig(newConfig, this.config);\n\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.handleConfigUpdate(this.config);\n\t\t}\n\n\t\tthis.eventBus.emit('config:updated', {\n\t\t\toldConfig,\n\t\t\tnewConfig: this.config,\n\t\t});\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.config.userContext = userContext;\n\t\tif (this.apiService) {\n\t\t\tthis.apiService.setUserContext(userContext);\n\t\t}\n\t\tthis.eventBus.emit('user:updated', { userContext });\n\t}\n\n\tgetUserContext() {\n\t\treturn (\n\t\t\tthis.config.userContext ||\n\t\t\t(this.apiService ? this.apiService.getUserContext() : null)\n\t\t);\n\t}\n\n\tasync reinitialize(newUserContext = null) {\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\n\t\tif (newUserContext) {\n\t\t\tthis.setUserContext(newUserContext);\n\t\t}\n\n\t\treturn this.init();\n\t}\n\n\ton(event, callback) {\n\t\tthis.eventBus.on(event, callback);\n\t\treturn this;\n\t}\n\n\toff(event, callback) {\n\t\tthis.eventBus.off(event, callback);\n\t\treturn this;\n\t}\n\n\tonce(event, callback) {\n\t\tthis.eventBus.once(event, callback);\n\t\treturn this;\n\t}\n\n\temit(event, data) {\n\t\tthis.eventBus.emit(event, data);\n\t\treturn this;\n\t}\n\n\tdestroy() {\n\t\tthis.destroyAllWidgets();\n\t\tthis.eventBus.removeAllListeners();\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.eventBus.emit('sdk:destroyed');\n\t}\n\n\thasFeedbackBeenSubmitted(cooldownDays = 30) {\n\t\tconst cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\treturn now - data.submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearFeedbackSubmissionTracking() {\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t\tthis.eventBus.emit('feedback:trackingCleared');\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear feedback tracking:', e);\n\t\t}\n\t}\n\n\t_detectEnvironment() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn 'production';\n\t\t}\n\n\t\tconst hostname = window.location.hostname.toLowerCase();\n\n\t\tif (\n\t\t\thostname.includes('staging') ||\n\t\t\thostname.includes('localhost') ||\n\t\t\thostname.includes('127.0.0.1') ||\n\t\t\thostname.includes('.local')\n\t\t) {\n\t\t\treturn 'staging';\n\t\t}\n\n\t\treturn 'production';\n\t}\n\n\t_validateAndMergeConfig(newConfig, existingConfig = {}) {\n\t\tconst defaultConfig = {\n\t\t\tapiUrl: null,\n\t\t\tworkspace: null,\n\t\t\tuserContext: null,\n\t\t\tposition: 'bottom-right',\n\t\t\ttheme: 'light',\n\t\t\tboardId: 'general',\n\t\t\tautoShow: true,\n\t\t\tdebug: false,\n\t\t\tmock: false,\n\t\t\tenv: this._detectEnvironment(),\n\t\t};\n\n\t\tconst mergedConfig = deepMerge(\n\t\t\tdeepMerge(defaultConfig, existingConfig),\n\t\t\tnewConfig\n\t\t);\n\n\t\tif (!newConfig.env && !existingConfig.env) {\n\t\t\tmergedConfig.env = this._detectEnvironment();\n\t\t}\n\n\t\tif (!mergedConfig.workspace) {\n\t\t\tthrow new ConfigError('Missing required configuration: workspace');\n\t\t}\n\n\t\tif (mergedConfig.userContext) {\n\t\t\tthis._validateUserContext(mergedConfig.userContext);\n\t\t}\n\n\t\treturn mergedConfig;\n\t}\n\n\t_validateUserContext(userContext) {\n\t\tif (!userContext.user_id && !userContext.email) {\n\t\t\tthrow new ConfigError(\n\t\t\t\t'User context must include at least user_id or email'\n\t\t\t);\n\t\t}\n\n\t\tconst validStructure = {\n\t\t\tuser_id: 'string',\n\t\t\temail: 'string',\n\t\t\tname: 'string',\n\t\t\tcustom_fields: 'object',\n\t\t\tcompany: 'object',\n\t\t};\n\n\t\tfor (const [key, expectedType] of Object.entries(validStructure)) {\n\t\t\tif (userContext[key] && typeof userContext[key] !== expectedType) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`User context field '${key}' must be of type '${expectedType}'`\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\t_bindMethods() {\n\t\tthis.createWidget = this.createWidget.bind(this);\n\t\tthis.destroyWidget = this.destroyWidget.bind(this);\n\t\tthis.updateConfig = this.updateConfig.bind(this);\n\t}\n\n\tstatic create(config) {\n\t\treturn new FeedbackSDK(config);\n\t}\n\n\tstatic async createAndInit(config) {\n\t\tconst sdk = new FeedbackSDK(config);\n\t\tawait sdk.init();\n\t\treturn sdk;\n\t}\n\n\tstatic extractUserContextFromAuth(authData) {\n\t\tif (!authData) return null;\n\n\t\treturn {\n\t\t\tuser_id: authData.sub || authData.id || authData.user_id,\n\t\t\temail: authData.email,\n\t\t\tname: authData.name || authData.display_name || authData.full_name,\n\t\t\tcustom_fields: {\n\t\t\t\trole: authData.role,\n\t\t\t\tplan: authData.plan || authData.subscription?.plan,\n\t\t\t\t...(authData.custom_fields || {}),\n\t\t\t},\n\t\t\tcompany:\n\t\t\t\tauthData.company || authData.organization\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tid: authData.company?.id || authData.organization?.id,\n\t\t\t\t\t\t\tname: authData.company?.name || authData.organization?.name,\n\t\t\t\t\t\t\tmonthly_spend: authData.company?.monthly_spend,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t};\n\t}\n}\n","import { APIService } from './core/APIService.js';\nimport { EventBus } from './core/EventBus.js';\nimport { FeedbackSDK } from './core/FeedbackSDK.js';\nimport { CSS_STYLES } from './styles/styles.js';\nimport {\n\tAPIError,\n\tConfigError,\n\tSDKError,\n\tValidationError,\n\tWidgetError,\n} from './utils/errors.js';\nimport * as helpers from './utils/helpers.js';\nimport { BaseWidget } from './widgets/BaseWidget.js';\nimport { ButtonWidget } from './widgets/ButtonWidget.js';\nimport { ChangelogWidget } from './widgets/ChangelogWidget.js';\nimport { InlineWidget } from './widgets/InlineWidget.js';\nimport { MessengerWidget } from './widgets/MessengerWidget.js';\nimport { SurveyWidget } from './widgets/SurveyWidget.js';\nimport { TabWidget } from './widgets/TabWidget.js';\nimport { WidgetFactory } from './widgets/WidgetFactory.js';\n\nfunction injectStyles() {\n\tif (\n\t\ttypeof document !== 'undefined' &&\n\t\t!document.querySelector('#feedback-sdk-styles')\n\t) {\n\t\tconst style = document.createElement('style');\n\t\tstyle.id = 'feedback-sdk-styles';\n\t\tstyle.textContent = CSS_STYLES;\n\t\tdocument.head.appendChild(style);\n\t}\n}\n\nfunction autoInit() {\n\tif (typeof window !== 'undefined' && window.FeedbackSDKConfig) {\n\t\tinjectStyles();\n\n\t\tconst config = { ...window.FeedbackSDKConfig };\n\t\tconst sdk = new FeedbackSDK(config);\n\n\t\tsdk\n\t\t\t.init()\n\t\t\t.then((initData) => {\n\t\t\t\twindow.FeedbackSDK.instance = sdk;\n\n\t\t\t\tif (window.FeedbackSDKConfig.autoCreate) {\n\t\t\t\t\tconst widgets = Array.isArray(window.FeedbackSDKConfig.autoCreate)\n\t\t\t\t\t\t? window.FeedbackSDKConfig.autoCreate\n\t\t\t\t\t\t: [window.FeedbackSDKConfig.autoCreate];\n\n\t\t\t\t\twidgets.forEach((widgetConfig) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst widget = sdk.createWidget(\n\t\t\t\t\t\t\t\twidgetConfig.type || 'button',\n\t\t\t\t\t\t\t\twidgetConfig\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\twidget.mount(widgetConfig.container);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tconsole.error('[FeedbackSDK] Failed to create widget:', error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKReady', {\n\t\t\t\t\t\tdetail: { sdk, config, initData },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t})\n\t\t\t.catch((error) => {\n\t\t\t\tconsole.error('[FeedbackSDK] Auto-initialization failed:', error);\n\n\t\t\t\tif (typeof CustomEvent !== 'undefined') {\n\t\t\t\t\tconst event = new CustomEvent('FeedbackSDKError', {\n\t\t\t\t\t\tdetail: { error, config, phase: 'initialization' },\n\t\t\t\t\t});\n\t\t\t\t\twindow.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t});\n\t}\n}\n\nfunction handleDOMReady() {\n\tif (typeof document !== 'undefined') {\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', autoInit);\n\t\t} else {\n\t\t\tsetTimeout(autoInit, 0);\n\t\t}\n\t}\n}\n\nconst FeedbackSDKExport = {\n\tFeedbackSDK,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tTabWidget,\n\tInlineWidget,\n\tSurveyWidget,\n\tMessengerWidget,\n\tWidgetFactory,\n\tEventBus,\n\tAPIService,\n\tSDKError,\n\tAPIError,\n\tWidgetError,\n\tConfigError,\n\tValidationError,\n\thelpers,\n\tcreate: (config) => {\n\t\tinjectStyles();\n\t\treturn new FeedbackSDK(config);\n\t},\n\tversion: '1.0.0',\n\tinstance: null,\n\n\tisReady: () => Boolean(FeedbackSDKExport.instance),\n\tgetInstance: () => FeedbackSDKExport.instance,\n\n\tsetUserContext: (userContext) => {\n\t\tif (FeedbackSDKExport.instance) {\n\t\t\tFeedbackSDKExport.instance.setUserContext(userContext);\n\t\t} else {\n\t\t\tif (typeof window !== 'undefined') {\n\t\t\t\twindow.FeedbackSDKUserContext = userContext;\n\t\t\t}\n\t\t}\n\t},\n\n\tinitWithUser: async (config, userContext) => {\n\t\tinjectStyles();\n\t\tconst fullConfig = { ...config, userContext };\n\t\tconst sdk = new FeedbackSDK(fullConfig);\n\t\tawait sdk.init();\n\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.FeedbackSDK.instance = sdk;\n\t\t}\n\n\t\treturn sdk;\n\t},\n\n\tonReady: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\tif (FeedbackSDKExport.isReady()) {\n\t\t\t\tcallback(FeedbackSDKExport.instance);\n\t\t\t} else {\n\t\t\t\twindow.addEventListener(\n\t\t\t\t\t'FeedbackSDKReady',\n\t\t\t\t\t(event) => {\n\t\t\t\t\t\tcallback(event.detail.sdk, event.detail);\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t},\n\n\tonError: (callback) => {\n\t\tif (typeof window !== 'undefined') {\n\t\t\twindow.addEventListener('FeedbackSDKError', (event) => {\n\t\t\t\tcallback(event.detail.error, event.detail);\n\t\t\t});\n\t\t}\n\t},\n\n\textractUserContext: FeedbackSDK.extractUserContextFromAuth,\n};\n\nif (typeof window !== 'undefined') {\n\twindow.FeedbackSDK = FeedbackSDKExport;\n\thandleDOMReady();\n}\n\nexport default FeedbackSDKExport;\n\nexport {\n\tAPIError,\n\tAPIService,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tConfigError,\n\tEventBus,\n\tFeedbackSDK,\n\thelpers,\n\tInlineWidget,\n\tMessengerWidget,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\n};\n","import { baseStyles } from './base.js';\nimport { changelogStyles } from './changelog.js';\nimport { componentsStyles } from './components.js';\nimport { designTokens } from './design-tokens.js';\nimport { feedbackStyles } from './feedback.js';\nimport { messengerStyles } from './messenger.js';\nimport { surveyStyles } from './survey.js';\n\nexport const CSS_STYLES =\n\tdesignTokens +\n\tbaseStyles +\n\tcomponentsStyles +\n\tfeedbackStyles +\n\tchangelogStyles +\n\tsurveyStyles +\n\tmessengerStyles;\n\nexport {\n\tbaseStyles,\n\tchangelogStyles,\n\tcomponentsStyles,\n\tdesignTokens,\n\tfeedbackStyles,\n\tmessengerStyles,\n\tsurveyStyles,\n};\n"],"names":["MOCK_CHANGELOGS","id","title","excerpt","description","cover_image","slug","published_at","labels","name","color","status","MOCK_CONVERSATIONS","subject","last_message_at","Date","now","toISOString","created_at","unread","assigned_user","avatar","MOCK_MESSAGES","conv_1","content","sender_type","sender_name","sender_avatar","conv_2","MOCK_HELP_COLLECTIONS","articleCount","icon","url","MOCK_SURVEYS","type","low_label","high_label","trigger","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","options","_ensureSession","mock","success","data","_handleAuthRetry","async","endpoint","_getEndpointWithParams","_makeRequest","method","headers","Authorization","sessionToken","FeedbackService","submitFeedback","feedbackData","message","payload","board","board_id","boardId","attachments","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","MessengerService","getMessengerSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","getMessages","identifyContact","contact_id","email","is_new","phone","company","avatar_url","metadata","sendTypingIndicator","isTyping","is_typing","SDKError","Error","cause","super","captureStackTrace","APIError","response","isNetworkError","isClientError","isServerError","WidgetError","widgetType","widgetId","ConfigError","configKey","ValidationError","field","value","SurveyService","getActiveSurveys","context","window","location","href","userProperties","user_properties","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","userContext","env","baseURL","_getBaseURL","_loadStoredSession","apiUrl","ENV_URLS","production","base","withWorkspace","ws","staging","localstack","envConfig","init","isSessionValid","_initMockSession","_initRealSession","_storeSession","primaryColor","backgroundColor","textColor","size","displayMode","expiresIn","user","session_token","expires_in","error","args","apply","setUserContext","_storeData","getUserContext","clearSession","_removeData","localStorage","sessionData","token","expiry","stored","getItem","parse","key","setItem","removeItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","APIService","survey","messenger","help","changelog","available_agents","full_name","picture","console","log","initError","uploadFile","base64Data","filename","file","submitRating","startsWith","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","Array","isArray","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","undefined","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","required","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","_hasRecentlySubmitted","eventBus","widget","reason","querySelector","_render","appendChild","_attachEvents","onMount","show","style","display","hide","openPanel","_showLoadingModal","_hideLoadingModal","_renderPanel","requestAnimationFrame","classList","add","className","loadingElement","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessMessage","handleConfigUpdate","newConfig","theme","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","addEventListener","modeClass","sizeClass","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","notification","closeNotification","opacity","openModal","closeModal","ButtonWidget","isMinimized","_hiddenForOpenPanel","button","assign","minimizeIcon","expandIcon","openIfAllowed","Element","Boolean","closest","isControlIcon","stopPropagation","minimize","restore","pointerType","shouldRestoreButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","currentIndex","triggerText","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","listModalBackdropElement","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","_truncateDescription","label","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBase","changelogBaseUrl","openInNewTab","open","onViewUpdate","_stripHtml","html","tmp","innerText","maxLength","plain","trimEnd","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","originalContent","updateTitle","titleElement","setPlaceholder","placeholder","input","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_listeners","_onOpen","_onMessage","_onClose","_onError","connect","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","close","_mockInterval","Set","delete","send","readyState","OPEN","setInterval","code","conversation_id","user_id","user_name","is_agent","simulateMessage","MessengerState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","welcomeMessage","isIdentified","pendingMessage","enableHelp","enableChangelog","agentsOnline","onlineCount","responseTime","typingUsers","isLoadingMessages","urls","roadmap","subscribe","_notify","changeType","cb","setView","view","previousView","setOpen","setActiveConversation","previousConversationId","setIdentified","setConversations","_updateUnreadCount","addConversation","conversation","setMessages","addMessage","conv","lastMessage","lastMessageTime","timestamp","isOwn","updateConversation","updates","markAsRead","setHelpArticles","articles","setHelpSearchQuery","setHomeChangelogItems","items","setChangelogItems","getActiveConversation","getActiveMessages","setTeamAvatarsFromAgents","agents","agent","getFilteredHelpArticles","article","reset","MessengerLauncher","_unsubscribe","render","_updateContent","_updateIcon","_updateBadge","badgeHtml","btn","chatIcon","closeIcon","existingBadge","NavigationTabs","_updateActiveTab","_getTabs","tabs","_getHomeIcon","_getMessagesIcon","_getHelpIcon","_getChangelogIcon","tabsHtml","tab","isActive","tabId","toggle","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","setHeader","headerContent","header","ChangelogView","_updateChangelogList","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","tagsHtml","tags","tag","dateStr","publishedAt","coverImage","_truncateText","_renderTeamAvatars","avatars","slice","charAt","toUpperCase","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_pendingAttachments","_hideTypingIndicator","_appendMessage","_scrollToBottom","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","msg","_renderMessage","_renderAttachmentPreviews","avatarHtml","isOnline","_renderMessageAttachments","att","_escapeHtml","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","avatarUrl","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollTop","scrollHeight","_updateSendButtonState","sendBtn","preview","idx","currentTarget","min","_startTyping","shiftKey","_sendMessage","attachBtn","fileInput","click","files","from","reader","FileReader","onload","ev","readAsDataURL","fileLink","_downloadFile","img","src","blob","blobUrl","URL","createObjectURL","a","download","revokeObjectURL","hasAttachments","_stopTyping","attachmentsToSend","onStartConversation","onSendMessage","onTyping","ConversationsView","avatarColors","_getAvatarColor","charCode","charCodeAt","conversationsHtml","_renderConversationItem","unreadClass","timeAgo","_formatTimeAgo","avatarsHtml","_renderConversationAvatars","participants","_truncateMessage","p","initial","_renderAvatarStack","diffMs","diffMins","diffHours","diffDays","closeBtn","convId","onSelectConversation","newMsgBtn","_startNewConversation","openConversation","onStartNewConversation","HelpView","_updateCollectionsList","searchQuery","collectionsContainer","collections","filteredCollections","headerEl","collection","_renderCollectionItem","_attachCollectionEvents","searchTimeout","collectionId","onArticleClick","HomeView","recentChangelogHtml","_renderRecentChangelog","logoUrl","_renderMessageButton","_renderFeaturedCard","_renderAvailabilityStatus","sendIcon","caretIcon","featuredContent","action","coverText","msgBtn","feedbackBtn","onFeedbackClick","seeAllBtn","featuredBtn","PreChatFormView","_isSubmitting","existingName","existingEmail","emailInput","skipBtn","validateForm","isEmailValid","_isValidEmail","_clearError","_handleSubmit","elementId","errorEl","nameInput","submitText","submitLoading","onIdentifyContact","MessengerWidget","messengerOptions","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","messengerState","launcher","wsService","_wsUnsubscribers","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","zIndex","styleElement","getElementById","head","adjustColor","percent","alpha","num","r","max","g","b","padStart","applyMessengerCustomStyles","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","markAsIdentified","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","mockResponse","localMessage","_initWebSocket","navigateTo","setUnreadCount","getState","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","helpBase","article_count","url_slug","newConversation","checkAgentAvailability","mappedItems","_availabilityInterval","unsub","removeMessengerCustomStyles","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","customQuestions","onSubmit","onDismiss","surveyState","score","customAnswers","isVisible","_renderSurvey","_closeSurvey","_getSurveyConfig","_handleDismiss","surveyElement","_attachSurveyEvents","transform","configs","nps","csat","emoji","ces","custom","_renderCustomQuestions","_renderQuestionInput","freq","question","opt","_attachTypeSpecificEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","frequency","_showSuccessNotification","existing","insertBefore","transition","surveyEl","backdropEl","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","initData","createWidget","widgetOptions","getWidget","showSurveyById","surveyConfig","s","showSurvey","questions","surveyWidget","showChangelog","changelogWidget","getAllWidgets","values","destroyWidget","destroyAllWidgets","updateConfig","oldConfig","reinitialize","newUserContext","removeAllListeners","hasFeedbackBeenSubmitted","cooldownDays","clearFeedbackSubmissionTracking","_detectEnvironment","hostname","existingConfig","mergedConfig","_validateUserContext","validStructure","custom_fields","expectedType","createAndInit","extractUserContextFromAuth","authData","sub","display_name","role","plan","subscription","organization","monthly_spend","injectStyles","designTokens","autoInit","FeedbackSDKConfig","then","instance","autoCreate","widgetConfig","CustomEvent","detail","dispatchEvent","catch","phase","FeedbackSDKExport","helpers","version","isReady","getInstance","FeedbackSDKUserContext","initWithUser","fullConfig","onReady","onError","extractUserContext"],"mappings":"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"}
|