@product7/feedback-sdk 1.6.4 → 1.6.5

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 respondent = this._getRespondentContext(context);\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...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t\t...(context.includeEligibility !== undefined && {\n\t\t\t\tinclude_eligibility: context.includeEligibility,\n\t\t\t}),\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\t_getRespondentContext(context = {}) {\n\t\tconst userContext =\n\t\t\ttypeof this.api.getUserContext === 'function'\n\t\t\t\t? this.api.getUserContext() || {}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\trespondent_id:\n\t\t\t\tcontext.respondentId || context.userId || userContext.user_id || null,\n\t\t\temail: context.email || userContext.email || null,\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 respondent = this._getRespondentContext(responseData);\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\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\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: false,\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\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"18\" height=\"18\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n </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\">&times;</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\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg></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<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"18\" height=\"18\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n</button></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.greetingMessage = options.greetingMessage || 'Hi there 👋';\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\t_getMessageAttachmentsSignature(message) {\n\t\tif (\n\t\t\t!Array.isArray(message?.attachments) ||\n\t\t\tmessage.attachments.length === 0\n\t\t) {\n\t\t\treturn '';\n\t\t}\n\n\t\treturn message.attachments\n\t\t\t.map((att) => `${att?.type || ''}:${att?.name || ''}`)\n\t\t\t.join('|');\n\t}\n\n\t_findOptimisticMatchIndex(conversationId, incomingMessage, matchWindowMs) {\n\t\tconst messages = this.messages[conversationId] || [];\n\t\tconst incomingTimestamp = Date.parse(incomingMessage.timestamp);\n\t\tconst incomingSignature =\n\t\t\tthis._getMessageAttachmentsSignature(incomingMessage);\n\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst candidate = messages[i];\n\t\t\tif (!candidate?.isOptimistic || !candidate?.isOwn) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ((candidate.content || '') !== (incomingMessage.content || '')) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst candidateSignature =\n\t\t\t\tthis._getMessageAttachmentsSignature(candidate);\n\t\t\tif (candidateSignature !== incomingSignature) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst candidateTimestamp = Date.parse(candidate.timestamp);\n\t\t\tif (\n\t\t\t\tNumber.isNaN(incomingTimestamp) ||\n\t\t\t\tNumber.isNaN(candidateTimestamp) ||\n\t\t\t\tMath.abs(incomingTimestamp - candidateTimestamp) <= matchWindowMs\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t}\n\n\t_updateConversationFromMessage(conversationId, message, countUnread) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (!conv) {\n\t\t\treturn;\n\t\t}\n\n\t\tconv.lastMessage = message.content;\n\t\tconv.lastMessageTime = message.timestamp;\n\n\t\tif (countUnread && !message.isOwn) {\n\t\t\tconv.unread = (conv.unread || 0) + 1;\n\t\t\tthis._updateUnreadCount();\n\t\t}\n\t}\n\n\tupsertMessage(conversationId, message, options = {}) {\n\t\tif (!this.messages[conversationId]) {\n\t\t\tthis.messages[conversationId] = [];\n\t\t}\n\n\t\tconst reconcileOwnOptimistic = options.reconcileOwnOptimistic === true;\n\t\tconst optimisticMatchWindowMs = options.optimisticMatchWindowMs || 30000;\n\t\tconst messages = this.messages[conversationId];\n\t\tconst existingIndex =\n\t\t\tmessage?.id != null\n\t\t\t\t? messages.findIndex((msg) => msg?.id === message.id)\n\t\t\t\t: -1;\n\n\t\tif (existingIndex !== -1) {\n\t\t\tmessages[existingIndex] = {\n\t\t\t\t...messages[existingIndex],\n\t\t\t\t...message,\n\t\t\t\tisOptimistic: false,\n\t\t\t};\n\t\t\tthis._updateConversationFromMessage(\n\t\t\t\tconversationId,\n\t\t\t\tmessages[existingIndex],\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis._notify('messagesUpdate', {\n\t\t\t\tconversationId,\n\t\t\t\tmessages: [...messages],\n\t\t\t});\n\t\t\treturn messages[existingIndex];\n\t\t}\n\n\t\tif (reconcileOwnOptimistic && message?.isOwn) {\n\t\t\tconst optimisticIndex = this._findOptimisticMatchIndex(\n\t\t\t\tconversationId,\n\t\t\t\tmessage,\n\t\t\t\toptimisticMatchWindowMs\n\t\t\t);\n\t\t\tif (optimisticIndex !== -1) {\n\t\t\t\tmessages[optimisticIndex] = {\n\t\t\t\t\t...messages[optimisticIndex],\n\t\t\t\t\t...message,\n\t\t\t\t\tisOptimistic: false,\n\t\t\t\t};\n\t\t\t\tthis._updateConversationFromMessage(\n\t\t\t\t\tconversationId,\n\t\t\t\t\tmessages[optimisticIndex],\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tthis._notify('messagesUpdate', {\n\t\t\t\t\tconversationId,\n\t\t\t\t\tmessages: [...messages],\n\t\t\t\t});\n\t\t\t\treturn messages[optimisticIndex];\n\t\t\t}\n\t\t}\n\n\t\tconst storedMessage = {\n\t\t\t...message,\n\t\t\tisOptimistic: Boolean(message?.isOptimistic),\n\t\t};\n\t\tmessages.push(storedMessage);\n\t\tthis._updateConversationFromMessage(conversationId, storedMessage, true);\n\t\tthis._notify('messageAdded', { conversationId, message: storedMessage });\n\t\treturn storedMessage;\n\t}\n\n\taddMessage(conversationId, message) {\n\t\treturn this.upsertMessage(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: 'ph:house-simple-duotone' },\n\t\t\t{\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: 'ph:chats-duotone',\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: 'ph:books-duotone' });\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: 'Updates',\n\t\t\t\ticon: 'ph:megaphone-duotone',\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\t<button class=\"messenger-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t\t<span class=\"messenger-nav-icon\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"${tab.icon}\" width=\"22\" height=\"22\"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"messenger-nav-label\">${tab.label}</span>\n\t\t\t\t\t\t${badgeHtml}\n\t\t\t\t\t</button>\n\t\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\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\n\t\t// Configurable header colour — defaults to Product7 blue\n\t\tthis._headerBg = `linear-gradient(180deg, #f0f4ff 0%, #ffffff 100%)`;\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<div class=\"messenger-changelog-header-top\">\n\t\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn messenger-changelog-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</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\t${item.tags.map((tag) => `<span class=\"sdk-badge sdk-badge-primary messenger-changelog-tag\">${tag}</span>`).join('')}\n\t\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_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<iconify-icon icon=\"ph:megaphone-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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.element\n\t\t\t.querySelector('.messenger-changelog-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\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?.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<button class=\"sdk-btn-icon messenger-compose-attach\" aria-label=\"Attach file\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"20\" height=\"20\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <path d=\"M160,80,76.69,164.69a16,16,0,0,0,22.63,22.62L198.63,86.63a32,32,0,0,0-45.26-45.26L54.06,142.06a48,48,0,0,0,67.88,67.88L204,128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n</button>\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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\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\">&times;</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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\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\tisOptimistic: 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\" viewBox=\"0 0 256 256\" width=\"18\" height=\"18\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\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 messenger-help-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<div class=\"messenger-help-search-wrap\">\n\t\t\t\t\t<span class=\"messenger-help-search-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:magnifying-glass-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclass=\"messenger-help-search-input\"\n\t\t\t\t\t\tplaceholder=\"Search for help...\"\n\t\t\t\t\t\tvalue=\"${searchQuery}\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\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 container = this.element.querySelector('.messenger-help-collections');\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst searchQuery = (this.state.helpSearchQuery || '').toLowerCase();\n\n\t\tconst filtered = 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\tif (filtered.length === 0) {\n\t\t\tcontainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.innerHTML = filtered.map((c) => this._renderCollectionItem(c)).join('');\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_avatarColors = [\n\t\t{ bg: '#EF4444', text: '#FFFFFF' },\n\t\t{ bg: '#F97316', text: '#FFFFFF' },\n\t\t{ bg: '#F59E0B', text: '#FFFFFF' },\n\t\t{ bg: '#10B981', text: '#FFFFFF' },\n\t\t{ bg: '#06B6D4', text: '#FFFFFF' },\n\t\t{ bg: '#3B82F6', text: '#FFFFFF' },\n\t\t{ bg: '#8B5CF6', text: '#FFFFFF' },\n\t\t{ bg: '#EC4899', text: '#FFFFFF' },\n\t];\n\n\t_getAvatarColor(id) {\n\t\tconst hash = id.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\n\t\treturn this._avatarColors[hash % this._avatarColors.length];\n\t}\n\n\t_getInitials(name) {\n\t\tif (!name) return 'A';\n\t\treturn name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\n\t}\n\n\t_renderAuthorAvatar(collection) {\n\t\tif (collection.author?.picture) {\n\t\t\treturn `<img\n\t\t\t\tsrc=\"${collection.author.picture}\"\n\t\t\t\talt=\"${collection.author.name || ''}\"\n\t\t\t\tclass=\"messenger-help-collection-avatar\"\n\t\t\t\ttitle=\"${collection.author.name || ''}\"\n\t\t\t/>`;\n\t\t}\n\n\t\tconst { bg, text } = this._getAvatarColor(collection.id);\n\t\tconst initials = collection.author?.name ? this._getInitials(collection.author.name) : 'A';\n\n\t\treturn `<span\n\t\t\tclass=\"messenger-help-collection-avatar messenger-help-collection-avatar--initials\"\n\t\t\tstyle=\"background-color: ${bg}; color: ${text};\"\n\t\t\ttitle=\"${collection.author?.name || 'Author'}\"\n\t\t>${initials}</span>`;\n\t}\n\n\t_resolveCollectionIcon(icon) {\n\t\tif (!icon) return this._defaultCollectionIcon();\n\n\t\tif (icon.trimStart().startsWith('<')) {\n\t\t\treturn `<span class=\"messenger-help-collection-icon\">${icon}</span>`;\n\t\t}\n\n\t\tif (icon.startsWith('ph:')) {\n\t\t\treturn `<span class=\"messenger-help-collection-icon\">\n\t\t\t\t<iconify-icon icon=\"${icon}\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t</span>`;\n\t\t}\n\n\t\treturn this._defaultCollectionIcon();\n\t}\n\n\t_defaultCollectionIcon() {\n\t\treturn `<span class=\"messenger-help-collection-icon\">\n\t\t\t<iconify-icon icon=\"ph:book-open-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t</span>`;\n\t}\n\n\t_renderCollectionItem(collection) {\n\t\tconst articleCount = collection.articleCount || 0;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t${this._resolveCollectionIcon(collection.icon)}\n\t\t\t\t<div class=\"messenger-help-collection-content\">\n\t\t\t\t\t<div class=\"messenger-help-collection-title\">${collection.title}</div>\n\t\t\t\t\t${collection.description ? `<p class=\"messenger-help-collection-desc\">${collection.description}</p>` : ''}\n\t\t\t\t\t<div class=\"messenger-help-collection-meta\">\n\t\t\t\t\t\t${this._renderAuthorAvatar(collection)}\n\t\t\t\t\t\t<span class=\"messenger-help-collection-count\">\n\t\t\t\t\t\t\t${articleCount} ${articleCount === 1 ? 'article' : 'articles'}\n\t\t\t\t\t\t</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_renderEmptyState() {\n\t\tif (this.state.helpSearchQuery) {\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<iconify-icon icon=\"ph:magnifying-glass-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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<iconify-icon icon=\"ph:books-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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.querySelector('.messenger-help-close-btn').addEventListener('click', () => {\n\t\t\tthis.state.setOpen(false);\n\t\t});\n\n\t\tconst searchInput = this.element.querySelector('.messenger-help-search-input');\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.querySelectorAll('.messenger-help-collection').forEach((item) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t(c) => c.id === item.dataset.collectionId\n\t\t\t\t);\n\t\t\t\tif (collection?.url) {\n\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) this._unsubscribe();\n\t\tif (this.element?.parentNode) this.element.parentNode.removeChild(this.element);\n\t}\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\">${this.state.greetingMessage}</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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\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\tgreetingMessage: options.greetingMessage || 'Hi there 👋',\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\tgreetingMessage: this.messengerOptions.greetingMessage,\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.upsertMessage(conversation_id, localMessage, {\n\t\t\treconcileOwnOptimistic: true,\n\t\t\toptimisticMatchWindowMs: 30000,\n\t\t});\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\tconst sorted = [...collections].sort(\n\t\t\t\t\t(a, b) => (a.order ?? 0) - (b.order ?? 0)\n\t\t\t\t);\n\n\t\t\t\treturn sorted.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\ticon: collection.icon || null,\n\t\t\t\t\tauthor: collection.author || null,\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\tratingScale: options.ratingScale || options.scale || null,\n\t\t\tshowFeedbackInput:\n\t\t\t\ttypeof options.showFeedbackInput === 'boolean'\n\t\t\t\t\t? options.showFeedbackInput\n\t\t\t\t\t: null,\n\t\t\tshowSubmitButton:\n\t\t\t\ttypeof options.showSubmitButton === 'boolean'\n\t\t\t\t\t? options.showSubmitButton\n\t\t\t\t\t: null,\n\t\t\tautoSubmitOnSelect:\n\t\t\t\ttypeof options.autoSubmitOnSelect === 'boolean'\n\t\t\t\t\t? options.autoSubmitOnSelect\n\t\t\t\t\t: null,\n\t\t\tshowTitle:\n\t\t\t\ttypeof options.showTitle === 'boolean' ? options.showTitle : null,\n\t\t\tshowDescription:\n\t\t\t\ttypeof options.showDescription === 'boolean'\n\t\t\t\t\t? options.showDescription\n\t\t\t\t\t: null,\n\t\t\tcustomQuestions: options.customQuestions || [],\n\t\t\tpages: Array.isArray(options.pages) ? options.pages : [],\n\t\t\trespondentId: options.respondentId || null,\n\t\t\temail: options.email || null,\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\tpageAnswers: {},\n\t\t\tcurrentPageIndex: 0,\n\t\t\tisSubmitting: false,\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(false);\n\n\t\tconst config = this._getSurveyConfig();\n\t\tconst isMultiPage = this._isMultiPageSurvey();\n\t\tconst isLastPage = this._isLastPage();\n\t\tconst showFeedbackInput = this._shouldShowFeedbackInput();\n\t\tconst showActions = this._shouldShowActions();\n\t\tconst showTitle = this._shouldShowTitle(config);\n\t\tconst showDescription = this._shouldShowDescription(config);\n\t\tconst pageProgress = isMultiPage\n\t\t\t? `Page ${this.surveyState.currentPageIndex + 1} of ${this.surveyOptions.pages.length}`\n\t\t\t: '';\n\t\tconst submitLabel = isMultiPage && !isLastPage ? 'Next' : 'Submit';\n\t\tconst backButton =\n\t\t\tisMultiPage && this.surveyState.currentPageIndex > 0\n\t\t\t\t? '<button class=\"feedback-survey-back\">Back</button>'\n\t\t\t\t: '';\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\t\t\tshowDescription && !showTitle\n\t\t\t\t? ' feedback-survey-description-primary'\n\t\t\t\t: ''\n\t\t}`;\n\n\t\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg></button>\n\t\t\t${showTitle ? `<h3 class=\"feedback-survey-title\">${config.title}</h3>` : ''}\n\t\t\t${showDescription ? `<p class=\"feedback-survey-description\">${config.description}</p>` : ''}\n\t\t\t${isMultiPage ? `<div class=\"feedback-survey-progress\">${pageProgress}</div>` : ''}\n\t\t\t<div class=\"feedback-survey-content\">${config.html}</div>\n\t\t\t${\n\t\t\t\tshowFeedbackInput\n\t\t\t\t\t? `<div class=\"feedback-survey-feedback\">\n\t\t\t\t<textarea class=\"feedback-survey-textarea\" placeholder=\"Any additional feedback? (optional)\">${this.surveyState.feedback || ''}</textarea>\n\t\t\t</div>`\n\t\t\t\t\t: ''\n\t\t\t}\n\t\t\t${\n\t\t\t\tshowActions\n\t\t\t\t\t? `<div class=\"feedback-survey-actions\">\n\t\t\t\t${backButton}\n\t\t\t\t<button class=\"feedback-survey-submit\">${submitLabel}</button>\n\t\t\t</div>`\n\t\t\t\t\t: ''\n\t\t\t}\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\tif (this._isMultiPageSurvey()) {\n\t\t\treturn this._getCurrentPageConfig();\n\t\t}\n\n\t\tconst npsScale = this._getNPSScale();\n\t\tconst npsUsesSegmentedScale = npsScale.values.length <= 7;\n\t\tconst npsContainerClass = npsUsesSegmentedScale\n\t\t\t? 'feedback-survey-ces feedback-survey-rating-scale'\n\t\t\t: 'feedback-survey-nps';\n\t\tconst npsButtonClass = npsUsesSegmentedScale\n\t\t\t? 'feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn'\n\t\t\t: 'feedback-survey-nps-btn';\n\t\tconst npsLowLabel =\n\t\t\tthis.surveyOptions.lowLabel ||\n\t\t\t(npsScale.start === 0 ? 'Not likely' : 'Strongly Disagree');\n\t\tconst npsHighLabel =\n\t\t\tthis.surveyOptions.highLabel ||\n\t\t\t(npsScale.start === 0 ? 'Very likely' : 'Strongly Agree');\n\t\tconst npsPrompt =\n\t\t\tthis.surveyOptions.description ||\n\t\t\tthis.surveyOptions.title ||\n\t\t\t'How likely are you to recommend us?';\n\t\tconst csatPrompt =\n\t\t\tthis.surveyOptions.description ||\n\t\t\tthis.surveyOptions.title ||\n\t\t\t'How satisfied are you?';\n\t\tconst cesPrompt =\n\t\t\tthis.surveyOptions.description ||\n\t\t\tthis.surveyOptions.title ||\n\t\t\t'How easy was it?';\n\n\t\tconst configs = {\n\t\t\tnps: {\n\t\t\t\ttitle: this.surveyOptions.title || '',\n\t\t\t\tdescription: npsPrompt,\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"${npsContainerClass}\">\n\t\t\t\t\t\t${npsScale.values\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=\"${npsButtonClass}\" 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${this._renderScaleLabels(npsLowLabel, npsHighLabel)}\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcsat: {\n\t\t\t\ttitle: this.surveyOptions.title || '',\n\t\t\t\tdescription: csatPrompt,\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'\\uD83D\\uDE1E',\n\t\t\t\t\t\t\t'\\uD83D\\uDE15',\n\t\t\t\t\t\t\t'\\uD83D\\uDE10',\n\t\t\t\t\t\t\t'\\uD83D\\uDE42',\n\t\t\t\t\t\t\t'\\uD83D\\uDE04',\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${this._renderScaleLabels(\n\t\t\t\t\t\tthis.surveyOptions.lowLabel || 'Very dissatisfied',\n\t\t\t\t\t\tthis.surveyOptions.highLabel || 'Very satisfied'\n\t\t\t\t\t)}\n\t\t\t\t`,\n\t\t\t},\n\t\t\tces: {\n\t\t\t\ttitle: this.surveyOptions.title || '',\n\t\t\t\tdescription: cesPrompt,\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_getNPSScale() {\n\t\tconst rawScale = Number(this.surveyOptions.ratingScale);\n\t\tconst scale = Number.isFinite(rawScale) && rawScale >= 2 ? rawScale : 5;\n\t\tconst start = scale === 11 ? 0 : 1;\n\t\treturn {\n\t\t\tscale,\n\t\t\tstart,\n\t\t\tvalues: Array.from({ length: scale }, (_, index) => start + index),\n\t\t};\n\t}\n\n\t_renderScaleLabels(lowLabel, highLabel) {\n\t\tconst low = lowLabel || '';\n\t\tconst high = highLabel || '';\n\t\tif (!low && !high) {\n\t\t\treturn '';\n\t\t}\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t<span>${low}</span>\n\t\t\t\t<span>${high}</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_isRatingSurveyType(type = this.surveyOptions.surveyType) {\n\t\treturn type === 'nps' || type === 'csat' || type === 'ces';\n\t}\n\n\t_shouldShowTitle(config) {\n\t\tif (!config || !config.title) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof this.surveyOptions.showTitle === 'boolean') {\n\t\t\treturn this.surveyOptions.showTitle;\n\t\t}\n\t\tif (!this._isMultiPageSurvey() && this._isRatingSurveyType()) {\n\t\t\treturn !config.description;\n\t\t}\n\t\treturn true;\n\t}\n\n\t_shouldShowDescription(config) {\n\t\tif (typeof this.surveyOptions.showDescription === 'boolean') {\n\t\t\treturn this.surveyOptions.showDescription;\n\t\t}\n\t\tif (!this._isMultiPageSurvey() && this._isRatingSurveyType()) {\n\t\t\treturn Boolean(config && (config.description || config.title));\n\t\t}\n\t\treturn Boolean(config && config.description);\n\t}\n\n\t_shouldShowFeedbackInput() {\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof this.surveyOptions.showFeedbackInput === 'boolean') {\n\t\t\treturn this.surveyOptions.showFeedbackInput;\n\t\t}\n\t\treturn false;\n\t}\n\n\t_shouldAutoSubmitOnSelect() {\n\t\tif (typeof this.surveyOptions.autoSubmitOnSelect === 'boolean') {\n\t\t\treturn this.surveyOptions.autoSubmitOnSelect;\n\t\t}\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.surveyOptions.showSubmitButton === true) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this._isRatingSurveyType() && !this._shouldShowFeedbackInput();\n\t}\n\n\t_shouldShowActions() {\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\treturn true;\n\t\t}\n\t\tif (typeof this.surveyOptions.showSubmitButton === 'boolean') {\n\t\t\treturn this.surveyOptions.showSubmitButton;\n\t\t}\n\t\treturn !this._shouldAutoSubmitOnSelect();\n\t}\n\n\t_isMultiPageSurvey() {\n\t\treturn (\n\t\t\tArray.isArray(this.surveyOptions.pages) &&\n\t\t\tthis.surveyOptions.pages.length > 0\n\t\t);\n\t}\n\n\t_getCurrentPage() {\n\t\tif (!this._isMultiPageSurvey()) return null;\n\t\treturn this.surveyOptions.pages[this.surveyState.currentPageIndex] || null;\n\t}\n\n\t_isLastPage() {\n\t\tif (!this._isMultiPageSurvey()) return true;\n\t\treturn (\n\t\t\tthis.surveyState.currentPageIndex >= this.surveyOptions.pages.length - 1\n\t\t);\n\t}\n\n\t_getCurrentPageConfig() {\n\t\tconst page = this._getCurrentPage();\n\t\tif (!page) {\n\t\t\treturn this._getFallbackSurveyConfig();\n\t\t}\n\n\t\treturn {\n\t\t\ttitle: page.title || this.surveyOptions.title || 'Quick Feedback',\n\t\t\tdescription: page.description || this.surveyOptions.description || '',\n\t\t\thtml: this._renderSurveyPage(page),\n\t\t};\n\t}\n\n\t_getFallbackSurveyConfig() {\n\t\treturn {\n\t\t\ttitle: this.surveyOptions.title || 'Quick Feedback',\n\t\t\tdescription: this.surveyOptions.description || '',\n\t\t\thtml: this._renderCustomQuestions(),\n\t\t};\n\t}\n\n\t_renderSurveyPage(page) {\n\t\tswitch (page.type) {\n\t\t\tcase 'rating':\n\t\t\t\treturn this._renderRatingPage(page);\n\t\t\tcase 'multiple_choice':\n\t\t\t\treturn this._renderMultipleChoicePage(page);\n\t\t\tcase 'text':\n\t\t\t\treturn this._renderTextPage(page);\n\t\t\tdefault:\n\t\t\t\treturn this._renderTextPage(page);\n\t\t}\n\t}\n\n\t_renderRatingPage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst config = page.ratingConfig || page.rating_config || {};\n\t\tconst scale = Number(config.scale) || 5;\n\t\tconst ratingType =\n\t\t\tconfig.survey_type || this.surveyOptions.surveyType || 'csat';\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst currentRating = pageAnswer.rating;\n\t\tconst defaultLowLabel =\n\t\t\tratingType === 'nps'\n\t\t\t\t? scale === 11\n\t\t\t\t\t? 'Not likely'\n\t\t\t\t\t: 'Strongly Disagree'\n\t\t\t\t: '';\n\t\tconst defaultHighLabel =\n\t\t\tratingType === 'nps'\n\t\t\t\t? scale === 11\n\t\t\t\t\t? 'Very likely'\n\t\t\t\t\t: 'Strongly Agree'\n\t\t\t\t: '';\n\t\tconst lowLabel =\n\t\t\tconfig.low_label || this.surveyOptions.lowLabel || defaultLowLabel;\n\t\tconst highLabel =\n\t\t\tconfig.high_label || this.surveyOptions.highLabel || defaultHighLabel;\n\t\tconst labels = this._renderScaleLabels(lowLabel, highLabel);\n\n\t\tif (ratingType === 'nps') {\n\t\t\tconst npsScale = Number.isFinite(scale) && scale >= 2 ? scale : 5;\n\t\t\tconst start = npsScale === 11 ? 0 : 1;\n\t\t\tconst values = Array.from(\n\t\t\t\t{ length: npsScale },\n\t\t\t\t(_, index) => start + index\n\t\t\t);\n\t\t\tconst usesSegmentedScale = values.length <= 7;\n\t\t\tconst containerClass = usesSegmentedScale\n\t\t\t\t? 'feedback-survey-ces feedback-survey-rating-scale'\n\t\t\t\t: 'feedback-survey-nps';\n\t\t\tconst buttonClass = usesSegmentedScale\n\t\t\t\t? 'feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn'\n\t\t\t\t: 'feedback-survey-page-rating-btn feedback-survey-nps-btn';\n\t\t\treturn `\n\t\t\t\t<div class=\"${containerClass}\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${values\n\t\t\t\t\t\t.map((n) => {\n\t\t\t\t\t\t\tconst selected = currentRating === n ? ' selected' : '';\n\t\t\t\t\t\t\treturn `<button class=\"${buttonClass}${selected}\" data-page-id=\"${pageId}\" data-score=\"${n}\">${n}</button>`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</div>\n\t\t\t\t${labels}\n\t\t\t`;\n\t\t}\n\n\t\tif (ratingType === 'emoji' && scale === 5) {\n\t\t\tconst emojis = [\n\t\t\t\t'\\uD83D\\uDE1E',\n\t\t\t\t'\\uD83D\\uDE15',\n\t\t\t\t'\\uD83D\\uDE10',\n\t\t\t\t'\\uD83D\\uDE42',\n\t\t\t\t'\\uD83D\\uDE04',\n\t\t\t];\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-csat\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${emojis\n\t\t\t\t\t\t.map((emoji, i) => {\n\t\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\t\tconst selected = currentRating === score ? ' selected' : '';\n\t\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-rating-btn feedback-survey-csat-btn${selected}\" data-page-id=\"${pageId}\" data-score=\"${score}\">${emoji}</button>`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</div>\n\t\t\t\t${labels}\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-rating-scale\" data-page-id=\"${pageId}\">\n\t\t\t\t${[...Array(scale).keys()]\n\t\t\t\t\t.map((i) => {\n\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\tconst selected = currentRating === score ? ' selected' : '';\n\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-rating-btn feedback-survey-rating-scale-btn${selected}\" data-page-id=\"${pageId}\" data-score=\"${score}\">${score}</button>`;\n\t\t\t\t\t})\n\t\t\t\t\t.join('')}\n\t\t\t</div>\n\t\t\t${labels}\n\t\t`;\n\t}\n\n\t_renderMultipleChoicePage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst config =\n\t\t\tpage.multipleChoiceConfig || page.multiple_choice_config || {};\n\t\tconst options = Array.isArray(config.options) ? config.options : [];\n\t\tconst allowMultiple =\n\t\t\tconfig.allow_multiple === true || config.multiple === true;\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst selectedValues = Array.isArray(pageAnswer.values)\n\t\t\t? pageAnswer.values\n\t\t\t: pageAnswer.value\n\t\t\t\t? [pageAnswer.value]\n\t\t\t\t: [];\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-multiple-choice\" data-page-id=\"${pageId}\" data-multiple=\"${allowMultiple}\">\n\t\t\t\t${options\n\t\t\t\t\t.map((option, index) => {\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\toption.value || option.id || option.key || `option_${index}`;\n\t\t\t\t\t\tconst label = option.label || option.text || String(value);\n\t\t\t\t\t\tconst selected = selectedValues.includes(value) ? ' selected' : '';\n\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-choice-btn${selected}\" data-page-id=\"${pageId}\" data-value=\"${value}\">${label}</button>`;\n\t\t\t\t\t})\n\t\t\t\t\t.join('')}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderTextPage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst value = pageAnswer.text || '';\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-text-page\" data-page-id=\"${pageId}\">\n\t\t\t\t<textarea class=\"feedback-survey-page-textarea\" data-page-id=\"${pageId}\" placeholder=\"Type your answer...\">${value}</textarea>\n\t\t\t</div>\n\t\t`;\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\tif (submitBtn) {\n\t\t\tsubmitBtn.addEventListener('click', () => this._handleSubmit());\n\t\t}\n\n\t\tconst backBtn = this.surveyElement.querySelector('.feedback-survey-back');\n\t\tif (backBtn) {\n\t\t\tbackBtn.addEventListener('click', () => this._handleBack());\n\t\t}\n\n\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-textarea'\n\t\t);\n\t\tif (textarea) {\n\t\t\ttextarea.addEventListener('input', (e) => {\n\t\t\t\tthis.surveyState.feedback = e.target.value;\n\t\t\t});\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\tif (this._isMultiPageSurvey()) {\n\t\t\tthis._attachCurrentPageEvents();\n\t\t\treturn;\n\t\t}\n\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_attachCurrentPageEvents() {\n\t\tconst page = this._getCurrentPage();\n\t\tif (!page || !this.surveyElement) return;\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\n\t\tif (page.type === 'rating') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-page-rating-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst score = parseInt(btn.dataset.score);\n\t\t\t\t\t\tif (Number.isNaN(score)) return;\n\t\t\t\t\t\tthis._setPageAnswer(pageId, { rating: score });\n\n\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-page-rating-btn')\n\t\t\t\t\t\t\t.forEach((item) => item.classList.remove('selected'));\n\t\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tif (page.type === 'multiple_choice') {\n\t\t\tconst container = this.surveyElement.querySelector(\n\t\t\t\t'.feedback-survey-multiple-choice'\n\t\t\t);\n\t\t\tconst allowMultiple = container\n\t\t\t\t? container.dataset.multiple === 'true'\n\t\t\t\t: false;\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-page-choice-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst value = btn.dataset.value;\n\t\t\t\t\t\tif (!value) return;\n\n\t\t\t\t\t\tconst existing = this.surveyState.pageAnswers[pageId] || {};\n\t\t\t\t\t\tconst existingValues = Array.isArray(existing.values)\n\t\t\t\t\t\t\t? existing.values\n\t\t\t\t\t\t\t: existing.value\n\t\t\t\t\t\t\t\t? [existing.value]\n\t\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\tlet nextValues = [];\n\t\t\t\t\t\tif (allowMultiple) {\n\t\t\t\t\t\t\tconst hasValue = existingValues.includes(value);\n\t\t\t\t\t\t\tnextValues = hasValue\n\t\t\t\t\t\t\t\t? existingValues.filter((v) => v !== value)\n\t\t\t\t\t\t\t\t: [...existingValues, value];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnextValues = [value];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._setPageAnswer(pageId, {\n\t\t\t\t\t\t\tvalue: nextValues[0] || null,\n\t\t\t\t\t\t\tvalues: nextValues,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!allowMultiple) {\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-page-choice-btn')\n\t\t\t\t\t\t\t\t.forEach((item) => item.classList.remove('selected'));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbtn.classList.toggle('selected', nextValues.includes(value));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tif (page.type === 'text') {\n\t\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t\t'.feedback-survey-page-textarea'\n\t\t\t);\n\t\t\tif (textarea) {\n\t\t\t\ttextarea.addEventListener('input', (e) => {\n\t\t\t\t\tthis._setPageAnswer(pageId, { text: e.target.value });\n\t\t\t\t});\n\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\tthis._maybeAutoSubmit();\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\tthis._maybeAutoSubmit();\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\tthis._maybeAutoSubmit();\n\t}\n\n\t_maybeAutoSubmit() {\n\t\tif (!this._shouldAutoSubmitOnSelect()) {\n\t\t\treturn;\n\t\t}\n\t\tthis._handleSubmit();\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\t\tif (this.surveyState.isSubmitting) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\tif (!this._validateCurrentPage()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextPageIndex = this._getNextPageIndex();\n\t\t\tif (\n\t\t\t\tnextPageIndex !== -1 &&\n\t\t\t\tnextPageIndex !== this.surveyState.currentPageIndex\n\t\t\t) {\n\t\t\t\tthis.surveyState.currentPageIndex = nextPageIndex;\n\t\t\t\tthis._renderSurvey();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\t!this._isMultiPageSurvey() &&\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\tthis.surveyState.isSubmitting = true;\n\n\t\tconst respondent = this._getRespondentContext();\n\t\tconst normalizedPageAnswers = this._normalizePageAnswersForSubmit();\n\t\tconst mergedAnswers = {\n\t\t\t...this.surveyState.customAnswers,\n\t\t\t...(Object.keys(normalizedPageAnswers).length > 0 && {\n\t\t\t\tpage_answers: normalizedPageAnswers,\n\t\t\t}),\n\t\t};\n\n\t\tconst responseData = {\n\t\t\trating: this._getSubmissionRating(),\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tanswers: mergedAnswers,\n\t\t\t...(respondent.respondentId && { respondentId: respondent.respondentId }),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t};\n\n\t\tconst response = {\n\t\t\ttype: type,\n\t\t\tscore: this._getSubmissionRating(),\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tcustomAnswers: mergedAnswers,\n\t\t\tpageAnswers: normalizedPageAnswers,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\ttry {\n\t\t\tif (this.surveyOptions.onSubmit) {\n\t\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t\t}\n\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} finally {\n\t\t\tthis.surveyState.isSubmitting = false;\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\t_handleBack() {\n\t\tif (!this._isMultiPageSurvey()) return;\n\t\tif (this.surveyState.currentPageIndex <= 0) return;\n\t\tthis.surveyState.currentPageIndex -= 1;\n\t\tthis._renderSurvey();\n\t}\n\n\t_setPageAnswer(pageId, data) {\n\t\tif (!pageId) return;\n\t\tthis.surveyState.pageAnswers[pageId] = {\n\t\t\t...(this.surveyState.pageAnswers[pageId] || {}),\n\t\t\t...data,\n\t\t};\n\t}\n\n\t_validateCurrentPage() {\n\t\tconst page = this._getCurrentPage();\n\t\tif (!page || page.required === false) return true;\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\n\t\tconst answer = this.surveyState.pageAnswers[pageId] || {};\n\n\t\tif (page.type === 'rating') {\n\t\t\tif (typeof answer.rating !== 'number') {\n\t\t\t\tthis._showError('Please select a rating');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (page.type === 'multiple_choice') {\n\t\t\tconst hasSingle = Boolean(answer.value);\n\t\t\tconst hasMany = Array.isArray(answer.values) && answer.values.length > 0;\n\t\t\tif (!hasSingle && !hasMany) {\n\t\t\t\tthis._showError('Please select an option');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (page.type === 'text') {\n\t\t\tif (!answer.text || !String(answer.text).trim()) {\n\t\t\t\tthis._showError('Please enter an answer');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_getNextPageIndex() {\n\t\tif (!this._isMultiPageSurvey()) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst page = this._getCurrentPage();\n\t\tconst total = this.surveyOptions.pages.length;\n\t\tconst currentIndex = this.surveyState.currentPageIndex;\n\t\tconst fallbackNext = currentIndex + 1 < total ? currentIndex + 1 : -1;\n\t\tconst navigation = page ? page.afterThisPage || page.after_this_page : null;\n\t\tif (!navigation) {\n\t\t\treturn fallbackNext;\n\t\t}\n\n\t\tconst nextValue = navigation.default;\n\t\tif (!nextValue) {\n\t\t\treturn fallbackNext;\n\t\t}\n\n\t\tif (nextValue === 'end_survey') {\n\t\t\treturn -1;\n\t\t}\n\t\tif (nextValue === 'next_page' || nextValue === 'next') {\n\t\t\treturn fallbackNext;\n\t\t}\n\n\t\tif (typeof nextValue === 'number') {\n\t\t\treturn nextValue >= 0 && nextValue < total ? nextValue : fallbackNext;\n\t\t}\n\n\t\tif (typeof nextValue === 'string') {\n\t\t\tconst normalizedId = nextValue.replace(/^page:/, '');\n\t\t\tconst pageIndex = this.surveyOptions.pages.findIndex(\n\t\t\t\t(item) => item.id === normalizedId\n\t\t\t);\n\t\t\treturn pageIndex >= 0 ? pageIndex : fallbackNext;\n\t\t}\n\n\t\treturn fallbackNext;\n\t}\n\n\t_getSubmissionRating() {\n\t\tif (typeof this.surveyState.score === 'number') {\n\t\t\treturn this.surveyState.score;\n\t\t}\n\n\t\tif (!this._isMultiPageSurvey()) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (const page of this.surveyOptions.pages) {\n\t\t\tconst pageId =\n\t\t\t\tpage.id || `page_${this.surveyOptions.pages.indexOf(page)}`;\n\t\t\tconst answer = this.surveyState.pageAnswers[pageId];\n\t\t\tif (answer && typeof answer.rating === 'number') {\n\t\t\t\treturn answer.rating;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t_normalizePageAnswersForSubmit() {\n\t\tconst output = {};\n\t\tfor (const [pageId, answer] of Object.entries(\n\t\t\tthis.surveyState.pageAnswers\n\t\t)) {\n\t\t\tif (answer == null) continue;\n\t\t\tif (Array.isArray(answer.values) && answer.values.length > 0) {\n\t\t\t\toutput[pageId] = answer.values;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (answer.value != null && answer.value !== '') {\n\t\t\t\toutput[pageId] = answer.value;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof answer.rating === 'number') {\n\t\t\t\toutput[pageId] = answer.rating;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof answer.text === 'string' && answer.text.trim()) {\n\t\t\t\toutput[pageId] = answer.text.trim();\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t_getRespondentContext() {\n\t\tconst sdkUserContext =\n\t\t\ttypeof this.sdk.getUserContext === 'function'\n\t\t\t\t? this.sdk.getUserContext() || {}\n\t\t\t\t: {};\n\t\tconst apiUserContext =\n\t\t\tthis.apiService && typeof this.apiService.getUserContext === 'function'\n\t\t\t\t? this.apiService.getUserContext() || {}\n\t\t\t\t: {};\n\t\tconst localUserContext = this.options.userContext || {};\n\n\t\treturn {\n\t\t\trespondentId:\n\t\t\t\tthis.surveyOptions.respondentId ||\n\t\t\t\tlocalUserContext.user_id ||\n\t\t\t\tsdkUserContext.user_id ||\n\t\t\t\tapiUserContext.user_id ||\n\t\t\t\tnull,\n\t\t\temail:\n\t\t\t\tthis.surveyOptions.email ||\n\t\t\t\tlocalUserContext.email ||\n\t\t\t\tsdkUserContext.email ||\n\t\t\t\tapiUserContext.email ||\n\t\t\t\tnull,\n\t\t};\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\tconst actions = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-actions'\n\t\t);\n\t\tconst anchor = submitBtn || actions;\n\t\tif (anchor && anchor.parentNode) {\n\t\t\tanchor.parentNode.insertBefore(error, anchor);\n\t\t} else {\n\t\t\tthis.surveyElement.appendChild(error);\n\t\t}\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(resetState = true) {\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\tif (resetState) {\n\t\t\tthis.surveyState = {\n\t\t\t\tscore: null,\n\t\t\t\tfeedback: '',\n\t\t\t\tcustomAnswers: {},\n\t\t\t\tpageAnswers: {},\n\t\t\t\tcurrentPageIndex: 0,\n\t\t\t\tisSubmitting: false,\n\t\t\t\tisVisible: false,\n\t\t\t};\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\tconst surveys = (result.data || []).map((survey) =>\n\t\t\t\tthis._normalizeSurveyConfig(survey)\n\t\t\t);\n\t\t\tif (context.includeIneligible) {\n\t\t\t\treturn surveys;\n\t\t\t}\n\t\t\treturn surveys.filter((survey) => this._isSurveyEligible(survey));\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 { context = {}, ...displayOptions } = options;\n\t\tconst surveys = await this.getActiveSurveys({\n\t\t\t...context,\n\t\t\tincludeEligibility: true,\n\t\t\tincludeIneligible: true,\n\t\t});\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\tif (!this._isSurveyEligible(surveyConfig)) {\n\t\t\tthis.eventBus.emit('survey:suppressed', {\n\t\t\t\tsurveyId,\n\t\t\t\treason: this._getSurveyIneligibilityReason(surveyConfig),\n\t\t\t\tsurvey: surveyConfig,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.showSurvey({\n\t\t\tsurveyId: surveyConfig.id,\n\t\t\tsurveyType: surveyConfig.surveyType || surveyConfig.type,\n\t\t\ttitle: surveyConfig.title,\n\t\t\tdescription: surveyConfig.description,\n\t\t\tlowLabel: surveyConfig.lowLabel || surveyConfig.low_label,\n\t\t\thighLabel: surveyConfig.highLabel || surveyConfig.high_label,\n\t\t\tratingScale: surveyConfig.ratingScale ?? surveyConfig.rating_scale,\n\t\t\tshowFeedbackInput:\n\t\t\t\tsurveyConfig.showFeedbackInput ?? surveyConfig.show_feedback_input,\n\t\t\tshowSubmitButton:\n\t\t\t\tsurveyConfig.showSubmitButton ?? surveyConfig.show_submit_button,\n\t\t\tautoSubmitOnSelect:\n\t\t\t\tsurveyConfig.autoSubmitOnSelect ?? surveyConfig.auto_submit_on_select,\n\t\t\tshowTitle: surveyConfig.showTitle ?? surveyConfig.show_title,\n\t\t\tshowDescription:\n\t\t\t\tsurveyConfig.showDescription ?? surveyConfig.show_description,\n\t\t\tcustomQuestions: surveyConfig.customQuestions || surveyConfig.questions,\n\t\t\tpages: surveyConfig.pages,\n\t\t\t...displayOptions,\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\tif (!this._isSurveyEligible(options)) {\n\t\t\tthis.eventBus.emit('survey:suppressed', {\n\t\t\t\tsurveyId: options.surveyId || options.id || null,\n\t\t\t\treason: this._getSurveyIneligibilityReason(options),\n\t\t\t\tsurvey: options,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\n\t\tconst normalizedOptions = this._normalizeSurveyConfig(options);\n\n\t\tconst surveyWidget = this.createWidget('survey', {\n\t\t\tsurveyId: normalizedOptions.surveyId,\n\t\t\tsurveyType:\n\t\t\t\tnormalizedOptions.surveyType || normalizedOptions.type || 'nps',\n\t\t\tposition: normalizedOptions.position || 'bottom-right',\n\t\t\ttheme: normalizedOptions.theme || this.config.theme || 'light',\n\t\t\ttitle: normalizedOptions.title,\n\t\t\tdescription: normalizedOptions.description,\n\t\t\tlowLabel: normalizedOptions.lowLabel,\n\t\t\thighLabel: normalizedOptions.highLabel,\n\t\t\tratingScale: normalizedOptions.ratingScale ?? normalizedOptions.scale,\n\t\t\tshowFeedbackInput: normalizedOptions.showFeedbackInput,\n\t\t\tshowSubmitButton: normalizedOptions.showSubmitButton,\n\t\t\tautoSubmitOnSelect: normalizedOptions.autoSubmitOnSelect,\n\t\t\tshowTitle: normalizedOptions.showTitle,\n\t\t\tshowDescription: normalizedOptions.showDescription,\n\t\t\tcustomQuestions: normalizedOptions.customQuestions,\n\t\t\tpages: normalizedOptions.pages,\n\t\t\trespondentId: normalizedOptions.respondentId,\n\t\t\temail: normalizedOptions.email,\n\t\t\tonSubmit: normalizedOptions.onSubmit,\n\t\t\tonDismiss: normalizedOptions.onDismiss,\n\t\t});\n\n\t\tsurveyWidget.mount();\n\t\tsurveyWidget.show();\n\n\t\treturn surveyWidget;\n\t}\n\n\t_isSurveyEligible(survey = {}) {\n\t\tconst shouldShow = this._getSurveyField(survey, [\n\t\t\t'shouldShow',\n\t\t\t'should_show',\n\t\t]);\n\t\tif (typeof shouldShow === 'boolean') {\n\t\t\treturn shouldShow;\n\t\t}\n\n\t\tconst eligibilityShouldShow = this._getSurveyField(\n\t\t\tsurvey.eligibility || {},\n\t\t\t['shouldShow', 'should_show']\n\t\t);\n\t\tif (typeof eligibilityShouldShow === 'boolean') {\n\t\t\treturn eligibilityShouldShow;\n\t\t}\n\n\t\tconst eligible = this._getSurveyField(survey, [\n\t\t\t'eligible',\n\t\t\t'isEligible',\n\t\t\t'is_eligible',\n\t\t]);\n\t\tif (typeof eligible === 'boolean') {\n\t\t\treturn eligible;\n\t\t}\n\n\t\tconst isAnswered = this._getSurveyField(survey, [\n\t\t\t'isAnswered',\n\t\t\t'is_answered',\n\t\t]);\n\t\tif (typeof isAnswered === 'boolean') {\n\t\t\treturn !isAnswered;\n\t\t}\n\n\t\tconst eligibilityAnswered = this._getSurveyField(survey.eligibility || {}, [\n\t\t\t'isAnswered',\n\t\t\t'is_answered',\n\t\t]);\n\t\tif (typeof eligibilityAnswered === 'boolean') {\n\t\t\treturn !eligibilityAnswered;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_getSurveyIneligibilityReason(survey = {}) {\n\t\tconst explicitReason = this._getSurveyField(survey, [\n\t\t\t'reason',\n\t\t\t'suppressionReason',\n\t\t\t'suppression_reason',\n\t\t]);\n\t\tif (explicitReason) {\n\t\t\treturn explicitReason;\n\t\t}\n\n\t\tconst eligibilityReason = this._getSurveyField(survey.eligibility || {}, [\n\t\t\t'reason',\n\t\t\t'suppressionReason',\n\t\t\t'suppression_reason',\n\t\t]);\n\t\tif (eligibilityReason) {\n\t\t\treturn eligibilityReason;\n\t\t}\n\n\t\tconst isAnswered = this._getSurveyField(survey, [\n\t\t\t'isAnswered',\n\t\t\t'is_answered',\n\t\t]);\n\t\tif (isAnswered === true) {\n\t\t\treturn 'already_answered';\n\t\t}\n\n\t\treturn 'ineligible';\n\t}\n\n\t_normalizeSurveyConfig(survey = {}) {\n\t\tconst firstPage =\n\t\t\tArray.isArray(survey.pages) && survey.pages.length > 0\n\t\t\t\t? survey.pages[0]\n\t\t\t\t: null;\n\t\tconst ratingConfig = firstPage\n\t\t\t? firstPage.rating_config || firstPage.ratingConfig || {}\n\t\t\t: {};\n\n\t\tconst inferredType =\n\t\t\tsurvey.type || this._inferSurveyTypeFromPage(firstPage) || 'nps';\n\n\t\treturn {\n\t\t\t...survey,\n\t\t\tsurveyId: survey.surveyId || survey.id || null,\n\t\t\tsurveyType: survey.surveyType || inferredType,\n\t\t\ttype: survey.type || inferredType,\n\t\t\tshould_show:\n\t\t\t\tsurvey.should_show ??\n\t\t\t\t(survey.eligibility ? survey.eligibility.should_show : undefined),\n\t\t\treason:\n\t\t\t\tsurvey.reason ||\n\t\t\t\t(survey.eligibility ? survey.eligibility.reason : undefined),\n\t\t\ttitle:\n\t\t\t\tsurvey.title || survey.name || (firstPage ? firstPage.title : null),\n\t\t\tdescription:\n\t\t\t\tsurvey.description || (firstPage ? firstPage.description : null),\n\t\t\tlowLabel:\n\t\t\t\tsurvey.lowLabel || survey.low_label || ratingConfig.low_label || null,\n\t\t\thighLabel:\n\t\t\t\tsurvey.highLabel ||\n\t\t\t\tsurvey.high_label ||\n\t\t\t\tratingConfig.high_label ||\n\t\t\t\tnull,\n\t\t\tratingScale:\n\t\t\t\tsurvey.ratingScale ?? survey.rating_scale ?? ratingConfig.scale ?? null,\n\t\t\tshowFeedbackInput:\n\t\t\t\tsurvey.showFeedbackInput ?? survey.show_feedback_input ?? null,\n\t\t\tshowSubmitButton:\n\t\t\t\tsurvey.showSubmitButton ?? survey.show_submit_button ?? null,\n\t\t\tautoSubmitOnSelect:\n\t\t\t\tsurvey.autoSubmitOnSelect ?? survey.auto_submit_on_select ?? null,\n\t\t\tshowTitle: survey.showTitle ?? survey.show_title ?? null,\n\t\t\tshowDescription:\n\t\t\t\tsurvey.showDescription ?? survey.show_description ?? null,\n\t\t\tcustomQuestions: survey.customQuestions || survey.questions || [],\n\t\t\tpages: this._normalizeSurveyPages(survey.pages || []),\n\t\t};\n\t}\n\n\t_normalizeSurveyPages(pages = []) {\n\t\tif (!Array.isArray(pages)) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn pages\n\t\t\t.map((page, index) => ({\n\t\t\t\tid: page.id || `page_${index}`,\n\t\t\t\ttype: page.type || 'rating',\n\t\t\t\ttitle: page.title || '',\n\t\t\t\tdescription: page.description || '',\n\t\t\t\trequired: page.required !== false,\n\t\t\t\tposition: page.position ?? index,\n\t\t\t\tratingConfig: page.ratingConfig || page.rating_config || null,\n\t\t\t\tmultipleChoiceConfig:\n\t\t\t\t\tpage.multipleChoiceConfig || page.multiple_choice_config || null,\n\t\t\t\tlinkConfig: page.linkConfig || page.link_config || null,\n\t\t\t\tafterThisPage: page.afterThisPage || page.after_this_page || null,\n\t\t\t}))\n\t\t\t.sort((a, b) => a.position - b.position);\n\t}\n\n\t_inferSurveyTypeFromPage(page) {\n\t\tif (!page) return null;\n\t\tconst ratingConfig = page.rating_config || page.ratingConfig || {};\n\t\tconst scale = ratingConfig.scale;\n\t\tconst surveyType = ratingConfig.survey_type;\n\t\tconst title = (page.title || '').toLowerCase();\n\n\t\tif (scale === 11 || surveyType === 'nps') {\n\t\t\treturn 'nps';\n\t\t}\n\n\t\tif (\n\t\t\tsurveyType === 'emoji' ||\n\t\t\ttitle.includes('effort') ||\n\t\t\ttitle.includes('easy')\n\t\t) {\n\t\t\treturn 'ces';\n\t\t}\n\n\t\treturn 'csat';\n\t}\n\n\t_getSurveyField(survey, fields) {\n\t\tfor (const field of fields) {\n\t\t\tif (survey[field] !== undefined && survey[field] !== null) {\n\t\t\t\treturn survey[field];\n\t\t\t}\n\t\t}\n\t\treturn null;\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 (typeof document === 'undefined') return;\n\n\tif (!document.querySelector('#feedback-sdk-styles')) {\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\tif (!document.querySelector('#feedback-sdk-iconify')) {\n\t\tconst script = document.createElement('script');\n\t\tscript.id = 'feedback-sdk-iconify';\n\t\tscript.src =\n\t\t\t'https://cdn.jsdelivr.net/npm/iconify-icon@2/dist/iconify-icon.min.js';\n\t\tscript.async = true;\n\t\tdocument.head.appendChild(script);\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","respondent","_getRespondentContext","window","location","href","respondent_id","undefined","includeEligibility","include_eligibility","userProperties","user_properties","userContext","getUserContext","respondentId","userId","user_id","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","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","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","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_name","is_agent","simulateMessage","MessengerState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","greetingMessage","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","_getMessageAttachmentsSignature","att","_findOptimisticMatchIndex","incomingMessage","matchWindowMs","incomingTimestamp","timestamp","incomingSignature","candidate","isOptimistic","isOwn","candidateTimestamp","Number","isNaN","abs","_updateConversationFromMessage","countUnread","conv","lastMessage","lastMessageTime","upsertMessage","reconcileOwnOptimistic","optimisticMatchWindowMs","existingIndex","findIndex","msg","optimisticIndex","storedMessage","addMessage","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","tabsHtml","tab","isActive","tabId","toggle","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","setHeader","headerContent","header","ChangelogView","_headerBg","_updateChangelogList","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","tagsHtml","tags","tag","dateStr","publishedAt","coverImage","_truncateText","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_pendingAttachments","_hideTypingIndicator","_appendMessage","_scrollToBottom","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","_renderMessage","_renderAttachmentPreviews","avatarHtml","_renderTeamAvatars","isOnline","_renderMessageAttachments","_escapeHtml","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","avatarUrl","charAt","toUpperCase","avatars","slice","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","collections","filtered","_renderCollectionItem","_attachCollectionEvents","_avatarColors","bg","hash","acc","char","_getInitials","_renderAuthorAvatar","collection","author","initials","_resolveCollectionIcon","trimStart","_defaultCollectionIcon","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","sort","order","article_count","url_slug","newConversation","checkAgentAvailability","mappedItems","_availabilityInterval","unsub","removeMessengerCustomStyles","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","ratingScale","scale","showFeedbackInput","showSubmitButton","autoSubmitOnSelect","showTitle","showDescription","customQuestions","pages","onSubmit","onDismiss","surveyState","score","customAnswers","pageAnswers","currentPageIndex","isVisible","_renderSurvey","_closeSurvey","_getSurveyConfig","isMultiPage","_isMultiPageSurvey","isLastPage","_isLastPage","_shouldShowFeedbackInput","showActions","_shouldShowActions","_shouldShowTitle","_shouldShowDescription","pageProgress","submitLabel","backButton","_handleDismiss","surveyElement","_attachSurveyEvents","transform","_getCurrentPageConfig","npsScale","_getNPSScale","npsUsesSegmentedScale","values","npsContainerClass","npsButtonClass","npsLowLabel","start","npsHighLabel","npsPrompt","csatPrompt","cesPrompt","configs","nps","_renderScaleLabels","csat","emoji","ces","custom","_renderCustomQuestions","rawScale","isFinite","low","high","_isRatingSurveyType","_shouldAutoSubmitOnSelect","_getCurrentPage","_renderSurveyPage","_getFallbackSurveyConfig","_renderRatingPage","_renderMultipleChoicePage","_renderTextPage","pageId","ratingConfig","rating_config","ratingType","survey_type","currentRating","defaultLowLabel","defaultHighLabel","usesSegmentedScale","buttonClass","multipleChoiceConfig","multiple_choice_config","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","String","_renderQuestionInput","freq","question","opt","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","_setPageAnswer","existing","existingValues","nextValues","v","_maybeAutoSubmit","frequency","_validateCurrentPage","nextPageIndex","_getNextPageIndex","normalizedPageAnswers","_normalizePageAnswersForSubmit","mergedAnswers","page_answers","_getSubmissionRating","_showSuccessNotification","answer","hasSingle","hasMany","fallbackNext","navigation","afterThisPage","after_this_page","nextValue","default","normalizedId","pageIndex","output","sdkUserContext","apiUserContext","localUserContext","actions","anchor","insertBefore","transition","resetState","surveyEl","backdropEl","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","initData","createWidget","widgetOptions","getWidget","surveys","_normalizeSurveyConfig","includeIneligible","_isSurveyEligible","showSurveyById","displayOptions","surveyConfig","s","showSurvey","rating_scale","show_feedback_input","show_submit_button","auto_submit_on_select","show_title","show_description","questions","_getSurveyIneligibilityReason","normalizedOptions","surveyWidget","_getSurveyField","eligibilityShouldShow","eligibility","eligible","isAnswered","eligibilityAnswered","explicitReason","eligibilityReason","firstPage","inferredType","_inferSurveyTypeFromPage","should_show","_normalizeSurveyPages","linkConfig","link_config","fields","showChangelog","changelogWidget","getAllWidgets","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","script","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 respondent = this._getRespondentContext(context);\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...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t\t...(context.includeEligibility !== undefined && {\n\t\t\t\tinclude_eligibility: context.includeEligibility,\n\t\t\t}),\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\t_getRespondentContext(context = {}) {\n\t\tconst userContext =\n\t\t\ttypeof this.api.getUserContext === 'function'\n\t\t\t\t? this.api.getUserContext() || {}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\trespondent_id:\n\t\t\t\tcontext.respondentId || context.userId || userContext.user_id || null,\n\t\t\temail: context.email || userContext.email || null,\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 respondent = this._getRespondentContext(responseData);\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\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\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: false,\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\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"18\" height=\"18\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n </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\">&times;</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 buttonText =\n\t\t\tthis.options.buttonText ||\n\t\t\tthis.options.triggerText ||\n\t\t\tthis.options.label ||\n\t\t\tthis.options.text ||\n\t\t\t'Feedback';\n\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\">${buttonText}</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\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg></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<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"18\" height=\"18\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n</button></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.greetingMessage = options.greetingMessage || 'Hi there 👋';\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\t_getMessageAttachmentsSignature(message) {\n\t\tif (\n\t\t\t!Array.isArray(message?.attachments) ||\n\t\t\tmessage.attachments.length === 0\n\t\t) {\n\t\t\treturn '';\n\t\t}\n\n\t\treturn message.attachments\n\t\t\t.map((att) => `${att?.type || ''}:${att?.name || ''}`)\n\t\t\t.join('|');\n\t}\n\n\t_findOptimisticMatchIndex(conversationId, incomingMessage, matchWindowMs) {\n\t\tconst messages = this.messages[conversationId] || [];\n\t\tconst incomingTimestamp = Date.parse(incomingMessage.timestamp);\n\t\tconst incomingSignature =\n\t\t\tthis._getMessageAttachmentsSignature(incomingMessage);\n\n\t\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\t\tconst candidate = messages[i];\n\t\t\tif (!candidate?.isOptimistic || !candidate?.isOwn) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif ((candidate.content || '') !== (incomingMessage.content || '')) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst candidateSignature =\n\t\t\t\tthis._getMessageAttachmentsSignature(candidate);\n\t\t\tif (candidateSignature !== incomingSignature) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst candidateTimestamp = Date.parse(candidate.timestamp);\n\t\t\tif (\n\t\t\t\tNumber.isNaN(incomingTimestamp) ||\n\t\t\t\tNumber.isNaN(candidateTimestamp) ||\n\t\t\t\tMath.abs(incomingTimestamp - candidateTimestamp) <= matchWindowMs\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t}\n\n\t_updateConversationFromMessage(conversationId, message, countUnread) {\n\t\tconst conv = this.conversations.find((c) => c.id === conversationId);\n\t\tif (!conv) {\n\t\t\treturn;\n\t\t}\n\n\t\tconv.lastMessage = message.content;\n\t\tconv.lastMessageTime = message.timestamp;\n\n\t\tif (countUnread && !message.isOwn) {\n\t\t\tconv.unread = (conv.unread || 0) + 1;\n\t\t\tthis._updateUnreadCount();\n\t\t}\n\t}\n\n\tupsertMessage(conversationId, message, options = {}) {\n\t\tif (!this.messages[conversationId]) {\n\t\t\tthis.messages[conversationId] = [];\n\t\t}\n\n\t\tconst reconcileOwnOptimistic = options.reconcileOwnOptimistic === true;\n\t\tconst optimisticMatchWindowMs = options.optimisticMatchWindowMs || 30000;\n\t\tconst messages = this.messages[conversationId];\n\t\tconst existingIndex =\n\t\t\tmessage?.id != null\n\t\t\t\t? messages.findIndex((msg) => msg?.id === message.id)\n\t\t\t\t: -1;\n\n\t\tif (existingIndex !== -1) {\n\t\t\tmessages[existingIndex] = {\n\t\t\t\t...messages[existingIndex],\n\t\t\t\t...message,\n\t\t\t\tisOptimistic: false,\n\t\t\t};\n\t\t\tthis._updateConversationFromMessage(\n\t\t\t\tconversationId,\n\t\t\t\tmessages[existingIndex],\n\t\t\t\tfalse\n\t\t\t);\n\t\t\tthis._notify('messagesUpdate', {\n\t\t\t\tconversationId,\n\t\t\t\tmessages: [...messages],\n\t\t\t});\n\t\t\treturn messages[existingIndex];\n\t\t}\n\n\t\tif (reconcileOwnOptimistic && message?.isOwn) {\n\t\t\tconst optimisticIndex = this._findOptimisticMatchIndex(\n\t\t\t\tconversationId,\n\t\t\t\tmessage,\n\t\t\t\toptimisticMatchWindowMs\n\t\t\t);\n\t\t\tif (optimisticIndex !== -1) {\n\t\t\t\tmessages[optimisticIndex] = {\n\t\t\t\t\t...messages[optimisticIndex],\n\t\t\t\t\t...message,\n\t\t\t\t\tisOptimistic: false,\n\t\t\t\t};\n\t\t\t\tthis._updateConversationFromMessage(\n\t\t\t\t\tconversationId,\n\t\t\t\t\tmessages[optimisticIndex],\n\t\t\t\t\tfalse\n\t\t\t\t);\n\t\t\t\tthis._notify('messagesUpdate', {\n\t\t\t\t\tconversationId,\n\t\t\t\t\tmessages: [...messages],\n\t\t\t\t});\n\t\t\t\treturn messages[optimisticIndex];\n\t\t\t}\n\t\t}\n\n\t\tconst storedMessage = {\n\t\t\t...message,\n\t\t\tisOptimistic: Boolean(message?.isOptimistic),\n\t\t};\n\t\tmessages.push(storedMessage);\n\t\tthis._updateConversationFromMessage(conversationId, storedMessage, true);\n\t\tthis._notify('messageAdded', { conversationId, message: storedMessage });\n\t\treturn storedMessage;\n\t}\n\n\taddMessage(conversationId, message) {\n\t\treturn this.upsertMessage(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: 'ph:house-simple-duotone' },\n\t\t\t{\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: 'ph:chats-duotone',\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: 'ph:books-duotone' });\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: 'Updates',\n\t\t\t\ticon: 'ph:megaphone-duotone',\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\t<button class=\"messenger-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t\t<span class=\"messenger-nav-icon\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"${tab.icon}\" width=\"22\" height=\"22\"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class=\"messenger-nav-label\">${tab.label}</span>\n\t\t\t\t\t\t${badgeHtml}\n\t\t\t\t\t</button>\n\t\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\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\n\t\t// Configurable header colour — defaults to Product7 blue\n\t\tthis._headerBg = `linear-gradient(180deg, #f0f4ff 0%, #ffffff 100%)`;\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<div class=\"messenger-changelog-header-top\">\n\t\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn messenger-changelog-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</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\t${item.tags.map((tag) => `<span class=\"sdk-badge sdk-badge-primary messenger-changelog-tag\">${tag}</span>`).join('')}\n\t\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_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<iconify-icon icon=\"ph:megaphone-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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.element\n\t\t\t.querySelector('.messenger-changelog-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\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?.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<button class=\"sdk-btn-icon messenger-compose-attach\" aria-label=\"Attach file\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\" width=\"20\" height=\"20\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <path d=\"M160,80,76.69,164.69a16,16,0,0,0,22.63,22.62L198.63,86.63a32,32,0,0,0-45.26-45.26L54.06,142.06a48,48,0,0,0,67.88,67.88L204,128\" fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n </svg>\n</button>\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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\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\">&times;</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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\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\tisOptimistic: 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\" viewBox=\"0 0 256 256\" width=\"18\" height=\"18\">\n <rect width=\"256\" height=\"256\" fill=\"none\"/>\n <line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\n <line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/>\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 messenger-help-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<div class=\"messenger-help-search-wrap\">\n\t\t\t\t\t<span class=\"messenger-help-search-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:magnifying-glass-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\tclass=\"messenger-help-search-input\"\n\t\t\t\t\t\tplaceholder=\"Search for help...\"\n\t\t\t\t\t\tvalue=\"${searchQuery}\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\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 container = this.element.querySelector('.messenger-help-collections');\n\t\tconst collections = this.state.helpArticles || [];\n\t\tconst searchQuery = (this.state.helpSearchQuery || '').toLowerCase();\n\n\t\tconst filtered = 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\tif (filtered.length === 0) {\n\t\t\tcontainer.innerHTML = this._renderEmptyState();\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.innerHTML = filtered.map((c) => this._renderCollectionItem(c)).join('');\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_avatarColors = [\n\t\t{ bg: '#EF4444', text: '#FFFFFF' },\n\t\t{ bg: '#F97316', text: '#FFFFFF' },\n\t\t{ bg: '#F59E0B', text: '#FFFFFF' },\n\t\t{ bg: '#10B981', text: '#FFFFFF' },\n\t\t{ bg: '#06B6D4', text: '#FFFFFF' },\n\t\t{ bg: '#3B82F6', text: '#FFFFFF' },\n\t\t{ bg: '#8B5CF6', text: '#FFFFFF' },\n\t\t{ bg: '#EC4899', text: '#FFFFFF' },\n\t];\n\n\t_getAvatarColor(id) {\n\t\tconst hash = id.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0);\n\t\treturn this._avatarColors[hash % this._avatarColors.length];\n\t}\n\n\t_getInitials(name) {\n\t\tif (!name) return 'A';\n\t\treturn name.split(' ').map((n) => n[0]).join('').toUpperCase().slice(0, 2);\n\t}\n\n\t_renderAuthorAvatar(collection) {\n\t\tif (collection.author?.picture) {\n\t\t\treturn `<img\n\t\t\t\tsrc=\"${collection.author.picture}\"\n\t\t\t\talt=\"${collection.author.name || ''}\"\n\t\t\t\tclass=\"messenger-help-collection-avatar\"\n\t\t\t\ttitle=\"${collection.author.name || ''}\"\n\t\t\t/>`;\n\t\t}\n\n\t\tconst { bg, text } = this._getAvatarColor(collection.id);\n\t\tconst initials = collection.author?.name ? this._getInitials(collection.author.name) : 'A';\n\n\t\treturn `<span\n\t\t\tclass=\"messenger-help-collection-avatar messenger-help-collection-avatar--initials\"\n\t\t\tstyle=\"background-color: ${bg}; color: ${text};\"\n\t\t\ttitle=\"${collection.author?.name || 'Author'}\"\n\t\t>${initials}</span>`;\n\t}\n\n\t_resolveCollectionIcon(icon) {\n\t\tif (!icon) return this._defaultCollectionIcon();\n\n\t\tif (icon.trimStart().startsWith('<')) {\n\t\t\treturn `<span class=\"messenger-help-collection-icon\">${icon}</span>`;\n\t\t}\n\n\t\tif (icon.startsWith('ph:')) {\n\t\t\treturn `<span class=\"messenger-help-collection-icon\">\n\t\t\t\t<iconify-icon icon=\"${icon}\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t</span>`;\n\t\t}\n\n\t\treturn this._defaultCollectionIcon();\n\t}\n\n\t_defaultCollectionIcon() {\n\t\treturn `<span class=\"messenger-help-collection-icon\">\n\t\t\t<iconify-icon icon=\"ph:book-open-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t</span>`;\n\t}\n\n\t_renderCollectionItem(collection) {\n\t\tconst articleCount = collection.articleCount || 0;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t${this._resolveCollectionIcon(collection.icon)}\n\t\t\t\t<div class=\"messenger-help-collection-content\">\n\t\t\t\t\t<div class=\"messenger-help-collection-title\">${collection.title}</div>\n\t\t\t\t\t${collection.description ? `<p class=\"messenger-help-collection-desc\">${collection.description}</p>` : ''}\n\t\t\t\t\t<div class=\"messenger-help-collection-meta\">\n\t\t\t\t\t\t${this._renderAuthorAvatar(collection)}\n\t\t\t\t\t\t<span class=\"messenger-help-collection-count\">\n\t\t\t\t\t\t\t${articleCount} ${articleCount === 1 ? 'article' : 'articles'}\n\t\t\t\t\t\t</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_renderEmptyState() {\n\t\tif (this.state.helpSearchQuery) {\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<iconify-icon icon=\"ph:magnifying-glass-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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<iconify-icon icon=\"ph:books-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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.querySelector('.messenger-help-close-btn').addEventListener('click', () => {\n\t\t\tthis.state.setOpen(false);\n\t\t});\n\n\t\tconst searchInput = this.element.querySelector('.messenger-help-search-input');\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.querySelectorAll('.messenger-help-collection').forEach((item) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t(c) => c.id === item.dataset.collectionId\n\t\t\t\t);\n\t\t\t\tif (collection?.url) {\n\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) this._unsubscribe();\n\t\tif (this.element?.parentNode) this.element.parentNode.removeChild(this.element);\n\t}\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\">${this.state.greetingMessage}</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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\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\tgreetingMessage: options.greetingMessage || 'Hi there 👋',\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\tgreetingMessage: this.messengerOptions.greetingMessage,\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.upsertMessage(conversation_id, localMessage, {\n\t\t\treconcileOwnOptimistic: true,\n\t\t\toptimisticMatchWindowMs: 30000,\n\t\t});\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\tconst sorted = [...collections].sort(\n\t\t\t\t\t(a, b) => (a.order ?? 0) - (b.order ?? 0)\n\t\t\t\t);\n\n\t\t\t\treturn sorted.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\ticon: collection.icon || null,\n\t\t\t\t\tauthor: collection.author || null,\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\tratingScale: options.ratingScale || options.scale || null,\n\t\t\tshowFeedbackInput:\n\t\t\t\ttypeof options.showFeedbackInput === 'boolean'\n\t\t\t\t\t? options.showFeedbackInput\n\t\t\t\t\t: null,\n\t\t\tshowSubmitButton:\n\t\t\t\ttypeof options.showSubmitButton === 'boolean'\n\t\t\t\t\t? options.showSubmitButton\n\t\t\t\t\t: null,\n\t\t\tautoSubmitOnSelect:\n\t\t\t\ttypeof options.autoSubmitOnSelect === 'boolean'\n\t\t\t\t\t? options.autoSubmitOnSelect\n\t\t\t\t\t: null,\n\t\t\tshowTitle:\n\t\t\t\ttypeof options.showTitle === 'boolean' ? options.showTitle : null,\n\t\t\tshowDescription:\n\t\t\t\ttypeof options.showDescription === 'boolean'\n\t\t\t\t\t? options.showDescription\n\t\t\t\t\t: null,\n\t\t\tcustomQuestions: options.customQuestions || [],\n\t\t\tpages: Array.isArray(options.pages) ? options.pages : [],\n\t\t\trespondentId: options.respondentId || null,\n\t\t\temail: options.email || null,\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\tpageAnswers: {},\n\t\t\tcurrentPageIndex: 0,\n\t\t\tisSubmitting: false,\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(false);\n\n\t\tconst config = this._getSurveyConfig();\n\t\tconst isMultiPage = this._isMultiPageSurvey();\n\t\tconst isLastPage = this._isLastPage();\n\t\tconst showFeedbackInput = this._shouldShowFeedbackInput();\n\t\tconst showActions = this._shouldShowActions();\n\t\tconst showTitle = this._shouldShowTitle(config);\n\t\tconst showDescription = this._shouldShowDescription(config);\n\t\tconst pageProgress = isMultiPage\n\t\t\t? `Page ${this.surveyState.currentPageIndex + 1} of ${this.surveyOptions.pages.length}`\n\t\t\t: '';\n\t\tconst submitLabel = isMultiPage && !isLastPage ? 'Next' : 'Submit';\n\t\tconst backButton =\n\t\t\tisMultiPage && this.surveyState.currentPageIndex > 0\n\t\t\t\t? '<button class=\"feedback-survey-back\">Back</button>'\n\t\t\t\t: '';\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\t\t\tshowDescription && !showTitle\n\t\t\t\t? ' feedback-survey-description-primary'\n\t\t\t\t: ''\n\t\t}`;\n\n\t\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\"><svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><rect width=\"256\" height=\"256\" fill=\"none\"/><line x1=\"200\" y1=\"56\" x2=\"56\" y2=\"200\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/><line x1=\"200\" y1=\"200\" x2=\"56\" y2=\"56\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"16\"/></svg></button>\n\t\t\t${showTitle ? `<h3 class=\"feedback-survey-title\">${config.title}</h3>` : ''}\n\t\t\t${showDescription ? `<p class=\"feedback-survey-description\">${config.description}</p>` : ''}\n\t\t\t${isMultiPage ? `<div class=\"feedback-survey-progress\">${pageProgress}</div>` : ''}\n\t\t\t<div class=\"feedback-survey-content\">${config.html}</div>\n\t\t\t${\n\t\t\t\tshowFeedbackInput\n\t\t\t\t\t? `<div class=\"feedback-survey-feedback\">\n\t\t\t\t<textarea class=\"feedback-survey-textarea\" placeholder=\"Any additional feedback? (optional)\">${this.surveyState.feedback || ''}</textarea>\n\t\t\t</div>`\n\t\t\t\t\t: ''\n\t\t\t}\n\t\t\t${\n\t\t\t\tshowActions\n\t\t\t\t\t? `<div class=\"feedback-survey-actions\">\n\t\t\t\t${backButton}\n\t\t\t\t<button class=\"feedback-survey-submit\">${submitLabel}</button>\n\t\t\t</div>`\n\t\t\t\t\t: ''\n\t\t\t}\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\tif (this._isMultiPageSurvey()) {\n\t\t\treturn this._getCurrentPageConfig();\n\t\t}\n\n\t\tconst npsScale = this._getNPSScale();\n\t\tconst npsUsesSegmentedScale = npsScale.values.length <= 7;\n\t\tconst npsContainerClass = npsUsesSegmentedScale\n\t\t\t? 'feedback-survey-ces feedback-survey-rating-scale'\n\t\t\t: 'feedback-survey-nps';\n\t\tconst npsButtonClass = npsUsesSegmentedScale\n\t\t\t? 'feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn'\n\t\t\t: 'feedback-survey-nps-btn';\n\t\tconst npsLowLabel =\n\t\t\tthis.surveyOptions.lowLabel ||\n\t\t\t(npsScale.start === 0 ? 'Not likely' : 'Strongly Disagree');\n\t\tconst npsHighLabel =\n\t\t\tthis.surveyOptions.highLabel ||\n\t\t\t(npsScale.start === 0 ? 'Very likely' : 'Strongly Agree');\n\t\tconst npsPrompt =\n\t\t\tthis.surveyOptions.description ||\n\t\t\tthis.surveyOptions.title ||\n\t\t\t'How likely are you to recommend us?';\n\t\tconst csatPrompt =\n\t\t\tthis.surveyOptions.description ||\n\t\t\tthis.surveyOptions.title ||\n\t\t\t'How satisfied are you?';\n\t\tconst cesPrompt =\n\t\t\tthis.surveyOptions.description ||\n\t\t\tthis.surveyOptions.title ||\n\t\t\t'How easy was it?';\n\n\t\tconst configs = {\n\t\t\tnps: {\n\t\t\t\ttitle: this.surveyOptions.title || '',\n\t\t\t\tdescription: npsPrompt,\n\t\t\t\thtml: `\n\t\t\t\t\t<div class=\"${npsContainerClass}\">\n\t\t\t\t\t\t${npsScale.values\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=\"${npsButtonClass}\" 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${this._renderScaleLabels(npsLowLabel, npsHighLabel)}\n\t\t\t\t`,\n\t\t\t},\n\t\t\tcsat: {\n\t\t\t\ttitle: this.surveyOptions.title || '',\n\t\t\t\tdescription: csatPrompt,\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'\\uD83D\\uDE1E',\n\t\t\t\t\t\t\t'\\uD83D\\uDE15',\n\t\t\t\t\t\t\t'\\uD83D\\uDE10',\n\t\t\t\t\t\t\t'\\uD83D\\uDE42',\n\t\t\t\t\t\t\t'\\uD83D\\uDE04',\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${this._renderScaleLabels(\n\t\t\t\t\t\tthis.surveyOptions.lowLabel || 'Very dissatisfied',\n\t\t\t\t\t\tthis.surveyOptions.highLabel || 'Very satisfied'\n\t\t\t\t\t)}\n\t\t\t\t`,\n\t\t\t},\n\t\t\tces: {\n\t\t\t\ttitle: this.surveyOptions.title || '',\n\t\t\t\tdescription: cesPrompt,\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_getNPSScale() {\n\t\tconst rawScale = Number(this.surveyOptions.ratingScale);\n\t\tconst scale = Number.isFinite(rawScale) && rawScale >= 2 ? rawScale : 5;\n\t\tconst start = scale === 11 ? 0 : 1;\n\t\treturn {\n\t\t\tscale,\n\t\t\tstart,\n\t\t\tvalues: Array.from({ length: scale }, (_, index) => start + index),\n\t\t};\n\t}\n\n\t_renderScaleLabels(lowLabel, highLabel) {\n\t\tconst low = lowLabel || '';\n\t\tconst high = highLabel || '';\n\t\tif (!low && !high) {\n\t\t\treturn '';\n\t\t}\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-labels\">\n\t\t\t\t<span>${low}</span>\n\t\t\t\t<span>${high}</span>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_isRatingSurveyType(type = this.surveyOptions.surveyType) {\n\t\treturn type === 'nps' || type === 'csat' || type === 'ces';\n\t}\n\n\t_shouldShowTitle(config) {\n\t\tif (!config || !config.title) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof this.surveyOptions.showTitle === 'boolean') {\n\t\t\treturn this.surveyOptions.showTitle;\n\t\t}\n\t\tif (!this._isMultiPageSurvey() && this._isRatingSurveyType()) {\n\t\t\treturn !config.description;\n\t\t}\n\t\treturn true;\n\t}\n\n\t_shouldShowDescription(config) {\n\t\tif (typeof this.surveyOptions.showDescription === 'boolean') {\n\t\t\treturn this.surveyOptions.showDescription;\n\t\t}\n\t\tif (!this._isMultiPageSurvey() && this._isRatingSurveyType()) {\n\t\t\treturn Boolean(config && (config.description || config.title));\n\t\t}\n\t\treturn Boolean(config && config.description);\n\t}\n\n\t_shouldShowFeedbackInput() {\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (typeof this.surveyOptions.showFeedbackInput === 'boolean') {\n\t\t\treturn this.surveyOptions.showFeedbackInput;\n\t\t}\n\t\treturn false;\n\t}\n\n\t_shouldAutoSubmitOnSelect() {\n\t\tif (typeof this.surveyOptions.autoSubmitOnSelect === 'boolean') {\n\t\t\treturn this.surveyOptions.autoSubmitOnSelect;\n\t\t}\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\treturn false;\n\t\t}\n\t\tif (this.surveyOptions.showSubmitButton === true) {\n\t\t\treturn false;\n\t\t}\n\t\treturn this._isRatingSurveyType() && !this._shouldShowFeedbackInput();\n\t}\n\n\t_shouldShowActions() {\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\treturn true;\n\t\t}\n\t\tif (typeof this.surveyOptions.showSubmitButton === 'boolean') {\n\t\t\treturn this.surveyOptions.showSubmitButton;\n\t\t}\n\t\treturn !this._shouldAutoSubmitOnSelect();\n\t}\n\n\t_isMultiPageSurvey() {\n\t\treturn (\n\t\t\tArray.isArray(this.surveyOptions.pages) &&\n\t\t\tthis.surveyOptions.pages.length > 0\n\t\t);\n\t}\n\n\t_getCurrentPage() {\n\t\tif (!this._isMultiPageSurvey()) return null;\n\t\treturn this.surveyOptions.pages[this.surveyState.currentPageIndex] || null;\n\t}\n\n\t_isLastPage() {\n\t\tif (!this._isMultiPageSurvey()) return true;\n\t\treturn (\n\t\t\tthis.surveyState.currentPageIndex >= this.surveyOptions.pages.length - 1\n\t\t);\n\t}\n\n\t_getCurrentPageConfig() {\n\t\tconst page = this._getCurrentPage();\n\t\tif (!page) {\n\t\t\treturn this._getFallbackSurveyConfig();\n\t\t}\n\n\t\treturn {\n\t\t\ttitle: page.title || this.surveyOptions.title || 'Quick Feedback',\n\t\t\tdescription: page.description || this.surveyOptions.description || '',\n\t\t\thtml: this._renderSurveyPage(page),\n\t\t};\n\t}\n\n\t_getFallbackSurveyConfig() {\n\t\treturn {\n\t\t\ttitle: this.surveyOptions.title || 'Quick Feedback',\n\t\t\tdescription: this.surveyOptions.description || '',\n\t\t\thtml: this._renderCustomQuestions(),\n\t\t};\n\t}\n\n\t_renderSurveyPage(page) {\n\t\tswitch (page.type) {\n\t\t\tcase 'rating':\n\t\t\t\treturn this._renderRatingPage(page);\n\t\t\tcase 'multiple_choice':\n\t\t\t\treturn this._renderMultipleChoicePage(page);\n\t\t\tcase 'text':\n\t\t\t\treturn this._renderTextPage(page);\n\t\t\tdefault:\n\t\t\t\treturn this._renderTextPage(page);\n\t\t}\n\t}\n\n\t_renderRatingPage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst config = page.ratingConfig || page.rating_config || {};\n\t\tconst scale = Number(config.scale) || 5;\n\t\tconst ratingType =\n\t\t\tconfig.survey_type || this.surveyOptions.surveyType || 'csat';\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst currentRating = pageAnswer.rating;\n\t\tconst defaultLowLabel =\n\t\t\tratingType === 'nps'\n\t\t\t\t? scale === 11\n\t\t\t\t\t? 'Not likely'\n\t\t\t\t\t: 'Strongly Disagree'\n\t\t\t\t: '';\n\t\tconst defaultHighLabel =\n\t\t\tratingType === 'nps'\n\t\t\t\t? scale === 11\n\t\t\t\t\t? 'Very likely'\n\t\t\t\t\t: 'Strongly Agree'\n\t\t\t\t: '';\n\t\tconst lowLabel =\n\t\t\tconfig.low_label || this.surveyOptions.lowLabel || defaultLowLabel;\n\t\tconst highLabel =\n\t\t\tconfig.high_label || this.surveyOptions.highLabel || defaultHighLabel;\n\t\tconst labels = this._renderScaleLabels(lowLabel, highLabel);\n\n\t\tif (ratingType === 'nps') {\n\t\t\tconst npsScale = Number.isFinite(scale) && scale >= 2 ? scale : 5;\n\t\t\tconst start = npsScale === 11 ? 0 : 1;\n\t\t\tconst values = Array.from(\n\t\t\t\t{ length: npsScale },\n\t\t\t\t(_, index) => start + index\n\t\t\t);\n\t\t\tconst usesSegmentedScale = values.length <= 7;\n\t\t\tconst containerClass = usesSegmentedScale\n\t\t\t\t? 'feedback-survey-ces feedback-survey-rating-scale'\n\t\t\t\t: 'feedback-survey-nps';\n\t\t\tconst buttonClass = usesSegmentedScale\n\t\t\t\t? 'feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn'\n\t\t\t\t: 'feedback-survey-page-rating-btn feedback-survey-nps-btn';\n\t\t\treturn `\n\t\t\t\t<div class=\"${containerClass}\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${values\n\t\t\t\t\t\t.map((n) => {\n\t\t\t\t\t\t\tconst selected = currentRating === n ? ' selected' : '';\n\t\t\t\t\t\t\treturn `<button class=\"${buttonClass}${selected}\" data-page-id=\"${pageId}\" data-score=\"${n}\">${n}</button>`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</div>\n\t\t\t\t${labels}\n\t\t\t`;\n\t\t}\n\n\t\tif (ratingType === 'emoji' && scale === 5) {\n\t\t\tconst emojis = [\n\t\t\t\t'\\uD83D\\uDE1E',\n\t\t\t\t'\\uD83D\\uDE15',\n\t\t\t\t'\\uD83D\\uDE10',\n\t\t\t\t'\\uD83D\\uDE42',\n\t\t\t\t'\\uD83D\\uDE04',\n\t\t\t];\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-csat\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${emojis\n\t\t\t\t\t\t.map((emoji, i) => {\n\t\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\t\tconst selected = currentRating === score ? ' selected' : '';\n\t\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-rating-btn feedback-survey-csat-btn${selected}\" data-page-id=\"${pageId}\" data-score=\"${score}\">${emoji}</button>`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</div>\n\t\t\t\t${labels}\n\t\t\t`;\n\t\t}\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-rating-scale\" data-page-id=\"${pageId}\">\n\t\t\t\t${[...Array(scale).keys()]\n\t\t\t\t\t.map((i) => {\n\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\tconst selected = currentRating === score ? ' selected' : '';\n\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-rating-btn feedback-survey-rating-scale-btn${selected}\" data-page-id=\"${pageId}\" data-score=\"${score}\">${score}</button>`;\n\t\t\t\t\t})\n\t\t\t\t\t.join('')}\n\t\t\t</div>\n\t\t\t${labels}\n\t\t`;\n\t}\n\n\t_renderMultipleChoicePage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst config =\n\t\t\tpage.multipleChoiceConfig || page.multiple_choice_config || {};\n\t\tconst options = Array.isArray(config.options) ? config.options : [];\n\t\tconst allowMultiple =\n\t\t\tconfig.allow_multiple === true || config.multiple === true;\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst selectedValues = Array.isArray(pageAnswer.values)\n\t\t\t? pageAnswer.values\n\t\t\t: pageAnswer.value\n\t\t\t\t? [pageAnswer.value]\n\t\t\t\t: [];\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-multiple-choice\" data-page-id=\"${pageId}\" data-multiple=\"${allowMultiple}\">\n\t\t\t\t${options\n\t\t\t\t\t.map((option, index) => {\n\t\t\t\t\t\tconst value =\n\t\t\t\t\t\t\toption.value || option.id || option.key || `option_${index}`;\n\t\t\t\t\t\tconst label = option.label || option.text || String(value);\n\t\t\t\t\t\tconst selected = selectedValues.includes(value) ? ' selected' : '';\n\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-choice-btn${selected}\" data-page-id=\"${pageId}\" data-value=\"${value}\">${label}</button>`;\n\t\t\t\t\t})\n\t\t\t\t\t.join('')}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderTextPage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst value = pageAnswer.text || '';\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-text-page\" data-page-id=\"${pageId}\">\n\t\t\t\t<textarea class=\"feedback-survey-page-textarea\" data-page-id=\"${pageId}\" placeholder=\"Type your answer...\">${value}</textarea>\n\t\t\t</div>\n\t\t`;\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\tif (submitBtn) {\n\t\t\tsubmitBtn.addEventListener('click', () => this._handleSubmit());\n\t\t}\n\n\t\tconst backBtn = this.surveyElement.querySelector('.feedback-survey-back');\n\t\tif (backBtn) {\n\t\t\tbackBtn.addEventListener('click', () => this._handleBack());\n\t\t}\n\n\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-textarea'\n\t\t);\n\t\tif (textarea) {\n\t\t\ttextarea.addEventListener('input', (e) => {\n\t\t\t\tthis.surveyState.feedback = e.target.value;\n\t\t\t});\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\tif (this._isMultiPageSurvey()) {\n\t\t\tthis._attachCurrentPageEvents();\n\t\t\treturn;\n\t\t}\n\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_attachCurrentPageEvents() {\n\t\tconst page = this._getCurrentPage();\n\t\tif (!page || !this.surveyElement) return;\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\n\t\tif (page.type === 'rating') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-page-rating-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst score = parseInt(btn.dataset.score);\n\t\t\t\t\t\tif (Number.isNaN(score)) return;\n\t\t\t\t\t\tthis._setPageAnswer(pageId, { rating: score });\n\n\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-page-rating-btn')\n\t\t\t\t\t\t\t.forEach((item) => item.classList.remove('selected'));\n\t\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tif (page.type === 'multiple_choice') {\n\t\t\tconst container = this.surveyElement.querySelector(\n\t\t\t\t'.feedback-survey-multiple-choice'\n\t\t\t);\n\t\t\tconst allowMultiple = container\n\t\t\t\t? container.dataset.multiple === 'true'\n\t\t\t\t: false;\n\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-page-choice-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst value = btn.dataset.value;\n\t\t\t\t\t\tif (!value) return;\n\n\t\t\t\t\t\tconst existing = this.surveyState.pageAnswers[pageId] || {};\n\t\t\t\t\t\tconst existingValues = Array.isArray(existing.values)\n\t\t\t\t\t\t\t? existing.values\n\t\t\t\t\t\t\t: existing.value\n\t\t\t\t\t\t\t\t? [existing.value]\n\t\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\tlet nextValues = [];\n\t\t\t\t\t\tif (allowMultiple) {\n\t\t\t\t\t\t\tconst hasValue = existingValues.includes(value);\n\t\t\t\t\t\t\tnextValues = hasValue\n\t\t\t\t\t\t\t\t? existingValues.filter((v) => v !== value)\n\t\t\t\t\t\t\t\t: [...existingValues, value];\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnextValues = [value];\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._setPageAnswer(pageId, {\n\t\t\t\t\t\t\tvalue: nextValues[0] || null,\n\t\t\t\t\t\t\tvalues: nextValues,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!allowMultiple) {\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-page-choice-btn')\n\t\t\t\t\t\t\t\t.forEach((item) => item.classList.remove('selected'));\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbtn.classList.toggle('selected', nextValues.includes(value));\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\n\t\tif (page.type === 'text') {\n\t\t\tconst textarea = this.surveyElement.querySelector(\n\t\t\t\t'.feedback-survey-page-textarea'\n\t\t\t);\n\t\t\tif (textarea) {\n\t\t\t\ttextarea.addEventListener('input', (e) => {\n\t\t\t\t\tthis._setPageAnswer(pageId, { text: e.target.value });\n\t\t\t\t});\n\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\tthis._maybeAutoSubmit();\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\tthis._maybeAutoSubmit();\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\tthis._maybeAutoSubmit();\n\t}\n\n\t_maybeAutoSubmit() {\n\t\tif (!this._shouldAutoSubmitOnSelect()) {\n\t\t\treturn;\n\t\t}\n\t\tthis._handleSubmit();\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\t\tif (this.surveyState.isSubmitting) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._isMultiPageSurvey()) {\n\t\t\tif (!this._validateCurrentPage()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst nextPageIndex = this._getNextPageIndex();\n\t\t\tif (\n\t\t\t\tnextPageIndex !== -1 &&\n\t\t\t\tnextPageIndex !== this.surveyState.currentPageIndex\n\t\t\t) {\n\t\t\t\tthis.surveyState.currentPageIndex = nextPageIndex;\n\t\t\t\tthis._renderSurvey();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\tif (\n\t\t\t!this._isMultiPageSurvey() &&\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\tthis.surveyState.isSubmitting = true;\n\n\t\tconst respondent = this._getRespondentContext();\n\t\tconst normalizedPageAnswers = this._normalizePageAnswersForSubmit();\n\t\tconst mergedAnswers = {\n\t\t\t...this.surveyState.customAnswers,\n\t\t\t...(Object.keys(normalizedPageAnswers).length > 0 && {\n\t\t\t\tpage_answers: normalizedPageAnswers,\n\t\t\t}),\n\t\t};\n\n\t\tconst responseData = {\n\t\t\trating: this._getSubmissionRating(),\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tanswers: mergedAnswers,\n\t\t\t...(respondent.respondentId && { respondentId: respondent.respondentId }),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t};\n\n\t\tconst response = {\n\t\t\ttype: type,\n\t\t\tscore: this._getSubmissionRating(),\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\tcustomAnswers: mergedAnswers,\n\t\t\tpageAnswers: normalizedPageAnswers,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\ttry {\n\t\t\tif (this.surveyOptions.onSubmit) {\n\t\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t\t}\n\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} finally {\n\t\t\tthis.surveyState.isSubmitting = false;\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\t_handleBack() {\n\t\tif (!this._isMultiPageSurvey()) return;\n\t\tif (this.surveyState.currentPageIndex <= 0) return;\n\t\tthis.surveyState.currentPageIndex -= 1;\n\t\tthis._renderSurvey();\n\t}\n\n\t_setPageAnswer(pageId, data) {\n\t\tif (!pageId) return;\n\t\tthis.surveyState.pageAnswers[pageId] = {\n\t\t\t...(this.surveyState.pageAnswers[pageId] || {}),\n\t\t\t...data,\n\t\t};\n\t}\n\n\t_validateCurrentPage() {\n\t\tconst page = this._getCurrentPage();\n\t\tif (!page || page.required === false) return true;\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\n\t\tconst answer = this.surveyState.pageAnswers[pageId] || {};\n\n\t\tif (page.type === 'rating') {\n\t\t\tif (typeof answer.rating !== 'number') {\n\t\t\t\tthis._showError('Please select a rating');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (page.type === 'multiple_choice') {\n\t\t\tconst hasSingle = Boolean(answer.value);\n\t\t\tconst hasMany = Array.isArray(answer.values) && answer.values.length > 0;\n\t\t\tif (!hasSingle && !hasMany) {\n\t\t\t\tthis._showError('Please select an option');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (page.type === 'text') {\n\t\t\tif (!answer.text || !String(answer.text).trim()) {\n\t\t\t\tthis._showError('Please enter an answer');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_getNextPageIndex() {\n\t\tif (!this._isMultiPageSurvey()) {\n\t\t\treturn -1;\n\t\t}\n\n\t\tconst page = this._getCurrentPage();\n\t\tconst total = this.surveyOptions.pages.length;\n\t\tconst currentIndex = this.surveyState.currentPageIndex;\n\t\tconst fallbackNext = currentIndex + 1 < total ? currentIndex + 1 : -1;\n\t\tconst navigation = page ? page.afterThisPage || page.after_this_page : null;\n\t\tif (!navigation) {\n\t\t\treturn fallbackNext;\n\t\t}\n\n\t\tconst nextValue = navigation.default;\n\t\tif (!nextValue) {\n\t\t\treturn fallbackNext;\n\t\t}\n\n\t\tif (nextValue === 'end_survey') {\n\t\t\treturn -1;\n\t\t}\n\t\tif (nextValue === 'next_page' || nextValue === 'next') {\n\t\t\treturn fallbackNext;\n\t\t}\n\n\t\tif (typeof nextValue === 'number') {\n\t\t\treturn nextValue >= 0 && nextValue < total ? nextValue : fallbackNext;\n\t\t}\n\n\t\tif (typeof nextValue === 'string') {\n\t\t\tconst normalizedId = nextValue.replace(/^page:/, '');\n\t\t\tconst pageIndex = this.surveyOptions.pages.findIndex(\n\t\t\t\t(item) => item.id === normalizedId\n\t\t\t);\n\t\t\treturn pageIndex >= 0 ? pageIndex : fallbackNext;\n\t\t}\n\n\t\treturn fallbackNext;\n\t}\n\n\t_getSubmissionRating() {\n\t\tif (typeof this.surveyState.score === 'number') {\n\t\t\treturn this.surveyState.score;\n\t\t}\n\n\t\tif (!this._isMultiPageSurvey()) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (const page of this.surveyOptions.pages) {\n\t\t\tconst pageId =\n\t\t\t\tpage.id || `page_${this.surveyOptions.pages.indexOf(page)}`;\n\t\t\tconst answer = this.surveyState.pageAnswers[pageId];\n\t\t\tif (answer && typeof answer.rating === 'number') {\n\t\t\t\treturn answer.rating;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t_normalizePageAnswersForSubmit() {\n\t\tconst output = {};\n\t\tfor (const [pageId, answer] of Object.entries(\n\t\t\tthis.surveyState.pageAnswers\n\t\t)) {\n\t\t\tif (answer == null) continue;\n\t\t\tif (Array.isArray(answer.values) && answer.values.length > 0) {\n\t\t\t\toutput[pageId] = answer.values;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (answer.value != null && answer.value !== '') {\n\t\t\t\toutput[pageId] = answer.value;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof answer.rating === 'number') {\n\t\t\t\toutput[pageId] = answer.rating;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (typeof answer.text === 'string' && answer.text.trim()) {\n\t\t\t\toutput[pageId] = answer.text.trim();\n\t\t\t}\n\t\t}\n\t\treturn output;\n\t}\n\n\t_getRespondentContext() {\n\t\tconst sdkUserContext =\n\t\t\ttypeof this.sdk.getUserContext === 'function'\n\t\t\t\t? this.sdk.getUserContext() || {}\n\t\t\t\t: {};\n\t\tconst apiUserContext =\n\t\t\tthis.apiService && typeof this.apiService.getUserContext === 'function'\n\t\t\t\t? this.apiService.getUserContext() || {}\n\t\t\t\t: {};\n\t\tconst localUserContext = this.options.userContext || {};\n\n\t\treturn {\n\t\t\trespondentId:\n\t\t\t\tthis.surveyOptions.respondentId ||\n\t\t\t\tlocalUserContext.user_id ||\n\t\t\t\tsdkUserContext.user_id ||\n\t\t\t\tapiUserContext.user_id ||\n\t\t\t\tnull,\n\t\t\temail:\n\t\t\t\tthis.surveyOptions.email ||\n\t\t\t\tlocalUserContext.email ||\n\t\t\t\tsdkUserContext.email ||\n\t\t\t\tapiUserContext.email ||\n\t\t\t\tnull,\n\t\t};\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\tconst actions = this.surveyElement.querySelector(\n\t\t\t'.feedback-survey-actions'\n\t\t);\n\t\tconst anchor = submitBtn || actions;\n\t\tif (anchor && anchor.parentNode) {\n\t\t\tanchor.parentNode.insertBefore(error, anchor);\n\t\t} else {\n\t\t\tthis.surveyElement.appendChild(error);\n\t\t}\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(resetState = true) {\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\tif (resetState) {\n\t\t\tthis.surveyState = {\n\t\t\t\tscore: null,\n\t\t\t\tfeedback: '',\n\t\t\t\tcustomAnswers: {},\n\t\t\t\tpageAnswers: {},\n\t\t\t\tcurrentPageIndex: 0,\n\t\t\t\tisSubmitting: false,\n\t\t\t\tisVisible: false,\n\t\t\t};\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 widgetConfig = this._getWidgetTypeConfig(type);\n\t\tconst explicitOptions = this._omitUndefined(options);\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...widgetConfig,\n\t\t\t...explicitOptions,\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\tconst surveys = (result.data || []).map((survey) =>\n\t\t\t\tthis._normalizeSurveyConfig(survey)\n\t\t\t);\n\t\t\tif (context.includeIneligible) {\n\t\t\t\treturn surveys;\n\t\t\t}\n\t\t\treturn surveys.filter((survey) => this._isSurveyEligible(survey));\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 { context = {}, ...displayOptions } = options;\n\t\tconst surveys = await this.getActiveSurveys({\n\t\t\t...context,\n\t\t\tincludeEligibility: true,\n\t\t\tincludeIneligible: true,\n\t\t});\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\tif (!this._isSurveyEligible(surveyConfig)) {\n\t\t\tthis.eventBus.emit('survey:suppressed', {\n\t\t\t\tsurveyId,\n\t\t\t\treason: this._getSurveyIneligibilityReason(surveyConfig),\n\t\t\t\tsurvey: surveyConfig,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\n\t\treturn this.showSurvey({\n\t\t\tsurveyId: surveyConfig.id,\n\t\t\tsurveyType: surveyConfig.surveyType || surveyConfig.type,\n\t\t\ttitle: surveyConfig.title,\n\t\t\tdescription: surveyConfig.description,\n\t\t\tlowLabel: surveyConfig.lowLabel || surveyConfig.low_label,\n\t\t\thighLabel: surveyConfig.highLabel || surveyConfig.high_label,\n\t\t\tratingScale: surveyConfig.ratingScale ?? surveyConfig.rating_scale,\n\t\t\tshowFeedbackInput:\n\t\t\t\tsurveyConfig.showFeedbackInput ?? surveyConfig.show_feedback_input,\n\t\t\tshowSubmitButton:\n\t\t\t\tsurveyConfig.showSubmitButton ?? surveyConfig.show_submit_button,\n\t\t\tautoSubmitOnSelect:\n\t\t\t\tsurveyConfig.autoSubmitOnSelect ?? surveyConfig.auto_submit_on_select,\n\t\t\tshowTitle: surveyConfig.showTitle ?? surveyConfig.show_title,\n\t\t\tshowDescription:\n\t\t\t\tsurveyConfig.showDescription ?? surveyConfig.show_description,\n\t\t\tcustomQuestions: surveyConfig.customQuestions || surveyConfig.questions,\n\t\t\tpages: surveyConfig.pages,\n\t\t\t...displayOptions,\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\tif (!this._isSurveyEligible(options)) {\n\t\t\tthis.eventBus.emit('survey:suppressed', {\n\t\t\t\tsurveyId: options.surveyId || options.id || null,\n\t\t\t\treason: this._getSurveyIneligibilityReason(options),\n\t\t\t\tsurvey: options,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\n\t\tconst normalizedOptions = this._normalizeSurveyConfig(options);\n\t\tconst surveyConfigDefaults = this._getWidgetTypeConfig('survey');\n\n\t\tconst surveyWidget = this.createWidget('survey', {\n\t\t\tsurveyId: normalizedOptions.surveyId,\n\t\t\tsurveyType:\n\t\t\t\tnormalizedOptions.surveyType || normalizedOptions.type || 'nps',\n\t\t\tposition:\n\t\t\t\tnormalizedOptions.position ??\n\t\t\t\tsurveyConfigDefaults.position ??\n\t\t\t\tthis.config.position ??\n\t\t\t\t'bottom-right',\n\t\t\ttheme:\n\t\t\t\tnormalizedOptions.theme ??\n\t\t\t\tsurveyConfigDefaults.theme ??\n\t\t\t\tthis.config.theme ??\n\t\t\t\t'light',\n\t\t\ttitle: normalizedOptions.title,\n\t\t\tdescription: normalizedOptions.description,\n\t\t\tlowLabel: normalizedOptions.lowLabel,\n\t\t\thighLabel: normalizedOptions.highLabel,\n\t\t\tratingScale: normalizedOptions.ratingScale ?? normalizedOptions.scale,\n\t\t\tshowFeedbackInput: normalizedOptions.showFeedbackInput,\n\t\t\tshowSubmitButton: normalizedOptions.showSubmitButton,\n\t\t\tautoSubmitOnSelect: normalizedOptions.autoSubmitOnSelect,\n\t\t\tshowTitle: normalizedOptions.showTitle,\n\t\t\tshowDescription: normalizedOptions.showDescription,\n\t\t\tcustomQuestions: normalizedOptions.customQuestions,\n\t\t\tpages: normalizedOptions.pages,\n\t\t\trespondentId: normalizedOptions.respondentId,\n\t\t\temail: normalizedOptions.email,\n\t\t\tonSubmit: normalizedOptions.onSubmit,\n\t\t\tonDismiss: normalizedOptions.onDismiss,\n\t\t});\n\n\t\tsurveyWidget.mount();\n\t\tsurveyWidget.show();\n\n\t\treturn surveyWidget;\n\t}\n\n\t_isSurveyEligible(survey = {}) {\n\t\tconst shouldShow = this._getSurveyField(survey, [\n\t\t\t'shouldShow',\n\t\t\t'should_show',\n\t\t]);\n\t\tif (typeof shouldShow === 'boolean') {\n\t\t\treturn shouldShow;\n\t\t}\n\n\t\tconst eligibilityShouldShow = this._getSurveyField(\n\t\t\tsurvey.eligibility || {},\n\t\t\t['shouldShow', 'should_show']\n\t\t);\n\t\tif (typeof eligibilityShouldShow === 'boolean') {\n\t\t\treturn eligibilityShouldShow;\n\t\t}\n\n\t\tconst eligible = this._getSurveyField(survey, [\n\t\t\t'eligible',\n\t\t\t'isEligible',\n\t\t\t'is_eligible',\n\t\t]);\n\t\tif (typeof eligible === 'boolean') {\n\t\t\treturn eligible;\n\t\t}\n\n\t\tconst isAnswered = this._getSurveyField(survey, [\n\t\t\t'isAnswered',\n\t\t\t'is_answered',\n\t\t]);\n\t\tif (typeof isAnswered === 'boolean') {\n\t\t\treturn !isAnswered;\n\t\t}\n\n\t\tconst eligibilityAnswered = this._getSurveyField(survey.eligibility || {}, [\n\t\t\t'isAnswered',\n\t\t\t'is_answered',\n\t\t]);\n\t\tif (typeof eligibilityAnswered === 'boolean') {\n\t\t\treturn !eligibilityAnswered;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_getSurveyIneligibilityReason(survey = {}) {\n\t\tconst explicitReason = this._getSurveyField(survey, [\n\t\t\t'reason',\n\t\t\t'suppressionReason',\n\t\t\t'suppression_reason',\n\t\t]);\n\t\tif (explicitReason) {\n\t\t\treturn explicitReason;\n\t\t}\n\n\t\tconst eligibilityReason = this._getSurveyField(survey.eligibility || {}, [\n\t\t\t'reason',\n\t\t\t'suppressionReason',\n\t\t\t'suppression_reason',\n\t\t]);\n\t\tif (eligibilityReason) {\n\t\t\treturn eligibilityReason;\n\t\t}\n\n\t\tconst isAnswered = this._getSurveyField(survey, [\n\t\t\t'isAnswered',\n\t\t\t'is_answered',\n\t\t]);\n\t\tif (isAnswered === true) {\n\t\t\treturn 'already_answered';\n\t\t}\n\n\t\treturn 'ineligible';\n\t}\n\n\t_normalizeSurveyConfig(survey = {}) {\n\t\tconst firstPage =\n\t\t\tArray.isArray(survey.pages) && survey.pages.length > 0\n\t\t\t\t? survey.pages[0]\n\t\t\t\t: null;\n\t\tconst ratingConfig = firstPage\n\t\t\t? firstPage.rating_config || firstPage.ratingConfig || {}\n\t\t\t: {};\n\n\t\tconst inferredType =\n\t\t\tsurvey.type || this._inferSurveyTypeFromPage(firstPage) || 'nps';\n\n\t\treturn {\n\t\t\t...survey,\n\t\t\tsurveyId: survey.surveyId || survey.id || null,\n\t\t\tsurveyType: survey.surveyType || inferredType,\n\t\t\ttype: survey.type || inferredType,\n\t\t\tshould_show:\n\t\t\t\tsurvey.should_show ??\n\t\t\t\t(survey.eligibility ? survey.eligibility.should_show : undefined),\n\t\t\treason:\n\t\t\t\tsurvey.reason ||\n\t\t\t\t(survey.eligibility ? survey.eligibility.reason : undefined),\n\t\t\ttitle:\n\t\t\t\tsurvey.title || survey.name || (firstPage ? firstPage.title : null),\n\t\t\tdescription:\n\t\t\t\tsurvey.description || (firstPage ? firstPage.description : null),\n\t\t\tlowLabel:\n\t\t\t\tsurvey.lowLabel || survey.low_label || ratingConfig.low_label || null,\n\t\t\thighLabel:\n\t\t\t\tsurvey.highLabel ||\n\t\t\t\tsurvey.high_label ||\n\t\t\t\tratingConfig.high_label ||\n\t\t\t\tnull,\n\t\t\tratingScale:\n\t\t\t\tsurvey.ratingScale ?? survey.rating_scale ?? ratingConfig.scale ?? null,\n\t\t\tshowFeedbackInput:\n\t\t\t\tsurvey.showFeedbackInput ?? survey.show_feedback_input ?? null,\n\t\t\tshowSubmitButton:\n\t\t\t\tsurvey.showSubmitButton ?? survey.show_submit_button ?? null,\n\t\t\tautoSubmitOnSelect:\n\t\t\t\tsurvey.autoSubmitOnSelect ?? survey.auto_submit_on_select ?? null,\n\t\t\tshowTitle: survey.showTitle ?? survey.show_title ?? null,\n\t\t\tshowDescription:\n\t\t\t\tsurvey.showDescription ?? survey.show_description ?? null,\n\t\t\tcustomQuestions: survey.customQuestions || survey.questions || [],\n\t\t\tpages: this._normalizeSurveyPages(survey.pages || []),\n\t\t};\n\t}\n\n\t_normalizeSurveyPages(pages = []) {\n\t\tif (!Array.isArray(pages)) {\n\t\t\treturn [];\n\t\t}\n\n\t\treturn pages\n\t\t\t.map((page, index) => ({\n\t\t\t\tid: page.id || `page_${index}`,\n\t\t\t\ttype: page.type || 'rating',\n\t\t\t\ttitle: page.title || '',\n\t\t\t\tdescription: page.description || '',\n\t\t\t\trequired: page.required !== false,\n\t\t\t\tposition: page.position ?? index,\n\t\t\t\tratingConfig: page.ratingConfig || page.rating_config || null,\n\t\t\t\tmultipleChoiceConfig:\n\t\t\t\t\tpage.multipleChoiceConfig || page.multiple_choice_config || null,\n\t\t\t\tlinkConfig: page.linkConfig || page.link_config || null,\n\t\t\t\tafterThisPage: page.afterThisPage || page.after_this_page || null,\n\t\t\t}))\n\t\t\t.sort((a, b) => a.position - b.position);\n\t}\n\n\t_inferSurveyTypeFromPage(page) {\n\t\tif (!page) return null;\n\t\tconst ratingConfig = page.rating_config || page.ratingConfig || {};\n\t\tconst scale = ratingConfig.scale;\n\t\tconst surveyType = ratingConfig.survey_type;\n\t\tconst title = (page.title || '').toLowerCase();\n\n\t\tif (scale === 11 || surveyType === 'nps') {\n\t\t\treturn 'nps';\n\t\t}\n\n\t\tif (\n\t\t\tsurveyType === 'emoji' ||\n\t\t\ttitle.includes('effort') ||\n\t\t\ttitle.includes('easy')\n\t\t) {\n\t\t\treturn 'ces';\n\t\t}\n\n\t\treturn 'csat';\n\t}\n\n\t_getSurveyField(survey, fields) {\n\t\tfor (const field of fields) {\n\t\t\tif (survey[field] !== undefined && survey[field] !== null) {\n\t\t\t\treturn survey[field];\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n\n\t_getWidgetTypeConfig(type) {\n\t\tconst widgetsConfig = this._isPlainObject(this.config?.widgets)\n\t\t\t? this.config.widgets\n\t\t\t: {};\n\n\t\tconst legacyTypeConfig = this._isPlainObject(this.config?.[type])\n\t\t\t? this.config[type]\n\t\t\t: {};\n\n\t\tconst namespacedTypeConfig = this._isPlainObject(widgetsConfig?.[type])\n\t\t\t? widgetsConfig[type]\n\t\t\t: {};\n\n\t\tconst mergedTypeConfig = deepMerge(legacyTypeConfig, namespacedTypeConfig);\n\t\treturn this._toCamelCaseObject(mergedTypeConfig);\n\t}\n\n\t_isPlainObject(value) {\n\t\treturn Object.prototype.toString.call(value) === '[object Object]';\n\t}\n\n\t_toCamelCaseKey(key) {\n\t\treturn key.replace(/_([a-z])/g, (_, char) => char.toUpperCase());\n\t}\n\n\t_toCamelCaseObject(value) {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.map((item) => this._toCamelCaseObject(item));\n\t\t}\n\n\t\tif (!this._isPlainObject(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst normalized = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tnormalized[this._toCamelCaseKey(key)] =\n\t\t\t\tthis._toCamelCaseObject(nestedValue);\n\t\t}\n\t\treturn normalized;\n\t}\n\n\t_omitUndefined(value) {\n\t\tif (!this._isPlainObject(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value).filter(([, nestedValue]) => nestedValue !== undefined)\n\t\t);\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 defaults = {\n\t\t\tposition: this.config.position || 'bottom-right',\n\t\t\ttheme: this.config.theme || 'light',\n\t\t\ttitle: \"What's New\",\n\t\t\ttriggerText: \"What's New\",\n\t\t\tshowBadge: true,\n\t\t\tviewButtonText: 'View Update',\n\t\t};\n\n\t\tconst configDefaults = this._getWidgetTypeConfig('changelog');\n\t\tconst explicitOptions = this._omitUndefined(options);\n\n\t\tconst changelogWidget = this.createWidget('changelog', {\n\t\t\t...defaults,\n\t\t\t...configDefaults,\n\t\t\t...explicitOptions,\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 (typeof document === 'undefined') return;\n\n\tif (!document.querySelector('#feedback-sdk-styles')) {\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\tif (!document.querySelector('#feedback-sdk-iconify')) {\n\t\tconst script = document.createElement('script');\n\t\tscript.id = 'feedback-sdk-iconify';\n\t\tscript.src =\n\t\t\t'https://cdn.jsdelivr.net/npm/iconify-icon@2/dist/iconify-icon.min.js';\n\t\tscript.async = true;\n\t\tdocument.head.appendChild(script);\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","respondent","_getRespondentContext","window","location","href","respondent_id","undefined","includeEligibility","include_eligibility","userProperties","user_properties","userContext","getUserContext","respondentId","userId","user_id","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","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","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","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","buttonText","triggerText","label","button","assign","minimizeIcon","expandIcon","openIfAllowed","Element","Boolean","closest","isControlIcon","stopPropagation","minimize","restore","pointerType","shouldRestoreButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","currentIndex","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","_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_name","is_agent","simulateMessage","MessengerState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","greetingMessage","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","_getMessageAttachmentsSignature","att","_findOptimisticMatchIndex","incomingMessage","matchWindowMs","incomingTimestamp","timestamp","incomingSignature","candidate","isOptimistic","isOwn","candidateTimestamp","Number","isNaN","abs","_updateConversationFromMessage","countUnread","conv","lastMessage","lastMessageTime","upsertMessage","reconcileOwnOptimistic","optimisticMatchWindowMs","existingIndex","findIndex","msg","optimisticIndex","storedMessage","addMessage","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","tabsHtml","tab","isActive","tabId","toggle","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","setHeader","headerContent","header","ChangelogView","_headerBg","_updateChangelogList","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","tagsHtml","tags","tag","dateStr","publishedAt","coverImage","_truncateText","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_pendingAttachments","_hideTypingIndicator","_appendMessage","_scrollToBottom","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","_renderMessage","_renderAttachmentPreviews","avatarHtml","_renderTeamAvatars","isOnline","_renderMessageAttachments","_escapeHtml","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","avatarUrl","charAt","toUpperCase","avatars","slice","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","collections","filtered","_renderCollectionItem","_attachCollectionEvents","_avatarColors","bg","hash","acc","char","_getInitials","_renderAuthorAvatar","collection","author","initials","_resolveCollectionIcon","trimStart","_defaultCollectionIcon","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","sort","order","article_count","url_slug","newConversation","checkAgentAvailability","mappedItems","_availabilityInterval","unsub","removeMessengerCustomStyles","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","ratingScale","scale","showFeedbackInput","showSubmitButton","autoSubmitOnSelect","showTitle","showDescription","customQuestions","pages","onSubmit","onDismiss","surveyState","score","customAnswers","pageAnswers","currentPageIndex","isVisible","_renderSurvey","_closeSurvey","_getSurveyConfig","isMultiPage","_isMultiPageSurvey","isLastPage","_isLastPage","_shouldShowFeedbackInput","showActions","_shouldShowActions","_shouldShowTitle","_shouldShowDescription","pageProgress","submitLabel","backButton","_handleDismiss","surveyElement","_attachSurveyEvents","transform","_getCurrentPageConfig","npsScale","_getNPSScale","npsUsesSegmentedScale","values","npsContainerClass","npsButtonClass","npsLowLabel","start","npsHighLabel","npsPrompt","csatPrompt","cesPrompt","configs","nps","_renderScaleLabels","csat","emoji","ces","custom","_renderCustomQuestions","rawScale","isFinite","low","high","_isRatingSurveyType","_shouldAutoSubmitOnSelect","_getCurrentPage","_renderSurveyPage","_getFallbackSurveyConfig","_renderRatingPage","_renderMultipleChoicePage","_renderTextPage","pageId","ratingConfig","rating_config","ratingType","survey_type","currentRating","defaultLowLabel","defaultHighLabel","usesSegmentedScale","buttonClass","multipleChoiceConfig","multiple_choice_config","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","String","_renderQuestionInput","freq","question","opt","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","_setPageAnswer","existing","existingValues","nextValues","v","_maybeAutoSubmit","frequency","_validateCurrentPage","nextPageIndex","_getNextPageIndex","normalizedPageAnswers","_normalizePageAnswersForSubmit","mergedAnswers","page_answers","_getSubmissionRating","_showSuccessNotification","answer","hasSingle","hasMany","fallbackNext","navigation","afterThisPage","after_this_page","nextValue","default","normalizedId","pageIndex","output","sdkUserContext","apiUserContext","localUserContext","actions","anchor","insertBefore","transition","resetState","surveyEl","backdropEl","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","initData","createWidget","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","widgetOptions","getWidget","surveys","_normalizeSurveyConfig","includeIneligible","_isSurveyEligible","showSurveyById","displayOptions","surveyConfig","s","showSurvey","rating_scale","show_feedback_input","show_submit_button","auto_submit_on_select","show_title","show_description","questions","_getSurveyIneligibilityReason","normalizedOptions","surveyConfigDefaults","surveyWidget","_getSurveyField","eligibilityShouldShow","eligibility","eligible","isAnswered","eligibilityAnswered","explicitReason","eligibilityReason","firstPage","inferredType","_inferSurveyTypeFromPage","should_show","_normalizeSurveyPages","linkConfig","link_config","fields","widgetsConfig","_isPlainObject","mergedTypeConfig","_toCamelCaseObject","prototype","call","_toCamelCaseKey","normalized","nestedValue","fromEntries","showChangelog","defaults","configDefaults","changelogWidget","getAllWidgets","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","script","autoInit","FeedbackSDKConfig","then","instance","autoCreate","CustomEvent","detail","dispatchEvent","catch","phase","FeedbackSDKExport","helpers","version","isReady","getInstance","FeedbackSDKUserContext","initWithUser","fullConfig","onReady","onError","extractUserContext"],"mappings":"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"}