@product7/feedback-sdk 1.7.7 → 1.7.9
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\tname: 'NPS Score',\n\t\tslug: 'nps',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'nps-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How likely are you to recommend us to a friend?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: { scale: 11, low_label: 'Very unlikely', high_label: 'Very likely', survey_type: 'nps' },\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\tname: 'CSAT Survey',\n\t\tslug: 'csat',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'csat-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How satisfied are you with our service?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: { scale: 5, low_label: 'Very dissatisfied', high_label: 'Very satisfied', survey_type: 'emoji' },\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\tname: 'Customer Effort Score',\n\t\tslug: 'ces',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'ces-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How easy was it to use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: { scale: 5, low_label: 'Very difficult', high_label: 'Very easy', survey_type: 'ces' },\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_open_question_survey',\n\t\tname: 'Open Question',\n\t\tslug: 'open-question',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'open-page-1',\n\t\t\t\ttype: 'text',\n\t\t\t\ttitle: 'What could we do better?',\n\t\t\t\tdescription: 'Is there anything we could do to make our product better for you?',\n\t\t\t\tplaceholder: 'Type your answer here',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_product_idea_poll_survey',\n\t\tname: 'Product Idea Poll',\n\t\tslug: 'product-idea-poll',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'poll-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'Which feature should we add next?',\n\t\t\t\tdescription: 'Vote on the feature you would like to see next.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'opt1', label: 'Better reporting' },\n\t\t\t\t\t\t{ id: 'opt2', label: 'Mobile app' },\n\t\t\t\t\t\t{ id: 'opt3', label: 'Integrations' },\n\t\t\t\t\t\t{ id: 'opt4', label: 'AI features' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_pmf_survey',\n\t\tname: 'Product Market Fit (PMF)',\n\t\tslug: 'pmf',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'pmf-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'How would you feel if you could no longer use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'very_disappointed', label: 'Very disappointed' },\n\t\t\t\t\t\t{ id: 'somewhat_disappointed', label: 'Somewhat disappointed' },\n\t\t\t\t\t\t{ id: 'not_disappointed', label: 'Not disappointed' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_user_interview_survey',\n\t\tname: 'User Interview Request',\n\t\tslug: 'user-interview',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'interview-page-1',\n\t\t\t\ttype: 'link',\n\t\t\t\ttitle: 'Would you like to hop on a quick demo?',\n\t\t\t\tdescription: 'We would love to hear your thoughts and answer any questions you have.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: {\n\t\t\t\t\tbutton_text: 'Book a demo',\n\t\t\t\t\tlink_text: '',\n\t\t\t\t\tredirect_url: 'https://example.com',\n\t\t\t\t\topen_in: 'new_tab',\n\t\t\t\t},\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\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/index.js';\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/index.js';\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/index.js';\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/index.js';\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\t\t\tconst initData = this._extractInitResponseData(response);\n\n\t\t\tthis.sessionToken = initData.sessionToken;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + initData.expiresIn * 1000);\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: initData.config,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t\tstatus: initData.status,\n\t\t\t\tmessage: initData.message,\n\t\t\t\tconfigVersion: initData.configVersion,\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\t_extractInitResponseData(response) {\n\t\tconst payload =\n\t\t\tresponse && typeof response.data === 'object' ? response.data : response || {};\n\n\t\tconst sessionToken = payload.session_token || payload.sessionToken;\n\t\tconst expiresIn = Number(payload.expires_in ?? payload.expiresIn);\n\n\t\tif (!sessionToken) {\n\t\t\tthrow new APIError(500, 'Invalid init response: missing session_token');\n\t\t}\n\n\t\tif (!Number.isFinite(expiresIn) || expiresIn <= 0) {\n\t\t\tthrow new APIError(500, 'Invalid init response: missing expires_in');\n\t\t}\n\n\t\treturn {\n\t\t\tsessionToken,\n\t\t\texpiresIn,\n\t\t\tconfig:\n\t\t\t\tpayload.config && typeof payload.config === 'object'\n\t\t\t\t\t? payload.config\n\t\t\t\t\t: {},\n\t\t\tconfigVersion: payload.config_version ?? payload.configVersion ?? null,\n\t\t\tstatus: response?.status ?? payload?.status ?? true,\n\t\t\tmessage: response?.message ?? payload?.message ?? null,\n\t\t};\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.userContext = userContext;\n\t\tthis._storeData('feedbackSDK_userContext', userContext);\n\t}\n\n\tgetUserContext() {\n\t\treturn this.userContext;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis._removeData('feedbackSDK_session');\n\t\tthis._removeData('feedbackSDK_userContext');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('feedbackSDK_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { MessengerService } from '../api/services/MessengerService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\n\nexport class APIService extends BaseAPIService {\n\tconstructor(config = {}) {\n\t\tsuper(config);\n\n\t\tthis.feedback = new FeedbackService(this);\n\t\tthis.survey = new SurveyService(this);\n\t\tthis.messenger = new MessengerService(this);\n\t\tthis.help = new HelpService(this);\n\t\tthis.changelog = new ChangelogService(this);\n\t}\n\n\tasync submitFeedback(data) {\n\t\treturn this.feedback.submitFeedback(data);\n\t}\n\n\tasync getActiveSurveys(context) {\n\t\treturn this.survey.getActiveSurveys(context);\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\treturn this.survey.submitSurveyResponse(surveyId, responseData);\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\treturn this.survey.dismissSurvey(surveyId);\n\t}\n\n\tasync getMessengerSettings() {\n\t\treturn this.messenger.getMessengerSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log(\n\t\t\t\t'[APIService] startConversation: session invalid, calling init...'\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[APIService] startConversation: init result, token:',\n\t\t\t\t\tthis.sessionToken ? 'set' : 'null'\n\t\t\t\t);\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[APIService] startConversation: init failed:',\n\t\t\t\t\tinitError.message\n\t\t\t\t);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error(\n\t\t\t\t'[APIService] startConversation: no session token after init'\n\t\t\t);\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log(\n\t\t\t'[APIService] startConversation: sending to',\n\t\t\t`${this.baseURL}/widget/messenger/conversations`,\n\t\t\t'mock:',\n\t\t\tthis.mock\n\t\t);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.messenger.identifyContact(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\tasync getChangelogs(options) {\n\t\treturn this.changelog.getChangelogs(options);\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken =\n\t\t\t\tsessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('feedbackSDK_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[FeedbackSDK] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30;\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardId: this.sdk.config.boardId,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true,\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\tif (this.options.enabled === false) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\ttype: this.type,\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\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\tif (this.options.showBackdrop) {\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\t\t}\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\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\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\tconst themeClass = `theme-${this.options.theme || 'light'}`;\n\t\tthis.panelElement.className = `${modeClass} ${sizeClass} ${themeClass}`;\n\t\tthis.panelElement.style.setProperty('--color-primary', this.options.primaryColor);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-bg',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-text',\n\t\t\tthis.options.textColor\n\t\t);\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\">×</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.listModalBackdropElement = 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} changelog-theme-${this.options.theme || 'light'}`;\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\tif (this.options.showBackdrop !== false) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = `changelog-modal-backdrop changelog-theme-${this.options.theme || 'light'}`;\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t\tthis.backdropElement.addEventListener('click', () => this.closeModal());\n\t\t}\n\n\t\tthis.modalElement = document.createElement('div');\n\t\tthis.modalElement.className = `changelog-modal changelog-theme-${this.options.theme || 'light'}`;\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\tif (this.options.showBackdrop !== false) {\n\t\t\tthis.listModalBackdropElement = document.createElement('div');\n\t\t\tthis.listModalBackdropElement.className = `changelog-list-modal-backdrop changelog-theme-${this.options.theme || 'light'}`;\n\t\t\tdocument.body.appendChild(this.listModalBackdropElement);\n\t\t\tthis.listModalBackdropElement.addEventListener('click', () =>\n\t\t\t\tthis.closeSidebar()\n\t\t\t);\n\t\t}\n\n\t\tthis.listModalElement = document.createElement('div');\n\t\tthis.listModalElement.className = `changelog-list-modal changelog-theme-${this.options.theme || 'light'}`;\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, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.messenger-chat-empty');\n\t\tif (emptyState) {\n\t\t\temptyState.remove();\n\t\t}\n\n\t\tconst messageHtml = this._renderMessage(message);\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = messageHtml;\n\t\tmessagesContainer.appendChild(tempDiv.firstElementChild);\n\t}\n\n\t_scrollToBottom() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n\t\t\t}, 50);\n\t\t}\n\t}\n\n\t_updateSendButtonState() {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\t\tif (input && sendBtn) {\n\t\t\tsendBtn.disabled =\n\t\t\t\t!input.value.trim() && this._pendingAttachments.length === 0;\n\t\t}\n\t}\n\n\t_renderAttachmentPreviews() {\n\t\tconst container = this.element.querySelector(\n\t\t\t'.messenger-compose-attachments-preview'\n\t\t);\n\t\tif (!container) return;\n\n\t\tif (this._pendingAttachments.length === 0) {\n\t\t\tcontainer.innerHTML = '';\n\t\t\tcontainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.display = 'flex';\n\t\tcontainer.innerHTML = this._pendingAttachments\n\t\t\t.map((att, i) => {\n\t\t\t\tconst isImage = att.type.startsWith('image');\n\t\t\t\tconst thumb = isImage\n\t\t\t\t\t? `<img class=\"messenger-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t\t: `<div class=\"messenger-attachment-thumb messenger-attachment-file-icon\"><i class=\"ph ph-file\"></i></div>`;\n\t\t\t\treturn `\n\t\t\t\t<div class=\"messenger-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"messenger-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">×</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tcontainer\n\t\t\t.querySelectorAll('.messenger-attachment-remove')\n\t\t\t.forEach((btn) => {\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-back-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('messages');\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\n\t\tif (input && sendBtn) {\n\t\t\tinput.addEventListener('input', () => {\n\t\t\t\tinput.style.height = 'auto';\n\t\t\t\tinput.style.height = Math.min(input.scrollHeight, 120) + 'px';\n\t\t\t\tthis._updateSendButtonState();\n\n\t\t\t\tif (input.value.trim()) {\n\t\t\t\t\tthis._startTyping();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._sendMessage();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsendBtn.addEventListener('click', () => {\n\t\t\t\tthis._sendMessage();\n\t\t\t});\n\t\t}\n\n\t\tconst attachBtn = this.element.querySelector('.messenger-compose-attach');\n\t\tconst fileInput = this.element.querySelector(\n\t\t\t'.messenger-compose-file-input'\n\t\t);\n\n\t\tif (attachBtn && fileInput) {\n\t\t\tattachBtn.addEventListener('click', () => {\n\t\t\t\tfileInput.click();\n\t\t\t});\n\n\t\t\tfileInput.addEventListener('change', (e) => {\n\t\t\t\tconst files = e.target.files;\n\t\t\t\tif (!files) return;\n\t\t\t\tArray.from(files).forEach((file) => {\n\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\treader.onload = (ev) => {\n\t\t\t\t\t\tthis._pendingAttachments.push({\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tpreview: ev.target.result,\n\t\t\t\t\t\t\ttype: file.type,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t\t};\n\t\t\t\t\treader.readAsDataURL(file);\n\t\t\t\t});\n\t\t\t\tfileInput.value = '';\n\t\t\t});\n\t\t}\n\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tmessagesContainer.addEventListener('click', (e) => {\n\t\t\t\tconst fileLink = e.target.closest('.messenger-message-file');\n\t\t\t\tif (fileLink) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst url = fileLink.dataset.url;\n\t\t\t\t\tconst name = fileLink.dataset.name;\n\t\t\t\t\tthis._downloadFile(url, name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst img = e.target.closest('.messenger-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst content = input.value.trim();\n\t\tconst hasAttachments = this._pendingAttachments.length > 0;\n\n\t\tif (!content && !hasAttachments) return;\n\n\t\tthis._stopTyping();\n\n\t\tconst attachmentsToSend = [...this._pendingAttachments];\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\n\t\tif (isNewConversation) {\n\t\t\tif (this.options.onStartConversation) {\n\t\t\t\tthis.options.onStartConversation(content, attachmentsToSend);\n\t\t\t}\n\t\t} else {\n\t\t\tconst message = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\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, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('form');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst skipBtn = this.element.querySelector('.messenger-prechat-skip');\n\n\t\tconst validateForm = () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tconst isEmailValid = this._isValidEmail(email);\n\t\t\tsubmitBtn.disabled = !isEmailValid;\n\t\t\treturn isEmailValid;\n\t\t};\n\n\t\temailInput.addEventListener('input', () => {\n\t\t\tthis._clearError('messenger-email-error');\n\t\t\tvalidateForm();\n\t\t});\n\n\t\temailInput.addEventListener('blur', () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tif (email && !this._isValidEmail(email)) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t}\n\t\t});\n\n\t\tskipBtn.addEventListener('click', () => {\n\t\t\tthis.state.setView('chat');\n\t\t});\n\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this._isSubmitting) return;\n\t\t\tif (!validateForm()) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._handleSubmit();\n\t\t});\n\n\t\tvalidateForm();\n\n\t\tsetTimeout(() => emailInput.focus(), 100);\n\t}\n\n\t_isValidEmail(email) {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\treturn emailRegex.test(email);\n\t}\n\n\t_showError(elementId, message) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = message;\n\t\t\terrorEl.style.display = 'block';\n\t\t}\n\t}\n\n\t_clearError(elementId) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = '';\n\t\t\terrorEl.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst nameInput = this.element.querySelector('#messenger-prechat-name');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst submitText = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-text'\n\t\t);\n\t\tconst submitLoading = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-loading'\n\t\t);\n\n\t\tconst name = nameInput.value.trim();\n\t\tconst email = emailInput.value.trim();\n\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitText.style.display = 'none';\n\t\tsubmitLoading.style.display = 'inline-flex';\n\n\t\ttry {\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\tthis.state.setIdentified(true, { name, email });\n\n\t\t\tthis._isSubmitting = false;\n\n\t\t\tconst pendingMessage = this.state.pendingMessage;\n\t\t\tif (pendingMessage && this.options.onStartConversation) {\n\t\t\t\tthis.state.pendingMessage = null;\n\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\tawait this.options.onStartConversation(\n\t\t\t\t\tpendingMessage.content,\n\t\t\t\t\tpendingMessage.attachments\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[PreChatFormView] Error submitting form:', error);\n\t\t\tthis._showError(\n\t\t\t\t'messenger-email-error',\n\t\t\t\t'Something went wrong. Please try again.'\n\t\t\t);\n\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitText.style.display = 'inline';\n\t\t\tsubmitLoading.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { WebSocketService } from '../core/WebSocketService.js';\nimport {\n\tapplyMessengerCustomStyles,\n\tremoveMessengerCustomStyles,\n} from '../styles/messengerCustomStyles.js';\nimport { BaseWidget } from './BaseWidget.js';\nimport { MessengerState } from './messenger/MessengerState.js';\nimport { MessengerLauncher } from './messenger/components/MessengerLauncher.js';\nimport { MessengerPanel } from './messenger/components/MessengerPanel.js';\nimport { ChangelogView } from './messenger/views/ChangelogView.js';\nimport { ChatView } from './messenger/views/ChatView.js';\nimport { ConversationsView } from './messenger/views/ConversationsView.js';\nimport { HelpView } from './messenger/views/HelpView.js';\nimport { HomeView } from './messenger/views/HomeView.js';\nimport { PreChatFormView } from './messenger/views/PreChatFormView.js';\n\nexport class MessengerWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'messenger' });\n\t\tconst resolvedTheme = options.theme || 'light';\n\t\tconst hasExplicitTextColor = Object.prototype.hasOwnProperty.call(\n\t\t\toptions,\n\t\t\t'textColor'\n\t\t);\n\t\tconst hasExplicitBackgroundColor = Object.prototype.hasOwnProperty.call(\n\t\t\toptions,\n\t\t\t'backgroundColor'\n\t\t);\n\t\tconst defaultTextColor =\n\t\t\tresolvedTheme === 'dark' ? '#E2E8F0' : '#1d1d1f';\n\t\tconst defaultBackgroundColor =\n\t\t\tresolvedTheme === 'dark' ? '#0F172A' : '#ffffff';\n\n\t\tconst resolvedEnableChangelog =\n\t\t\ttypeof options.enableChangelog === 'boolean'\n\t\t\t\t? options.enableChangelog\n\t\t\t\t: options.enableNews !== false;\n\n\t\tthis.messengerOptions = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: resolvedTheme,\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\ttextColor: hasExplicitTextColor ? options.textColor : defaultTextColor,\n\t\t\tbackgroundColor: hasExplicitBackgroundColor\n\t\t\t\t? options.backgroundColor\n\t\t\t\t: defaultBackgroundColor,\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: resolvedEnableChangelog,\n\t\t\tautoLoadData: options.autoLoadData !== false,\n\t\t\tinitialView: options.initialView || 'home',\n\t\t\tpreviewData: options.previewData || null,\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\t_applyPreviewData() {\n\t\tconst data = this.messengerOptions.previewData;\n\t\tif (!data || typeof data !== 'object') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (Array.isArray(data.conversations)) {\n\t\t\tthis.messengerState.setConversations(data.conversations);\n\t\t}\n\n\t\tif (Array.isArray(data.helpArticles)) {\n\t\t\tthis.messengerState.setHelpArticles(data.helpArticles);\n\t\t}\n\n\t\tif (Array.isArray(data.homeChangelogItems)) {\n\t\t\tthis.messengerState.setHomeChangelogItems(data.homeChangelogItems);\n\t\t}\n\n\t\tif (Array.isArray(data.changelogItems)) {\n\t\t\tthis.messengerState.setChangelogItems(data.changelogItems);\n\t\t}\n\n\t\tif (typeof data.unreadCount === 'number') {\n\t\t\tthis.setUnreadCount(data.unreadCount);\n\t\t}\n\n\t\tif (data.availability && typeof data.availability === 'object') {\n\t\t\tconst availability = data.availability;\n\t\t\tthis.messengerState.agentsOnline = Boolean(\n\t\t\t\tavailability.agentsOnline ?? availability.agents_online\n\t\t\t);\n\t\t\tthis.messengerState.onlineCount =\n\t\t\t\tavailability.onlineCount ?? availability.online_count ?? 0;\n\t\t\tthis.messengerState.responseTime =\n\t\t\t\tavailability.responseTime ??\n\t\t\t\tavailability.response_time ??\n\t\t\t\tthis.messengerState.responseTime;\n\t\t\tthis.messengerState._notify('availabilityUpdate', availability);\n\t\t}\n\n\t\tif (typeof data.currentView === 'string') {\n\t\t\tthis.messengerState.setView(data.currentView);\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._applyPreviewData();\n\n\t\tif (this.messengerOptions.autoLoadData) {\n\t\t\tthis.loadInitialData();\n\n\t\t\tif (this.apiService?.sessionToken) {\n\t\t\t\tthis._initWebSocket();\n\t\t\t}\n\n\t\t\tthis.checkAgentAvailability();\n\n\t\t\tthis._availabilityInterval = setInterval(() => {\n\t\t\t\tthis.checkAgentAvailability();\n\t\t\t}, 60000);\n\t\t}\n\n\t\tif (\n\t\t\tthis.messengerOptions.initialView &&\n\t\t\tthis.messengerOptions.initialView !== this.messengerState.currentView\n\t\t) {\n\t\t\tthis.messengerState.setView(this.messengerOptions.initialView);\n\t\t}\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 normalized = String(hex || '').trim();\n\t\tif (!/^#?[0-9a-fA-F]{6}$/.test(normalized)) {\n\t\t\treturn normalized || '#000000';\n\t\t}\n\n\t\tconst num = parseInt(normalized.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\tconst darkSurface = adjustColor(backgroundColor, 12);\n\tconst darkSurfaceAlt = adjustColor(backgroundColor, 20);\n\tconst darkBorder = adjustColor(backgroundColor, 34);\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\n\t\t${\n\t\t\ttheme === 'dark'\n\t\t\t\t? `\n\t\t.messenger-widget.theme-dark .messenger-panel-content,\n\t\t.messenger-widget.theme-dark .messenger-home-view,\n\t\t.messenger-widget.theme-dark .messenger-nav,\n\t\t.messenger-widget.theme-dark .messenger-chat-compose,\n\t\t.messenger-widget.theme-dark .messenger-compose-attachments-preview,\n\t\t.messenger-widget.theme-dark .messenger-home-featured,\n\t\t.messenger-widget.theme-dark .messenger-chat-header {\n\t\t\tbackground: ${backgroundColor} !important;\n\t\t\tborder-color: ${darkBorder} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-view,\n\t\t.messenger-widget.theme-dark .messenger-chat-title,\n\t\t.messenger-widget.theme-dark .messenger-home-greeting,\n\t\t.messenger-widget.theme-dark .messenger-home-question,\n\t\t.messenger-widget.theme-dark .messenger-home-featured-content h3,\n\t\t.messenger-widget.theme-dark .messenger-home-featured-content p,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card-title,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card-desc,\n\t\t.messenger-widget.theme-dark .messenger-conversation-title,\n\t\t.messenger-widget.theme-dark .messenger-article-title,\n\t\t.messenger-widget.theme-dark .messenger-compose-input,\n\t\t.messenger-widget.theme-dark .messenger-message-sender,\n\t\t.messenger-widget.theme-dark .messenger-message-time,\n\t\t.messenger-widget.theme-dark .messenger-nav-label {\n\t\t\tcolor: ${textColor} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-view {\n\t\t\tbackground: linear-gradient(180deg, ${adjustColor(backgroundColor, 10)} 0%, ${backgroundColor} 55%) !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${adjustColor(primaryColor, 0, 0.12)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-message-btn,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card,\n\t\t.messenger-widget.theme-dark .messenger-compose-input-wrapper,\n\t\t.messenger-widget.theme-dark .messenger-message-received .messenger-message-bubble,\n\t\t.messenger-widget.theme-dark .messenger-message-file,\n\t\t.messenger-widget.theme-dark .messenger-prechat-card,\n\t\t.messenger-widget.theme-dark .messenger-list-item,\n\t\t.messenger-widget.theme-dark .messenger-article-item {\n\t\t\tbackground: ${darkSurface} !important;\n\t\t\tborder-color: ${darkBorder} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-message-btn:hover,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card:hover,\n\t\t.messenger-widget.theme-dark .messenger-list-item:hover,\n\t\t.messenger-widget.theme-dark .messenger-article-item:hover {\n\t\t\tbackground: ${darkSurfaceAlt} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-message-own .messenger-message-bubble,\n\t\t.messenger-widget.theme-dark .messenger-compose-send,\n\t\t.messenger-widget.theme-dark .messenger-launcher-btn,\n\t\t.messenger-widget.theme-dark .messenger-nav-badge,\n\t\t.messenger-widget.theme-dark .messenger-launcher-badge,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-cover-text,\n\t\t.messenger-widget.theme-dark .messenger-attachment-remove {\n\t\t\tcolor: #FFFFFF !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\ttheme: options.theme || 'light',\n\t\t\tenabled:\n\t\t\t\ttypeof options.enabled === 'boolean' ? options.enabled : undefined,\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\tstatic removeDanglingElements() {\n\t\tif (typeof document === 'undefined') return;\n\n\t\tdocument\n\t\t\t.querySelectorAll(\n\t\t\t\t'.feedback-survey, .feedback-survey-backdrop, .feedback-survey-success, .feedback-sdk-notification'\n\t\t\t)\n\t\t\t.forEach((el) => {\n\t\t\t\tif (el && el.parentNode) {\n\t\t\t\t\tel.parentNode.removeChild(el);\n\t\t\t\t}\n\t\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\tif (this.options.enabled === false || this.surveyOptions.enabled === false) {\n\t\t\tthis.sdk.eventBus.emit('survey:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\tsurveyId: this.surveyOptions.surveyId,\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tSurveyWidget.removeDanglingElements();\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\tif (!config) return;\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 feedback-survey-backdrop-${this.surveyOptions.theme}`;\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} feedback-survey-theme-${this.surveyOptions.theme}${\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 && this.surveyOptions.pages.length > 1 ? `<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] || null;\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\tconst page = this._getCurrentPage();\n\t\t\tif (page && page.type === 'link') {\n\t\t\t\treturn false;\n\t\t\t}\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 null;\n\t\t}\n\n\t\treturn {\n\t\t\ttitle: page.title || '',\n\t\t\tdescription: page.description || '',\n\t\t\thtml: this._renderSurveyPage(page),\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\tcase 'link':\n\t\t\t\treturn this._renderLinkPage(page);\n\t\t\tdefault:\n\t\t\t\treturn '';\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 topSurveyType = this.surveyOptions.surveyType;\n\t\tconst configType = config.survey_type;\n\t\tlet ratingType;\n\t\tif (topSurveyType === 'ces') {\n\t\t\tratingType = 'ces';\n\t\t} else if (topSurveyType === 'nps') {\n\t\t\tratingType = 'nps';\n\t\t} else if (topSurveyType === 'csat' && !configType) {\n\t\t\tratingType = 'emoji';\n\t\t} else {\n\t\t\tratingType = configType || topSurveyType || 'csat';\n\t\t}\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 === 'ces') {\n\t\t\tconst cesLabels = ['Very Difficult', 'Difficult', 'Neutral', 'Easy', 'Very Easy'];\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-ces-list\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${cesLabels\n\t\t\t\t\t\t.map((label, 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-ces-list-btn${selected}\" data-page-id=\"${pageId}\" data-score=\"${score}\">${label}</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`;\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 ||\n\t\t\tconfig.multiple === true ||\n\t\t\tconfig.allow_multiple_selection === 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\t\tconst placeholder = page.placeholder || 'Type your answer...';\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=\"${placeholder}\">${value}</textarea>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderLinkPage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst config = page.link_config || page.linkConfig || {};\n\t\tconst buttonText = config.button_text || config.buttonText || 'Click here';\n\t\tconst linkText = config.link_text || config.linkText || '';\n\t\tconst redirectUrl = config.redirect_url || config.redirectUrl || '#';\n\t\tconst openIn = config.open_in || config.openIn || 'new_tab';\n\t\tconst target = openIn === 'new_tab' ? '_blank' : '_self';\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst clicked = pageAnswer.clicked === true;\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-link-page\" data-page-id=\"${pageId}\">\n\t\t\t\t${linkText ? `<p class=\"feedback-survey-link-text\">${linkText}</p>` : ''}\n\t\t\t\t<a class=\"feedback-survey-link-btn${clicked ? ' selected' : ''}\"\n\t\t\t\t href=\"${redirectUrl}\"\n\t\t\t\t target=\"${target}\"\n\t\t\t\t rel=\"noopener noreferrer\"\n\t\t\t\t data-page-id=\"${pageId}\">\n\t\t\t\t\t${buttonText}\n\t\t\t\t</a>\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\n\t\tif (page.type === 'link') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-link-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst pId = btn.dataset.pageId;\n\t\t\t\t\t\tthis._setPageAnswer(pId, { clicked: true });\n\t\t\t\t\t\tbtn.classList.add('selected');\n\n\t\t\t\t\t\tconst navigation = page.afterThisPage || page.after_this_page;\n\t\t\t\t\t\tconst goesTo = navigation ? navigation.default : null;\n\t\t\t\t\t\tif (!goesTo || goesTo === 'end_survey') {\n\t\t\t\t\t\t\tsetTimeout(() => this._handleSubmit(), 400);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t}\n\n\t_selectNPS(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t\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\tif (page.type === 'link') {\n\t\t\tif (page.required && !answer.clicked) {\n\t\t\t\tthis._showError('Please click the link to continue');\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.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><path d=\"M236.8,188.09,149.35,36a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z\" fill=\"currentColor\"/></svg><span>${message}</span>`;\n\n\t\tthis.surveyElement.prepend(error);\n\n\t\tsetTimeout(() => error.remove(), 3000);\n\t}\n\n\t_showSuccessNotification() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className =\n\t\t\t'feedback-sdk-notification feedback-sdk-notification-success';\n\t\tnotification.innerHTML = `\n\t\t\t<div>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><path d=\"M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z\" fill=\"currentColor\"/></svg>\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, immediate = false) {\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\tif (immediate) {\n\t\t\t\tif (surveyEl.parentNode) {\n\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (surveyEl && surveyEl.parentNode) {\n\t\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t\tthis.surveyElement = null;\n\t\t}\n\n\t\tif (backdropEl) {\n\t\t\tbackdropEl.style.opacity = '0';\n\t\t\tif (immediate) {\n\t\t\t\tif (backdropEl.parentNode) {\n\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (backdropEl && backdropEl.parentNode) {\n\t\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\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(true, true);\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 widgetEnabled = this._isWidgetEnabled(type, {\n\t\t\t...widgetConfig,\n\t\t\t...explicitOptions,\n\t\t});\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\tenabled: widgetEnabled,\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\tenabled: surveyConfig.enabled,\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\t\tconst surveyEnabled = this._isWidgetEnabled('survey', normalizedOptions);\n\n\t\tif (!surveyEnabled) {\n\t\t\tthis.eventBus.emit('survey:suppressed', {\n\t\t\t\tsurveyId:\n\t\t\t\t\tnormalizedOptions.surveyId || normalizedOptions.id || options.id || null,\n\t\t\t\treason: 'disabled',\n\t\t\t\tsurvey: normalizedOptions,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\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\tenabled: surveyEnabled,\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.surveyType ||\n\t\t\tsurvey.survey_type ||\n\t\t\tsurvey.type ||\n\t\t\tthis._inferSurveyTypeFromPage(firstPage) ||\n\t\t\t'nps';\n\n\t\treturn {\n\t\t\t...survey,\n\t\t\tsurveyId: survey.surveyId || survey.survey_id || survey.id || null,\n\t\t\tsurveyType: survey.surveyType || survey.survey_type || inferredType,\n\t\t\ttype: survey.type || survey.survey_type || inferredType,\n\t\t\tenabled:\n\t\t\t\ttypeof survey.enabled === 'boolean' ? survey.enabled : undefined,\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:\n\t\t\t\tsurvey.customQuestions ||\n\t\t\t\tsurvey.custom_questions ||\n\t\t\t\tsurvey.questions ||\n\t\t\t\t[],\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\tplaceholder: page.placeholder || '',\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_isWidgetEnabled(type, options = {}) {\n\t\tconst typeConfig = this._getWidgetTypeConfig(type);\n\t\tif (typeConfig.enabled === false) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (typeof options.enabled === 'boolean') {\n\t\t\treturn options.enabled;\n\t\t}\n\n\t\tif (typeof typeConfig.enabled === 'boolean') {\n\t\t\treturn typeConfig.enabled;\n\t\t}\n\n\t\treturn true;\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\tshowBackdrop: true,\n\t\t};\n\n\t\tconst configDefaults = this._getWidgetTypeConfig('changelog');\n\t\tconst explicitOptions = this._omitUndefined(options);\n\t\tconst changelogEnabled = this._isWidgetEnabled('changelog', explicitOptions);\n\n\t\tif (!changelogEnabled) {\n\t\t\tthis.eventBus.emit('widget:suppressed', {\n\t\t\t\ttype: 'changelog',\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn null;\n\t\t}\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\tenabled: changelogEnabled,\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","trigger_type","pages","type","placeholder","rating_config","scale","low_label","high_label","survey_type","multiple_choice_config","link_config","after_this_page","default","conditions","required","allow_multiple_selection","options","label","button_text","link_text","redirect_url","open_in","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","_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","initData","_extractInitResponseData","configVersion","error","session_token","Number","expires_in","isFinite","config_version","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","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","eventBus","widget","reason","_hasRecentlySubmitted","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","themeClass","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","notification","closeNotification","opacity","openModal","closeModal","ButtonWidget","isMinimized","_hiddenForOpenPanel","buttonText","triggerText","button","assign","minimizeIcon","expandIcon","openIfAllowed","Element","Boolean","closest","isControlIcon","stopPropagation","minimize","restore","pointerType","shouldRestoreButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","listModalBackdropElement","currentIndex","trigger","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","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","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","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","resolvedTheme","hasExplicitTextColor","prototype","call","hasExplicitBackgroundColor","defaultTextColor","defaultBackgroundColor","resolvedEnableChangelog","enableNews","messengerOptions","autoLoadData","initialView","previewData","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","messengerState","launcher","wsService","_wsUnsubscribers","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","zIndex","styleElement","getElementById","head","adjustColor","percent","alpha","normalized","String","num","r","max","g","b","padStart","darkSurface","darkSurfaceAlt","darkBorder","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","_applyPreviewData","availability","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","showFeedbackInput","showSubmitButton","autoSubmitOnSelect","showTitle","showDescription","customQuestions","onSubmit","onDismiss","surveyState","score","customAnswers","pageAnswers","currentPageIndex","isVisible","removeDanglingElements","el","_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","nps","_renderScaleLabels","csat","emoji","ces","custom","_renderCustomQuestions","rawScale","low","high","_isRatingSurveyType","_shouldAutoSubmitOnSelect","_getCurrentPage","_renderSurveyPage","_renderRatingPage","_renderMultipleChoicePage","_renderTextPage","_renderLinkPage","pageId","ratingConfig","topSurveyType","configType","ratingType","currentRating","defaultLowLabel","defaultHighLabel","usesSegmentedScale","buttonClass","multipleChoiceConfig","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","linkConfig","linkText","redirectUrl","openIn","clicked","_renderQuestionInput","freq","question","opt","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","_setPageAnswer","existing","existingValues","nextValues","v","pId","navigation","afterThisPage","goesTo","_maybeAutoSubmit","frequency","_validateCurrentPage","nextPageIndex","_getNextPageIndex","normalizedPageAnswers","_normalizePageAnswersForSubmit","mergedAnswers","page_answers","_getSubmissionRating","_showSuccessNotification","answer","hasSingle","hasMany","fallbackNext","nextValue","normalizedId","pageIndex","output","sdkUserContext","apiUserContext","localUserContext","prepend","transition","resetState","immediate","surveyEl","backdropEl","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","createWidget","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","widgetEnabled","_isWidgetEnabled","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","surveyEnabled","surveyWidget","_getSurveyField","eligibilityShouldShow","eligibility","eligible","isAnswered","eligibilityAnswered","explicitReason","eligibilityReason","firstPage","inferredType","_inferSurveyTypeFromPage","should_show","custom_questions","_normalizeSurveyPages","fields","widgetsConfig","_isPlainObject","mergedTypeConfig","_toCamelCaseObject","typeConfig","_toCamelCaseKey","nestedValue","fromEntries","showChangelog","defaults","configDefaults","changelogEnabled","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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"}
|
|
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\tname: 'NPS Score',\n\t\tslug: 'nps',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'nps-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How likely are you to recommend us to a friend?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: { scale: 11, low_label: 'Very unlikely', high_label: 'Very likely', survey_type: 'nps' },\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\tname: 'CSAT Survey',\n\t\tslug: 'csat',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'csat-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How satisfied are you with our service?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: { scale: 5, low_label: 'Very dissatisfied', high_label: 'Very satisfied', survey_type: 'emoji' },\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\tname: 'Customer Effort Score',\n\t\tslug: 'ces',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'ces-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How easy was it to use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: { scale: 5, low_label: 'Very difficult', high_label: 'Very easy', survey_type: 'ces' },\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_open_question_survey',\n\t\tname: 'Open Question',\n\t\tslug: 'open-question',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'open-page-1',\n\t\t\t\ttype: 'text',\n\t\t\t\ttitle: 'What could we do better?',\n\t\t\t\tdescription: 'Is there anything we could do to make our product better for you?',\n\t\t\t\tplaceholder: 'Type your answer here',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_product_idea_poll_survey',\n\t\tname: 'Product Idea Poll',\n\t\tslug: 'product-idea-poll',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'poll-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'Which feature should we add next?',\n\t\t\t\tdescription: 'Vote on the feature you would like to see next.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'opt1', label: 'Better reporting' },\n\t\t\t\t\t\t{ id: 'opt2', label: 'Mobile app' },\n\t\t\t\t\t\t{ id: 'opt3', label: 'Integrations' },\n\t\t\t\t\t\t{ id: 'opt4', label: 'AI features' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_pmf_survey',\n\t\tname: 'Product Market Fit (PMF)',\n\t\tslug: 'pmf',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'pmf-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'How would you feel if you could no longer use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'very_disappointed', label: 'Very disappointed' },\n\t\t\t\t\t\t{ id: 'somewhat_disappointed', label: 'Somewhat disappointed' },\n\t\t\t\t\t\t{ id: 'not_disappointed', label: 'Not disappointed' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_user_interview_survey',\n\t\tname: 'User Interview Request',\n\t\tslug: 'user-interview',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'interview-page-1',\n\t\t\t\ttype: 'link',\n\t\t\t\ttitle: 'Would you like to hop on a quick demo?',\n\t\t\t\tdescription: 'We would love to hear your thoughts and answer any questions you have.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: {\n\t\t\t\t\tbutton_text: 'Book a demo',\n\t\t\t\t\tlink_text: '',\n\t\t\t\t\tredirect_url: 'https://example.com',\n\t\t\t\t\topen_in: 'new_tab',\n\t\t\t\t},\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\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/index.js';\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/index.js';\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/index.js';\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/index.js';\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\t\t\tconst initData = this._extractInitResponseData(response);\n\n\t\t\tthis.sessionToken = initData.sessionToken;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + initData.expiresIn * 1000);\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: initData.config,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t\tstatus: initData.status,\n\t\t\t\tmessage: initData.message,\n\t\t\t\tconfigVersion: initData.configVersion,\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\t_extractInitResponseData(response) {\n\t\tconst payload =\n\t\t\tresponse && typeof response.data === 'object' ? response.data : response || {};\n\n\t\tconst sessionToken = payload.session_token || payload.sessionToken;\n\t\tconst expiresIn = Number(payload.expires_in ?? payload.expiresIn);\n\n\t\tif (!sessionToken) {\n\t\t\tthrow new APIError(500, 'Invalid init response: missing session_token');\n\t\t}\n\n\t\tif (!Number.isFinite(expiresIn) || expiresIn <= 0) {\n\t\t\tthrow new APIError(500, 'Invalid init response: missing expires_in');\n\t\t}\n\n\t\treturn {\n\t\t\tsessionToken,\n\t\t\texpiresIn,\n\t\t\tconfig:\n\t\t\t\tpayload.config && typeof payload.config === 'object'\n\t\t\t\t\t? payload.config\n\t\t\t\t\t: {},\n\t\t\tconfigVersion: payload.config_version ?? payload.configVersion ?? null,\n\t\t\tstatus: response?.status ?? payload?.status ?? true,\n\t\t\tmessage: response?.message ?? payload?.message ?? null,\n\t\t};\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetUserContext(userContext) {\n\t\tthis.userContext = userContext;\n\t\tthis._storeData('feedbackSDK_userContext', userContext);\n\t}\n\n\tgetUserContext() {\n\t\treturn this.userContext;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis._removeData('feedbackSDK_session');\n\t\tthis._removeData('feedbackSDK_userContext');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('feedbackSDK_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { MessengerService } from '../api/services/MessengerService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\n\nexport class APIService extends BaseAPIService {\n\tconstructor(config = {}) {\n\t\tsuper(config);\n\n\t\tthis.feedback = new FeedbackService(this);\n\t\tthis.survey = new SurveyService(this);\n\t\tthis.messenger = new MessengerService(this);\n\t\tthis.help = new HelpService(this);\n\t\tthis.changelog = new ChangelogService(this);\n\t}\n\n\tasync submitFeedback(data) {\n\t\treturn this.feedback.submitFeedback(data);\n\t}\n\n\tasync getActiveSurveys(context) {\n\t\treturn this.survey.getActiveSurveys(context);\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\treturn this.survey.submitSurveyResponse(surveyId, responseData);\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\treturn this.survey.dismissSurvey(surveyId);\n\t}\n\n\tasync getMessengerSettings() {\n\t\treturn this.messenger.getMessengerSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log(\n\t\t\t\t'[APIService] startConversation: session invalid, calling init...'\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[APIService] startConversation: init result, token:',\n\t\t\t\t\tthis.sessionToken ? 'set' : 'null'\n\t\t\t\t);\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[APIService] startConversation: init failed:',\n\t\t\t\t\tinitError.message\n\t\t\t\t);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error(\n\t\t\t\t'[APIService] startConversation: no session token after init'\n\t\t\t);\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log(\n\t\t\t'[APIService] startConversation: sending to',\n\t\t\t`${this.baseURL}/widget/messenger/conversations`,\n\t\t\t'mock:',\n\t\t\tthis.mock\n\t\t);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.messenger.identifyContact(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\tasync getChangelogs(options) {\n\t\treturn this.changelog.getChangelogs(options);\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('feedbackSDK_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken =\n\t\t\t\tsessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('feedbackSDK_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[FeedbackSDK] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30;\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardId: this.sdk.config.boardId,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true,\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\tif (this.options.enabled === false) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\ttype: this.type,\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\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\tif (this.options.showBackdrop) {\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\t\t}\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\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\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\tconst themeClass = `theme-${this.options.theme || 'light'}`;\n\t\tthis.panelElement.className = `${modeClass} ${sizeClass} ${themeClass}`;\n\t\tthis.panelElement.style.setProperty('--color-primary', this.options.primaryColor);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-bg',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-text',\n\t\t\tthis.options.textColor\n\t\t);\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\">×</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.listModalBackdropElement = 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} changelog-theme-${this.options.theme || 'light'}`;\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\tif (this.options.showBackdrop !== false) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = `changelog-modal-backdrop changelog-theme-${this.options.theme || 'light'}`;\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t\tthis.backdropElement.addEventListener('click', () => this.closeModal());\n\t\t}\n\n\t\tthis.modalElement = document.createElement('div');\n\t\tthis.modalElement.className = `changelog-modal changelog-theme-${this.options.theme || 'light'}`;\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\tif (this.options.showBackdrop !== false) {\n\t\t\tthis.listModalBackdropElement = document.createElement('div');\n\t\t\tthis.listModalBackdropElement.className = `changelog-list-modal-backdrop changelog-theme-${this.options.theme || 'light'}`;\n\t\t\tdocument.body.appendChild(this.listModalBackdropElement);\n\t\t\tthis.listModalBackdropElement.addEventListener('click', () =>\n\t\t\t\tthis.closeSidebar()\n\t\t\t);\n\t\t}\n\n\t\tthis.listModalElement = document.createElement('div');\n\t\tthis.listModalElement.className = `changelog-list-modal changelog-theme-${this.options.theme || 'light'}`;\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, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.messenger-chat-empty');\n\t\tif (emptyState) {\n\t\t\temptyState.remove();\n\t\t}\n\n\t\tconst messageHtml = this._renderMessage(message);\n\t\tconst tempDiv = document.createElement('div');\n\t\ttempDiv.innerHTML = messageHtml;\n\t\tmessagesContainer.appendChild(tempDiv.firstElementChild);\n\t}\n\n\t_scrollToBottom() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tmessagesContainer.scrollTop = messagesContainer.scrollHeight;\n\t\t\t}, 50);\n\t\t}\n\t}\n\n\t_updateSendButtonState() {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\t\tif (input && sendBtn) {\n\t\t\tsendBtn.disabled =\n\t\t\t\t!input.value.trim() && this._pendingAttachments.length === 0;\n\t\t}\n\t}\n\n\t_renderAttachmentPreviews() {\n\t\tconst container = this.element.querySelector(\n\t\t\t'.messenger-compose-attachments-preview'\n\t\t);\n\t\tif (!container) return;\n\n\t\tif (this._pendingAttachments.length === 0) {\n\t\t\tcontainer.innerHTML = '';\n\t\t\tcontainer.style.display = 'none';\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.display = 'flex';\n\t\tcontainer.innerHTML = this._pendingAttachments\n\t\t\t.map((att, i) => {\n\t\t\t\tconst isImage = att.type.startsWith('image');\n\t\t\t\tconst thumb = isImage\n\t\t\t\t\t? `<img class=\"messenger-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t\t: `<div class=\"messenger-attachment-thumb messenger-attachment-file-icon\"><i class=\"ph ph-file\"></i></div>`;\n\t\t\t\treturn `\n\t\t\t\t<div class=\"messenger-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"messenger-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">×</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tcontainer\n\t\t\t.querySelectorAll('.messenger-attachment-remove')\n\t\t\t.forEach((btn) => {\n\t\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-back-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('messages');\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.sdk-close-btn')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.messenger-compose-send');\n\n\t\tif (input && sendBtn) {\n\t\t\tinput.addEventListener('input', () => {\n\t\t\t\tinput.style.height = 'auto';\n\t\t\t\tinput.style.height = Math.min(input.scrollHeight, 120) + 'px';\n\t\t\t\tthis._updateSendButtonState();\n\n\t\t\t\tif (input.value.trim()) {\n\t\t\t\t\tthis._startTyping();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tinput.addEventListener('keydown', (e) => {\n\t\t\t\tif (e.key === 'Enter' && !e.shiftKey) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tthis._sendMessage();\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tsendBtn.addEventListener('click', () => {\n\t\t\t\tthis._sendMessage();\n\t\t\t});\n\t\t}\n\n\t\tconst attachBtn = this.element.querySelector('.messenger-compose-attach');\n\t\tconst fileInput = this.element.querySelector(\n\t\t\t'.messenger-compose-file-input'\n\t\t);\n\n\t\tif (attachBtn && fileInput) {\n\t\t\tattachBtn.addEventListener('click', () => {\n\t\t\t\tfileInput.click();\n\t\t\t});\n\n\t\t\tfileInput.addEventListener('change', (e) => {\n\t\t\t\tconst files = e.target.files;\n\t\t\t\tif (!files) return;\n\t\t\t\tArray.from(files).forEach((file) => {\n\t\t\t\t\tconst reader = new FileReader();\n\t\t\t\t\treader.onload = (ev) => {\n\t\t\t\t\t\tthis._pendingAttachments.push({\n\t\t\t\t\t\t\tfile,\n\t\t\t\t\t\t\tpreview: ev.target.result,\n\t\t\t\t\t\t\ttype: file.type,\n\t\t\t\t\t\t});\n\t\t\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\t\t\tthis._updateSendButtonState();\n\t\t\t\t\t};\n\t\t\t\t\treader.readAsDataURL(file);\n\t\t\t\t});\n\t\t\t\tfileInput.value = '';\n\t\t\t});\n\t\t}\n\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tif (messagesContainer) {\n\t\t\tmessagesContainer.addEventListener('click', (e) => {\n\t\t\t\tconst fileLink = e.target.closest('.messenger-message-file');\n\t\t\t\tif (fileLink) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tconst url = fileLink.dataset.url;\n\t\t\t\t\tconst name = fileLink.dataset.name;\n\t\t\t\t\tthis._downloadFile(url, name);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst img = e.target.closest('.messenger-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tconst content = input.value.trim();\n\t\tconst hasAttachments = this._pendingAttachments.length > 0;\n\n\t\tif (!content && !hasAttachments) return;\n\n\t\tthis._stopTyping();\n\n\t\tconst attachmentsToSend = [...this._pendingAttachments];\n\t\tconst isNewConversation = !this.state.activeConversationId;\n\n\t\tif (isNewConversation) {\n\t\t\tif (this.options.onStartConversation) {\n\t\t\t\tthis.options.onStartConversation(content, attachmentsToSend);\n\t\t\t}\n\t\t} else {\n\t\t\tconst message = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: content,\n\t\t\t\tisOwn: true,\n\t\t\t\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, '&')\n\t\t\t.replace(/</g, '<')\n\t\t\t.replace(/>/g, '>')\n\t\t\t.replace(/\"/g, '"');\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('form');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst skipBtn = this.element.querySelector('.messenger-prechat-skip');\n\n\t\tconst validateForm = () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tconst isEmailValid = this._isValidEmail(email);\n\t\t\tsubmitBtn.disabled = !isEmailValid;\n\t\t\treturn isEmailValid;\n\t\t};\n\n\t\temailInput.addEventListener('input', () => {\n\t\t\tthis._clearError('messenger-email-error');\n\t\t\tvalidateForm();\n\t\t});\n\n\t\temailInput.addEventListener('blur', () => {\n\t\t\tconst email = emailInput.value.trim();\n\t\t\tif (email && !this._isValidEmail(email)) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t}\n\t\t});\n\n\t\tskipBtn.addEventListener('click', () => {\n\t\t\tthis.state.setView('chat');\n\t\t});\n\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tif (this._isSubmitting) return;\n\t\t\tif (!validateForm()) {\n\t\t\t\tthis._showError('messenger-email-error', 'Please enter a valid email');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tawait this._handleSubmit();\n\t\t});\n\n\t\tvalidateForm();\n\n\t\tsetTimeout(() => emailInput.focus(), 100);\n\t}\n\n\t_isValidEmail(email) {\n\t\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\t\treturn emailRegex.test(email);\n\t}\n\n\t_showError(elementId, message) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = message;\n\t\t\terrorEl.style.display = 'block';\n\t\t}\n\t}\n\n\t_clearError(elementId) {\n\t\tconst errorEl = this.element.querySelector(`#${elementId}`);\n\t\tif (errorEl) {\n\t\t\terrorEl.textContent = '';\n\t\t\terrorEl.style.display = 'none';\n\t\t}\n\t}\n\n\tasync _handleSubmit() {\n\t\tconst nameInput = this.element.querySelector('#messenger-prechat-name');\n\t\tconst emailInput = this.element.querySelector('#messenger-prechat-email');\n\t\tconst submitBtn = this.element.querySelector('.messenger-prechat-submit');\n\t\tconst submitText = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-text'\n\t\t);\n\t\tconst submitLoading = submitBtn.querySelector(\n\t\t\t'.messenger-prechat-submit-loading'\n\t\t);\n\n\t\tconst name = nameInput.value.trim();\n\t\tconst email = emailInput.value.trim();\n\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitText.style.display = 'none';\n\t\tsubmitLoading.style.display = 'inline-flex';\n\n\t\ttry {\n\t\t\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({ name, email });\n\t\t\t}\n\n\t\t\tthis.state.setIdentified(true, { name, email });\n\n\t\t\tthis._isSubmitting = false;\n\n\t\t\tconst pendingMessage = this.state.pendingMessage;\n\t\t\tif (pendingMessage && this.options.onStartConversation) {\n\t\t\t\tthis.state.pendingMessage = null;\n\t\t\t\tthis.state.setView('chat');\n\n\t\t\t\tawait this.options.onStartConversation(\n\t\t\t\t\tpendingMessage.content,\n\t\t\t\t\tpendingMessage.attachments\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.state.setView('chat');\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[PreChatFormView] Error submitting form:', error);\n\t\t\tthis._showError(\n\t\t\t\t'messenger-email-error',\n\t\t\t\t'Something went wrong. Please try again.'\n\t\t\t);\n\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitText.style.display = 'inline';\n\t\t\tsubmitLoading.style.display = 'none';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { WebSocketService } from '../core/WebSocketService.js';\nimport {\n\tapplyMessengerCustomStyles,\n\tremoveMessengerCustomStyles,\n} from '../styles/messengerCustomStyles.js';\nimport { BaseWidget } from './BaseWidget.js';\nimport { MessengerState } from './messenger/MessengerState.js';\nimport { MessengerLauncher } from './messenger/components/MessengerLauncher.js';\nimport { MessengerPanel } from './messenger/components/MessengerPanel.js';\nimport { ChangelogView } from './messenger/views/ChangelogView.js';\nimport { ChatView } from './messenger/views/ChatView.js';\nimport { ConversationsView } from './messenger/views/ConversationsView.js';\nimport { HelpView } from './messenger/views/HelpView.js';\nimport { HomeView } from './messenger/views/HomeView.js';\nimport { PreChatFormView } from './messenger/views/PreChatFormView.js';\n\nexport class MessengerWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'messenger' });\n\t\tconst resolvedTheme = options.theme || 'light';\n\t\tconst hasExplicitTextColor = Object.prototype.hasOwnProperty.call(\n\t\t\toptions,\n\t\t\t'textColor'\n\t\t);\n\t\tconst hasExplicitBackgroundColor = Object.prototype.hasOwnProperty.call(\n\t\t\toptions,\n\t\t\t'backgroundColor'\n\t\t);\n\t\tconst defaultTextColor =\n\t\t\tresolvedTheme === 'dark' ? '#E2E8F0' : '#1d1d1f';\n\t\tconst defaultBackgroundColor =\n\t\t\tresolvedTheme === 'dark' ? '#0F172A' : '#ffffff';\n\n\t\tconst resolvedEnableChangelog =\n\t\t\ttypeof options.enableChangelog === 'boolean'\n\t\t\t\t? options.enableChangelog\n\t\t\t\t: options.enableNews !== false;\n\n\t\tthis.messengerOptions = {\n\t\t\tposition: options.position || 'bottom-right',\n\t\t\ttheme: resolvedTheme,\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\ttextColor: hasExplicitTextColor ? options.textColor : defaultTextColor,\n\t\t\tbackgroundColor: hasExplicitBackgroundColor\n\t\t\t\t? options.backgroundColor\n\t\t\t\t: defaultBackgroundColor,\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: resolvedEnableChangelog,\n\t\t\tautoLoadData: options.autoLoadData !== false,\n\t\t\tinitialView: options.initialView || 'home',\n\t\t\tpreviewData: options.previewData || null,\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\t_applyPreviewData() {\n\t\tconst data = this.messengerOptions.previewData;\n\t\tif (!data || typeof data !== 'object') {\n\t\t\treturn;\n\t\t}\n\n\t\tif (Array.isArray(data.conversations)) {\n\t\t\tthis.messengerState.setConversations(data.conversations);\n\t\t}\n\n\t\tif (Array.isArray(data.helpArticles)) {\n\t\t\tthis.messengerState.setHelpArticles(data.helpArticles);\n\t\t}\n\n\t\tif (Array.isArray(data.homeChangelogItems)) {\n\t\t\tthis.messengerState.setHomeChangelogItems(data.homeChangelogItems);\n\t\t}\n\n\t\tif (Array.isArray(data.changelogItems)) {\n\t\t\tthis.messengerState.setChangelogItems(data.changelogItems);\n\t\t}\n\n\t\tif (typeof data.unreadCount === 'number') {\n\t\t\tthis.setUnreadCount(data.unreadCount);\n\t\t}\n\n\t\tif (data.availability && typeof data.availability === 'object') {\n\t\t\tconst availability = data.availability;\n\t\t\tthis.messengerState.agentsOnline = Boolean(\n\t\t\t\tavailability.agentsOnline ?? availability.agents_online\n\t\t\t);\n\t\t\tthis.messengerState.onlineCount =\n\t\t\t\tavailability.onlineCount ?? availability.online_count ?? 0;\n\t\t\tthis.messengerState.responseTime =\n\t\t\t\tavailability.responseTime ??\n\t\t\t\tavailability.response_time ??\n\t\t\t\tthis.messengerState.responseTime;\n\t\t\tthis.messengerState._notify('availabilityUpdate', availability);\n\t\t}\n\n\t\tif (typeof data.currentView === 'string') {\n\t\t\tthis.messengerState.setView(data.currentView);\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._applyPreviewData();\n\n\t\tif (this.messengerOptions.autoLoadData) {\n\t\t\tthis.loadInitialData();\n\n\t\t\tif (this.apiService?.sessionToken) {\n\t\t\t\tthis._initWebSocket();\n\t\t\t}\n\n\t\t\tthis.checkAgentAvailability();\n\n\t\t\tthis._availabilityInterval = setInterval(() => {\n\t\t\t\tthis.checkAgentAvailability();\n\t\t\t}, 60000);\n\t\t}\n\n\t\tif (\n\t\t\tthis.messengerOptions.initialView &&\n\t\t\tthis.messengerOptions.initialView !== this.messengerState.currentView\n\t\t) {\n\t\t\tthis.messengerState.setView(this.messengerOptions.initialView);\n\t\t}\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 normalized = String(hex || '').trim();\n\t\tif (!/^#?[0-9a-fA-F]{6}$/.test(normalized)) {\n\t\t\treturn normalized || '#000000';\n\t\t}\n\n\t\tconst num = parseInt(normalized.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\tconst darkSurface = adjustColor(backgroundColor, 12);\n\tconst darkSurfaceAlt = adjustColor(backgroundColor, 20);\n\tconst darkBorder = adjustColor(backgroundColor, 34);\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\n\t\t${\n\t\t\ttheme === 'dark'\n\t\t\t\t? `\n\t\t.messenger-widget.theme-dark .messenger-panel-content,\n\t\t.messenger-widget.theme-dark .messenger-home-view,\n\t\t.messenger-widget.theme-dark .messenger-nav,\n\t\t.messenger-widget.theme-dark .messenger-chat-compose,\n\t\t.messenger-widget.theme-dark .messenger-compose-attachments-preview,\n\t\t.messenger-widget.theme-dark .messenger-home-featured,\n\t\t.messenger-widget.theme-dark .messenger-chat-header {\n\t\t\tbackground: ${backgroundColor} !important;\n\t\t\tborder-color: ${darkBorder} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-view,\n\t\t.messenger-widget.theme-dark .messenger-chat-title,\n\t\t.messenger-widget.theme-dark .messenger-home-greeting,\n\t\t.messenger-widget.theme-dark .messenger-home-question,\n\t\t.messenger-widget.theme-dark .messenger-home-featured-content h3,\n\t\t.messenger-widget.theme-dark .messenger-home-featured-content p,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card-title,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card-desc,\n\t\t.messenger-widget.theme-dark .messenger-conversation-title,\n\t\t.messenger-widget.theme-dark .messenger-article-title,\n\t\t.messenger-widget.theme-dark .messenger-compose-input,\n\t\t.messenger-widget.theme-dark .messenger-message-sender,\n\t\t.messenger-widget.theme-dark .messenger-message-time,\n\t\t.messenger-widget.theme-dark .messenger-nav-label {\n\t\t\tcolor: ${textColor} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-view {\n\t\t\tbackground: linear-gradient(180deg, ${adjustColor(backgroundColor, 10)} 0%, ${backgroundColor} 55%) !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${adjustColor(primaryColor, 0, 0.12)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-message-btn,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card,\n\t\t.messenger-widget.theme-dark .messenger-compose-input-wrapper,\n\t\t.messenger-widget.theme-dark .messenger-message-received .messenger-message-bubble,\n\t\t.messenger-widget.theme-dark .messenger-message-file,\n\t\t.messenger-widget.theme-dark .messenger-prechat-card,\n\t\t.messenger-widget.theme-dark .messenger-list-item,\n\t\t.messenger-widget.theme-dark .messenger-article-item {\n\t\t\tbackground: ${darkSurface} !important;\n\t\t\tborder-color: ${darkBorder} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-home-message-btn:hover,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-card:hover,\n\t\t.messenger-widget.theme-dark .messenger-list-item:hover,\n\t\t.messenger-widget.theme-dark .messenger-article-item:hover {\n\t\t\tbackground: ${darkSurfaceAlt} !important;\n\t\t}\n\n\t\t.messenger-widget.theme-dark .messenger-message-own .messenger-message-bubble,\n\t\t.messenger-widget.theme-dark .messenger-compose-send,\n\t\t.messenger-widget.theme-dark .messenger-launcher-btn,\n\t\t.messenger-widget.theme-dark .messenger-nav-badge,\n\t\t.messenger-widget.theme-dark .messenger-launcher-badge,\n\t\t.messenger-widget.theme-dark .messenger-home-changelog-cover-text,\n\t\t.messenger-widget.theme-dark .messenger-attachment-remove {\n\t\t\tcolor: #FFFFFF !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\ttheme: options.theme || 'light',\n\t\t\tenabled:\n\t\t\t\ttypeof options.enabled === 'boolean' ? options.enabled : undefined,\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\tstatic removeDanglingElements() {\n\t\tif (typeof document === 'undefined') return;\n\n\t\tdocument\n\t\t\t.querySelectorAll(\n\t\t\t\t'.feedback-survey, .feedback-survey-backdrop, .feedback-survey-success, .feedback-sdk-notification'\n\t\t\t)\n\t\t\t.forEach((el) => {\n\t\t\t\tif (el && el.parentNode) {\n\t\t\t\t\tel.parentNode.removeChild(el);\n\t\t\t\t}\n\t\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\tif (this.options.enabled === false || this.surveyOptions.enabled === false) {\n\t\t\tthis.sdk.eventBus.emit('survey:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\tsurveyId: this.surveyOptions.surveyId,\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tSurveyWidget.removeDanglingElements();\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\tif (!config) return;\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 feedback-survey-backdrop-${this.surveyOptions.theme}`;\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} feedback-survey-theme-${this.surveyOptions.theme}${\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 && this.surveyOptions.pages.length > 1 ? `<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-list\">\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 feedback-survey-ces-list-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] || null;\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\tconst page = this._getCurrentPage();\n\t\t\tif (page && page.type === 'link') {\n\t\t\t\treturn false;\n\t\t\t}\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 null;\n\t\t}\n\n\t\treturn {\n\t\t\ttitle: page.title || '',\n\t\t\tdescription: page.description || '',\n\t\t\thtml: this._renderSurveyPage(page),\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\tcase 'link':\n\t\t\t\treturn this._renderLinkPage(page);\n\t\t\tdefault:\n\t\t\t\treturn '';\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 topSurveyType = this.surveyOptions.surveyType;\n\t\tconst configType = config.survey_type;\n\t\tlet ratingType;\n\t\tif (topSurveyType === 'ces') {\n\t\t\tratingType = 'ces';\n\t\t} else if (topSurveyType === 'nps') {\n\t\t\tratingType = 'nps';\n\t\t} else if (topSurveyType === 'csat' && !configType) {\n\t\t\tratingType = 'emoji';\n\t\t} else {\n\t\t\tratingType = configType || topSurveyType || 'csat';\n\t\t}\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 === 'ces') {\n\t\t\tconst cesLabels = ['Very Difficult', 'Difficult', 'Neutral', 'Easy', 'Very Easy'];\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-ces-list\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${cesLabels\n\t\t\t\t\t\t.map((label, 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-ces-list-btn${selected}\" data-page-id=\"${pageId}\" data-score=\"${score}\">${label}</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`;\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 ||\n\t\t\tconfig.multiple === true ||\n\t\t\tconfig.allow_multiple_selection === 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\t\tconst placeholder = page.placeholder || 'Type your answer...';\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=\"${placeholder}\">${value}</textarea>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderLinkPage(page) {\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\n\t\tconst config = page.link_config || page.linkConfig || {};\n\t\tconst buttonText = config.button_text || config.buttonText || 'Click here';\n\t\tconst linkText = config.link_text || config.linkText || '';\n\t\tconst redirectUrl = config.redirect_url || config.redirectUrl || '#';\n\t\tconst openIn = config.open_in || config.openIn || 'new_tab';\n\t\tconst target = openIn === 'new_tab' ? '_blank' : '_self';\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst clicked = pageAnswer.clicked === true;\n\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-link-page\" data-page-id=\"${pageId}\">\n\t\t\t\t${linkText ? `<p class=\"feedback-survey-link-text\">${linkText}</p>` : ''}\n\t\t\t\t<a class=\"feedback-survey-link-btn${clicked ? ' selected' : ''}\"\n\t\t\t\t href=\"${redirectUrl}\"\n\t\t\t\t target=\"${target}\"\n\t\t\t\t rel=\"noopener noreferrer\"\n\t\t\t\t data-page-id=\"${pageId}\">\n\t\t\t\t\t${buttonText}\n\t\t\t\t</a>\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\n\t\tif (page.type === 'link') {\n\t\t\tthis.surveyElement\n\t\t\t\t.querySelectorAll('.feedback-survey-link-btn')\n\t\t\t\t.forEach((btn) => {\n\t\t\t\t\tbtn.addEventListener('click', () => {\n\t\t\t\t\t\tconst pId = btn.dataset.pageId;\n\t\t\t\t\t\tthis._setPageAnswer(pId, { clicked: true });\n\t\t\t\t\t\tbtn.classList.add('selected');\n\n\t\t\t\t\t\tconst navigation = page.afterThisPage || page.after_this_page;\n\t\t\t\t\t\tconst goesTo = navigation ? navigation.default : null;\n\t\t\t\t\t\tif (!goesTo || goesTo === 'end_survey') {\n\t\t\t\t\t\t\tsetTimeout(() => this._handleSubmit(), 400);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t}\n\t}\n\n\t_selectNPS(score) {\n\t\tthis.surveyState.score = score;\n\t\tthis.surveyElement\n\t\t\t.querySelectorAll('.feedback-survey-nps-btn')\n\t\t\t.forEach((btn) => {\n\t\t\t\tconst btnScore = parseInt(btn.dataset.score);\n\t\t\t\tif (btnScore === score) {\n\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t} else {\n\t\t\t\t\tbtn.classList.remove('selected');\n\t\t\t\t}\n\t\t\t});\n\t\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\tif (page.type === 'link') {\n\t\t\tif (page.required && !answer.clicked) {\n\t\t\t\tthis._showError('Please click the link to continue');\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.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><path d=\"M236.8,188.09,149.35,36a24.76,24.76,0,0,0-42.7,0L19.2,188.09a23.51,23.51,0,0,0,0,23.72A24.35,24.35,0,0,0,40.55,224h174.9a24.35,24.35,0,0,0,21.33-12.19A23.51,23.51,0,0,0,236.8,188.09ZM120,104a8,8,0,0,1,16,0v40a8,8,0,0,1-16,0Zm8,88a12,12,0,1,1,12-12A12,12,0,0,1,128,192Z\" fill=\"currentColor\"/></svg><span>${message}</span>`;\n\n\t\tthis.surveyElement.prepend(error);\n\n\t\tsetTimeout(() => error.remove(), 3000);\n\t}\n\n\t_showSuccessNotification() {\n\t\tconst notification = document.createElement('div');\n\t\tnotification.className =\n\t\t\t'feedback-sdk-notification feedback-sdk-notification-success';\n\t\tnotification.innerHTML = `\n\t\t\t<div>\n\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 256 256\"><path d=\"M173.66,98.34a8,8,0,0,1,0,11.32l-56,56a8,8,0,0,1-11.32,0l-24-24a8,8,0,0,1,11.32-11.32L112,148.69l50.34-50.35A8,8,0,0,1,173.66,98.34ZM232,128A104,104,0,1,1,128,24,104.11,104.11,0,0,1,232,128Zm-16,0a88,88,0,1,0-88,88A88.1,88.1,0,0,0,216,128Z\" fill=\"currentColor\"/></svg>\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, immediate = false) {\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\tif (immediate) {\n\t\t\t\tif (surveyEl.parentNode) {\n\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (surveyEl && surveyEl.parentNode) {\n\t\t\t\t\t\tsurveyEl.parentNode.removeChild(surveyEl);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\n\t\t\tthis.surveyElement = null;\n\t\t}\n\n\t\tif (backdropEl) {\n\t\t\tbackdropEl.style.opacity = '0';\n\t\t\tif (immediate) {\n\t\t\t\tif (backdropEl.parentNode) {\n\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tif (backdropEl && backdropEl.parentNode) {\n\t\t\t\t\t\tbackdropEl.parentNode.removeChild(backdropEl);\n\t\t\t\t\t}\n\t\t\t\t}, 300);\n\t\t\t}\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(true, true);\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 widgetEnabled = this._isWidgetEnabled(type, {\n\t\t\t...widgetConfig,\n\t\t\t...explicitOptions,\n\t\t});\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\tenabled: widgetEnabled,\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\tenabled: surveyConfig.enabled,\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\t\tconst surveyEnabled = this._isWidgetEnabled('survey', normalizedOptions);\n\n\t\tif (!surveyEnabled) {\n\t\t\tthis.eventBus.emit('survey:suppressed', {\n\t\t\t\tsurveyId:\n\t\t\t\t\tnormalizedOptions.surveyId || normalizedOptions.id || options.id || null,\n\t\t\t\treason: 'disabled',\n\t\t\t\tsurvey: normalizedOptions,\n\t\t\t});\n\t\t\treturn null;\n\t\t}\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\tenabled: surveyEnabled,\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.surveyType ||\n\t\t\tsurvey.survey_type ||\n\t\t\tsurvey.type ||\n\t\t\tthis._inferSurveyTypeFromPage(firstPage) ||\n\t\t\t'nps';\n\n\t\treturn {\n\t\t\t...survey,\n\t\t\tsurveyId: survey.surveyId || survey.survey_id || survey.id || null,\n\t\t\tsurveyType: survey.surveyType || survey.survey_type || inferredType,\n\t\t\ttype: survey.type || survey.survey_type || inferredType,\n\t\t\tenabled:\n\t\t\t\ttypeof survey.enabled === 'boolean' ? survey.enabled : undefined,\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:\n\t\t\t\tsurvey.customQuestions ||\n\t\t\t\tsurvey.custom_questions ||\n\t\t\t\tsurvey.questions ||\n\t\t\t\t[],\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\tplaceholder: page.placeholder || '',\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\tconst lowLabel = (ratingConfig.low_label || '').toLowerCase();\n\t\tif (\n\t\t\tsurveyType === 'ces' ||\n\t\t\ttitle.includes('effort') ||\n\t\t\ttitle.includes('easy') ||\n\t\t\tlowLabel.includes('difficult')\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_isWidgetEnabled(type, options = {}) {\n\t\tconst typeConfig = this._getWidgetTypeConfig(type);\n\t\tif (typeConfig.enabled === false) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (typeof options.enabled === 'boolean') {\n\t\t\treturn options.enabled;\n\t\t}\n\n\t\tif (typeof typeConfig.enabled === 'boolean') {\n\t\t\treturn typeConfig.enabled;\n\t\t}\n\n\t\treturn true;\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\tshowBackdrop: true,\n\t\t};\n\n\t\tconst configDefaults = this._getWidgetTypeConfig('changelog');\n\t\tconst explicitOptions = this._omitUndefined(options);\n\t\tconst changelogEnabled = this._isWidgetEnabled('changelog', explicitOptions);\n\n\t\tif (!changelogEnabled) {\n\t\t\tthis.eventBus.emit('widget:suppressed', {\n\t\t\t\ttype: 'changelog',\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn null;\n\t\t}\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\tenabled: changelogEnabled,\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","trigger_type","pages","type","placeholder","rating_config","scale","low_label","high_label","survey_type","multiple_choice_config","link_config","after_this_page","default","conditions","required","allow_multiple_selection","options","label","button_text","link_text","redirect_url","open_in","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","_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","initData","_extractInitResponseData","configVersion","error","session_token","Number","expires_in","isFinite","config_version","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","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","eventBus","widget","reason","_hasRecentlySubmitted","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","themeClass","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","notification","closeNotification","opacity","openModal","closeModal","ButtonWidget","isMinimized","_hiddenForOpenPanel","buttonText","triggerText","button","assign","minimizeIcon","expandIcon","openIfAllowed","Element","Boolean","closest","isControlIcon","stopPropagation","minimize","restore","pointerType","shouldRestoreButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","listModalBackdropElement","currentIndex","trigger","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","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","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","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","resolvedTheme","hasExplicitTextColor","prototype","call","hasExplicitBackgroundColor","defaultTextColor","defaultBackgroundColor","resolvedEnableChangelog","enableNews","messengerOptions","autoLoadData","initialView","previewData","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","messengerState","launcher","wsService","_wsUnsubscribers","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","zIndex","styleElement","getElementById","head","adjustColor","percent","alpha","normalized","String","num","r","max","g","b","padStart","darkSurface","darkSurfaceAlt","darkBorder","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","_applyPreviewData","availability","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","showFeedbackInput","showSubmitButton","autoSubmitOnSelect","showTitle","showDescription","customQuestions","onSubmit","onDismiss","surveyState","score","customAnswers","pageAnswers","currentPageIndex","isVisible","removeDanglingElements","el","_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","nps","_renderScaleLabels","csat","emoji","ces","custom","_renderCustomQuestions","rawScale","low","high","_isRatingSurveyType","_shouldAutoSubmitOnSelect","_getCurrentPage","_renderSurveyPage","_renderRatingPage","_renderMultipleChoicePage","_renderTextPage","_renderLinkPage","pageId","ratingConfig","topSurveyType","configType","ratingType","currentRating","defaultLowLabel","defaultHighLabel","usesSegmentedScale","buttonClass","multipleChoiceConfig","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","linkConfig","linkText","redirectUrl","openIn","clicked","_renderQuestionInput","freq","question","opt","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","_setPageAnswer","existing","existingValues","nextValues","v","pId","navigation","afterThisPage","goesTo","_maybeAutoSubmit","frequency","_validateCurrentPage","nextPageIndex","_getNextPageIndex","normalizedPageAnswers","_normalizePageAnswersForSubmit","mergedAnswers","page_answers","_getSubmissionRating","_showSuccessNotification","answer","hasSingle","hasMany","fallbackNext","nextValue","normalizedId","pageIndex","output","sdkUserContext","apiUserContext","localUserContext","prepend","transition","resetState","immediate","surveyEl","backdropEl","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","FeedbackSDK","_validateAndMergeConfig","initialized","siteId","debug","alreadyInitialized","createWidget","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","widgetEnabled","_isWidgetEnabled","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","surveyEnabled","surveyWidget","_getSurveyField","eligibilityShouldShow","eligibility","eligible","isAnswered","eligibilityAnswered","explicitReason","eligibilityReason","firstPage","inferredType","_inferSurveyTypeFromPage","should_show","custom_questions","_normalizeSurveyPages","fields","widgetsConfig","_isPlainObject","mergedTypeConfig","_toCamelCaseObject","typeConfig","_toCamelCaseKey","nestedValue","fromEntries","showChangelog","defaults","configDefaults","changelogEnabled","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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"}
|