@product7/product7-js 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -3
- package/dist/README.md +11 -3
- package/dist/product7-js.js +6 -12
- package/dist/product7-js.js.map +1 -1
- package/dist/product7-js.min.js +1 -1
- package/dist/product7-js.min.js.map +1 -1
- package/package.json +1 -1
- package/src/utils/NotificationSound.js +4 -4
- package/src/utils/notificationSoundData.js +1 -0
- package/src/widgets/MessengerWidget.js +3 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"product7-js.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/utils/NotificationSound.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/Product7.js","../src/styles/styles.js","../src/index.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: {\n\t\t\t\t\tscale: 11,\n\t\t\t\t\tlow_label: 'Very unlikely',\n\t\t\t\t\thigh_label: 'Very likely',\n\t\t\t\t\tsurvey_type: 'nps',\n\t\t\t\t},\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: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very dissatisfied',\n\t\t\t\t\thigh_label: 'Very satisfied',\n\t\t\t\t\tsurvey_type: 'emoji',\n\t\t\t\t},\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: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very difficult',\n\t\t\t\t\thigh_label: 'Very easy',\n\t\t\t\t\tsurvey_type: 'ces',\n\t\t\t\t},\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:\n\t\t\t\t\t'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:\n\t\t\t\t\t'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 contact = this.api.getContactIdentity();\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardName,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\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\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.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 uploadFile(base64Data, filename) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this.api._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.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.api.identify(data);\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true, data: { rated: true } };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/rating`,\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(data),\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('[Product7 Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[Product7 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 metadata =\n\t\t\ttypeof this.api.getMetadata === 'function'\n\t\t\t\t? this.api.getMetadata() || {}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\trespondent_id:\n\t\t\t\tcontext.respondentId || context.userId || metadata.user_id || null,\n\t\t\temail: context.email || metadata.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\t\tconst contact = this.api.getContactIdentity?.() || null;\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\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\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.metadata = config.metadata || null;\n\t\tthis.identitySyncedToken = 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\tthis._loadStoredMetadata();\n\t\tif (this.isSessionValid() && this.metadata) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t}\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\tlet env = this.env;\n\t\tif (!env || env === 'production') {\n\t\t\tconst hostname =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.hostname) || '';\n\t\t\tconst port =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.port) || '';\n\t\t\tif (hostname.includes('staging')) {\n\t\t\t\tenv = 'staging';\n\t\t\t} else if (hostname === 'app.localhost' && port === '3005') {\n\t\t\t\tenv = 'localstack';\n\t\t\t}\n\t\t}\n\n\t\tconst envConfig = ENV_URLS[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(metadata = undefined) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\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) {\n\t\t\tthrow new APIError(400, 'Missing workspace for initialization');\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.identitySyncedToken = null;\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\tboardName: '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};\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.identitySyncedToken = null;\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'\n\t\t\t\t? response.data\n\t\t\t\t: 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\tawait this._restoreIdentity();\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\tasync identify(metadata = this.metadata) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\n\t\t}\n\n\t\tif (!this.metadata) {\n\t\t\tthrow new APIError(400, 'Missing user context for identify');\n\t\t}\n\n\t\tawait this._ensureSession();\n\n\t\tconst payload = this._buildIdentifyPayload(this.metadata);\n\n\t\tif (this.mock) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tidentified: true,\n\t\t\t\tdata: {\n\t\t\t\t\tuser_id: payload.user_id || null,\n\t\t\t\t\temail: payload.email || null,\n\t\t\t\t\tname: payload.name || null,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst response = await this._makeRequest('/widget/identify', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(payload),\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});\n\n\t\tthis.identitySyncedToken = this.sessionToken;\n\t\treturn response;\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\tsetMetadata(metadata) {\n\t\tthis.metadata = metadata || null;\n\t\tthis.identitySyncedToken = null;\n\t\tif (this.metadata) {\n\t\t\tthis._storeData('product7_metadata', this.metadata);\n\t\t} else {\n\t\t\tthis._removeData('product7_metadata');\n\t\t}\n\t}\n\n\tgetMetadata() {\n\t\treturn this.metadata;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.identitySyncedToken = null;\n\t\tthis.contactId = null;\n\t\tthis.contactEmail = null;\n\t\tthis.contactName = null;\n\t\tthis._removeData('product7_session');\n\t\tthis._removeData('product7_metadata');\n\t\tthis._removeData('product7_contact');\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('product7_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('product7_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('product7_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.workspace &&\n\t\t\t\tsessionData.workspace &&\n\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t) {\n\t\t\t\tlocalStorage.removeItem('product7_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\t_loadStoredMetadata() {\n\t\tif (this.metadata || typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst session = localStorage.getItem('product7_session');\n\t\t\tif (session) {\n\t\t\t\tconst sessionData = JSON.parse(session);\n\t\t\t\tif (\n\t\t\t\t\tthis.workspace &&\n\t\t\t\t\tsessionData.workspace &&\n\t\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stored = localStorage.getItem('product7_metadata');\n\t\t\tif (!stored) return false;\n\n\t\t\tthis.metadata = JSON.parse(stored);\n\t\t\treturn true;\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\t_buildIdentifyPayload(metadata = {}) {\n\t\tconst payload = {\n\t\t\tuser_id: metadata.user_id,\n\t\t\temail: metadata.email,\n\t\t\tname: metadata.name,\n\t\t\tavatar:\n\t\t\t\tmetadata.profile_picture || metadata.avatar_url || metadata.avatar,\n\t\t\tattributes: metadata.custom_fields || {},\n\t\t};\n\n\t\tif (metadata.company) {\n\t\t\tpayload.company = metadata.company;\n\t\t}\n\n\t\treturn payload;\n\t}\n\n\tasync _restoreIdentity() {\n\t\tif (\n\t\t\t!this.metadata ||\n\t\t\t!this.sessionToken ||\n\t\t\t!this.identitySyncedToken ||\n\t\t\tthis.identitySyncedToken === this.sessionToken\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.identify(this.metadata);\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\treturn this.messenger.checkAgentsOnline();\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\treturn this.messenger.startConversation(data);\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\treturn this.messenger.sendMessage(conversationId, data);\n\t}\n\n\tasync uploadFile(base64Data, filename) {\n\t\treturn this.messenger.uploadFile(base64Data, filename);\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 identify(metadata) {\n\t\tawait this._ensureSession();\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((r) => setTimeout(r, 300));\n\t\t\tconst mockResponse = {\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: metadata.email || '',\n\t\t\t\t\tname: metadata.name || '',\n\t\t\t\t\tavatar: metadata.avatar || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis._storeContactIdentity(mockResponse.data, metadata);\n\t\t\treturn mockResponse;\n\t\t}\n\n\t\tconst payload = {};\n\n\t\tif (metadata.email) payload.email = metadata.email;\n\t\tif (metadata.user_id) payload.user_id = metadata.user_id;\n\t\tif (metadata.name) payload.name = metadata.name;\n\t\tif (metadata.avatar) payload.avatar = metadata.avatar;\n\t\tif (metadata.attributes) payload.attributes = metadata.attributes;\n\t\tif (metadata.company) payload.company = metadata.company;\n\n\t\tconst response = await this._makeRequest('/widget/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.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\n\t\tif (response?.status && response?.data) {\n\t\t\tthis._storeContactIdentity(response.data, metadata);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t_storeContactIdentity(data, metadata = {}) {\n\t\tthis.contactId = data.contact_id || null;\n\t\tthis.contactEmail = data.email || metadata.email || null;\n\t\tthis.contactName = data.name || metadata.name || null;\n\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\t'product7_contact',\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tcontactId: this.contactId,\n\t\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\t\tcontactName: this.contactName,\n\t\t\t\t})\n\t\t\t);\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\t}\n\n\tgetContactIdentity() {\n\t\tif (this.contactId) {\n\t\t\treturn {\n\t\t\t\tcontactId: this.contactId,\n\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\tcontactName: this.contactName,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('product7_contact');\n\t\t\tif (stored) {\n\t\t\t\tconst parsed = JSON.parse(stored);\n\t\t\t\tthis.contactId = parsed.contactId;\n\t\t\t\tthis.contactEmail = parsed.contactEmail;\n\t\t\t\tthis.contactName = parsed.contactName;\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.identify(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","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('[Product7] 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\tboardName: this.sdk.config.boardName,\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\ttrigger: true,\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\n\t\t// Bind to a custom trigger element if a selector or element was provided\n\t\tif (this.options.trigger && this.options.trigger !== true) {\n\t\t\tconst triggerEl =\n\t\t\t\ttypeof this.options.trigger === 'string'\n\t\t\t\t\t? document.querySelector(this.options.trigger)\n\t\t\t\t\t: this.options.trigger instanceof Element\n\t\t\t\t\t\t? this.options.trigger\n\t\t\t\t\t\t: null;\n\t\t\tif (triggerEl) {\n\t\t\t\ttriggerEl.addEventListener('click', () => this.open());\n\t\t\t}\n\t\t}\n\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\tthis._renderPanel();\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.panelElement) {\n\t\t\t\tthis.panelElement.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\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\tthis.state.isOpen = false;\n\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\tthis.panelElement = null;\n\t\t}\n\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\t\tthis._resetForm();\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.boardName,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.title.trim()) {\n\t\t\t\tthis._showError('Please enter a title.');\n\t\t\t\treturn;\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._showSuccessInPanel();\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\tboardName: this.options.boardName,\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\tconst isLeftPosition =\n\t\t\tmodeClass === 'feedback-panel' &&\n\t\t\tString(this.options.position).includes('left');\n\t\tconst directionClass = isLeftPosition ? 'panel-from-left' : '';\n\t\tthis.panelElement.className =\n\t\t\t`${modeClass} ${sizeClass} ${themeClass} ${directionClass}`.trim();\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--color-primary',\n\t\t\tthis.options.primaryColor\n\t\t);\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 <iconify-icon icon=\"ph:x-duotone\" width=\"18\" height=\"18\"></iconify-icon>\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 <span class=\"sdk-required\">*</span></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 <span class=\"sdk-required\">*</span></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.disabled = this.state.isSubmitting;\n\t\t\t\tsubmitBtn.innerHTML = this.state.isSubmitting\n\t\t\t\t\t? `<iconify-icon icon=\"ph:circle-notch\" width=\"16\" height=\"16\" style=\"animation: spin 0.8s linear infinite;\"></iconify-icon> Sending...`\n\t\t\t\t\t: `Send Feedback`;\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_showSuccessInPanel() {\n\t\tif (!this.panelElement) return;\n\n\t\tconst content = this.panelElement.querySelector('.feedback-panel-content');\n\t\tif (!content) return;\n\n\t\tcontent.innerHTML = `\n\t\t\t<div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; padding: 40px 24px; text-align: center;\">\n\t\t\t\t<div style=\"width: 56px; height: 56px; border-radius: 50%; background: #037F0C; display: flex; align-items: center; justify-content: center; margin-bottom: 20px;\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"24\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<polyline points=\"216,72 96,192 40,136\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3 style=\"margin: 0 0 8px; font-size: 1.25rem; font-weight: 600; color: var(--feedback-panel-text, #1d1d1f);\">Thank you!</h3>\n\t\t\t\t<p style=\"margin: 0; font-size: 0.875rem; color: #6b7280; line-height: 1.5;\">Your feedback has been submitted successfully.</p>\n\t\t\t</div>\n\t\t`;\n\n\t\tsetTimeout(() => this.closePanel(), 2000);\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\topen() {\n\t\tthis.openPanel();\n\t\treturn this;\n\t}\n\n\tclose() {\n\t\tthis.closePanel();\n\t\treturn this;\n\t}\n\n\ttoggle() {\n\t\tif (this.state.isOpen) {\n\t\t\tthis.closePanel();\n\t\t} else {\n\t\t\tthis.openPanel();\n\t\t}\n\t\treturn this;\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_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_render() {\n\t\tif (!this._hasTrigger()) {\n\t\t\t// No built-in button — widget is opened programmatically or via custom trigger\n\t\t\tconst placeholder = document.createElement('div');\n\t\t\tplaceholder.style.display = 'none';\n\t\t\treturn placeholder;\n\t\t}\n\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\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-8,144H40V74.19l82.59,75.71a8,8,0,0,0,10.82,0L216,74.19V192Z\"/>\n </svg>\n <span class=\"feedback-text\">${buttonText}</span>\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\tif (!this._hasTrigger()) return;\n\n\t\tconst button = this.element.querySelector('.feedback-trigger-btn');\n\n\t\tbutton.addEventListener('click', () => {\n\t\t\tthis.openPanel();\n\t\t});\n\n\t\tbutton.addEventListener('pointerup', (e) => {\n\t\t\tif (e.pointerType === 'mouse') return;\n\t\t\tthis.openPanel();\n\t\t});\n\t}\n\n\topenPanel() {\n\t\tif (this._hasTrigger() && !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 && !this.options._noTriggerButton) {\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+/,\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_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_render() {\n\t\tif (!this._hasTrigger()) {\n\t\t\tconst placeholder = document.createElement('div');\n\t\t\tplaceholder.style.display = 'none';\n\t\t\treturn placeholder;\n\t\t}\n\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\tif (!this._hasTrigger()) return;\n\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\">\n\t\t\t\t\t<iconify-icon icon=\"ph:x-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t\t</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\t<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-list-modal-body\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.listModalElement);\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-container')\n\t\t\t.addEventListener('click', (e) => e.stopPropagation());\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-close')\n\t\t\t.addEventListener('click', () => this.closeSidebar());\n\n\t\tthis._listModalEscapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') this.closeSidebar();\n\t\t};\n\t\tdocument.addEventListener('keydown', this._listModalEscapeHandler);\n\t}\n\n\t_renderChangelogList() {\n\t\tconst body = this.listModalElement.querySelector(\n\t\t\t'.changelog-list-modal-body'\n\t\t);\n\n\t\tif (this.isLoading) return;\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tbody.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tbody.innerHTML = `\n\t\t\t<div class=\"changelog-list\">\n\t\t\t\t${this.changelogs.map((changelog, index) => this._renderChangelogListItem(changelog, index)).join('')}\n\t\t\t</div>\n\t\t`;\n\n\t\tbody.querySelectorAll('.changelog-list-item').forEach((item, index) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(this.changelogs[index]);\n\t\t\t});\n\t\t});\n\t}\n\n\t_renderChangelogListItem(changelog, index) {\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst date = changelog.published_at\n\t\t\t? this._formatDate(changelog.published_at)\n\t\t\t: '';\n\t\tconst description = this._stripHtml(\n\t\t\tchangelog.excerpt || changelog.description\n\t\t);\n\t\tconst labelsHTML =\n\t\t\tchangelog.labels && changelog.labels.length > 0\n\t\t\t\t? `<div class=\"changelog-list-item-labels\">\n\t\t\t\t\t\t${changelog.labels\n\t\t\t\t\t\t\t.map(\n\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)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>`\n\t\t\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-content\">\n\t\t\t\t\t<div class=\"changelog-list-item-meta\">\n\t\t\t\t\t\t${date ? `<span class=\"changelog-list-item-date\">${date}</span>` : ''}\n\t\t\t\t\t\t${labelsHTML}\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3 class=\"changelog-list-item-title\">${changelog.title}</h3>\n\t\t\t\t\t${description ? `<p class=\"changelog-list-item-description\">${description}</p>` : ''}\n\t\t\t\t</div>\n\t\t\t\t${hasImage ? `<div class=\"changelog-list-item-image\"><img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" /></div>` : ''}\n\t\t\t\t<iconify-icon icon=\"ph:caret-right\" class=\"changelog-list-item-arrow\" width=\"16\" height=\"16\"></iconify-icon>\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._stripHtml(\n\t\t\tchangelog.excerpt || changelog.description\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<iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>\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\topen() {\n\t\tthis.openSidebar();\n\t\treturn this;\n\t}\n\n\tclose() {\n\t\tthis.closeSidebar();\n\t\treturn this;\n\t}\n\n\ttoggle() {\n\t\tif (this.state.isOpen) {\n\t\t\tthis.closeSidebar();\n\t\t} else {\n\t\t\tthis.openSidebar();\n\t\t}\n\t\treturn this;\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\n\t\t// Bind to a custom trigger element if provided\n\t\tif (this.options.trigger && this.options.trigger !== true) {\n\t\t\tconst triggerEl =\n\t\t\t\ttypeof this.options.trigger === 'string'\n\t\t\t\t\t? document.querySelector(this.options.trigger)\n\t\t\t\t\t: this.options.trigger instanceof Element\n\t\t\t\t\t\t? this.options.trigger\n\t\t\t\t\t\t: null;\n\t\t\tif (triggerEl) {\n\t\t\t\ttriggerEl.addEventListener('click', () => this.open());\n\t\t\t}\n\t\t}\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 * NotificationSound — plays a soft ping when a new agent message arrives.\n *\n * Default: the bundled notification-sound.mp3 (inlined as base64 at build time).\n * Falls back to a Web Audio API synthetic chime if the file was not bundled.\n * Override: pass `soundUrl` (MP3/OGG/WAV URL or base64 data URI) to use a different file.\n */\nimport BUNDLED_SOUND from 'virtual:notification-sound';\n\nexport class NotificationSound {\n\tconstructor({ soundUrl = BUNDLED_SOUND, volume = 0.4 } = {}) {\n\t\tthis._soundUrl = soundUrl;\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t\tthis._enabled = true;\n\t\tthis._audioCtx = null;\n\t\tthis._audioBuffer = null;\n\t\tthis._loadPromise = null;\n\n\t\tif (soundUrl) {\n\t\t\tthis._loadPromise = this._loadAudioFile(soundUrl);\n\t\t}\n\t}\n\n\tsetEnabled(enabled) {\n\t\tthis._enabled = Boolean(enabled);\n\t}\n\n\tsetVolume(volume) {\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t}\n\n\tasync play() {\n\t\tif (!this._enabled) return;\n\t\tif (typeof window === 'undefined') return;\n\n\t\ttry {\n\t\t\tif (this._soundUrl) {\n\t\t\t\tawait this._playFile();\n\t\t\t} else {\n\t\t\t\tthis._playSynthetic();\n\t\t\t}\n\t\t} catch {\n\t\t\t/* autoplay policy or context suspended — silent fail */\n\t\t}\n\t}\n\n\t// ── Private ────────────────────────────────────────────────────────────────\n\n\t_getAudioContext() {\n\t\tif (!this._audioCtx || this._audioCtx.state === 'closed') {\n\t\t\tconst AudioContext = window.AudioContext || window.webkitAudioContext;\n\t\t\tif (!AudioContext) return null;\n\t\t\tthis._audioCtx = new AudioContext();\n\t\t}\n\t\treturn this._audioCtx;\n\t}\n\n\t/**\n\t * Synthetic two-tone chime via Web Audio API — no file required.\n\t * • First tone: 880 Hz, 0–80 ms\n\t * • Second tone: 1100 Hz, 60–160 ms\n\t * Sounds like a gentle message ping.\n\t */\n\t_playSynthetic() {\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tctx.resume().catch(() => {});\n\t\t}\n\n\t\tconst now = ctx.currentTime;\n\t\tconst vol = this._volume;\n\n\t\tconst tones = [\n\t\t\t{ freq: 880, start: 0, end: 0.08 },\n\t\t\t{ freq: 1100, start: 0.06, end: 0.16 },\n\t\t];\n\n\t\ttones.forEach(({ freq, start, end }) => {\n\t\t\tconst osc = ctx.createOscillator();\n\t\t\tconst gain = ctx.createGain();\n\n\t\t\tosc.type = 'sine';\n\t\t\tosc.frequency.value = freq;\n\n\t\t\tgain.gain.setValueAtTime(0, now + start);\n\t\t\tgain.gain.linearRampToValueAtTime(vol, now + start + 0.01);\n\t\t\tgain.gain.linearRampToValueAtTime(0, now + end);\n\n\t\t\tosc.connect(gain);\n\t\t\tgain.connect(ctx.destination);\n\n\t\t\tosc.start(now + start);\n\t\t\tosc.stop(now + end + 0.01);\n\t\t});\n\t}\n\n\tasync _loadAudioFile(url) {\n\t\ttry {\n\t\t\tconst ctx = this._getAudioContext();\n\t\t\tif (!ctx) return;\n\n\t\t\tconst response = await fetch(url);\n\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\tthis._audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\t\t} catch {\n\t\t\t/* failed to load — fall back to synthetic */\n\t\t\tthis._soundUrl = null;\n\t\t}\n\t}\n\n\tasync _playFile() {\n\t\tif (this._loadPromise) {\n\t\t\tawait this._loadPromise;\n\t\t\tthis._loadPromise = null;\n\t\t}\n\n\t\tif (!this._audioBuffer) {\n\t\t\tthis._playSynthetic();\n\t\t\treturn;\n\t\t}\n\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tawait ctx.resume();\n\t\t}\n\n\t\tconst source = ctx.createBufferSource();\n\t\tconst gain = ctx.createGain();\n\n\t\tsource.buffer = this._audioBuffer;\n\t\tgain.gain.value = this._volume;\n\n\t\tsource.connect(gain);\n\t\tgain.connect(ctx.destination);\n\t\tsource.start();\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.metadata = options.metadata || 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.onlineMessage = options.onlineMessage || \"We're online now\";\n\t\tthis.responseTime =\n\t\t\toptions.responseTime || 'We typically reply 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, metadata = null) {\n\t\tthis.isIdentified = isIdentified;\n\t\tif (metadata) {\n\t\t\tthis.metadata = { ...this.metadata, ...metadata };\n\t\t}\n\t\tthis._notify('identificationChange', { isIdentified, metadata });\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\tconst previousView = this.currentView;\n\t\tthis.currentView = 'home';\n\t\tthis.activeConversationId = null;\n\t\tthis.helpSearchQuery = '';\n\t\tif (previousView !== 'home') {\n\t\t\tthis._notify('viewChange', { previousView, currentView: 'home' });\n\t\t}\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 || '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 <iconify-icon icon=\"ph:chats-circle-duotone\" width=\"24\" height=\"24\"></iconify-icon>\n </span>\n <span class=\"messenger-launcher-icon messenger-launcher-icon-close\" style=\"display: none;\">\n <iconify-icon icon=\"ph:caret-down-bold\" width=\"22\" height=\"22\"></iconify-icon>\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 || '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\t\tconst navContainer = this.element.querySelector('.messenger-panel-nav');\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\n\t\t// Hide nav in chat and prechat views\n\t\tif (navContainer) {\n\t\t\tconst hideNav =\n\t\t\t\tthis.state.currentView === 'chat' ||\n\t\t\t\tthis.state.currentView === 'prechat';\n\t\t\tnavContainer.style.display = hideNav ? 'none' : '';\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\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}\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 messenger-mobile-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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_stripHtml(html) {\n\t\tif (!html) return '';\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_renderChangelogCard(item) {\n\t\treturn `\n\t\t\t<div class=\"messenger-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${item.coverImage ? `<div class=\"messenger-changelog-thumb\"><img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.parentElement.style.display='none';\" /></div>` : ''}\n\t\t\t\t<div class=\"messenger-changelog-content\">\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._stripHtml(item.description)}</p>` : ''}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_getContrastColor(hexColor) {\n\t\tconst hex = hexColor.replace('#', '');\n\t\tconst r = parseInt(hex.substring(0, 2), 16);\n\t\tconst g = parseInt(hex.substring(2, 4), 16);\n\t\tconst b = parseInt(hex.substring(4, 6), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#374151' : '#ffffff';\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\tconst mobileCloseBtn = this.element.querySelector(\n\t\t\t'.messenger-changelog-close-btn'\n\t\t);\n\t\tif (mobileCloseBtn) {\n\t\t\tmobileCloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\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\tthis._emojiPickerOpen = false;\n\t\tthis._emojiOutsideHandler = null;\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 (type === 'connectionChange') {\n\t\t\t\tconst banner = this.element?.querySelector(\n\t\t\t\t\t'.messenger-connection-banner'\n\t\t\t\t);\n\t\t\t\tif (banner) {\n\t\t\t\t\tbanner.style.display = data.connected ? 'none' : 'flex';\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\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} 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: this._renderGroupedMessages(messages);\n\n\t\tconst defaultPlaceholder =\n\t\t\tthis.options.composePlaceholder || 'Write a message...';\n\t\tconst placeholder = isNewConversation\n\t\t\t? this.options.composePlaceholder || 'Start typing your message...'\n\t\t\t: isClosed\n\t\t\t\t? 'Conversation closed'\n\t\t\t\t: defaultPlaceholder;\n\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst headerAvatarHtml = logoUrl\n\t\t\t? `<img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(teamName)}\" />`\n\t\t\t: `<iconify-icon icon=\"ph:chats-circle-duotone\" width=\"20\" height=\"20\"></iconify-icon>`;\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<iconify-icon icon=\"ph:arrow-left\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-chat-header-avatar\">\n\t\t\t\t\t${headerAvatarHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-chat-header-info\">\n\t\t\t\t\t<span class=\"messenger-chat-title\">${this._escapeHtml(teamName)}</span>\n\t\t\t\t\t<span class=\"messenger-chat-subtitle\">${isClosed ? 'Conversation resolved' : this.state.responseTime || 'Typically replies within minutes'}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-chat-header-actions\">\n\t\t\t\t\t<button class=\"sdk-btn-icon sdk-close-btn messenger-mobile-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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-connection-banner\" style=\"display:none;\">\n\t\t\t\t<iconify-icon icon=\"ph:wifi-slash\" width=\"14\" height=\"14\"></iconify-icon>\n\t\t\t\t<span>Reconnecting…</span>\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<iconify-icon icon=\"ph:check-circle-duotone\" width=\"18\" height=\"18\"></iconify-icon>\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<div class=\"messenger-scroll-pill\" style=\"display:none;\">\n\t\t\t\t<iconify-icon icon=\"ph:arrow-down\" width=\"14\" height=\"14\"></iconify-icon>\n\t\t\t\t<span>New message</span>\n\t\t\t</div>\n\n\t\t\t${\n\t\t\t\tisClosed\n\t\t\t\t\t? ''\n\t\t\t\t\t: `\n\t\t\t<div class=\"messenger-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"messenger-chat-compose\">\n\t\t\t\t<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<div class=\"messenger-compose-bottom\">\n\t\t\t\t\t<div class=\"messenger-compose-actions\">\n\t\t\t\t\t\t<button class=\"sdk-btn-icon messenger-compose-attach\" aria-label=\"Attach file\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:paperclip-duotone\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button class=\"sdk-btn-icon messenger-emoji-btn\" aria-label=\"Emoji\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:smiley-duotone\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"messenger-compose-send\" aria-label=\"Send\" disabled>\n\t\t\t\t\t\t<iconify-icon icon=\"ph:paper-plane-right\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\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\tthis._setupScrollPill();\n\t}\n\n\t_renderEmptyState(isNewConversation = false) {\n\t\tconst logoUrl = this.options.logoUrl;\n\n\t\tconst logoHtml = logoUrl\n\t\t\t? `<div class=\"messenger-chat-empty-logo\"><img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(this.state.teamName)}\" /></div>`\n\t\t\t: '';\n\n\t\treturn `\n\t\t\t<div class=\"messenger-chat-empty\">\n\t\t\t\t${logoHtml}\n\t\t\t\t<h3>${isNewConversation ? 'Start a new conversation' : 'Start the conversation'}</h3>\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<iconify-icon icon=\"ph:file-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t\t<span>${this._escapeHtml(att.name || 'file')}</span>\n\t\t\t\t<iconify-icon icon=\"ph:download-simple\" width=\"16\" height=\"16\" class=\"messenger-file-download-icon\"></iconify-icon>\n\t\t\t</a>`;\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\t_renderMessage(message, isLastInGroup = true) {\n\t\tif (message.isSystem) {\n\t\t\treturn this._renderSystemMessage(message);\n\t\t}\n\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 = isLastInGroup\n\t\t\t? this._formatMessageTime(message.timestamp)\n\t\t\t: '';\n\t\tconst attachmentsHtml = this._renderMessageAttachments(message.attachments);\n\t\tconst isOptimistic = message.isOptimistic;\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\tconst sentIndicator = isLastInGroup\n\t\t\t\t? `<div class=\"messenger-message-meta messenger-message-meta-own\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tisOptimistic\n\t\t\t\t\t\t\t\t? `<span class=\"messenger-message-sent-status\">Sending…</span>`\n\t\t\t\t\t\t\t\t: `<span class=\"messenger-message-sent-status\">Sent</span>`\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${timeStr ? `<span>·</span><span>${timeStr}</span>` : ''}\n\t\t\t\t\t</div>`\n\t\t\t\t: '';\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message ${messageClass}${isOptimistic ? ' messenger-message-optimistic' : ''}\">\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t${sentIndicator}\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-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${timeStr ? `<div class=\"messenger-message-meta\"><span>${timeStr}</span></div>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSystemMessage(message) {\n\t\tconst content = message.content || '';\n\t\tconst isJoinLeave =\n\t\t\tcontent.includes('joined the chat') ||\n\t\t\tcontent.includes('left the chat') ||\n\t\t\tcontent.includes('joined the conversation') ||\n\t\t\tcontent.includes('left the conversation');\n\n\t\tif (isJoinLeave && message.sender) {\n\t\t\tconst rawName = message.sender.name || '';\n\t\t\tconst name = rawName\n\t\t\t\t.split(' ')\n\t\t\t\t.map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n\t\t\t\t.join(' ');\n\t\t\tconst logoUrl = this.options.logoUrl;\n\t\t\tconst logoHtml = logoUrl\n\t\t\t\t? `<img src=\"${this._escapeHtml(logoUrl)}\" alt=\"logo\" />`\n\t\t\t\t: name.charAt(0).toUpperCase();\n\t\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\n\t\t\tconst rawAction = content.replace(rawName, '').trim();\n\t\t\tconst action = rawAction.charAt(0).toUpperCase() + rawAction.slice(1);\n\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message-system-event\">\n\t\t\t\t\t<div class=\"messenger-message-system-event-avatar\">${logoHtml}</div>\n\t\t\t\t\t<span class=\"messenger-message-system-event-name\">${this._escapeHtml(name)}</span>\n\t\t\t\t\t<span class=\"messenger-message-system-event-action\">${this._escapeHtml(action)}</span>\n\t\t\t\t\t${timeStr ? `<span class=\"messenger-message-system-event-time\">${timeStr}</span>` : ''}\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\t// Render automated/bot messages as a proper received chat bubble\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst avatarHtml = logoUrl\n\t\t\t? `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(teamName)}\" /></div>`\n\t\t\t: `<div class=\"sdk-avatar sdk-avatar-sm\">${teamName.charAt(0).toUpperCase()}</div>`;\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-message messenger-message-received\">\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<div class=\"messenger-message-bubble\">\n\t\t\t\t\t\t\t<div class=\"messenger-message-content\">${this._formatMessageContent(content)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${timeStr ? `<div class=\"messenger-message-meta\"><span>${timeStr}</span></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}\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\tconst datePart = date.toLocaleDateString('en-GB', {\n\t\t\tday: '2-digit',\n\t\t\tmonth: 'short',\n\t\t\tyear: 'numeric',\n\t\t});\n\t\tconst timePart = date.toLocaleTimeString('en-GB', {\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t\thour12: false,\n\t\t});\n\t\treturn `${datePart}, ${timePart}`;\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\n\t\t// Show scroll pill if user is scrolled up, otherwise scroll to bottom\n\t\tconst isNearBottom =\n\t\t\tmessagesContainer.scrollHeight -\n\t\t\t\tmessagesContainer.scrollTop -\n\t\t\t\tmessagesContainer.clientHeight <\n\t\t\t80;\n\n\t\tif (isNearBottom) {\n\t\t\tthis._scrollToBottom();\n\t\t} else if (!message.isOwn) {\n\t\t\tconst pill = this.element.querySelector('.messenger-scroll-pill');\n\t\t\tif (pill) pill.style.display = 'flex';\n\t\t}\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_setupScrollPill() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst pill = this.element.querySelector('.messenger-scroll-pill');\n\t\tif (!messagesContainer || !pill) return;\n\n\t\tpill.addEventListener('click', () => {\n\t\t\tthis._scrollToBottom();\n\t\t\tpill.style.display = 'none';\n\t\t});\n\n\t\tmessagesContainer.addEventListener('scroll', () => {\n\t\t\tconst isNearBottom =\n\t\t\t\tmessagesContainer.scrollHeight -\n\t\t\t\t\tmessagesContainer.scrollTop -\n\t\t\t\t\tmessagesContainer.clientHeight <\n\t\t\t\t80;\n\t\t\tif (isNearBottom) {\n\t\t\t\tpill.style.display = 'none';\n\t\t\t}\n\t\t});\n\t}\n\n\t_renderGroupedMessages(messages) {\n\t\tconst GROUP_TIME_GAP = 5 * 60 * 1000; // 5 minutes\n\t\tlet html = '';\n\n\t\tmessages.forEach((msg, index) => {\n\t\t\tconst isLast = index === messages.length - 1;\n\t\t\tconst nextMsg = messages[index + 1];\n\t\t\tconst currentTime = msg.timestamp ? new Date(msg.timestamp).getTime() : 0;\n\t\t\tconst nextTime = nextMsg?.timestamp\n\t\t\t\t? new Date(nextMsg.timestamp).getTime()\n\t\t\t\t: null;\n\t\t\tconst senderKey = msg.isSystem\n\t\t\t\t? 'system'\n\t\t\t\t: msg.isOwn\n\t\t\t\t\t? 'own'\n\t\t\t\t\t: msg.sender?.name || 'agent';\n\t\t\tconst nextSenderKey = nextMsg\n\t\t\t\t? nextMsg.isSystem\n\t\t\t\t\t? 'system'\n\t\t\t\t\t: nextMsg.isOwn\n\t\t\t\t\t\t? 'own'\n\t\t\t\t\t\t: nextMsg.sender?.name || 'agent'\n\t\t\t\t: null;\n\n\t\t\tconst timeGapAfter = nextTime && nextTime - currentTime > GROUP_TIME_GAP;\n\t\t\tconst senderChanges = nextMsg && senderKey !== nextSenderKey;\n\t\t\tconst isLastInGroup = isLast || timeGapAfter || senderChanges;\n\n\t\t\thtml += this._renderMessage(msg, isLastInGroup);\n\t\t});\n\n\t\treturn html;\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\"><iconify-icon icon=\"ph:file-duotone\" width=\"24\" height=\"24\"></iconify-icon></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\tconst mobileCloseBtn = this.element.querySelector(\n\t\t\t'.messenger-mobile-close-btn'\n\t\t);\n\t\tif (mobileCloseBtn) {\n\t\t\tmobileCloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\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 emojiBtn = this.element.querySelector('.messenger-emoji-btn');\n\t\tif (emojiBtn) {\n\t\t\temojiBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis._toggleEmojiPicker();\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_loadEmojiPicker() {\n\t\tif (document.querySelector('#product7-emoji-picker-script')) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst script = document.createElement('script');\n\t\t\tscript.id = 'product7-emoji-picker-script';\n\t\t\tscript.type = 'module';\n\t\t\tscript.src =\n\t\t\t\t'https://cdn.jsdelivr.net/npm/emoji-picker-element@1/index.js';\n\t\t\tscript.onload = resolve;\n\t\t\tscript.onerror = reject;\n\t\t\tdocument.head.appendChild(script);\n\t\t});\n\t}\n\n\tasync _toggleEmojiPicker() {\n\t\tconst existing = this.element.querySelector(\n\t\t\t'.messenger-emoji-picker-container'\n\t\t);\n\t\tif (existing) {\n\t\t\texisting.remove();\n\t\t\tthis._emojiPickerOpen = false;\n\t\t\tif (this._emojiOutsideHandler) {\n\t\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\n\t\t\t\tthis._emojiOutsideHandler = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this._loadEmojiPicker();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'messenger-emoji-picker-container';\n\n\t\tconst picker = document.createElement('emoji-picker');\n\t\tcontainer.appendChild(picker);\n\n\t\tconst compose = this.element.querySelector('.messenger-chat-compose');\n\t\tcompose.parentNode.insertBefore(container, compose);\n\t\tthis._emojiPickerOpen = true;\n\n\t\tpicker.addEventListener('emoji-click', (e) => {\n\t\t\tthis._insertEmoji(e.detail.unicode);\n\t\t\tcontainer.remove();\n\t\t\tthis._emojiPickerOpen = false;\n\t\t\tif (this._emojiOutsideHandler) {\n\t\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\n\t\t\t\tthis._emojiOutsideHandler = null;\n\t\t\t}\n\t\t});\n\n\t\tthis._emojiOutsideHandler = (e) => {\n\t\t\tif (\n\t\t\t\t!container.contains(e.target) &&\n\t\t\t\t!e.target.closest('.messenger-emoji-btn')\n\t\t\t) {\n\t\t\t\tcontainer.remove();\n\t\t\t\tthis._emojiPickerOpen = false;\n\t\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\n\t\t\t\tthis._emojiOutsideHandler = null;\n\t\t\t}\n\t\t};\n\t\tsetTimeout(\n\t\t\t() => document.addEventListener('click', this._emojiOutsideHandler),\n\t\t\t0\n\t\t);\n\t}\n\n\t_insertEmoji(emoji) {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tif (!input) return;\n\t\tconst start = input.selectionStart;\n\t\tconst end = input.selectionEnd;\n\t\tinput.value = input.value.slice(0, start) + emoji + input.value.slice(end);\n\t\tinput.selectionStart = input.selectionEnd = start + emoji.length;\n\t\tinput.focus();\n\t\tinput.dispatchEvent(new Event('input'));\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._emojiOutsideHandler) {\n\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\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 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 <iconify-icon icon=\"ph:chat-circle-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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 messenger-mobile-close-btn\" aria-label=\"Close\">\n <iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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 <iconify-icon icon=\"ph:pencil-simple\" width=\"16\" height=\"16\" style=\"flex-shrink: 0; color: var(--msg-text-secondary);\"></iconify-icon>\n <span style=\"flex: 1;\">New conversation</span>\n <iconify-icon icon=\"ph:caret-right\" width=\"16\" height=\"16\" style=\"flex-shrink: 0; color: var(--msg-text-tertiary);\"></iconify-icon>\n </button>\n </div>\n `;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderConversationItem(conversation) {\n\t\tconst isClosed = conversation.status === 'closed';\n\t\tconst unreadClass = conversation.unread > 0 ? 'unread' : '';\n\t\tconst closedClass = isClosed ? 'closed' : '';\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} ${closedClass}\" 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${isClosed ? '<span class=\"messenger-conversation-resolved-badge\">Resolved</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) => {\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 messenger-mobile-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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 || []).filter(\n\t\t\t(c) => (c.articleCount || 0) > 0\n\t\t);\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\n\t\t\t.map((c) => this._renderCollectionItem(c))\n\t\t\t.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\n\t\t\t.split('')\n\t\t\t.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\n\t\t\t.split(' ')\n\t\t\t.map((n) => n[0])\n\t\t\t.join('')\n\t\t\t.toUpperCase()\n\t\t\t.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\n\t\t\t? this._getInitials(collection.author.name)\n\t\t\t: '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}\"></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\"></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\tconst mobileCloseBtn = this.element.querySelector(\n\t\t\t'.messenger-help-close-btn'\n\t\t);\n\t\tif (mobileCloseBtn) {\n\t\t\tmobileCloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\t\t}\n\n\t\tconst searchInput = this.element.querySelector(\n\t\t\t'.messenger-help-search-input'\n\t\t);\n\t\tlet searchTimeout;\n\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\tclearTimeout(searchTimeout);\n\t\t\tsearchTimeout = setTimeout(() => {\n\t\t\t\tthis.state.setHelpSearchQuery(e.target.value);\n\t\t\t}, 300);\n\t\t});\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_attachCollectionEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-help-collection')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t\t(c) => c.id === item.dataset.collectionId\n\t\t\t\t\t);\n\t\t\t\t\tif (collection?.url) {\n\t\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) this._unsubscribe();\n\t\tif (this.element?.parentNode)\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t}\n}\n","export class HomeView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-home-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'homeChangelogUpdate' ||\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'availabilityUpdate'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-home-scroll\">\n\t\t\t\t<div class=\"messenger-home-header\">\n\t\t\t\t\t<div class=\"messenger-home-header-top\">\n\t\t\t\t\t\t<div class=\"messenger-home-logo\">\n\t\t\t\t\t\t\t${this.options.logoUrl ? `<img src=\"${this.options.logoUrl}\" alt=\"${this.state.teamName}\" />` : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-home-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t</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}\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\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\">${this.state.onlineMessage}</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\">${this.state.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 = `<iconify-icon icon=\"ph:paper-plane-right\" width=\"20\" height=\"20\" style=\"flex-shrink: 0;\"></iconify-icon>`;\n\t\tconst caretIcon = `<iconify-icon icon=\"ph:caret-right\" width=\"20\" height=\"20\" style=\"flex-shrink: 0;\"></iconify-icon>`;\n\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\n\t\tconst recentCardHtml = openConversation\n\t\t\t? this._renderRecentMessageCard(openConversation)\n\t\t\t: '';\n\n\t\treturn `\n\t\t\t${recentCardHtml}\n\t\t\t<button class=\"messenger-home-message-btn\">\n\t\t\t\t<div class=\"messenger-home-continue-info\">\n\t\t\t\t\t<span class=\"messenger-home-continue-label\">Send us a message</span>\n\t\t\t\t\t<span class=\"messenger-home-message-subtext\">${responseTime}</span>\n\t\t\t\t</div>\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_renderRecentMessageCard(conversation) {\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst logoHtml = logoUrl\n\t\t\t? `<div class=\"messenger-home-recent-avatar messenger-home-recent-avatar-logo\"><img src=\"${logoUrl}\" alt=\"${teamName}\" /></div>`\n\t\t\t: `<div class=\"messenger-home-recent-avatar\" style=\"background: var(--color-primary);\">${teamName.charAt(0).toUpperCase()}</div>`;\n\n\t\tconst title = conversation.title || teamName;\n\t\tconst timeAgo = this._formatTimeAgo(conversation.lastMessageTime);\n\t\tconst preview = conversation.lastMessage\n\t\t\t? conversation.lastMessage.substring(0, 48) +\n\t\t\t\t(conversation.lastMessage.length > 48 ? '...' : '')\n\t\t\t: '';\n\t\tconst hasUnread = conversation.unread > 0;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-recent-card\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"messenger-home-recent-card-label\">Recent message</div>\n\t\t\t\t<div class=\"messenger-home-recent-card-row\">\n\t\t\t\t\t${logoHtml}\n\t\t\t\t\t<div class=\"messenger-home-recent-card-content\">\n\t\t\t\t\t\t<div class=\"messenger-home-recent-card-header\">\n\t\t\t\t\t\t\t<span class=\"messenger-home-recent-card-name\">${title}</span>\n\t\t\t\t\t\t\t<span class=\"messenger-home-recent-card-time\">${timeAgo}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-home-recent-card-preview\">\n\t\t\t\t\t\t\t<span class=\"messenger-home-recent-card-message\">${preview}</span>\n\t\t\t\t\t\t\t${hasUnread ? '<span class=\"messenger-home-recent-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t</div>\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_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\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_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-divider\"></div>\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${description ? `<p>${description}</p>` : ''}\n\t\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\t</div>\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\">${this._stripHtml(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_stripHtml(html) {\n\t\tif (!html) return '';\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_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\tconst recentCard = this.element.querySelector(\n\t\t\t'.messenger-home-recent-card'\n\t\t);\n\t\tif (recentCard) {\n\t\t\trecentCard.addEventListener('click', () => {\n\t\t\t\tconst convId = recentCard.dataset.conversationId;\n\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\tthis.state.markAsRead(convId);\n\t\t\t\tthis.state.setView('chat');\n\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t}\n\t\t\t});\n\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\tthis.state.setActiveConversation(null);\n\t\t\t\tthis.state.setView('chat');\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\tif (this.options.onFeedbackClick) {\n\t\t\t\t\tthis.state.setOpen(false);\n\t\t\t\t\tthis.options.onFeedbackClick();\n\t\t\t\t} else if (this.state.urls?.feedback) {\n\t\t\t\t\twindow.open(this.state.urls.feedback, '_blank');\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\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<div class=\"messenger-prechat-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:bell-ringing-duotone\" width=\"36\" height=\"36\"></iconify-icon>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h4 class=\"messenger-prechat-title\">Get notified when we reply</h4>\n\t\t\t\t\t<p class=\"messenger-prechat-subtitle\">We'll send you an email so you never miss a response.</p>\n\t\t\t\t\t<div class=\"messenger-prechat-actions\">\n\t\t\t\t\t\t<button type=\"button\" class=\"messenger-prechat-yes\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:bell-ringing-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t\t\tYes, notify me\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" class=\"messenger-prechat-no\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:bell-slash-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t\t\tNo thanks\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-prechat-yes')\n\t\t\t.addEventListener('click', async () => {\n\t\t\t\tawait this._handleYes();\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.messenger-prechat-no')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis._handleNo();\n\t\t\t});\n\t}\n\n\tasync _handleYes() {\n\t\tif (this._isSubmitting) return;\n\t\tthis._isSubmitting = true;\n\n\t\tconst yesBtn = this.element.querySelector('.messenger-prechat-yes');\n\t\tyesBtn.disabled = true;\n\t\tyesBtn.innerHTML = `\n\t\t\t<iconify-icon icon=\"ph:circle-notch\" width=\"16\" height=\"16\" style=\"animation: spin 0.8s linear infinite;\"></iconify-icon>\n\t\t\tJust a moment...\n\t\t`;\n\n\t\ttry {\n\t\t\tconst { name, email } = this.state.metadata || {};\n\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\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\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:', error);\n\t\t\tthis._isSubmitting = false;\n\t\t\tyesBtn.disabled = false;\n\t\t\tyesBtn.innerHTML = `\n\t\t\t\t<iconify-icon icon=\"ph:bell-ringing-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\tYes, notify me\n\t\t\t`;\n\t\t}\n\t}\n\n\t_handleNo() {\n\t\tthis.state.setView('chat');\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 { NotificationSound } from '../utils/NotificationSound.js';\nimport { 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\tthis._explicitOptions = options || {};\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 = resolvedTheme === '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 || '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\tonlineMessage: options.onlineMessage || \"We're online now\",\n\t\t\tresponseTime:\n\t\t\t\toptions.responseTime || 'We typically reply within a few minutes',\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\tfeedbackBoardName: options.feedbackBoardName || 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\tcomposePlaceholder: options.composePlaceholder || 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\tonlineMessage: this.messengerOptions.onlineMessage,\n\t\t\tresponseTime: this.messengerOptions.responseTime,\n\t\t\tenableHelp: this.messengerOptions.enableHelp,\n\t\t\tenableChangelog: this.messengerOptions.enableChangelog,\n\t\t\tmetadata: this.sdk?.apiService?.getMetadata() || 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\t\tthis._feedbackWidget = null;\n\n\t\tconst notificationSoundOption = options.notificationSound !== undefined\n\t\t\t? options.notificationSound\n\t\t\t: true;\n\n\t\tthis._notificationSound = new NotificationSound({\n\t\t\tsoundUrl: typeof notificationSoundOption === 'string' ? notificationSoundOption : null,\n\t\t\tvolume: options.notificationVolume ?? 0.4,\n\t\t});\n\n\t\tif (notificationSoundOption === false) {\n\t\t\tthis._notificationSound.setEnabled(false);\n\t\t}\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_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_createInternalFeedbackWidget() {\n\t\ttry {\n\t\t\tconst widget = this.sdk.createWidget('button', {\n\t\t\t\ttrigger: false,\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t\tboardName:\n\t\t\t\t\tthis.messengerOptions.feedbackBoardName || this.sdk.config.boardName,\n\t\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\t\ttheme: this.messengerOptions.theme,\n\t\t\t});\n\t\t\twidget.mount();\n\t\t\treturn widget;\n\t\t} catch (e) {\n\t\t\tconsole.warn('[Messenger] Could not create internal feedback widget:', e);\n\t\t\treturn null;\n\t\t}\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\t// Create internal feedback widget (no floating button) so the\n\t\t// \"Leave a feedback\" button in the home view can open it inline.\n\t\tif (!this.messengerOptions.onFeedbackClick) {\n\t\t\tthis._feedbackWidget = this._createInternalFeedbackWidget();\n\t\t}\n\n\t\tif (this._hasTrigger()) {\n\t\t\tthis.launcher = new MessengerLauncher(this.messengerState, {\n\t\t\t\tposition: this.messengerOptions.position,\n\t\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\t});\n\t\t\tcontainer.appendChild(this.launcher.render());\n\t\t}\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:\n\t\t\t\tthis.messengerOptions.onFeedbackClick ||\n\t\t\t\t(this._feedbackWidget ? () => this._feedbackWidget.open() : null),\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\t// Route through sdk.identify() so the SDK-level identity state is updated\n\t\t\t// and applyIdentity() handles the messenger state + WebSocket as a side effect.\n\t\t\tconst result = await this.sdk.identify({\n\t\t\t\temail: contactData.email,\n\t\t\t\tname: contactData.name,\n\t\t\t});\n\t\t\treturn result;\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\t// Called externally by the app when the user is already known.\n\t\t// No API call needed — identity was already established via sdk.identify().\n\t\tthis.applyIdentity({ name, email });\n\t}\n\n\tapplyIdentity(metadata = {}) {\n\t\tthis.messengerState.setIdentified(true, metadata);\n\n\t\tif (this.apiService?.sessionToken && !this.wsService?.isConnected) {\n\t\t\tthis._initWebSocket();\n\t\t}\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\tisSystem: message.sender_type === 'system',\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\tconst isOwnMessage = message.sender_type === 'customer';\n\n\t\tif (!isOwnMessage) {\n\t\t\tconst panelOpenOnThisConversation =\n\t\t\t\tthis.messengerState.isOpen &&\n\t\t\t\tthis.messengerState.activeConversationId === conversation_id;\n\n\t\t\tif (!panelOpenOnThisConversation) {\n\t\t\t\tthis._notificationSound.play();\n\t\t\t}\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\tthis.messengerState._notify('connectionChange', { connected: false });\n\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tthis.messengerState._notify('connectionChange', { connected: true });\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 ??\n\t\t\t\t\tavailability.agents_online ??\n\t\t\t\t\tavailability.is_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\tisSystem: msg.sender_type === 'system',\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\tconst initialMessages = [\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\tinitialMessages.push({\n\t\t\t\t\tid: 'system_rt_' + Date.now(),\n\t\t\t\t\tcontent: this.messengerState.agentsOnline\n\t\t\t\t\t\t? 'One of our customer support agents will be with you shortly.'\n\t\t\t\t\t\t: this.messengerState.responseTime,\n\t\t\t\t\tisSystem: true,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t});\n\n\t\t\t\tthis.messengerState.setMessages(conv.id, initialMessages);\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 _fetchAndApplySettings() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getMessengerSettings();\n\t\t\tif (!response?.status || !response?.data) return;\n\n\t\t\tconst s = response.data;\n\n\t\t\t// Only apply values that were NOT explicitly passed in options\n\t\t\tif (s.team_name && !this._hasExplicitOption('teamName')) {\n\t\t\t\tthis.messengerOptions.teamName = s.team_name;\n\t\t\t\tthis.messengerState.teamName = s.team_name;\n\t\t\t}\n\t\t\tif (s.logo_url && !this._hasExplicitOption('logoUrl')) {\n\t\t\t\tthis.messengerOptions.logoUrl = s.logo_url;\n\t\t\t}\n\t\t\tif (s.greeting_message && !this._hasExplicitOption('greetingMessage')) {\n\t\t\t\tthis.messengerState.greetingMessage = s.greeting_message;\n\t\t\t}\n\t\t\tif (s.response_time && !this._hasExplicitOption('responseTime')) {\n\t\t\t\tthis.messengerState.responseTime = s.response_time;\n\t\t\t}\n\n\t\t\t// Notify views to re-render with new values\n\t\t\tthis.messengerState._notify('availabilityUpdate', {});\n\t\t} catch (e) {\n\t\t\t// non-fatal\n\t\t}\n\t}\n\n\t_hasExplicitOption(key) {\n\t\treturn Object.prototype.hasOwnProperty.call(\n\t\t\tthis._explicitOptions || {},\n\t\t\tkey\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 =\n\t\t\t\t\tresponse.data.agents_online ?? response.data.is_online ?? false;\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\tlabels: [{ name: 'Integration', color: '#dbeafe' }],\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\tlabels: [\n\t\t\t\t\t\t\t{ name: 'New feature', color: '#dcfce7' },\n\t\t\t\t\t\t\t{ name: 'AI', color: '#f3e8ff' },\n\t\t\t\t\t\t],\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\tlabels: [{ name: 'Report', color: '#fef9c3' }],\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\tlabels: [{ name: 'Analytics', color: '#fce7f3' }],\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\tlabels: [\n\t\t\t\t\t\t\t{ name: 'New feature', color: '#dcfce7' },\n\t\t\t\t\t\t\t{ name: 'AI', color: '#f3e8ff' },\n\t\t\t\t\t\t],\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\tlabels: item.labels || [],\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\t// Fetch workspace settings and apply only if not explicitly configured\n\t\t\tthis._fetchAndApplySettings();\n\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:hover:not(:disabled) {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t\tborder-color: ${primaryColor} !important;\n\t\t\tcolor: #FFFFFF !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/* Dark theme is now handled by CSS custom properties in messenger-core.js */\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 || 'center',\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, .product7-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 (\n\t\t\tthis.options.enabled === false ||\n\t\t\tthis.surveyOptions.enabled === false\n\t\t) {\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.state.isOpen = true;\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.state.isOpen = false;\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 progressPercent = isMultiPage\n\t\t\t? Math.round(\n\t\t\t\t\t((this.surveyState.currentPageIndex + 1) /\n\t\t\t\t\t\tthis.surveyOptions.pages.length) *\n\t\t\t\t\t\t100\n\t\t\t\t)\n\t\t\t: 0;\n\t\tconst submitLabel = isMultiPage && !isLastPage ? 'Next' : 'Submit';\n\t\tconst iconArrowRight = `<iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>`;\n\t\tconst iconCheck = `<iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>`;\n\t\tconst iconArrowLeft = `<iconify-icon icon=\"ph:arrow-left\" width=\"16\" height=\"16\"></iconify-icon>`;\n\t\tconst backButton =\n\t\t\tisMultiPage && this.surveyState.currentPageIndex > 0\n\t\t\t\t? `<button class=\"feedback-survey-back\">${iconArrowLeft} 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\"><iconify-icon icon=\"ph:x-duotone\" width=\"16\" height=\"16\"></iconify-icon></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\"><div class=\"feedback-survey-progress-track\"><div class=\"feedback-survey-progress-fill\" style=\"width:${progressPercent}%\"></div></div></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} ${isLastPage ? iconCheck : iconArrowRight}</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\tif (!this.surveyElement) return;\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 === 'nps') {\n\t\t\tratingType = 'nps';\n\t\t} else if (configType) {\n\t\t\tratingType = configType;\n\t\t} else if (topSurveyType === 'ces') {\n\t\t\tratingType = 'ces';\n\t\t} else if (topSurveyType === 'csat') {\n\t\t\tratingType = 'emoji';\n\t\t} else {\n\t\t\tratingType = 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 = [\n\t\t\t\t'Very Difficult',\n\t\t\t\t'Difficult',\n\t\t\t\t'Neutral',\n\t\t\t\t'Easy',\n\t\t\t\t'Very Easy',\n\t\t\t];\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\tif (ratingType === 'star') {\n\t\t\tconst starScale = Number.isFinite(scale) && scale >= 2 ? scale : 5;\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-stars\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${[...Array(starScale).keys()]\n\t\t\t\t\t\t.map((i) => {\n\t\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\t\tconst filled = currentRating >= score ? ' filled' : '';\n\t\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-rating-btn feedback-survey-star-btn${filled}\" data-page-id=\"${pageId}\" data-score=\"${score}\">★</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\tconst iconExternalLink = `<iconify-icon icon=\"ph:arrow-square-out-duotone\" width=\"15\" height=\"15\"></iconify-icon>`;\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} ${iconExternalLink}\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\tconst isStarRating = !!this.surveyElement.querySelector(\n\t\t\t\t'.feedback-survey-star-btn'\n\t\t\t);\n\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\tif (isStarRating) {\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-star-btn')\n\t\t\t\t\t\t\t\t.forEach((star) => {\n\t\t\t\t\t\t\t\t\tconst starScore = parseInt(star.dataset.score);\n\t\t\t\t\t\t\t\t\tstar.classList.toggle('filled', starScore <= score);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-page-rating-btn')\n\t\t\t\t\t\t\t\t.forEach((item) => item.classList.remove('selected'));\n\t\t\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (isStarRating) {\n\t\t\t\t\t\tbtn.addEventListener('mouseenter', () => {\n\t\t\t\t\t\t\tconst hoverScore = parseInt(btn.dataset.score);\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-star-btn')\n\t\t\t\t\t\t\t\t.forEach((star) => {\n\t\t\t\t\t\t\t\t\tconst starScore = parseInt(star.dataset.score);\n\t\t\t\t\t\t\t\t\tstar.classList.toggle('hovered', starScore <= hoverScore);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tif (isStarRating) {\n\t\t\t\tconst container = this.surveyElement.querySelector(\n\t\t\t\t\t'.feedback-survey-stars'\n\t\t\t\t);\n\t\t\t\tif (container) {\n\t\t\t\t\tcontainer.addEventListener('mouseleave', () => {\n\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-star-btn')\n\t\t\t\t\t\t\t.forEach((star) => star.classList.remove('hovered'));\n\t\t\t\t\t});\n\t\t\t\t}\n\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\t_setSubmitLoading(loading) {\n\t\tconst btn = this.surveyElement?.querySelector('.feedback-survey-submit');\n\t\tif (!btn) return;\n\t\tbtn.disabled = loading;\n\t\tbtn.innerHTML = loading\n\t\t\t? `<iconify-icon icon=\"ph:circle-notch\" width=\"16\" height=\"16\" style=\"animation: spin 0.8s linear infinite;\"></iconify-icon> Submitting...`\n\t\t\t: `Submit <iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>`;\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\t\tthis._setSubmitLoading(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\n\t\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\t\t\tthis._closeSurvey();\n\t\t\tthis._showSuccessNotification();\n\t\t} catch (error) {\n\t\t\tconsole.error('[SurveyWidget] Failed to submit survey:', error);\n\t\t\tthis._showError('Something went wrong. Please try again.');\n\t\t} finally {\n\t\t\tthis.surveyState.isSubmitting = false;\n\t\t\tthis._setSubmitLoading(false);\n\t\t}\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\n\t\t// Emit question answered event\n\t\tconst page = this._getCurrentPage();\n\t\tthis.sdk.eventBus.emit('survey:questionAnswered', {\n\t\t\twidget: this,\n\t\t\tpageId,\n\t\t\tpageType: page?.type,\n\t\t\tanswer: this.surveyState.pageAnswers[pageId],\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 sdkMetadata =\n\t\t\ttypeof this.sdk.getMetadata === 'function'\n\t\t\t\t? this.sdk.getMetadata() || {}\n\t\t\t\t: {};\n\t\tconst apiMetadata =\n\t\t\tthis.apiService && typeof this.apiService.getMetadata === 'function'\n\t\t\t\t? this.apiService.getMetadata() || {}\n\t\t\t\t: {};\n\t\tconst localMetadata = this.options.metadata || {};\n\n\t\treturn {\n\t\t\trespondentId:\n\t\t\t\tthis.surveyOptions.respondentId ||\n\t\t\t\tlocalMetadata.user_id ||\n\t\t\t\tsdkMetadata.user_id ||\n\t\t\t\tapiMetadata.user_id ||\n\t\t\t\tnull,\n\t\t\temail:\n\t\t\t\tthis.surveyOptions.email ||\n\t\t\t\tlocalMetadata.email ||\n\t\t\t\tsdkMetadata.email ||\n\t\t\t\tapiMetadata.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 = `<iconify-icon icon=\"ph:warning-duotone\" width=\"15\" height=\"15\"></iconify-icon><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'product7-notification product7-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\tthis.state.isOpen = 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\tconst pos = this.surveyOptions.position;\n\t\t\tsurveyEl.style.transform =\n\t\t\t\tpos === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(0.95)'\n\t\t\t\t\t: pos === 'bottom'\n\t\t\t\t\t\t? 'translateY(100%)'\n\t\t\t\t\t\t: 'translateY(10px)';\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\n\t\tthis.sdk.eventBus.emit('survey:closed', { widget: this });\n\t}\n\n\topen() {\n\t\treturn this.show();\n\t}\n\n\tclose() {\n\t\treturn this.hide();\n\t}\n\n\ttoggle() {\n\t\tif (this.surveyState.isVisible) {\n\t\t\treturn this.hide();\n\t\t}\n\n\t\treturn this.show();\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+/,\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 { CSS_STYLES } from '../styles/styles.js';\nimport { 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 Product7 {\n\tconstructor(config = {}) {\n\t\tthis.config = this._validateAndMergeConfig(config);\n\t\tthis.initialized = false;\n\t\tthis.identified = 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\tmetadata: this.config.metadata,\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\t_injectStyles() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (document.querySelector('#product7-styles')) return;\n\n\t\tconst style = document.createElement('style');\n\t\tstyle.id = 'product7-styles';\n\t\tstyle.textContent = CSS_STYLES;\n\t\tdocument.head.appendChild(style);\n\n\t\tif (!document.querySelector('#product7-iconify')) {\n\t\t\tconst script = document.createElement('script');\n\t\t\tscript.id = 'product7-iconify';\n\t\t\tscript.src =\n\t\t\t\t'https://cdn.jsdelivr.net/npm/iconify-icon@2/dist/iconify-icon.min.js';\n\t\t\tscript.async = true;\n\t\t\tdocument.head.appendChild(script);\n\t\t}\n\t}\n\n\tasync init() {\n\t\tif (this.initialized) {\n\t\t\treturn { alreadyInitialized: true };\n\t\t}\n\n\t\tthis._injectStyles();\n\n\t\ttry {\n\t\t\tconst initData = await this.apiService.init();\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\tconst identifyResult = await this._syncConfiguredMetadataAfterInit();\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\tidentified: Boolean(identifyResult?.identified),\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 requestedType = type || 'button';\n\t\tconst normalizedType = this._normalizeWidgetType(requestedType);\n\t\tconst widgetId = generateId('widget');\n\t\tconst widgetConfig = this._getWidgetTypeConfig(normalizedType);\n\t\tconst explicitOptions = this._omitUndefined(\n\t\t\tthis._normalizeWidgetOptions(normalizedType, options)\n\t\t);\n\t\tconst widgetEnabled = this._isWidgetEnabled(normalizedType, {\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(normalizedType, widgetOptions);\n\t\t\tthis.widgets.set(widgetId, widget);\n\t\t\tthis.eventBus.emit('widget:created', {\n\t\t\t\twidget,\n\t\t\t\ttype: requestedType,\n\t\t\t\tinternalType: normalizedType,\n\t\t\t});\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\tcreateFeedbackWidget(options = {}) {\n\t\treturn this.createWidget('feedback', options);\n\t}\n\n\tcreateMessengerWidget(options = {}) {\n\t\treturn this.createWidget('messenger', options);\n\t}\n\n\tcreateChangelogWidget(options = {}) {\n\t\treturn this.createWidget('changelog', options);\n\t}\n\n\tcreateSurveyWidget(options = {}) {\n\t\treturn this.createWidget('survey', options);\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(\n\t\t\t(s) => s.surveyId === surveyId || s.id === surveyId\n\t\t);\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 ||\n\t\t\t\t\tnormalizedOptions.id ||\n\t\t\t\t\toptions.id ||\n\t\t\t\t\tnull,\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.createSurveyWidget({\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'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: typeof 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 mergedTypeConfig = this._getWidgetTypeAliases(type).reduce(\n\t\t\t(config, alias) => {\n\t\t\t\tconst legacyTypeConfig = this._isPlainObject(this.config?.[alias])\n\t\t\t\t\t? this.config[alias]\n\t\t\t\t\t: {};\n\n\t\t\t\tconst namespacedTypeConfig = this._isPlainObject(widgetsConfig?.[alias])\n\t\t\t\t\t? widgetsConfig[alias]\n\t\t\t\t\t: {};\n\n\t\t\t\treturn deepMerge(\n\t\t\t\t\tconfig,\n\t\t\t\t\tdeepMerge(legacyTypeConfig, namespacedTypeConfig)\n\t\t\t\t);\n\t\t\t},\n\t\t\t{}\n\t\t);\n\t\treturn this._toCamelCaseObject(mergedTypeConfig);\n\t}\n\n\t_getWidgetTypeAliases(type) {\n\t\tif (type === 'button') {\n\t\t\treturn ['button', 'feedback'];\n\t\t}\n\n\t\treturn [type];\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_normalizeWidgetType(type) {\n\t\tif (type === 'feedback') {\n\t\t\treturn 'button';\n\t\t}\n\n\t\treturn type;\n\t}\n\n\t_normalizeWidgetOptions(type, options = {}) {\n\t\tif (!this._isPlainObject(options)) {\n\t\t\treturn options;\n\t\t}\n\n\t\tconst normalizedOptions = { ...options };\n\t\tif (\n\t\t\tnormalizedOptions.headless === true &&\n\t\t\tnormalizedOptions.trigger === undefined &&\n\t\t\ttype !== 'survey'\n\t\t) {\n\t\t\tnormalizedOptions.trigger = false;\n\t\t}\n\n\t\treturn normalizedOptions;\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(\n\t\t\t\t([, nestedValue]) => nestedValue !== undefined\n\t\t\t)\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 || '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(\n\t\t\t'changelog',\n\t\t\texplicitOptions\n\t\t);\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.createChangelogWidget({\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\tsetMetadata(metadata) {\n\t\tif (metadata) {\n\t\t\tthis._validateMetadata(metadata);\n\t\t}\n\n\t\tthis.config.metadata = metadata;\n\t\tif (this.apiService) {\n\t\t\tthis.apiService.setMetadata(metadata);\n\t\t}\n\t\tthis.identified = false;\n\t\tthis.eventBus.emit('metadata:updated', { metadata });\n\t}\n\n\tgetMetadata() {\n\t\treturn (\n\t\t\tthis.config.metadata ||\n\t\t\t(this.apiService ? this.apiService.getMetadata() : null)\n\t\t);\n\t}\n\n\tasync identify(metadata = this.config.metadata) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before identifying users. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tif (!metadata) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'Identify requires metadata. Provide at least user_id or email.'\n\t\t\t);\n\t\t}\n\n\t\tthis._validateMetadata(metadata);\n\t\tthis.setMetadata(metadata);\n\n\t\ttry {\n\t\t\tconst response = await this.apiService.identify(metadata);\n\t\t\tconst configPatch = this._extractIdentifyConfig(response);\n\t\t\tif (Object.keys(configPatch).length > 0) {\n\t\t\t\tthis.updateConfig(configPatch);\n\t\t\t}\n\n\t\t\tthis.identified = true;\n\t\t\tthis._applyIdentityToWidgets(metadata);\n\n\t\t\tconst result = {\n\t\t\t\tidentified: true,\n\t\t\t\tmetadata: this.getMetadata(),\n\t\t\t\tresponse,\n\t\t\t};\n\n\t\t\tthis.eventBus.emit('sdk:identified', result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthis.identified = false;\n\t\t\tthis.eventBus.emit('sdk:error', { error, phase: 'identify' });\n\t\t\tthrow new SDKError(`Failed to identify user: ${error.message}`, error);\n\t\t}\n\t}\n\n\tasync reinitialize(newMetadata = null) {\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.identified = false;\n\n\t\tif (newMetadata !== null) {\n\t\t\tthis.setMetadata(newMetadata);\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.emit('sdk:destroyed');\n\t\tthis.eventBus.clear();\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.identified = false;\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\t\tconst port = window.location.port;\n\n\t\tif (hostname.includes('staging')) {\n\t\t\treturn 'staging';\n\t\t}\n\n\t\tif (hostname === 'app.localhost' && port === '3005') {\n\t\t\treturn 'localstack';\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\tmetadata: null,\n\t\t\tposition: 'right',\n\t\t\ttheme: 'light',\n\t\t\tboardName: 'feature-requests',\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.metadata) {\n\t\t\tthis._validateMetadata(mergedConfig.metadata);\n\t\t}\n\n\t\treturn mergedConfig;\n\t}\n\n\t_validateMetadata(metadata) {\n\t\tif (!metadata.user_id && !metadata.email) {\n\t\t\tthrow new ConfigError('Metadata must include at least user_id or email');\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 (metadata[key] && typeof metadata[key] !== expectedType) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`Metadata 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.createFeedbackWidget = this.createFeedbackWidget.bind(this);\n\t\tthis.createMessengerWidget = this.createMessengerWidget.bind(this);\n\t\tthis.createChangelogWidget = this.createChangelogWidget.bind(this);\n\t\tthis.createSurveyWidget = this.createSurveyWidget.bind(this);\n\t\tthis.destroyWidget = this.destroyWidget.bind(this);\n\t\tthis.identify = this.identify.bind(this);\n\t\tthis.updateConfig = this.updateConfig.bind(this);\n\t}\n\n\tstatic create(config) {\n\t\treturn new Product7(config);\n\t}\n\n\tstatic async createAndInit(config) {\n\t\tconst sdk = new Product7(config);\n\t\tawait sdk.init();\n\t\treturn sdk;\n\t}\n\n\tstatic extractMetadataFromAuth(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\tasync _syncConfiguredMetadataAfterInit() {\n\t\tif (\n\t\t\t!this.config.metadata ||\n\t\t\tthis.apiService.identitySyncedToken === this.apiService.sessionToken\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn await this.identify(this.config.metadata);\n\t\t} catch (error) {\n\t\t\tif (this.config.debug) {\n\t\t\t\tconsole.warn('[Product7] Initial identify failed:', error);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t_extractIdentifyConfig(response) {\n\t\tconst payload = this._isPlainObject(response?.data)\n\t\t\t? response.data\n\t\t\t: response || {};\n\t\tconst configPatch = this._isPlainObject(payload.config)\n\t\t\t? payload.config\n\t\t\t: {};\n\n\t\tif (payload.last_feedback_at !== undefined) {\n\t\t\tconfigPatch.last_feedback_at = payload.last_feedback_at;\n\t\t} else if (payload.lastFeedbackAt !== undefined) {\n\t\t\tconfigPatch.last_feedback_at = payload.lastFeedbackAt;\n\t\t}\n\n\t\treturn this._omitUndefined(configPatch);\n\t}\n\n\t_applyIdentityToWidgets(metadata) {\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\tif (typeof widget.applyIdentity === 'function') {\n\t\t\t\twidget.applyIdentity(metadata);\n\t\t\t}\n\t\t}\n\t}\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","import { APIService } from './core/APIService.js';\nimport { EventBus } from './core/EventBus.js';\nimport { Product7 as Product7SDK } from './core/Product7.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\n// --- Identify: transform flat user data into internal format ---\n\nfunction transformIdentifyData(data) {\n\tconst {\n\t\torganization,\n\t\temail,\n\t\tname,\n\t\tuserId,\n\t\tprofilePicture,\n\t\tlocale,\n\t\tcompanies,\n\t\t...customAttrs\n\t} = data;\n\n\tconst metadata = {\n\t\tuser_id: userId,\n\t\temail,\n\t\tname,\n\t\tprofile_picture: profilePicture,\n\t};\n\n\t// Flat custom attributes → custom_fields\n\tconst knownKeys = [\n\t\t'organization',\n\t\t'email',\n\t\t'name',\n\t\t'userId',\n\t\t'profilePicture',\n\t\t'locale',\n\t\t'companies',\n\t\t'debug',\n\t\t'mock',\n\t\t'env',\n\t\t'apiUrl',\n\t];\n\tconst customFields = {};\n\tfor (const [key, value] of Object.entries(customAttrs)) {\n\t\tif (!knownKeys.includes(key)) {\n\t\t\tcustomFields[key] = value;\n\t\t}\n\t}\n\tif (Object.keys(customFields).length > 0) {\n\t\tmetadata.custom_fields = customFields;\n\t}\n\n\t// Companies array → company (use first for now, backend supports single)\n\tif (Array.isArray(companies) && companies.length > 0) {\n\t\tconst c = companies[0];\n\t\tmetadata.company = {\n\t\t\tid: c.id,\n\t\t\tname: c.name,\n\t\t\tmonthly_spend: c.monthlySpend,\n\t\t\tcustom_fields: {},\n\t\t};\n\t\tconst companyKnownKeys = ['id', 'name', 'monthlySpend', 'createdAt'];\n\t\tfor (const [key, value] of Object.entries(c)) {\n\t\t\tif (!companyKnownKeys.includes(key)) {\n\t\t\t\tmetadata.company.custom_fields[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tworkspace: organization,\n\t\tmetadata,\n\t\tlocale,\n\t\tdebug: data.debug,\n\t\tmock: data.mock,\n\t\tenv: data.env,\n\t\tapiUrl: data.apiUrl,\n\t};\n}\n\nfunction cleanUndefined(obj) {\n\tObject.keys(obj).forEach((key) => {\n\t\tif (obj[key] === undefined) delete obj[key];\n\t});\n\treturn obj;\n}\n\nfunction hasIdentifyMetadata(metadata = {}) {\n\treturn Object.values(metadata).some((value) => value !== undefined);\n}\n\n// --- Ensure SDK is initialized (shared by widget inits) ---\n\nasync function ensureSDK(options) {\n\tif (\n\t\tProduct7._sdk &&\n\t\toptions.organization &&\n\t\tProduct7._sdk.config.workspace !== options.organization\n\t) {\n\t\tProduct7.destroy();\n\t}\n\n\tif (Product7._sdk) return Product7._sdk;\n\n\tif (options.organization) {\n\t\tconst config = cleanUndefined({\n\t\t\tworkspace: options.organization,\n\t\t\tdebug: options.debug,\n\t\t\tmock: options.mock,\n\t\t\tenv: options.env,\n\t\t\tapiUrl: options.apiUrl,\n\t\t});\n\n\t\tconst sdk = new Product7SDK(config);\n\t\tawait sdk.init();\n\t\tProduct7._sdk = sdk;\n\t\tProduct7._organization = options.organization;\n\t\treturn sdk;\n\t}\n\n\treturn null;\n}\n\n// --- Public API ---\n\nconst Product7 = {\n\t// Internal state\n\t_sdk: null,\n\t_identified: false,\n\t_organization: null,\n\t_q: [],\n\t_feedbackWidget: null,\n\t_messengerWidget: null,\n\t_surveyWidget: null,\n\n\tversion: '1.0.0',\n\n\t// ==================\n\t// Identify\n\t// ==================\n\n\tasync identify(data = {}, callback) {\n\t\ttry {\n\t\t\tconst transformed = transformIdentifyData(data);\n\t\t\tProduct7._organization =\n\t\t\t\ttransformed.workspace || Product7._organization || null;\n\n\t\t\tconst config = cleanUndefined({\n\t\t\t\tworkspace: Product7._organization,\n\t\t\t\tdebug: transformed.debug,\n\t\t\t\tmock: transformed.mock,\n\t\t\t\tenv: transformed.env,\n\t\t\t\tapiUrl: transformed.apiUrl,\n\t\t\t});\n\n\t\t\tlet sdk = Product7._sdk;\n\t\t\tconst requiresNewSDK =\n\t\t\t\t!sdk || (config.workspace && sdk.config.workspace !== config.workspace);\n\n\t\t\tif (requiresNewSDK) {\n\t\t\t\tif (Product7._sdk) {\n\t\t\t\t\tProduct7.destroy();\n\t\t\t\t\tProduct7._organization = config.workspace || null;\n\t\t\t\t}\n\t\t\t\tsdk = new Product7SDK(config);\n\t\t\t\tProduct7._sdk = sdk;\n\t\t\t}\n\n\t\t\tconst initData = sdk.initialized\n\t\t\t\t? {\n\t\t\t\t\t\talreadyInitialized: true,\n\t\t\t\t\t\tsessionToken: sdk.apiService?.sessionToken,\n\t\t\t\t\t}\n\t\t\t\t: await sdk.init();\n\n\t\t\tconst identifyData = hasIdentifyMetadata(transformed.metadata)\n\t\t\t\t? await sdk.identify(transformed.metadata)\n\t\t\t\t: null;\n\t\t\tProduct7._identified = Boolean(identifyData?.identified);\n\n\t\t\tProduct7._flushQueue();\n\n\t\t\tif (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('Product7Ready', {\n\t\t\t\t\t\tdetail: { sdk, config: sdk.config, initData, identifyData },\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof callback === 'function') callback(null);\n\t\t\treturn {\n\t\t\t\t...initData,\n\t\t\t\tidentified: Product7._identified,\n\t\t\t\tidentify: identifyData,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error('[Product7] Identify failed:', error);\n\n\t\t\tif (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('Product7Error', {\n\t\t\t\t\t\tdetail: { error, phase: 'identify' },\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof callback === 'function') callback(error);\n\t\t\tthrow error;\n\t\t}\n\t},\n\n\t// ==================\n\t// Feedback\n\t// ==================\n\n\tasync feedback(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['feedback', options, callback]);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst widgetOptions = cleanUndefined({\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\ttextColor: options.textColor,\n\t\t\tsuppressAfterSubmission: options.suppressAfterSubmission,\n\t\t\tsuppressionDays: options.suppressionDays,\n\t\t\tshowBackdrop: options.showBackdrop !== false,\n\t\t\tmetadata: options.metadata,\n\t\t});\n\n\t\t// placement → position\n\t\tif (options.placement === 'right') {\n\t\t\twidgetOptions.position = 'right';\n\t\t} else if (options.placement === 'left') {\n\t\t\twidgetOptions.position = 'left';\n\t\t} else if (options.placement) {\n\t\t\twidgetOptions.position = options.placement;\n\t\t}\n\n\t\t// defaultBoard → boardName\n\t\tif (options.defaultBoard) {\n\t\t\twidgetOptions.boardName = options.defaultBoard;\n\t\t}\n\n\t\t// No placement = modal mode, no floating button\n\t\tif (!options.placement) {\n\t\t\twidgetOptions.autoShow = false;\n\t\t\twidgetOptions.displayMode = 'modal';\n\t\t\twidgetOptions.headless = true;\n\t\t} else {\n\t\t\t// Trigger button is always visible when placement is set\n\t\t\twidgetOptions.suppressAfterSubmission = false;\n\t\t\twidgetOptions.enabled = true;\n\t\t}\n\n\t\ttry {\n\t\t\tconst widget = sdk.createFeedbackWidget(widgetOptions);\n\t\t\twidget.mount();\n\n\t\t\tif (options.placement) {\n\t\t\t\twidget.show();\n\t\t\t} else {\n\t\t\t\twidget.hide();\n\t\t\t}\n\n\t\t\tProduct7._feedbackWidget = widget;\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'widgetReady' });\n\n\t\t\t\tsdk.eventBus.on('feedback:submitted', (data) => {\n\t\t\t\t\tcallback({ action: 'feedbackSubmitted', post: data.feedback });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('feedback:error', (data) => {\n\t\t\t\t\tcallback({ action: 'feedbackError', error: data.error });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tProduct7._setupAttributeTriggers();\n\t\t\tProduct7._setupPostMessageListener();\n\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tconsole.error('[Product7] Failed to initialize feedback widget:', error);\n\t\t\tif (typeof callback === 'function') callback({ action: 'error', error });\n\t\t\treturn null;\n\t\t}\n\t},\n\n\topenFeedback(options = {}) {\n\t\tif (Product7._feedbackWidget) {\n\t\t\tif (options.setBoard) {\n\t\t\t\tProduct7._feedbackWidget.options.boardName = options.setBoard;\n\t\t\t}\n\t\t\tProduct7._feedbackWidget.open();\n\t\t}\n\t},\n\n\tcloseFeedback() {\n\t\tif (Product7._feedbackWidget) {\n\t\t\tProduct7._feedbackWidget.close();\n\t\t}\n\t},\n\n\tdestroyFeedback() {\n\t\tif (Product7._feedbackWidget) {\n\t\t\tProduct7._feedbackWidget.destroy();\n\t\t\tProduct7._feedbackWidget = null;\n\t\t}\n\t},\n\n\t// ==================\n\t// Messenger\n\t// ==================\n\n\tasync messenger(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['messenger', options, callback]);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst widgetOptions = cleanUndefined({\n\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\tprimaryColor: options.primaryColor,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\ttextColor: options.textColor,\n\t\t\tlogoUrl: options.logoUrl,\n\t\t\tteamName: options.teamName,\n\t\t\tteamAvatars: options.teamAvatars,\n\t\t\tgreetingMessage: options.greetingMessage,\n\t\t\twelcomeMessage: options.welcomeMessage,\n\t\t\tenableHelp: options.enableHelp,\n\t\t\tenableChangelog: options.enableChangelog,\n\t\t\tenableNews: options.enableNews,\n\t\t\tautoLoadData: options.autoLoadData,\n\t\t\tinitialView: options.initialView,\n\t\t\tfeaturedContent: options.featuredContent,\n\t\t\tfeedbackUrl: options.feedbackUrl,\n\t\t\tchangelogUrl: options.changelogUrl,\n\t\t\thelpUrl: options.helpUrl,\n\t\t\troadmapUrl: options.roadmapUrl,\n\t\t\tpreviewData: options.previewData,\n\t\t});\n\n\t\t// placement → position\n\t\tif (options.placement === 'right') {\n\t\t\twidgetOptions.position = 'right';\n\t\t} else if (options.placement === 'left') {\n\t\t\twidgetOptions.position = 'left';\n\t\t} else if (options.placement) {\n\t\t\twidgetOptions.position = options.placement;\n\t\t}\n\n\t\t// Messenger is always explicitly shown — never suppress based on feedback submission history\n\t\twidgetOptions.suppressAfterSubmission = false;\n\t\twidgetOptions.enabled = true;\n\n\t\ttry {\n\t\t\tconst widget = sdk.createMessengerWidget(widgetOptions);\n\t\t\twidget.mount();\n\t\t\twidget.show();\n\n\t\t\tProduct7._messengerWidget = widget;\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'widgetReady' });\n\n\t\t\t\tsdk.eventBus.on('messenger:messageSent', (data) => {\n\t\t\t\t\tcallback({ action: 'messageSent', message: data });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('messenger:opened', () => {\n\t\t\t\t\tcallback({ action: 'messengerOpened' });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('messenger:closed', () => {\n\t\t\t\t\tcallback({ action: 'messengerClosed' });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Listen for data-product7-messenger clicks\n\t\t\tProduct7._setupMessengerAttributeTriggers();\n\t\t\tProduct7._setupPostMessageListener();\n\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tconsole.error('[Product7] Failed to initialize messenger widget:', error);\n\t\t\tif (typeof callback === 'function') callback({ action: 'error', error });\n\t\t\treturn null;\n\t\t}\n\t},\n\n\topenMessenger() {\n\t\tif (Product7._messengerWidget) {\n\t\t\tProduct7._messengerWidget.open?.() ||\n\t\t\t\tProduct7._messengerWidget.openPanel?.();\n\t\t}\n\t},\n\n\tcloseMessenger() {\n\t\tif (Product7._messengerWidget) {\n\t\t\tProduct7._messengerWidget.close?.() ||\n\t\t\t\tProduct7._messengerWidget.closePanel?.();\n\t\t}\n\t},\n\n\tdestroyMessenger() {\n\t\tif (Product7._messengerWidget) {\n\t\t\tProduct7._messengerWidget.destroy();\n\t\t\tProduct7._messengerWidget = null;\n\t\t}\n\t},\n\n\t// ==================\n\t// Survey\n\t// ==================\n\n\tasync survey(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['survey', options, callback]);\n\t\t\treturn null;\n\t\t}\n\n\t\t// placement → position\n\t\tlet position = 'right';\n\t\tif (options.placement === 'right') {\n\t\t\tposition = 'right';\n\t\t} else if (options.placement === 'left') {\n\t\t\tposition = 'left';\n\t\t} else if (options.placement === 'center') {\n\t\t\tposition = 'center';\n\t\t} else if (options.placement === 'bottom') {\n\t\t\tposition = 'bottom';\n\t\t} else if (options.placement) {\n\t\t\tposition = options.placement;\n\t\t}\n\n\t\t// displayMode: \"popover\" (default), \"modal\", \"fullscreen\"\n\t\tconst displayMode = options.displayMode || 'popover';\n\t\tif (displayMode === 'modal' || displayMode === 'fullscreen') {\n\t\t\tposition = 'center';\n\t\t}\n\n\t\t// Wire up all lifecycle callbacks\n\t\tconst surveyCallbacks = {\n\t\t\tonSubmit: (response) => {\n\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\tcallback({ action: 'surveySubmitted', response });\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDismiss: () => {\n\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\tcallback({ action: 'surveyDismissed' });\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\t// Register event bus listeners for additional callbacks\n\t\tif (typeof callback === 'function') {\n\t\t\tsdk.eventBus.on('survey:shown', (data) => {\n\t\t\t\tcallback({ action: 'surveyShown', survey: data });\n\t\t\t});\n\n\t\t\tsdk.eventBus.on('survey:questionAnswered', (data) => {\n\t\t\t\tcallback({\n\t\t\t\t\taction: 'questionAnswered',\n\t\t\t\t\tpageId: data.pageId,\n\t\t\t\t\tpageType: data.pageType,\n\t\t\t\t\tanswer: data.answer,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tsdk.eventBus.on('survey:closed', () => {\n\t\t\t\tcallback({ action: 'surveyClosed' });\n\t\t\t});\n\t\t}\n\n\t\t// Display method: delayed, exitIntent, or immediate (default)\n\t\tconst displayMethod = options.displayMethod || 'immediate';\n\t\tconst showSurvey = async () => {\n\t\t\ttry {\n\t\t\t\tlet widget;\n\n\t\t\t\tif (options.surveyId) {\n\t\t\t\t\t// Show specific survey by ID\n\t\t\t\t\tconst showOpts = {\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\tdisplayMode,\n\t\t\t\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\t\t\t\tshowBackdrop:\n\t\t\t\t\t\t\tdisplayMode === 'modal' || displayMode === 'fullscreen',\n\t\t\t\t\t\t...surveyCallbacks,\n\t\t\t\t\t};\n\n\t\t\t\t\t// force flag: bypass eligibility checks\n\t\t\t\t\tif (options.force) {\n\t\t\t\t\t\tshowOpts.context = { includeIneligible: true };\n\t\t\t\t\t}\n\n\t\t\t\t\twidget = await sdk.showSurveyById(options.surveyId, showOpts);\n\t\t\t\t} else {\n\t\t\t\t\t// Auto-fetch and show first eligible survey\n\t\t\t\t\tconst fetchOpts = options.force ? { includeIneligible: true } : {};\n\t\t\t\t\tconst surveys = await sdk.getActiveSurveys(fetchOpts);\n\n\t\t\t\t\tif (surveys.length === 0) {\n\t\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\t\tcallback({ action: 'noSurveys' });\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst surveyConfig = surveys[0];\n\t\t\t\t\twidget = sdk.showSurvey({\n\t\t\t\t\t\tsurveyId: surveyConfig.surveyId || surveyConfig.id,\n\t\t\t\t\t\tsurveyType: surveyConfig.surveyType || surveyConfig.type || 'nps',\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\tdisplayMode,\n\t\t\t\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\t\t\t\tshowBackdrop:\n\t\t\t\t\t\t\tdisplayMode === 'modal' || displayMode === 'fullscreen',\n\t\t\t\t\t\ttitle: surveyConfig.title,\n\t\t\t\t\t\tdescription: surveyConfig.description,\n\t\t\t\t\t\tlowLabel: surveyConfig.lowLabel,\n\t\t\t\t\t\thighLabel: surveyConfig.highLabel,\n\t\t\t\t\t\tratingScale: surveyConfig.ratingScale,\n\t\t\t\t\t\tshowFeedbackInput: surveyConfig.showFeedbackInput,\n\t\t\t\t\t\tshowSubmitButton: surveyConfig.showSubmitButton,\n\t\t\t\t\t\tautoSubmitOnSelect: surveyConfig.autoSubmitOnSelect,\n\t\t\t\t\t\tshowTitle: surveyConfig.showTitle,\n\t\t\t\t\t\tshowDescription: surveyConfig.showDescription,\n\t\t\t\t\t\tcustomQuestions: surveyConfig.customQuestions,\n\t\t\t\t\t\tpages: surveyConfig.pages,\n\t\t\t\t\t\tenabled: options.force ? true : surveyConfig.enabled,\n\t\t\t\t\t\t...surveyCallbacks,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback({ action: 'surveyReady', survey: surveyConfig });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tProduct7._surveyWidget = widget;\n\t\t\t\treturn widget;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[Product7] Failed to show survey:', error);\n\t\t\t\tif (typeof callback === 'function')\n\t\t\t\t\tcallback({ action: 'error', error });\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\t// Handle display methods\n\t\tif (displayMethod === 'delayed') {\n\t\t\tconst delay = options.displayDelay || 5000;\n\t\t\tProduct7._surveyTimer = setTimeout(showSurvey, delay);\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'surveyScheduled', delay });\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tif (displayMethod === 'exitIntent') {\n\t\t\tconst handler = (e) => {\n\t\t\t\tif (e.clientY <= 0) {\n\t\t\t\t\tdocument.removeEventListener('mouseout', handler);\n\t\t\t\t\tProduct7._exitIntentHandler = null;\n\t\t\t\t\tshowSurvey();\n\t\t\t\t}\n\t\t\t};\n\t\t\tProduct7._exitIntentHandler = handler;\n\t\t\tdocument.addEventListener('mouseout', handler);\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'surveyScheduled', trigger: 'exitIntent' });\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tif (displayMethod === 'onScroll') {\n\t\t\tconst scrollPercent = options.scrollPercentage || 50;\n\t\t\tconst handler = () => {\n\t\t\t\tconst scrolled =\n\t\t\t\t\t(window.scrollY / (document.body.scrollHeight - window.innerHeight)) *\n\t\t\t\t\t100;\n\t\t\t\tif (scrolled >= scrollPercent) {\n\t\t\t\t\twindow.removeEventListener('scroll', handler);\n\t\t\t\t\tProduct7._scrollHandler = null;\n\t\t\t\t\tshowSurvey();\n\t\t\t\t}\n\t\t\t};\n\t\t\tProduct7._scrollHandler = handler;\n\t\t\twindow.addEventListener('scroll', handler, { passive: true });\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({\n\t\t\t\t\taction: 'surveyScheduled',\n\t\t\t\t\ttrigger: 'onScroll',\n\t\t\t\t\tscrollPercentage: scrollPercent,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\t// Default: immediate\n\t\treturn showSurvey();\n\t},\n\n\tcloseSurvey() {\n\t\tif (Product7._surveyWidget) {\n\t\t\tProduct7._surveyWidget.hide?.() || Product7._surveyWidget.closePanel?.();\n\t\t}\n\t},\n\n\tdestroySurvey() {\n\t\t// Clean up scheduled triggers\n\t\tif (Product7._surveyTimer) {\n\t\t\tclearTimeout(Product7._surveyTimer);\n\t\t\tProduct7._surveyTimer = null;\n\t\t}\n\t\tif (Product7._exitIntentHandler) {\n\t\t\tdocument.removeEventListener('mouseout', Product7._exitIntentHandler);\n\t\t\tProduct7._exitIntentHandler = null;\n\t\t}\n\t\tif (Product7._scrollHandler) {\n\t\t\twindow.removeEventListener('scroll', Product7._scrollHandler);\n\t\t\tProduct7._scrollHandler = null;\n\t\t}\n\t\tif (Product7._surveyWidget) {\n\t\t\tProduct7._surveyWidget.destroy();\n\t\t\tProduct7._surveyWidget = null;\n\t\t}\n\t},\n\n\t// ==================\n\t// Event Tracking\n\t// ==================\n\n\tasync track(eventName, properties = {}) {\n\t\tif (!Product7._sdk) {\n\t\t\tProduct7._q.push(['track', eventName, properties]);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst sdk = Product7._sdk;\n\t\tif (!sdk.apiService?.sessionToken) return null;\n\n\t\ttry {\n\t\t\tconst result = await sdk.apiService._makeRequest('/widget/track', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tevent: eventName,\n\t\t\t\t\tproperties,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t}),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${sdk.apiService.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// If server returns a survey to show, show it\n\t\t\tif (result?.survey) {\n\t\t\t\tProduct7.survey({\n\t\t\t\t\tsurveyId: result.survey.id || result.survey.survey_id,\n\t\t\t\t\tforce: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (sdk.config.debug) {\n\t\t\t\tconsole.warn('[Product7] Track failed:', error);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t},\n\n\t// ==================\n\t// General\n\t// ==================\n\n\tgetInstance() {\n\t\treturn Product7._sdk;\n\t},\n\n\tisReady() {\n\t\treturn Boolean(Product7._sdk?.initialized);\n\t},\n\n\tonReady(callback) {\n\t\tif (typeof window === 'undefined') return;\n\n\t\tif (Product7.isReady()) {\n\t\t\tcallback(Product7._sdk);\n\t\t} else {\n\t\t\twindow.addEventListener(\n\t\t\t\t'Product7Ready',\n\t\t\t\t(event) => callback(event.detail.sdk, event.detail),\n\t\t\t\t{ once: true }\n\t\t\t);\n\t\t}\n\t},\n\n\tonError(callback) {\n\t\tif (typeof window === 'undefined') return;\n\n\t\twindow.addEventListener('Product7Error', (event) => {\n\t\t\tcallback(event.detail.error, event.detail);\n\t\t});\n\t},\n\n\tdestroy() {\n\t\tProduct7.destroyFeedback();\n\t\tProduct7.destroyMessenger();\n\t\tProduct7.destroySurvey();\n\t\tif (Product7._sdk) {\n\t\t\tProduct7._sdk.destroy();\n\t\t\tProduct7._sdk = null;\n\t\t}\n\t\tProduct7._identified = false;\n\t\tProduct7._organization = null;\n\t\tProduct7._q = [];\n\t\tProduct7._feedbackListenerAttached = false;\n\t\tProduct7._messengerListenerAttached = false;\n\t\tProduct7._postMessageListenerAttached = false;\n\t},\n\n\t// ==================\n\t// Internal\n\t// ==================\n\n\t_flushQueue() {\n\t\tconst queue = Product7._q.splice(0);\n\t\tfor (const [method, ...args] of queue) {\n\t\t\tif (typeof Product7[method] === 'function') {\n\t\t\t\tProduct7[method](...args);\n\t\t\t}\n\t\t}\n\t},\n\n\t_setupAttributeTriggers() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (Product7._feedbackListenerAttached) return;\n\t\tProduct7._feedbackListenerAttached = true;\n\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest('[data-product7-feedback]');\n\t\t\tif (trigger) {\n\t\t\t\te.preventDefault();\n\t\t\t\tProduct7.openFeedback();\n\t\t\t}\n\t\t});\n\t},\n\n\t_setupMessengerAttributeTriggers() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (Product7._messengerListenerAttached) return;\n\t\tProduct7._messengerListenerAttached = true;\n\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest('[data-product7-messenger]');\n\t\t\tif (trigger) {\n\t\t\t\te.preventDefault();\n\t\t\t\tProduct7.openMessenger();\n\t\t\t}\n\t\t});\n\t},\n\n\t_setupPostMessageListener() {\n\t\tif (typeof window === 'undefined') return;\n\t\tif (Product7._postMessageListenerAttached) return;\n\t\tProduct7._postMessageListenerAttached = true;\n\n\t\twindow.addEventListener('message', (event) => {\n\t\t\tif (event.data?.target !== 'Product7Widget') return;\n\n\t\t\tconst { action, setBoard } = event.data.data || {};\n\t\t\tswitch (action) {\n\t\t\t\tcase 'openFeedback':\n\t\t\t\t\tProduct7.openFeedback({ setBoard });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeFeedback':\n\t\t\t\t\tProduct7.closeFeedback();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'openMessenger':\n\t\t\t\t\tProduct7.openMessenger();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeMessenger':\n\t\t\t\t\tProduct7.closeMessenger();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeSurvey':\n\t\t\t\t\tProduct7.closeSurvey();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t},\n\n\t// Expose internals for advanced/npm usage\n\tProduct7SDK,\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};\n\n// --- Pre-load queue support ---\nif (typeof window !== 'undefined') {\n\tconst existingQueue = window.Product7?._q || [];\n\twindow.Product7 = Product7;\n\n\tfor (const [method, ...args] of existingQueue) {\n\t\tif (typeof Product7[method] === 'function') {\n\t\t\tProduct7[method](...args);\n\t\t}\n\t}\n}\n\nexport default Product7;\n\nexport {\n\tAPIError,\n\tAPIService,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tConfigError,\n\tEventBus,\n\thelpers,\n\tInlineWidget,\n\tMessengerWidget,\n\tProduct7SDK as Product7,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\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","contact","getContactIdentity","payload","board","board_id","boardName","attachments","contactId","contact_id","contact_email","contactEmail","contact_name","contactName","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","available_agents","full_name","picture","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","uploadFile","base64Data","filename","file","identifyContact","identify","submitRating","rated","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","email","undefined","includeEligibility","include_eligibility","userProperties","user_properties","metadata","getMetadata","respondentId","userId","user_id","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","identitySyncedToken","env","baseURL","_getBaseURL","_loadStoredSession","_loadStoredMetadata","isSessionValid","apiUrl","ENV_URLS","production","base","withWorkspace","ws","staging","localstack","hostname","port","envConfig","init","setMetadata","_initMockSession","_initRealSession","_storeSession","primaryColor","backgroundColor","textColor","size","displayMode","expiresIn","initData","_extractInitResponseData","configVersion","error","session_token","Number","expires_in","isFinite","config_version","args","apply","_restoreIdentity","_buildIdentifyPayload","identified","_storeData","_removeData","clearSession","localStorage","sessionData","token","expiry","stored","getItem","parse","startsWith","removeItem","session","key","setItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","profile_picture","avatar_url","attributes","custom_fields","company","APIService","survey","messenger","help","changelog","r","mockResponse","is_new","_storeContactIdentity","parsed","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","console","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","log","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","trigger","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","eventBus","widget","reason","_hasRecentlySubmitted","querySelector","_render","appendChild","_attachEvents","triggerEl","Element","addEventListener","open","onMount","show","style","display","hide","openPanel","_renderPanel","requestAnimationFrame","classList","add","_showLoadingModal","className","loadingElement","_hideLoadingModal","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessInPanel","handleConfigUpdate","newConfig","theme","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","modeClass","sizeClass","themeClass","directionClass","String","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","close","toggle","openModal","closeModal","ButtonWidget","isMinimized","_hiddenForOpenPanel","_hasTrigger","buttonText","triggerText","button","assign","pointerType","shouldRestoreButton","_noTriggerButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","listModalBackdropElement","currentIndex","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","stopPropagation","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","_stripHtml","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBase","changelogBaseUrl","openInNewTab","onViewUpdate","html","tmp","innerText","_truncateDescription","maxLength","plain","trimEnd","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","_showSuccessMessage","originalContent","updateTitle","titleElement","setPlaceholder","input","NotificationSound","soundUrl","volume","_soundUrl","_volume","min","max","_enabled","_audioCtx","_audioBuffer","_loadPromise","_loadAudioFile","setEnabled","Boolean","setVolume","play","_playFile","_playSynthetic","_getAudioContext","AudioContext","webkitAudioContext","ctx","resume","catch","currentTime","vol","freq","start","end","osc","createOscillator","gain","createGain","frequency","setValueAtTime","linearRampToValueAtTime","connect","destination","stop","arrayBuffer","decodeAudioData","createBufferSource","buffer","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_listeners","_onOpen","_onMessage","_onClose","_onError","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","_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","onlineMessage","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","closest","tabId","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","navContainer","hideNav","setHeader","headerContent","header","ChangelogView","_headerBg","_updateChangelogList","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","coverImage","_truncateText","mobileCloseBtn","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_pendingAttachments","_emojiPickerOpen","_emojiOutsideHandler","banner","connected","_hideTypingIndicator","_appendMessage","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","_renderGroupedMessages","defaultPlaceholder","composePlaceholder","logoUrl","headerAvatarHtml","_escapeHtml","_scrollToBottom","_renderAttachmentPreviews","_setupScrollPill","_renderMessageAttachments","_renderMessage","isLastInGroup","isSystem","_renderSystemMessage","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","rawName","w","charAt","toUpperCase","slice","logoHtml","rawAction","action","avatarHtml","avatarUrl","_renderTeamAvatars","avatars","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollHeight","scrollTop","pill","isLast","nextMsg","nextTime","senderKey","nextSenderKey","_updateSendButtonState","sendBtn","preview","idx","currentTarget","_startTyping","shiftKey","_sendMessage","emojiBtn","_toggleEmojiPicker","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","_loadEmojiPicker","reject","script","head","existing","picker","compose","insertBefore","_insertEmoji","detail","unicode","contains","emoji","selectionStart","selectionEnd","dispatchEvent","Event","onTyping","ConversationsView","avatarColors","_getAvatarColor","charCode","charCodeAt","conversationsHtml","_renderConversationItem","unreadClass","closedClass","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","_renderMessageButton","_renderFeaturedCard","_renderAvailabilityStatus","_renderRecentMessageCard","hasUnread","featuredContent","coverText","recentCard","msgBtn","feedbackBtn","onFeedbackClick","seeAllBtn","featuredBtn","PreChatFormView","_isSubmitting","_handleYes","_handleNo","yesBtn","onIdentifyContact","MessengerWidget","_explicitOptions","resolvedTheme","hasExplicitTextColor","prototype","call","hasExplicitBackgroundColor","defaultTextColor","defaultBackgroundColor","resolvedEnableChangelog","enableNews","messengerOptions","autoLoadData","initialView","previewData","feedbackBoardName","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","messengerState","launcher","wsService","_wsUnsubscribers","_feedbackWidget","notificationSoundOption","notificationSound","_notificationSound","notificationVolume","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","_createInternalFeedbackWidget","createWidget","zIndex","styleElement","getElementById","adjustColor","percent","alpha","normalized","num","g","b","padStart","applyMessengerCustomStyles","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","markAsIdentified","applyIdentity","_initWebSocket","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","localMessage","navigateTo","setUnreadCount","getState","_applyPreviewData","availability","is_online","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","helpBase","sort","order","article_count","url_slug","newConversation","initialMessages","_fetchAndApplySettings","s","_hasExplicitOption","logo_url","checkAgentAvailability","publishedAt","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","progressPercent","round","submitLabel","backButton","_handleDismiss","surveyElement","_attachSurveyEvents","opacity","transform","_getCurrentPageConfig","npsScale","_getNPSScale","npsUsesSegmentedScale","values","npsContainerClass","npsButtonClass","npsLowLabel","npsHighLabel","npsPrompt","csatPrompt","cesPrompt","nps","_renderScaleLabels","csat","ces","custom","_renderCustomQuestions","rawScale","low","high","_isRatingSurveyType","_shouldAutoSubmitOnSelect","_getCurrentPage","_renderSurveyPage","_renderRatingPage","_renderMultipleChoicePage","_renderTextPage","_renderLinkPage","pageId","ratingConfig","topSurveyType","configType","ratingType","currentRating","defaultLowLabel","defaultHighLabel","usesSegmentedScale","buttonClass","starScale","multipleChoiceConfig","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","linkConfig","linkText","redirectUrl","openIn","clicked","_renderQuestionInput","question","opt","_handleSubmit","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","isStarRating","_setPageAnswer","star","starScore","hoverScore","existingValues","nextValues","v","pId","navigation","afterThisPage","goesTo","_maybeAutoSubmit","_setSubmitLoading","loading","_validateCurrentPage","nextPageIndex","_getNextPageIndex","normalizedPageAnswers","_normalizePageAnswersForSubmit","mergedAnswers","page_answers","_getSubmissionRating","_showSuccessNotification","pageType","answer","hasSingle","hasMany","fallbackNext","nextValue","normalizedId","pageIndex","output","sdkMetadata","apiMetadata","localMetadata","prepend","notification","transition","resetState","immediate","surveyEl","backdropEl","pos","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","Product7$1","Product7","_validateAndMergeConfig","initialized","siteId","debug","_injectStyles","designTokens","alreadyInitialized","identifyResult","_syncConfiguredMetadataAfterInit","requestedType","normalizedType","_normalizeWidgetType","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","_normalizeWidgetOptions","widgetEnabled","_isWidgetEnabled","widgetOptions","internalType","createFeedbackWidget","createMessengerWidget","createChangelogWidget","createSurveyWidget","getWidget","surveys","_normalizeSurveyConfig","includeIneligible","_isSurveyEligible","showSurveyById","displayOptions","surveyConfig","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","_getWidgetTypeAliases","alias","_toCamelCaseObject","typeConfig","_toCamelCaseKey","nestedValue","headless","fromEntries","showChangelog","defaults","configDefaults","changelogEnabled","changelogWidget","getAllWidgets","destroyWidget","destroyAllWidgets","updateConfig","oldConfig","_validateMetadata","configPatch","_extractIdentifyConfig","_applyIdentityToWidgets","phase","reinitialize","newMetadata","hasFeedbackBeenSubmitted","cooldownDays","clearFeedbackSubmissionTracking","_detectEnvironment","existingConfig","mergedConfig","validStructure","expectedType","createAndInit","extractMetadataFromAuth","authData","sub","display_name","role","plan","subscription","organization","monthly_spend","lastFeedbackAt","cleanUndefined","ensureSDK","_sdk","Product7SDK","_organization","_identified","_q","_messengerWidget","_surveyWidget","version","transformed","profilePicture","locale","companies","customAttrs","knownKeys","customFields","monthlySpend","companyKnownKeys","transformIdentifyData","identifyData","some","hasIdentifyMetadata","_flushQueue","CustomEvent","placement","defaultBoard","post","_setupAttributeTriggers","_setupPostMessageListener","openFeedback","setBoard","closeFeedback","destroyFeedback","_setupMessengerAttributeTriggers","openMessenger","closeMessenger","destroyMessenger","surveyCallbacks","displayMethod","showOpts","force","fetchOpts","displayDelay","_surveyTimer","handler","clientY","_exitIntentHandler","scrollPercent","scrollPercentage","scrollY","_scrollHandler","passive","closeSurvey","destroySurvey","track","eventName","properties","getInstance","isReady","onReady","onError","_feedbackListenerAttached","_messengerListenerAttached","_postMessageListenerAttached","queue","helpers","existingQueue"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"product7-js.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/utils/NotificationSound.js","../src/utils/notificationSoundData.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/Product7.js","../src/styles/styles.js","../src/index.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: {\n\t\t\t\t\tscale: 11,\n\t\t\t\t\tlow_label: 'Very unlikely',\n\t\t\t\t\thigh_label: 'Very likely',\n\t\t\t\t\tsurvey_type: 'nps',\n\t\t\t\t},\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: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very dissatisfied',\n\t\t\t\t\thigh_label: 'Very satisfied',\n\t\t\t\t\tsurvey_type: 'emoji',\n\t\t\t\t},\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: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very difficult',\n\t\t\t\t\thigh_label: 'Very easy',\n\t\t\t\t\tsurvey_type: 'ces',\n\t\t\t\t},\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:\n\t\t\t\t\t'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:\n\t\t\t\t\t'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 contact = this.api.getContactIdentity();\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardName,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\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\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.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 uploadFile(base64Data, filename) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this.api._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.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.api.identify(data);\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true, data: { rated: true } };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/rating`,\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(data),\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('[Product7 Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[Product7 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 metadata =\n\t\t\ttypeof this.api.getMetadata === 'function'\n\t\t\t\t? this.api.getMetadata() || {}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\trespondent_id:\n\t\t\t\tcontext.respondentId || context.userId || metadata.user_id || null,\n\t\t\temail: context.email || metadata.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\t\tconst contact = this.api.getContactIdentity?.() || null;\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\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\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.metadata = config.metadata || null;\n\t\tthis.identitySyncedToken = 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\tthis._loadStoredMetadata();\n\t\tif (this.isSessionValid() && this.metadata) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t}\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\tlet env = this.env;\n\t\tif (!env || env === 'production') {\n\t\t\tconst hostname =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.hostname) || '';\n\t\t\tconst port =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.port) || '';\n\t\t\tif (hostname.includes('staging')) {\n\t\t\t\tenv = 'staging';\n\t\t\t} else if (hostname === 'app.localhost' && port === '3005') {\n\t\t\t\tenv = 'localstack';\n\t\t\t}\n\t\t}\n\n\t\tconst envConfig = ENV_URLS[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(metadata = undefined) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\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) {\n\t\t\tthrow new APIError(400, 'Missing workspace for initialization');\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.identitySyncedToken = null;\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\tboardName: '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};\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.identitySyncedToken = null;\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'\n\t\t\t\t? response.data\n\t\t\t\t: 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\tawait this._restoreIdentity();\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\tasync identify(metadata = this.metadata) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\n\t\t}\n\n\t\tif (!this.metadata) {\n\t\t\tthrow new APIError(400, 'Missing user context for identify');\n\t\t}\n\n\t\tawait this._ensureSession();\n\n\t\tconst payload = this._buildIdentifyPayload(this.metadata);\n\n\t\tif (this.mock) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tidentified: true,\n\t\t\t\tdata: {\n\t\t\t\t\tuser_id: payload.user_id || null,\n\t\t\t\t\temail: payload.email || null,\n\t\t\t\t\tname: payload.name || null,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst response = await this._makeRequest('/widget/identify', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(payload),\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});\n\n\t\tthis.identitySyncedToken = this.sessionToken;\n\t\treturn response;\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\tsetMetadata(metadata) {\n\t\tthis.metadata = metadata || null;\n\t\tthis.identitySyncedToken = null;\n\t\tif (this.metadata) {\n\t\t\tthis._storeData('product7_metadata', this.metadata);\n\t\t} else {\n\t\t\tthis._removeData('product7_metadata');\n\t\t}\n\t}\n\n\tgetMetadata() {\n\t\treturn this.metadata;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.identitySyncedToken = null;\n\t\tthis.contactId = null;\n\t\tthis.contactEmail = null;\n\t\tthis.contactName = null;\n\t\tthis._removeData('product7_session');\n\t\tthis._removeData('product7_metadata');\n\t\tthis._removeData('product7_contact');\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('product7_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('product7_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('product7_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.workspace &&\n\t\t\t\tsessionData.workspace &&\n\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t) {\n\t\t\t\tlocalStorage.removeItem('product7_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\t_loadStoredMetadata() {\n\t\tif (this.metadata || typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst session = localStorage.getItem('product7_session');\n\t\t\tif (session) {\n\t\t\t\tconst sessionData = JSON.parse(session);\n\t\t\t\tif (\n\t\t\t\t\tthis.workspace &&\n\t\t\t\t\tsessionData.workspace &&\n\t\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stored = localStorage.getItem('product7_metadata');\n\t\t\tif (!stored) return false;\n\n\t\t\tthis.metadata = JSON.parse(stored);\n\t\t\treturn true;\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\t_buildIdentifyPayload(metadata = {}) {\n\t\tconst payload = {\n\t\t\tuser_id: metadata.user_id,\n\t\t\temail: metadata.email,\n\t\t\tname: metadata.name,\n\t\t\tavatar:\n\t\t\t\tmetadata.profile_picture || metadata.avatar_url || metadata.avatar,\n\t\t\tattributes: metadata.custom_fields || {},\n\t\t};\n\n\t\tif (metadata.company) {\n\t\t\tpayload.company = metadata.company;\n\t\t}\n\n\t\treturn payload;\n\t}\n\n\tasync _restoreIdentity() {\n\t\tif (\n\t\t\t!this.metadata ||\n\t\t\t!this.sessionToken ||\n\t\t\t!this.identitySyncedToken ||\n\t\t\tthis.identitySyncedToken === this.sessionToken\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.identify(this.metadata);\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\treturn this.messenger.checkAgentsOnline();\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\treturn this.messenger.startConversation(data);\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\treturn this.messenger.sendMessage(conversationId, data);\n\t}\n\n\tasync uploadFile(base64Data, filename) {\n\t\treturn this.messenger.uploadFile(base64Data, filename);\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 identify(metadata) {\n\t\tawait this._ensureSession();\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((r) => setTimeout(r, 300));\n\t\t\tconst mockResponse = {\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: metadata.email || '',\n\t\t\t\t\tname: metadata.name || '',\n\t\t\t\t\tavatar: metadata.avatar || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis._storeContactIdentity(mockResponse.data, metadata);\n\t\t\treturn mockResponse;\n\t\t}\n\n\t\tconst payload = {};\n\n\t\tif (metadata.email) payload.email = metadata.email;\n\t\tif (metadata.user_id) payload.user_id = metadata.user_id;\n\t\tif (metadata.name) payload.name = metadata.name;\n\t\tif (metadata.avatar) payload.avatar = metadata.avatar;\n\t\tif (metadata.attributes) payload.attributes = metadata.attributes;\n\t\tif (metadata.company) payload.company = metadata.company;\n\n\t\tconst response = await this._makeRequest('/widget/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.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\n\t\tif (response?.status && response?.data) {\n\t\t\tthis._storeContactIdentity(response.data, metadata);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t_storeContactIdentity(data, metadata = {}) {\n\t\tthis.contactId = data.contact_id || null;\n\t\tthis.contactEmail = data.email || metadata.email || null;\n\t\tthis.contactName = data.name || metadata.name || null;\n\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\t'product7_contact',\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tcontactId: this.contactId,\n\t\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\t\tcontactName: this.contactName,\n\t\t\t\t})\n\t\t\t);\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\t}\n\n\tgetContactIdentity() {\n\t\tif (this.contactId) {\n\t\t\treturn {\n\t\t\t\tcontactId: this.contactId,\n\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\tcontactName: this.contactName,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('product7_contact');\n\t\t\tif (stored) {\n\t\t\t\tconst parsed = JSON.parse(stored);\n\t\t\t\tthis.contactId = parsed.contactId;\n\t\t\t\tthis.contactEmail = parsed.contactEmail;\n\t\t\t\tthis.contactName = parsed.contactName;\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.identify(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","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('[Product7] 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\tboardName: this.sdk.config.boardName,\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\ttrigger: true,\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\n\t\t// Bind to a custom trigger element if a selector or element was provided\n\t\tif (this.options.trigger && this.options.trigger !== true) {\n\t\t\tconst triggerEl =\n\t\t\t\ttypeof this.options.trigger === 'string'\n\t\t\t\t\t? document.querySelector(this.options.trigger)\n\t\t\t\t\t: this.options.trigger instanceof Element\n\t\t\t\t\t\t? this.options.trigger\n\t\t\t\t\t\t: null;\n\t\t\tif (triggerEl) {\n\t\t\t\ttriggerEl.addEventListener('click', () => this.open());\n\t\t\t}\n\t\t}\n\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\tthis._renderPanel();\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.panelElement) {\n\t\t\t\tthis.panelElement.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\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\tthis.state.isOpen = false;\n\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\tthis.panelElement = null;\n\t\t}\n\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\t\tthis._resetForm();\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.boardName,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.title.trim()) {\n\t\t\t\tthis._showError('Please enter a title.');\n\t\t\t\treturn;\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._showSuccessInPanel();\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\tboardName: this.options.boardName,\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\tconst isLeftPosition =\n\t\t\tmodeClass === 'feedback-panel' &&\n\t\t\tString(this.options.position).includes('left');\n\t\tconst directionClass = isLeftPosition ? 'panel-from-left' : '';\n\t\tthis.panelElement.className =\n\t\t\t`${modeClass} ${sizeClass} ${themeClass} ${directionClass}`.trim();\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--color-primary',\n\t\t\tthis.options.primaryColor\n\t\t);\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 <iconify-icon icon=\"ph:x-duotone\" width=\"18\" height=\"18\"></iconify-icon>\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 <span class=\"sdk-required\">*</span></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 <span class=\"sdk-required\">*</span></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.disabled = this.state.isSubmitting;\n\t\t\t\tsubmitBtn.innerHTML = this.state.isSubmitting\n\t\t\t\t\t? `<iconify-icon icon=\"ph:circle-notch\" width=\"16\" height=\"16\" style=\"animation: spin 0.8s linear infinite;\"></iconify-icon> Sending...`\n\t\t\t\t\t: `Send Feedback`;\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_showSuccessInPanel() {\n\t\tif (!this.panelElement) return;\n\n\t\tconst content = this.panelElement.querySelector('.feedback-panel-content');\n\t\tif (!content) return;\n\n\t\tcontent.innerHTML = `\n\t\t\t<div style=\"display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; padding: 40px 24px; text-align: center;\">\n\t\t\t\t<div style=\"width: 56px; height: 56px; border-radius: 50%; background: #037F0C; display: flex; align-items: center; justify-content: center; margin-bottom: 20px;\">\n\t\t\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"28\" height=\"28\" fill=\"none\" stroke=\"#ffffff\" stroke-width=\"24\" stroke-linecap=\"round\" stroke-linejoin=\"round\" viewBox=\"0 0 256 256\">\n\t\t\t\t\t\t<polyline points=\"216,72 96,192 40,136\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3 style=\"margin: 0 0 8px; font-size: 1.25rem; font-weight: 600; color: var(--feedback-panel-text, #1d1d1f);\">Thank you!</h3>\n\t\t\t\t<p style=\"margin: 0; font-size: 0.875rem; color: #6b7280; line-height: 1.5;\">Your feedback has been submitted successfully.</p>\n\t\t\t</div>\n\t\t`;\n\n\t\tsetTimeout(() => this.closePanel(), 2000);\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\topen() {\n\t\tthis.openPanel();\n\t\treturn this;\n\t}\n\n\tclose() {\n\t\tthis.closePanel();\n\t\treturn this;\n\t}\n\n\ttoggle() {\n\t\tif (this.state.isOpen) {\n\t\t\tthis.closePanel();\n\t\t} else {\n\t\t\tthis.openPanel();\n\t\t}\n\t\treturn this;\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_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_render() {\n\t\tif (!this._hasTrigger()) {\n\t\t\t// No built-in button — widget is opened programmatically or via custom trigger\n\t\t\tconst placeholder = document.createElement('div');\n\t\t\tplaceholder.style.display = 'none';\n\t\t\treturn placeholder;\n\t\t}\n\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\" xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" fill=\"currentColor\" viewBox=\"0 0 256 256\">\n <path d=\"M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-8,144H40V74.19l82.59,75.71a8,8,0,0,0,10.82,0L216,74.19V192Z\"/>\n </svg>\n <span class=\"feedback-text\">${buttonText}</span>\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\tif (!this._hasTrigger()) return;\n\n\t\tconst button = this.element.querySelector('.feedback-trigger-btn');\n\n\t\tbutton.addEventListener('click', () => {\n\t\t\tthis.openPanel();\n\t\t});\n\n\t\tbutton.addEventListener('pointerup', (e) => {\n\t\t\tif (e.pointerType === 'mouse') return;\n\t\t\tthis.openPanel();\n\t\t});\n\t}\n\n\topenPanel() {\n\t\tif (this._hasTrigger() && !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 && !this.options._noTriggerButton) {\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+/,\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_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_render() {\n\t\tif (!this._hasTrigger()) {\n\t\t\tconst placeholder = document.createElement('div');\n\t\t\tplaceholder.style.display = 'none';\n\t\t\treturn placeholder;\n\t\t}\n\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\tif (!this._hasTrigger()) return;\n\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\">\n\t\t\t\t\t<iconify-icon icon=\"ph:x-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t\t</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\t<button class=\"changelog-list-modal-close\" type=\"button\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"changelog-list-modal-body\">\n\t\t\t\t\t<div class=\"changelog-loading\">\n\t\t\t\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tdocument.body.appendChild(this.listModalElement);\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-container')\n\t\t\t.addEventListener('click', (e) => e.stopPropagation());\n\n\t\tthis.listModalElement\n\t\t\t.querySelector('.changelog-list-modal-close')\n\t\t\t.addEventListener('click', () => this.closeSidebar());\n\n\t\tthis._listModalEscapeHandler = (e) => {\n\t\t\tif (e.key === 'Escape') this.closeSidebar();\n\t\t};\n\t\tdocument.addEventListener('keydown', this._listModalEscapeHandler);\n\t}\n\n\t_renderChangelogList() {\n\t\tconst body = this.listModalElement.querySelector(\n\t\t\t'.changelog-list-modal-body'\n\t\t);\n\n\t\tif (this.isLoading) return;\n\n\t\tif (this.changelogs.length === 0) {\n\t\t\tbody.innerHTML = `\n\t\t\t\t<div class=\"changelog-empty\">\n\t\t\t\t\t<svg width=\"48\" height=\"48\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\">\n\t\t\t\t\t\t<path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z\"/>\n\t\t\t\t\t\t<polyline points=\"14,2 14,8 20,8\"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\treturn;\n\t\t}\n\n\t\tbody.innerHTML = `\n\t\t\t<div class=\"changelog-list\">\n\t\t\t\t${this.changelogs.map((changelog, index) => this._renderChangelogListItem(changelog, index)).join('')}\n\t\t\t</div>\n\t\t`;\n\n\t\tbody.querySelectorAll('.changelog-list-item').forEach((item, index) => {\n\t\t\titem.addEventListener('click', () => {\n\t\t\t\tthis._handleViewUpdate(this.changelogs[index]);\n\t\t\t});\n\t\t});\n\t}\n\n\t_renderChangelogListItem(changelog, index) {\n\t\tconst hasImage = changelog.cover_image || changelog.image;\n\t\tconst imageUrl = changelog.cover_image || changelog.image;\n\t\tconst date = changelog.published_at\n\t\t\t? this._formatDate(changelog.published_at)\n\t\t\t: '';\n\t\tconst description = this._stripHtml(\n\t\t\tchangelog.excerpt || changelog.description\n\t\t);\n\t\tconst labelsHTML =\n\t\t\tchangelog.labels && changelog.labels.length > 0\n\t\t\t\t? `<div class=\"changelog-list-item-labels\">\n\t\t\t\t\t\t${changelog.labels\n\t\t\t\t\t\t\t.map(\n\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)\n\t\t\t\t\t\t\t.join('')}\n\t\t\t\t\t</div>`\n\t\t\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-content\">\n\t\t\t\t\t<div class=\"changelog-list-item-meta\">\n\t\t\t\t\t\t${date ? `<span class=\"changelog-list-item-date\">${date}</span>` : ''}\n\t\t\t\t\t\t${labelsHTML}\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3 class=\"changelog-list-item-title\">${changelog.title}</h3>\n\t\t\t\t\t${description ? `<p class=\"changelog-list-item-description\">${description}</p>` : ''}\n\t\t\t\t</div>\n\t\t\t\t${hasImage ? `<div class=\"changelog-list-item-image\"><img src=\"${imageUrl}\" alt=\"${changelog.title}\" loading=\"lazy\" /></div>` : ''}\n\t\t\t\t<iconify-icon icon=\"ph:caret-right\" class=\"changelog-list-item-arrow\" width=\"16\" height=\"16\"></iconify-icon>\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._stripHtml(\n\t\t\tchangelog.excerpt || changelog.description\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<iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>\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\topen() {\n\t\tthis.openSidebar();\n\t\treturn this;\n\t}\n\n\tclose() {\n\t\tthis.closeSidebar();\n\t\treturn this;\n\t}\n\n\ttoggle() {\n\t\tif (this.state.isOpen) {\n\t\t\tthis.closeSidebar();\n\t\t} else {\n\t\t\tthis.openSidebar();\n\t\t}\n\t\treturn this;\n\t}\n\n\tmount(container) {\n\t\tsuper.mount(container);\n\n\t\t// Bind to a custom trigger element if provided\n\t\tif (this.options.trigger && this.options.trigger !== true) {\n\t\t\tconst triggerEl =\n\t\t\t\ttypeof this.options.trigger === 'string'\n\t\t\t\t\t? document.querySelector(this.options.trigger)\n\t\t\t\t\t: this.options.trigger instanceof Element\n\t\t\t\t\t\t? this.options.trigger\n\t\t\t\t\t\t: null;\n\t\t\tif (triggerEl) {\n\t\t\t\ttriggerEl.addEventListener('click', () => this.open());\n\t\t\t}\n\t\t}\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 * NotificationSound — plays a soft ping when a new agent message arrives.\n *\n * Default: the bundled notification-sound.mp3 (inlined as base64 at build time).\n * Falls back to a Web Audio API synthetic chime if the file was not bundled.\n * Override: pass `soundUrl` (MP3/OGG/WAV URL or base64 data URI) to use a different file.\n */\nimport BUNDLED_SOUND from './notificationSoundData.js';\n\nexport class NotificationSound {\n\tconstructor({ soundUrl = BUNDLED_SOUND, volume = 0.4 } = {}) {\n\t\tthis._soundUrl = soundUrl;\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t\tthis._enabled = true;\n\t\tthis._audioCtx = null;\n\t\tthis._audioBuffer = null;\n\t\tthis._loadPromise = null;\n\n\t\tif (soundUrl) {\n\t\t\tthis._loadPromise = this._loadAudioFile(soundUrl);\n\t\t}\n\t}\n\n\tsetEnabled(enabled) {\n\t\tthis._enabled = Boolean(enabled);\n\t}\n\n\tsetVolume(volume) {\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t}\n\n\tasync play() {\n\t\tif (!this._enabled) return;\n\t\tif (typeof window === 'undefined') return;\n\n\t\ttry {\n\t\t\tif (this._soundUrl) {\n\t\t\t\tawait this._playFile();\n\t\t\t} else {\n\t\t\t\tawait this._playSynthetic();\n\t\t\t}\n\t\t} catch {\n\t\t\t/* autoplay policy or context suspended — silent fail */\n\t\t}\n\t}\n\n\t// ── Private ────────────────────────────────────────────────────────────────\n\n\t_getAudioContext() {\n\t\tif (!this._audioCtx || this._audioCtx.state === 'closed') {\n\t\t\tconst AudioContext = window.AudioContext || window.webkitAudioContext;\n\t\t\tif (!AudioContext) return null;\n\t\t\tthis._audioCtx = new AudioContext();\n\t\t}\n\t\treturn this._audioCtx;\n\t}\n\n\t/**\n\t * Synthetic two-tone chime via Web Audio API — no file required.\n\t * • First tone: 880 Hz, 0–80 ms\n\t * • Second tone: 1100 Hz, 60–160 ms\n\t * Sounds like a gentle message ping.\n\t */\n\tasync _playSynthetic() {\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tawait ctx.resume();\n\t\t}\n\n\t\tconst now = ctx.currentTime;\n\t\tconst vol = this._volume;\n\n\t\tconst tones = [\n\t\t\t{ freq: 880, start: 0, end: 0.08 },\n\t\t\t{ freq: 1100, start: 0.06, end: 0.16 },\n\t\t];\n\n\t\ttones.forEach(({ freq, start, end }) => {\n\t\t\tconst osc = ctx.createOscillator();\n\t\t\tconst gain = ctx.createGain();\n\n\t\t\tosc.type = 'sine';\n\t\t\tosc.frequency.value = freq;\n\n\t\t\tgain.gain.setValueAtTime(0, now + start);\n\t\t\tgain.gain.linearRampToValueAtTime(vol, now + start + 0.01);\n\t\t\tgain.gain.linearRampToValueAtTime(0, now + end);\n\n\t\t\tosc.connect(gain);\n\t\t\tgain.connect(ctx.destination);\n\n\t\t\tosc.start(now + start);\n\t\t\tosc.stop(now + end + 0.01);\n\t\t});\n\t}\n\n\tasync _loadAudioFile(url) {\n\t\ttry {\n\t\t\tconst ctx = this._getAudioContext();\n\t\t\tif (!ctx) return;\n\n\t\t\tconst response = await fetch(url);\n\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\tthis._audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\t\t} catch {\n\t\t\t/* failed to load — fall back to synthetic */\n\t\t\tthis._soundUrl = null;\n\t\t}\n\t}\n\n\tasync _playFile() {\n\t\tif (this._loadPromise) {\n\t\t\tawait this._loadPromise;\n\t\t\tthis._loadPromise = null;\n\t\t}\n\n\t\tif (!this._audioBuffer) {\n\t\t\tthis._playSynthetic();\n\t\t\treturn;\n\t\t}\n\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tawait ctx.resume();\n\t\t}\n\n\t\tconst source = ctx.createBufferSource();\n\t\tconst gain = ctx.createGain();\n\n\t\tsource.buffer = this._audioBuffer;\n\t\tgain.gain.value = this._volume;\n\n\t\tsource.connect(gain);\n\t\tgain.connect(ctx.destination);\n\t\tsource.start();\n\t}\n}\n","export default \"data:audio/mpeg;base64,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BeaJKOtqtegdfu08KKta9TmppaKVKbNRgAAdr/tXGB6CSCPl1Lelt7XW7T01ifVk2zjE1bLW839346gs//uAZPGAAtMh2Hn4GlhT52rfPeJdDAirVe28aaE2Dmr9tY0siLho4mUCDpWMFgQGgu42pLnLawWb/bpWNprQxluj9TNaXJSgOIMS1KzM0TRIAAAABFakEh3cgBQEGVwwSAstoCBiYpGhkVAplAwJmPAkYLCBkEDgYHpEhgdJRk+AeYkqaA6eReiyrxNIvmnxxStER14EjE2/9hljaO2siCoAhzKnpuRt269O0veD7Pq/uNbdzt6jfydzch/Kkpf1/dcqV6ta/y3Y1MWIft8iMqtZzUahrWPO71nqvG43fsROXu5Y3KZJGnRZbEH1clnOWX//OZ/+2WTnxeAH4ZfTSxQdl7ovLbXkoM0tW5UzXqqe3b9bPWP/+H7q59vrHa/P1WVuvIHDdeijc/LKqG114l3Joq5VSQSsRUcUBhEnmWs49v5f///////////////y/mff///////////////3Ad21LEZyZxNSU0SUaZb/+8Bk6AADBiBVfWGgCEbieq+nmAEjzhFJ+cyQBEdCKT85gkCgwCAAAAA6AP0AywXlGoy0hpYVBKCMGkNVAtKWyXWFQkQg10C3jJ4dCWsMS6ezji0j3yF6W6MVa5lLJbaXvIFSNMi8Vdp4aejr0kYgJ/IpLXJpq0lmN4S38scPty+3K4brc1En1pL+vzx/k/bwt3IYllNldscl0R/HlzH9/zJ2IEd+3kzt34vWlVWVWqbn5Z/njz8O/+aXAXCHDZovNNc0AZypebBMlXypavJwV2u4yFL1vG4qA//93+9d/ff/Fg5dCKWEFHZcd41TwOim499QNk7qNZnHhm2uvA4NA5XIelTssq//5////////////////KFL24Op////////////////I3ifN9VM55RBBXv+tQAA8aAYzpLaSOxTi1EgJ6SJFPyUphVqcwGS1LvW/Hx+27zX1/f7Y2w5rdPTwuJkLERYGnMZHg0LksCgqGoKvEWkqYTKtOnRLvoGgFPadXgqdiKxbu2ws92sNCIOHN0xkAtG+saAAuK4rNZxyl0v8x2rfuXaCm7ruwZLSEFAQkKru7B2WMZy0qeUZjNZr5eXDP+8VVSOR/5cly6S3120bi5SXY5P/1/U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\";\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.metadata = options.metadata || 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.onlineMessage = options.onlineMessage || \"We're online now\";\n\t\tthis.responseTime =\n\t\t\toptions.responseTime || 'We typically reply 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, metadata = null) {\n\t\tthis.isIdentified = isIdentified;\n\t\tif (metadata) {\n\t\t\tthis.metadata = { ...this.metadata, ...metadata };\n\t\t}\n\t\tthis._notify('identificationChange', { isIdentified, metadata });\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\tconst previousView = this.currentView;\n\t\tthis.currentView = 'home';\n\t\tthis.activeConversationId = null;\n\t\tthis.helpSearchQuery = '';\n\t\tif (previousView !== 'home') {\n\t\t\tthis._notify('viewChange', { previousView, currentView: 'home' });\n\t\t}\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 || '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 <iconify-icon icon=\"ph:chats-circle-duotone\" width=\"24\" height=\"24\"></iconify-icon>\n </span>\n <span class=\"messenger-launcher-icon messenger-launcher-icon-close\" style=\"display: none;\">\n <iconify-icon icon=\"ph:caret-down-bold\" width=\"22\" height=\"22\"></iconify-icon>\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 || '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\t\tconst navContainer = this.element.querySelector('.messenger-panel-nav');\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\n\t\t// Hide nav in chat and prechat views\n\t\tif (navContainer) {\n\t\t\tconst hideNav =\n\t\t\t\tthis.state.currentView === 'chat' ||\n\t\t\t\tthis.state.currentView === 'prechat';\n\t\t\tnavContainer.style.display = hideNav ? 'none' : '';\n\t\t}\n\t}\n\n\tshow() {\n\t\tif (this.element) {\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}\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 messenger-mobile-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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_stripHtml(html) {\n\t\tif (!html) return '';\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_renderChangelogCard(item) {\n\t\treturn `\n\t\t\t<div class=\"messenger-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${item.coverImage ? `<div class=\"messenger-changelog-thumb\"><img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.parentElement.style.display='none';\" /></div>` : ''}\n\t\t\t\t<div class=\"messenger-changelog-content\">\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._stripHtml(item.description)}</p>` : ''}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_getContrastColor(hexColor) {\n\t\tconst hex = hexColor.replace('#', '');\n\t\tconst r = parseInt(hex.substring(0, 2), 16);\n\t\tconst g = parseInt(hex.substring(2, 4), 16);\n\t\tconst b = parseInt(hex.substring(4, 6), 16);\n\t\tconst luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n\t\treturn luminance > 0.5 ? '#374151' : '#ffffff';\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\tconst mobileCloseBtn = this.element.querySelector(\n\t\t\t'.messenger-changelog-close-btn'\n\t\t);\n\t\tif (mobileCloseBtn) {\n\t\t\tmobileCloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\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\tthis._emojiPickerOpen = false;\n\t\tthis._emojiOutsideHandler = null;\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 (type === 'connectionChange') {\n\t\t\t\tconst banner = this.element?.querySelector(\n\t\t\t\t\t'.messenger-connection-banner'\n\t\t\t\t);\n\t\t\t\tif (banner) {\n\t\t\t\t\tbanner.style.display = data.connected ? 'none' : 'flex';\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\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} 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: this._renderGroupedMessages(messages);\n\n\t\tconst defaultPlaceholder =\n\t\t\tthis.options.composePlaceholder || 'Write a message...';\n\t\tconst placeholder = isNewConversation\n\t\t\t? this.options.composePlaceholder || 'Start typing your message...'\n\t\t\t: isClosed\n\t\t\t\t? 'Conversation closed'\n\t\t\t\t: defaultPlaceholder;\n\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst headerAvatarHtml = logoUrl\n\t\t\t? `<img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(teamName)}\" />`\n\t\t\t: `<iconify-icon icon=\"ph:chats-circle-duotone\" width=\"20\" height=\"20\"></iconify-icon>`;\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<iconify-icon icon=\"ph:arrow-left\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class=\"messenger-chat-header-avatar\">\n\t\t\t\t\t${headerAvatarHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-chat-header-info\">\n\t\t\t\t\t<span class=\"messenger-chat-title\">${this._escapeHtml(teamName)}</span>\n\t\t\t\t\t<span class=\"messenger-chat-subtitle\">${isClosed ? 'Conversation resolved' : this.state.responseTime || 'Typically replies within minutes'}</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"messenger-chat-header-actions\">\n\t\t\t\t\t<button class=\"sdk-btn-icon sdk-close-btn messenger-mobile-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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-connection-banner\" style=\"display:none;\">\n\t\t\t\t<iconify-icon icon=\"ph:wifi-slash\" width=\"14\" height=\"14\"></iconify-icon>\n\t\t\t\t<span>Reconnecting…</span>\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<iconify-icon icon=\"ph:check-circle-duotone\" width=\"18\" height=\"18\"></iconify-icon>\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<div class=\"messenger-scroll-pill\" style=\"display:none;\">\n\t\t\t\t<iconify-icon icon=\"ph:arrow-down\" width=\"14\" height=\"14\"></iconify-icon>\n\t\t\t\t<span>New message</span>\n\t\t\t</div>\n\n\t\t\t${\n\t\t\t\tisClosed\n\t\t\t\t\t? ''\n\t\t\t\t\t: `\n\t\t\t<div class=\"messenger-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"messenger-chat-compose\">\n\t\t\t\t<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<div class=\"messenger-compose-bottom\">\n\t\t\t\t\t<div class=\"messenger-compose-actions\">\n\t\t\t\t\t\t<button class=\"sdk-btn-icon messenger-compose-attach\" aria-label=\"Attach file\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:paperclip-duotone\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button class=\"sdk-btn-icon messenger-emoji-btn\" aria-label=\"Emoji\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:smiley-duotone\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"messenger-compose-send\" aria-label=\"Send\" disabled>\n\t\t\t\t\t\t<iconify-icon icon=\"ph:paper-plane-right\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\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\tthis._setupScrollPill();\n\t}\n\n\t_renderEmptyState(isNewConversation = false) {\n\t\tconst logoUrl = this.options.logoUrl;\n\n\t\tconst logoHtml = logoUrl\n\t\t\t? `<div class=\"messenger-chat-empty-logo\"><img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(this.state.teamName)}\" /></div>`\n\t\t\t: '';\n\n\t\treturn `\n\t\t\t<div class=\"messenger-chat-empty\">\n\t\t\t\t${logoHtml}\n\t\t\t\t<h3>${isNewConversation ? 'Start a new conversation' : 'Start the conversation'}</h3>\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<iconify-icon icon=\"ph:file-duotone\" width=\"18\" height=\"18\"></iconify-icon>\n\t\t\t\t<span>${this._escapeHtml(att.name || 'file')}</span>\n\t\t\t\t<iconify-icon icon=\"ph:download-simple\" width=\"16\" height=\"16\" class=\"messenger-file-download-icon\"></iconify-icon>\n\t\t\t</a>`;\n\t\t\t})\n\t\t\t.join('');\n\t}\n\n\t_renderMessage(message, isLastInGroup = true) {\n\t\tif (message.isSystem) {\n\t\t\treturn this._renderSystemMessage(message);\n\t\t}\n\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 = isLastInGroup\n\t\t\t? this._formatMessageTime(message.timestamp)\n\t\t\t: '';\n\t\tconst attachmentsHtml = this._renderMessageAttachments(message.attachments);\n\t\tconst isOptimistic = message.isOptimistic;\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\tconst sentIndicator = isLastInGroup\n\t\t\t\t? `<div class=\"messenger-message-meta messenger-message-meta-own\">\n\t\t\t\t\t\t${\n\t\t\t\t\t\t\tisOptimistic\n\t\t\t\t\t\t\t\t? `<span class=\"messenger-message-sent-status\">Sending…</span>`\n\t\t\t\t\t\t\t\t: `<span class=\"messenger-message-sent-status\">Sent</span>`\n\t\t\t\t\t\t}\n\t\t\t\t\t\t${timeStr ? `<span>·</span><span>${timeStr}</span>` : ''}\n\t\t\t\t\t</div>`\n\t\t\t\t: '';\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message ${messageClass}${isOptimistic ? ' messenger-message-optimistic' : ''}\">\n\t\t\t\t\t${bubbleHtml}\n\t\t\t\t\t${attachmentsHtml}\n\t\t\t\t\t${sentIndicator}\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-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${timeStr ? `<div class=\"messenger-message-meta\"><span>${timeStr}</span></div>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSystemMessage(message) {\n\t\tconst content = message.content || '';\n\t\tconst isJoinLeave =\n\t\t\tcontent.includes('joined the chat') ||\n\t\t\tcontent.includes('left the chat') ||\n\t\t\tcontent.includes('joined the conversation') ||\n\t\t\tcontent.includes('left the conversation');\n\n\t\tif (isJoinLeave && message.sender) {\n\t\t\tconst rawName = message.sender.name || '';\n\t\t\tconst name = rawName\n\t\t\t\t.split(' ')\n\t\t\t\t.map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n\t\t\t\t.join(' ');\n\t\t\tconst logoUrl = this.options.logoUrl;\n\t\t\tconst logoHtml = logoUrl\n\t\t\t\t? `<img src=\"${this._escapeHtml(logoUrl)}\" alt=\"logo\" />`\n\t\t\t\t: name.charAt(0).toUpperCase();\n\t\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\n\t\t\tconst rawAction = content.replace(rawName, '').trim();\n\t\t\tconst action = rawAction.charAt(0).toUpperCase() + rawAction.slice(1);\n\n\t\t\treturn `\n\t\t\t\t<div class=\"messenger-message-system-event\">\n\t\t\t\t\t<div class=\"messenger-message-system-event-avatar\">${logoHtml}</div>\n\t\t\t\t\t<span class=\"messenger-message-system-event-name\">${this._escapeHtml(name)}</span>\n\t\t\t\t\t<span class=\"messenger-message-system-event-action\">${this._escapeHtml(action)}</span>\n\t\t\t\t\t${timeStr ? `<span class=\"messenger-message-system-event-time\">${timeStr}</span>` : ''}\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\t// Render automated/bot messages as a proper received chat bubble\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst avatarHtml = logoUrl\n\t\t\t? `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(teamName)}\" /></div>`\n\t\t\t: `<div class=\"sdk-avatar sdk-avatar-sm\">${teamName.charAt(0).toUpperCase()}</div>`;\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\n\t\treturn `\n\t\t\t<div class=\"messenger-message messenger-message-received\">\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<div class=\"messenger-message-bubble\">\n\t\t\t\t\t\t\t<div class=\"messenger-message-content\">${this._formatMessageContent(content)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${timeStr ? `<div class=\"messenger-message-meta\"><span>${timeStr}</span></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}\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\tconst datePart = date.toLocaleDateString('en-GB', {\n\t\t\tday: '2-digit',\n\t\t\tmonth: 'short',\n\t\t\tyear: 'numeric',\n\t\t});\n\t\tconst timePart = date.toLocaleTimeString('en-GB', {\n\t\t\thour: '2-digit',\n\t\t\tminute: '2-digit',\n\t\t\thour12: false,\n\t\t});\n\t\treturn `${datePart}, ${timePart}`;\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\n\t\t// Show scroll pill if user is scrolled up, otherwise scroll to bottom\n\t\tconst isNearBottom =\n\t\t\tmessagesContainer.scrollHeight -\n\t\t\t\tmessagesContainer.scrollTop -\n\t\t\t\tmessagesContainer.clientHeight <\n\t\t\t80;\n\n\t\tif (isNearBottom) {\n\t\t\tthis._scrollToBottom();\n\t\t} else if (!message.isOwn) {\n\t\t\tconst pill = this.element.querySelector('.messenger-scroll-pill');\n\t\t\tif (pill) pill.style.display = 'flex';\n\t\t}\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_setupScrollPill() {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.messenger-chat-messages'\n\t\t);\n\t\tconst pill = this.element.querySelector('.messenger-scroll-pill');\n\t\tif (!messagesContainer || !pill) return;\n\n\t\tpill.addEventListener('click', () => {\n\t\t\tthis._scrollToBottom();\n\t\t\tpill.style.display = 'none';\n\t\t});\n\n\t\tmessagesContainer.addEventListener('scroll', () => {\n\t\t\tconst isNearBottom =\n\t\t\t\tmessagesContainer.scrollHeight -\n\t\t\t\t\tmessagesContainer.scrollTop -\n\t\t\t\t\tmessagesContainer.clientHeight <\n\t\t\t\t80;\n\t\t\tif (isNearBottom) {\n\t\t\t\tpill.style.display = 'none';\n\t\t\t}\n\t\t});\n\t}\n\n\t_renderGroupedMessages(messages) {\n\t\tconst GROUP_TIME_GAP = 5 * 60 * 1000; // 5 minutes\n\t\tlet html = '';\n\n\t\tmessages.forEach((msg, index) => {\n\t\t\tconst isLast = index === messages.length - 1;\n\t\t\tconst nextMsg = messages[index + 1];\n\t\t\tconst currentTime = msg.timestamp ? new Date(msg.timestamp).getTime() : 0;\n\t\t\tconst nextTime = nextMsg?.timestamp\n\t\t\t\t? new Date(nextMsg.timestamp).getTime()\n\t\t\t\t: null;\n\t\t\tconst senderKey = msg.isSystem\n\t\t\t\t? 'system'\n\t\t\t\t: msg.isOwn\n\t\t\t\t\t? 'own'\n\t\t\t\t\t: msg.sender?.name || 'agent';\n\t\t\tconst nextSenderKey = nextMsg\n\t\t\t\t? nextMsg.isSystem\n\t\t\t\t\t? 'system'\n\t\t\t\t\t: nextMsg.isOwn\n\t\t\t\t\t\t? 'own'\n\t\t\t\t\t\t: nextMsg.sender?.name || 'agent'\n\t\t\t\t: null;\n\n\t\t\tconst timeGapAfter = nextTime && nextTime - currentTime > GROUP_TIME_GAP;\n\t\t\tconst senderChanges = nextMsg && senderKey !== nextSenderKey;\n\t\t\tconst isLastInGroup = isLast || timeGapAfter || senderChanges;\n\n\t\t\thtml += this._renderMessage(msg, isLastInGroup);\n\t\t});\n\n\t\treturn html;\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\"><iconify-icon icon=\"ph:file-duotone\" width=\"24\" height=\"24\"></iconify-icon></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\tconst mobileCloseBtn = this.element.querySelector(\n\t\t\t'.messenger-mobile-close-btn'\n\t\t);\n\t\tif (mobileCloseBtn) {\n\t\t\tmobileCloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\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 emojiBtn = this.element.querySelector('.messenger-emoji-btn');\n\t\tif (emojiBtn) {\n\t\t\temojiBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tthis._toggleEmojiPicker();\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_loadEmojiPicker() {\n\t\tif (document.querySelector('#product7-emoji-picker-script')) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst script = document.createElement('script');\n\t\t\tscript.id = 'product7-emoji-picker-script';\n\t\t\tscript.type = 'module';\n\t\t\tscript.src =\n\t\t\t\t'https://cdn.jsdelivr.net/npm/emoji-picker-element@1/index.js';\n\t\t\tscript.onload = resolve;\n\t\t\tscript.onerror = reject;\n\t\t\tdocument.head.appendChild(script);\n\t\t});\n\t}\n\n\tasync _toggleEmojiPicker() {\n\t\tconst existing = this.element.querySelector(\n\t\t\t'.messenger-emoji-picker-container'\n\t\t);\n\t\tif (existing) {\n\t\t\texisting.remove();\n\t\t\tthis._emojiPickerOpen = false;\n\t\t\tif (this._emojiOutsideHandler) {\n\t\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\n\t\t\t\tthis._emojiOutsideHandler = null;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait this._loadEmojiPicker();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\n\t\tconst container = document.createElement('div');\n\t\tcontainer.className = 'messenger-emoji-picker-container';\n\n\t\tconst picker = document.createElement('emoji-picker');\n\t\tcontainer.appendChild(picker);\n\n\t\tconst compose = this.element.querySelector('.messenger-chat-compose');\n\t\tcompose.parentNode.insertBefore(container, compose);\n\t\tthis._emojiPickerOpen = true;\n\n\t\tpicker.addEventListener('emoji-click', (e) => {\n\t\t\tthis._insertEmoji(e.detail.unicode);\n\t\t\tcontainer.remove();\n\t\t\tthis._emojiPickerOpen = false;\n\t\t\tif (this._emojiOutsideHandler) {\n\t\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\n\t\t\t\tthis._emojiOutsideHandler = null;\n\t\t\t}\n\t\t});\n\n\t\tthis._emojiOutsideHandler = (e) => {\n\t\t\tif (\n\t\t\t\t!container.contains(e.target) &&\n\t\t\t\t!e.target.closest('.messenger-emoji-btn')\n\t\t\t) {\n\t\t\t\tcontainer.remove();\n\t\t\t\tthis._emojiPickerOpen = false;\n\t\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\n\t\t\t\tthis._emojiOutsideHandler = null;\n\t\t\t}\n\t\t};\n\t\tsetTimeout(\n\t\t\t() => document.addEventListener('click', this._emojiOutsideHandler),\n\t\t\t0\n\t\t);\n\t}\n\n\t_insertEmoji(emoji) {\n\t\tconst input = this.element.querySelector('.messenger-compose-input');\n\t\tif (!input) return;\n\t\tconst start = input.selectionStart;\n\t\tconst end = input.selectionEnd;\n\t\tinput.value = input.value.slice(0, start) + emoji + input.value.slice(end);\n\t\tinput.selectionStart = input.selectionEnd = start + emoji.length;\n\t\tinput.focus();\n\t\tinput.dispatchEvent(new Event('input'));\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._emojiOutsideHandler) {\n\t\t\tdocument.removeEventListener('click', this._emojiOutsideHandler);\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 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 <iconify-icon icon=\"ph:chat-circle-duotone\" width=\"48\" height=\"48\"></iconify-icon>\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 messenger-mobile-close-btn\" aria-label=\"Close\">\n <iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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 <iconify-icon icon=\"ph:pencil-simple\" width=\"16\" height=\"16\" style=\"flex-shrink: 0; color: var(--msg-text-secondary);\"></iconify-icon>\n <span style=\"flex: 1;\">New conversation</span>\n <iconify-icon icon=\"ph:caret-right\" width=\"16\" height=\"16\" style=\"flex-shrink: 0; color: var(--msg-text-tertiary);\"></iconify-icon>\n </button>\n </div>\n `;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_renderConversationItem(conversation) {\n\t\tconst isClosed = conversation.status === 'closed';\n\t\tconst unreadClass = conversation.unread > 0 ? 'unread' : '';\n\t\tconst closedClass = isClosed ? 'closed' : '';\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} ${closedClass}\" 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${isClosed ? '<span class=\"messenger-conversation-resolved-badge\">Resolved</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) => {\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 messenger-mobile-close-btn\" aria-label=\"Close\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:x\" width=\"18\" height=\"18\"></iconify-icon>\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 || []).filter(\n\t\t\t(c) => (c.articleCount || 0) > 0\n\t\t);\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\n\t\t\t.map((c) => this._renderCollectionItem(c))\n\t\t\t.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\n\t\t\t.split('')\n\t\t\t.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\n\t\t\t.split(' ')\n\t\t\t.map((n) => n[0])\n\t\t\t.join('')\n\t\t\t.toUpperCase()\n\t\t\t.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\n\t\t\t? this._getInitials(collection.author.name)\n\t\t\t: '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}\"></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\"></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\tconst mobileCloseBtn = this.element.querySelector(\n\t\t\t'.messenger-help-close-btn'\n\t\t);\n\t\tif (mobileCloseBtn) {\n\t\t\tmobileCloseBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setOpen(false);\n\t\t\t});\n\t\t}\n\n\t\tconst searchInput = this.element.querySelector(\n\t\t\t'.messenger-help-search-input'\n\t\t);\n\t\tlet searchTimeout;\n\t\tsearchInput.addEventListener('input', (e) => {\n\t\t\tclearTimeout(searchTimeout);\n\t\t\tsearchTimeout = setTimeout(() => {\n\t\t\t\tthis.state.setHelpSearchQuery(e.target.value);\n\t\t\t}, 300);\n\t\t});\n\n\t\tthis._attachCollectionEvents();\n\t}\n\n\t_attachCollectionEvents() {\n\t\tthis.element\n\t\t\t.querySelectorAll('.messenger-help-collection')\n\t\t\t.forEach((item) => {\n\t\t\t\titem.addEventListener('click', () => {\n\t\t\t\t\tconst collection = this.state.helpArticles.find(\n\t\t\t\t\t\t(c) => c.id === item.dataset.collectionId\n\t\t\t\t\t);\n\t\t\t\t\tif (collection?.url) {\n\t\t\t\t\t\twindow.open(collection.url, '_blank');\n\t\t\t\t\t} else if (this.options.onArticleClick) {\n\t\t\t\t\t\tthis.options.onArticleClick(collection);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t}\n\n\tdestroy() {\n\t\tif (this._unsubscribe) this._unsubscribe();\n\t\tif (this.element?.parentNode)\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t}\n}\n","export class HomeView {\n\tconstructor(state, options = {}) {\n\t\tthis.state = state;\n\t\tthis.options = options;\n\t\tthis.element = null;\n\t\tthis._unsubscribe = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'messenger-view messenger-home-view';\n\n\t\tthis._updateContent();\n\n\t\tthis._unsubscribe = this.state.subscribe((type) => {\n\t\t\tif (\n\t\t\t\ttype === 'homeChangelogUpdate' ||\n\t\t\t\ttype === 'conversationsUpdate' ||\n\t\t\t\ttype === 'availabilityUpdate'\n\t\t\t) {\n\t\t\t\tthis._updateContent();\n\t\t\t}\n\t\t});\n\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tconst avatarsHtml = this._renderAvatarStack();\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"messenger-home-scroll\">\n\t\t\t\t<div class=\"messenger-home-header\">\n\t\t\t\t\t<div class=\"messenger-home-header-top\">\n\t\t\t\t\t\t<div class=\"messenger-home-logo\">\n\t\t\t\t\t\t\t${this.options.logoUrl ? `<img src=\"${this.options.logoUrl}\" alt=\"${this.state.teamName}\" />` : ''}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-home-avatars\">${avatarsHtml}</div>\n\t\t\t\t\t</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}\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\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\">${this.state.onlineMessage}</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\">${this.state.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 = `<iconify-icon icon=\"ph:paper-plane-right\" width=\"20\" height=\"20\" style=\"flex-shrink: 0;\"></iconify-icon>`;\n\t\tconst caretIcon = `<iconify-icon icon=\"ph:caret-right\" width=\"20\" height=\"20\" style=\"flex-shrink: 0;\"></iconify-icon>`;\n\n\t\tconst responseTime =\n\t\t\tthis.state.responseTime || 'We typically reply within a few minutes';\n\n\t\tconst recentCardHtml = openConversation\n\t\t\t? this._renderRecentMessageCard(openConversation)\n\t\t\t: '';\n\n\t\treturn `\n\t\t\t${recentCardHtml}\n\t\t\t<button class=\"messenger-home-message-btn\">\n\t\t\t\t<div class=\"messenger-home-continue-info\">\n\t\t\t\t\t<span class=\"messenger-home-continue-label\">Send us a message</span>\n\t\t\t\t\t<span class=\"messenger-home-message-subtext\">${responseTime}</span>\n\t\t\t\t</div>\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_renderRecentMessageCard(conversation) {\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst logoHtml = logoUrl\n\t\t\t? `<div class=\"messenger-home-recent-avatar messenger-home-recent-avatar-logo\"><img src=\"${logoUrl}\" alt=\"${teamName}\" /></div>`\n\t\t\t: `<div class=\"messenger-home-recent-avatar\" style=\"background: var(--color-primary);\">${teamName.charAt(0).toUpperCase()}</div>`;\n\n\t\tconst title = conversation.title || teamName;\n\t\tconst timeAgo = this._formatTimeAgo(conversation.lastMessageTime);\n\t\tconst preview = conversation.lastMessage\n\t\t\t? conversation.lastMessage.substring(0, 48) +\n\t\t\t\t(conversation.lastMessage.length > 48 ? '...' : '')\n\t\t\t: '';\n\t\tconst hasUnread = conversation.unread > 0;\n\n\t\treturn `\n\t\t\t<div class=\"messenger-home-recent-card\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"messenger-home-recent-card-label\">Recent message</div>\n\t\t\t\t<div class=\"messenger-home-recent-card-row\">\n\t\t\t\t\t${logoHtml}\n\t\t\t\t\t<div class=\"messenger-home-recent-card-content\">\n\t\t\t\t\t\t<div class=\"messenger-home-recent-card-header\">\n\t\t\t\t\t\t\t<span class=\"messenger-home-recent-card-name\">${title}</span>\n\t\t\t\t\t\t\t<span class=\"messenger-home-recent-card-time\">${timeAgo}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"messenger-home-recent-card-preview\">\n\t\t\t\t\t\t\t<span class=\"messenger-home-recent-card-message\">${preview}</span>\n\t\t\t\t\t\t\t${hasUnread ? '<span class=\"messenger-home-recent-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t</div>\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_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\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_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-divider\"></div>\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${description ? `<p>${description}</p>` : ''}\n\t\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\t</div>\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\">${this._stripHtml(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_stripHtml(html) {\n\t\tif (!html) return '';\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_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\tconst recentCard = this.element.querySelector(\n\t\t\t'.messenger-home-recent-card'\n\t\t);\n\t\tif (recentCard) {\n\t\t\trecentCard.addEventListener('click', () => {\n\t\t\t\tconst convId = recentCard.dataset.conversationId;\n\t\t\t\tthis.state.setActiveConversation(convId);\n\t\t\t\tthis.state.markAsRead(convId);\n\t\t\t\tthis.state.setView('chat');\n\t\t\t\tif (this.options.onSelectConversation) {\n\t\t\t\t\tthis.options.onSelectConversation(convId);\n\t\t\t\t}\n\t\t\t});\n\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\tthis.state.setActiveConversation(null);\n\t\t\t\tthis.state.setView('chat');\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\tif (this.options.onFeedbackClick) {\n\t\t\t\t\tthis.state.setOpen(false);\n\t\t\t\t\tthis.options.onFeedbackClick();\n\t\t\t\t} else if (this.state.urls?.feedback) {\n\t\t\t\t\twindow.open(this.state.urls.feedback, '_blank');\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\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<div class=\"messenger-prechat-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:bell-ringing-duotone\" width=\"36\" height=\"36\"></iconify-icon>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h4 class=\"messenger-prechat-title\">Get notified when we reply</h4>\n\t\t\t\t\t<p class=\"messenger-prechat-subtitle\">We'll send you an email so you never miss a response.</p>\n\t\t\t\t\t<div class=\"messenger-prechat-actions\">\n\t\t\t\t\t\t<button type=\"button\" class=\"messenger-prechat-yes\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:bell-ringing-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t\t\tYes, notify me\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<button type=\"button\" class=\"messenger-prechat-no\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:bell-slash-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t\t\tNo thanks\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.messenger-prechat-yes')\n\t\t\t.addEventListener('click', async () => {\n\t\t\t\tawait this._handleYes();\n\t\t\t});\n\n\t\tthis.element\n\t\t\t.querySelector('.messenger-prechat-no')\n\t\t\t.addEventListener('click', () => {\n\t\t\t\tthis._handleNo();\n\t\t\t});\n\t}\n\n\tasync _handleYes() {\n\t\tif (this._isSubmitting) return;\n\t\tthis._isSubmitting = true;\n\n\t\tconst yesBtn = this.element.querySelector('.messenger-prechat-yes');\n\t\tyesBtn.disabled = true;\n\t\tyesBtn.innerHTML = `\n\t\t\t<iconify-icon icon=\"ph:circle-notch\" width=\"16\" height=\"16\" style=\"animation: spin 0.8s linear infinite;\"></iconify-icon>\n\t\t\tJust a moment...\n\t\t`;\n\n\t\ttry {\n\t\t\tconst { name, email } = this.state.metadata || {};\n\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\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\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:', error);\n\t\t\tthis._isSubmitting = false;\n\t\t\tyesBtn.disabled = false;\n\t\t\tyesBtn.innerHTML = `\n\t\t\t\t<iconify-icon icon=\"ph:bell-ringing-duotone\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\tYes, notify me\n\t\t\t`;\n\t\t}\n\t}\n\n\t_handleNo() {\n\t\tthis.state.setView('chat');\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 { NotificationSound } from '../utils/NotificationSound.js';\nimport { 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\tthis._explicitOptions = options || {};\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 = resolvedTheme === '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 || '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\tonlineMessage: options.onlineMessage || \"We're online now\",\n\t\t\tresponseTime:\n\t\t\t\toptions.responseTime || 'We typically reply within a few minutes',\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\tfeedbackBoardName: options.feedbackBoardName || 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\tcomposePlaceholder: options.composePlaceholder || 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\tonlineMessage: this.messengerOptions.onlineMessage,\n\t\t\tresponseTime: this.messengerOptions.responseTime,\n\t\t\tenableHelp: this.messengerOptions.enableHelp,\n\t\t\tenableChangelog: this.messengerOptions.enableChangelog,\n\t\t\tmetadata: this.sdk?.apiService?.getMetadata() || 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\t\tthis._feedbackWidget = null;\n\n\t\tconst notificationSoundOption = options.notificationSound !== undefined\n\t\t\t? options.notificationSound\n\t\t\t: true;\n\n\t\tthis._notificationSound = new NotificationSound({\n\t\t\tsoundUrl: typeof notificationSoundOption === 'string' ? notificationSoundOption : undefined,\n\t\t\tvolume: options.notificationVolume ?? 0.4,\n\t\t});\n\n\t\tif (notificationSoundOption === false) {\n\t\t\tthis._notificationSound.setEnabled(false);\n\t\t}\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_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_createInternalFeedbackWidget() {\n\t\ttry {\n\t\t\tconst widget = this.sdk.createWidget('button', {\n\t\t\t\ttrigger: false,\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t\tboardName:\n\t\t\t\t\tthis.messengerOptions.feedbackBoardName || this.sdk.config.boardName,\n\t\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\t\ttheme: this.messengerOptions.theme,\n\t\t\t});\n\t\t\twidget.mount();\n\t\t\treturn widget;\n\t\t} catch (e) {\n\t\t\tconsole.warn('[Messenger] Could not create internal feedback widget:', e);\n\t\t\treturn null;\n\t\t}\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\t// Create internal feedback widget (no floating button) so the\n\t\t// \"Leave a feedback\" button in the home view can open it inline.\n\t\tif (!this.messengerOptions.onFeedbackClick) {\n\t\t\tthis._feedbackWidget = this._createInternalFeedbackWidget();\n\t\t}\n\n\t\tif (this._hasTrigger()) {\n\t\t\tthis.launcher = new MessengerLauncher(this.messengerState, {\n\t\t\t\tposition: this.messengerOptions.position,\n\t\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\t});\n\t\t\tcontainer.appendChild(this.launcher.render());\n\t\t}\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:\n\t\t\t\tthis.messengerOptions.onFeedbackClick ||\n\t\t\t\t(this._feedbackWidget ? () => this._feedbackWidget.open() : null),\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\t// Route through sdk.identify() so the SDK-level identity state is updated\n\t\t\t// and applyIdentity() handles the messenger state + WebSocket as a side effect.\n\t\t\tconst result = await this.sdk.identify({\n\t\t\t\temail: contactData.email,\n\t\t\t\tname: contactData.name,\n\t\t\t});\n\t\t\treturn result;\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\t// Called externally by the app when the user is already known.\n\t\t// No API call needed — identity was already established via sdk.identify().\n\t\tthis.applyIdentity({ name, email });\n\t}\n\n\tapplyIdentity(metadata = {}) {\n\t\tthis.messengerState.setIdentified(true, metadata);\n\n\t\tif (this.apiService?.sessionToken && !this.wsService?.isConnected) {\n\t\t\tthis._initWebSocket();\n\t\t}\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\tisSystem: message.sender_type === 'system',\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\tconst isOwnMessage = message.sender_type === 'customer';\n\n\t\tif (!isOwnMessage && this.messengerState.isIdentified) {\n\t\t\tthis._notificationSound.play();\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\tthis.messengerState._notify('connectionChange', { connected: false });\n\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tthis.messengerState._notify('connectionChange', { connected: true });\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 ??\n\t\t\t\t\tavailability.agents_online ??\n\t\t\t\t\tavailability.is_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\tisSystem: msg.sender_type === 'system',\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\tconst initialMessages = [\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\tinitialMessages.push({\n\t\t\t\t\tid: 'system_rt_' + Date.now(),\n\t\t\t\t\tcontent: this.messengerState.agentsOnline\n\t\t\t\t\t\t? 'One of our customer support agents will be with you shortly.'\n\t\t\t\t\t\t: this.messengerState.responseTime,\n\t\t\t\t\tisSystem: true,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t});\n\n\t\t\t\tthis.messengerState.setMessages(conv.id, initialMessages);\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 _fetchAndApplySettings() {\n\t\ttry {\n\t\t\tconst response = await this.apiService.getMessengerSettings();\n\t\t\tif (!response?.status || !response?.data) return;\n\n\t\t\tconst s = response.data;\n\n\t\t\t// Only apply values that were NOT explicitly passed in options\n\t\t\tif (s.team_name && !this._hasExplicitOption('teamName')) {\n\t\t\t\tthis.messengerOptions.teamName = s.team_name;\n\t\t\t\tthis.messengerState.teamName = s.team_name;\n\t\t\t}\n\t\t\tif (s.logo_url && !this._hasExplicitOption('logoUrl')) {\n\t\t\t\tthis.messengerOptions.logoUrl = s.logo_url;\n\t\t\t}\n\t\t\tif (s.greeting_message && !this._hasExplicitOption('greetingMessage')) {\n\t\t\t\tthis.messengerState.greetingMessage = s.greeting_message;\n\t\t\t}\n\t\t\tif (s.response_time && !this._hasExplicitOption('responseTime')) {\n\t\t\t\tthis.messengerState.responseTime = s.response_time;\n\t\t\t}\n\n\t\t\t// Notify views to re-render with new values\n\t\t\tthis.messengerState._notify('availabilityUpdate', {});\n\t\t} catch (e) {\n\t\t\t// non-fatal\n\t\t}\n\t}\n\n\t_hasExplicitOption(key) {\n\t\treturn Object.prototype.hasOwnProperty.call(\n\t\t\tthis._explicitOptions || {},\n\t\t\tkey\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 =\n\t\t\t\t\tresponse.data.agents_online ?? response.data.is_online ?? false;\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\tlabels: [{ name: 'Integration', color: '#dbeafe' }],\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\tlabels: [\n\t\t\t\t\t\t\t{ name: 'New feature', color: '#dcfce7' },\n\t\t\t\t\t\t\t{ name: 'AI', color: '#f3e8ff' },\n\t\t\t\t\t\t],\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\tlabels: [{ name: 'Report', color: '#fef9c3' }],\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\tlabels: [{ name: 'Analytics', color: '#fce7f3' }],\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\tlabels: [\n\t\t\t\t\t\t\t{ name: 'New feature', color: '#dcfce7' },\n\t\t\t\t\t\t\t{ name: 'AI', color: '#f3e8ff' },\n\t\t\t\t\t\t],\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\tlabels: item.labels || [],\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\t// Fetch workspace settings and apply only if not explicitly configured\n\t\t\tthis._fetchAndApplySettings();\n\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:hover:not(:disabled) {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t\tborder-color: ${primaryColor} !important;\n\t\t\tcolor: #FFFFFF !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/* Dark theme is now handled by CSS custom properties in messenger-core.js */\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 || 'center',\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, .product7-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 (\n\t\t\tthis.options.enabled === false ||\n\t\t\tthis.surveyOptions.enabled === false\n\t\t) {\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.state.isOpen = true;\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.state.isOpen = false;\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 progressPercent = isMultiPage\n\t\t\t? Math.round(\n\t\t\t\t\t((this.surveyState.currentPageIndex + 1) /\n\t\t\t\t\t\tthis.surveyOptions.pages.length) *\n\t\t\t\t\t\t100\n\t\t\t\t)\n\t\t\t: 0;\n\t\tconst submitLabel = isMultiPage && !isLastPage ? 'Next' : 'Submit';\n\t\tconst iconArrowRight = `<iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>`;\n\t\tconst iconCheck = `<iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>`;\n\t\tconst iconArrowLeft = `<iconify-icon icon=\"ph:arrow-left\" width=\"16\" height=\"16\"></iconify-icon>`;\n\t\tconst backButton =\n\t\t\tisMultiPage && this.surveyState.currentPageIndex > 0\n\t\t\t\t? `<button class=\"feedback-survey-back\">${iconArrowLeft} 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\"><iconify-icon icon=\"ph:x-duotone\" width=\"16\" height=\"16\"></iconify-icon></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\"><div class=\"feedback-survey-progress-track\"><div class=\"feedback-survey-progress-fill\" style=\"width:${progressPercent}%\"></div></div></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} ${isLastPage ? iconCheck : iconArrowRight}</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\tif (!this.surveyElement) return;\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 === 'nps') {\n\t\t\tratingType = 'nps';\n\t\t} else if (configType) {\n\t\t\tratingType = configType;\n\t\t} else if (topSurveyType === 'ces') {\n\t\t\tratingType = 'ces';\n\t\t} else if (topSurveyType === 'csat') {\n\t\t\tratingType = 'emoji';\n\t\t} else {\n\t\t\tratingType = 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 = [\n\t\t\t\t'Very Difficult',\n\t\t\t\t'Difficult',\n\t\t\t\t'Neutral',\n\t\t\t\t'Easy',\n\t\t\t\t'Very Easy',\n\t\t\t];\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\tif (ratingType === 'star') {\n\t\t\tconst starScale = Number.isFinite(scale) && scale >= 2 ? scale : 5;\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-stars\" data-page-id=\"${pageId}\">\n\t\t\t\t\t${[...Array(starScale).keys()]\n\t\t\t\t\t\t.map((i) => {\n\t\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\t\tconst filled = currentRating >= score ? ' filled' : '';\n\t\t\t\t\t\t\treturn `<button class=\"feedback-survey-page-rating-btn feedback-survey-star-btn${filled}\" data-page-id=\"${pageId}\" data-score=\"${score}\">★</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\tconst iconExternalLink = `<iconify-icon icon=\"ph:arrow-square-out-duotone\" width=\"15\" height=\"15\"></iconify-icon>`;\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} ${iconExternalLink}\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\tconst isStarRating = !!this.surveyElement.querySelector(\n\t\t\t\t'.feedback-survey-star-btn'\n\t\t\t);\n\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\tif (isStarRating) {\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-star-btn')\n\t\t\t\t\t\t\t\t.forEach((star) => {\n\t\t\t\t\t\t\t\t\tconst starScore = parseInt(star.dataset.score);\n\t\t\t\t\t\t\t\t\tstar.classList.toggle('filled', starScore <= score);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-page-rating-btn')\n\t\t\t\t\t\t\t\t.forEach((item) => item.classList.remove('selected'));\n\t\t\t\t\t\t\tbtn.classList.add('selected');\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tif (isStarRating) {\n\t\t\t\t\t\tbtn.addEventListener('mouseenter', () => {\n\t\t\t\t\t\t\tconst hoverScore = parseInt(btn.dataset.score);\n\t\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-star-btn')\n\t\t\t\t\t\t\t\t.forEach((star) => {\n\t\t\t\t\t\t\t\t\tconst starScore = parseInt(star.dataset.score);\n\t\t\t\t\t\t\t\t\tstar.classList.toggle('hovered', starScore <= hoverScore);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\tif (isStarRating) {\n\t\t\t\tconst container = this.surveyElement.querySelector(\n\t\t\t\t\t'.feedback-survey-stars'\n\t\t\t\t);\n\t\t\t\tif (container) {\n\t\t\t\t\tcontainer.addEventListener('mouseleave', () => {\n\t\t\t\t\t\tthis.surveyElement\n\t\t\t\t\t\t\t.querySelectorAll('.feedback-survey-star-btn')\n\t\t\t\t\t\t\t.forEach((star) => star.classList.remove('hovered'));\n\t\t\t\t\t});\n\t\t\t\t}\n\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\t_setSubmitLoading(loading) {\n\t\tconst btn = this.surveyElement?.querySelector('.feedback-survey-submit');\n\t\tif (!btn) return;\n\t\tbtn.disabled = loading;\n\t\tbtn.innerHTML = loading\n\t\t\t? `<iconify-icon icon=\"ph:circle-notch\" width=\"16\" height=\"16\" style=\"animation: spin 0.8s linear infinite;\"></iconify-icon> Submitting...`\n\t\t\t: `Submit <iconify-icon icon=\"ph:arrow-right\" width=\"16\" height=\"16\"></iconify-icon>`;\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\t\tthis._setSubmitLoading(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\n\t\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\t\t\tthis._closeSurvey();\n\t\t\tthis._showSuccessNotification();\n\t\t} catch (error) {\n\t\t\tconsole.error('[SurveyWidget] Failed to submit survey:', error);\n\t\t\tthis._showError('Something went wrong. Please try again.');\n\t\t} finally {\n\t\t\tthis.surveyState.isSubmitting = false;\n\t\t\tthis._setSubmitLoading(false);\n\t\t}\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\n\t\t// Emit question answered event\n\t\tconst page = this._getCurrentPage();\n\t\tthis.sdk.eventBus.emit('survey:questionAnswered', {\n\t\t\twidget: this,\n\t\t\tpageId,\n\t\t\tpageType: page?.type,\n\t\t\tanswer: this.surveyState.pageAnswers[pageId],\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 sdkMetadata =\n\t\t\ttypeof this.sdk.getMetadata === 'function'\n\t\t\t\t? this.sdk.getMetadata() || {}\n\t\t\t\t: {};\n\t\tconst apiMetadata =\n\t\t\tthis.apiService && typeof this.apiService.getMetadata === 'function'\n\t\t\t\t? this.apiService.getMetadata() || {}\n\t\t\t\t: {};\n\t\tconst localMetadata = this.options.metadata || {};\n\n\t\treturn {\n\t\t\trespondentId:\n\t\t\t\tthis.surveyOptions.respondentId ||\n\t\t\t\tlocalMetadata.user_id ||\n\t\t\t\tsdkMetadata.user_id ||\n\t\t\t\tapiMetadata.user_id ||\n\t\t\t\tnull,\n\t\t\temail:\n\t\t\t\tthis.surveyOptions.email ||\n\t\t\t\tlocalMetadata.email ||\n\t\t\t\tsdkMetadata.email ||\n\t\t\t\tapiMetadata.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 = `<iconify-icon icon=\"ph:warning-duotone\" width=\"15\" height=\"15\"></iconify-icon><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'product7-notification product7-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\tthis.state.isOpen = 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\tconst pos = this.surveyOptions.position;\n\t\t\tsurveyEl.style.transform =\n\t\t\t\tpos === 'center'\n\t\t\t\t\t? 'translate(-50%, -50%) scale(0.95)'\n\t\t\t\t\t: pos === 'bottom'\n\t\t\t\t\t\t? 'translateY(100%)'\n\t\t\t\t\t\t: 'translateY(10px)';\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\n\t\tthis.sdk.eventBus.emit('survey:closed', { widget: this });\n\t}\n\n\topen() {\n\t\treturn this.show();\n\t}\n\n\tclose() {\n\t\treturn this.hide();\n\t}\n\n\ttoggle() {\n\t\tif (this.surveyState.isVisible) {\n\t\t\treturn this.hide();\n\t\t}\n\n\t\treturn this.show();\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+/,\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 { CSS_STYLES } from '../styles/styles.js';\nimport { 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 Product7 {\n\tconstructor(config = {}) {\n\t\tthis.config = this._validateAndMergeConfig(config);\n\t\tthis.initialized = false;\n\t\tthis.identified = 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\tmetadata: this.config.metadata,\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\t_injectStyles() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (document.querySelector('#product7-styles')) return;\n\n\t\tconst style = document.createElement('style');\n\t\tstyle.id = 'product7-styles';\n\t\tstyle.textContent = CSS_STYLES;\n\t\tdocument.head.appendChild(style);\n\n\t\tif (!document.querySelector('#product7-iconify')) {\n\t\t\tconst script = document.createElement('script');\n\t\t\tscript.id = 'product7-iconify';\n\t\t\tscript.src =\n\t\t\t\t'https://cdn.jsdelivr.net/npm/iconify-icon@2/dist/iconify-icon.min.js';\n\t\t\tscript.async = true;\n\t\t\tdocument.head.appendChild(script);\n\t\t}\n\t}\n\n\tasync init() {\n\t\tif (this.initialized) {\n\t\t\treturn { alreadyInitialized: true };\n\t\t}\n\n\t\tthis._injectStyles();\n\n\t\ttry {\n\t\t\tconst initData = await this.apiService.init();\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\tconst identifyResult = await this._syncConfiguredMetadataAfterInit();\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\tidentified: Boolean(identifyResult?.identified),\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 requestedType = type || 'button';\n\t\tconst normalizedType = this._normalizeWidgetType(requestedType);\n\t\tconst widgetId = generateId('widget');\n\t\tconst widgetConfig = this._getWidgetTypeConfig(normalizedType);\n\t\tconst explicitOptions = this._omitUndefined(\n\t\t\tthis._normalizeWidgetOptions(normalizedType, options)\n\t\t);\n\t\tconst widgetEnabled = this._isWidgetEnabled(normalizedType, {\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(normalizedType, widgetOptions);\n\t\t\tthis.widgets.set(widgetId, widget);\n\t\t\tthis.eventBus.emit('widget:created', {\n\t\t\t\twidget,\n\t\t\t\ttype: requestedType,\n\t\t\t\tinternalType: normalizedType,\n\t\t\t});\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\tcreateFeedbackWidget(options = {}) {\n\t\treturn this.createWidget('feedback', options);\n\t}\n\n\tcreateMessengerWidget(options = {}) {\n\t\treturn this.createWidget('messenger', options);\n\t}\n\n\tcreateChangelogWidget(options = {}) {\n\t\treturn this.createWidget('changelog', options);\n\t}\n\n\tcreateSurveyWidget(options = {}) {\n\t\treturn this.createWidget('survey', options);\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(\n\t\t\t(s) => s.surveyId === surveyId || s.id === surveyId\n\t\t);\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 ||\n\t\t\t\t\tnormalizedOptions.id ||\n\t\t\t\t\toptions.id ||\n\t\t\t\t\tnull,\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.createSurveyWidget({\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'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: typeof 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 mergedTypeConfig = this._getWidgetTypeAliases(type).reduce(\n\t\t\t(config, alias) => {\n\t\t\t\tconst legacyTypeConfig = this._isPlainObject(this.config?.[alias])\n\t\t\t\t\t? this.config[alias]\n\t\t\t\t\t: {};\n\n\t\t\t\tconst namespacedTypeConfig = this._isPlainObject(widgetsConfig?.[alias])\n\t\t\t\t\t? widgetsConfig[alias]\n\t\t\t\t\t: {};\n\n\t\t\t\treturn deepMerge(\n\t\t\t\t\tconfig,\n\t\t\t\t\tdeepMerge(legacyTypeConfig, namespacedTypeConfig)\n\t\t\t\t);\n\t\t\t},\n\t\t\t{}\n\t\t);\n\t\treturn this._toCamelCaseObject(mergedTypeConfig);\n\t}\n\n\t_getWidgetTypeAliases(type) {\n\t\tif (type === 'button') {\n\t\t\treturn ['button', 'feedback'];\n\t\t}\n\n\t\treturn [type];\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_normalizeWidgetType(type) {\n\t\tif (type === 'feedback') {\n\t\t\treturn 'button';\n\t\t}\n\n\t\treturn type;\n\t}\n\n\t_normalizeWidgetOptions(type, options = {}) {\n\t\tif (!this._isPlainObject(options)) {\n\t\t\treturn options;\n\t\t}\n\n\t\tconst normalizedOptions = { ...options };\n\t\tif (\n\t\t\tnormalizedOptions.headless === true &&\n\t\t\tnormalizedOptions.trigger === undefined &&\n\t\t\ttype !== 'survey'\n\t\t) {\n\t\t\tnormalizedOptions.trigger = false;\n\t\t}\n\n\t\treturn normalizedOptions;\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(\n\t\t\t\t([, nestedValue]) => nestedValue !== undefined\n\t\t\t)\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 || '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(\n\t\t\t'changelog',\n\t\t\texplicitOptions\n\t\t);\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.createChangelogWidget({\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\tsetMetadata(metadata) {\n\t\tif (metadata) {\n\t\t\tthis._validateMetadata(metadata);\n\t\t}\n\n\t\tthis.config.metadata = metadata;\n\t\tif (this.apiService) {\n\t\t\tthis.apiService.setMetadata(metadata);\n\t\t}\n\t\tthis.identified = false;\n\t\tthis.eventBus.emit('metadata:updated', { metadata });\n\t}\n\n\tgetMetadata() {\n\t\treturn (\n\t\t\tthis.config.metadata ||\n\t\t\t(this.apiService ? this.apiService.getMetadata() : null)\n\t\t);\n\t}\n\n\tasync identify(metadata = this.config.metadata) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before identifying users. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tif (!metadata) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'Identify requires metadata. Provide at least user_id or email.'\n\t\t\t);\n\t\t}\n\n\t\tthis._validateMetadata(metadata);\n\t\tthis.setMetadata(metadata);\n\n\t\ttry {\n\t\t\tconst response = await this.apiService.identify(metadata);\n\t\t\tconst configPatch = this._extractIdentifyConfig(response);\n\t\t\tif (Object.keys(configPatch).length > 0) {\n\t\t\t\tthis.updateConfig(configPatch);\n\t\t\t}\n\n\t\t\tthis.identified = true;\n\t\t\tthis._applyIdentityToWidgets(metadata);\n\n\t\t\tconst result = {\n\t\t\t\tidentified: true,\n\t\t\t\tmetadata: this.getMetadata(),\n\t\t\t\tresponse,\n\t\t\t};\n\n\t\t\tthis.eventBus.emit('sdk:identified', result);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthis.identified = false;\n\t\t\tthis.eventBus.emit('sdk:error', { error, phase: 'identify' });\n\t\t\tthrow new SDKError(`Failed to identify user: ${error.message}`, error);\n\t\t}\n\t}\n\n\tasync reinitialize(newMetadata = null) {\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.identified = false;\n\n\t\tif (newMetadata !== null) {\n\t\t\tthis.setMetadata(newMetadata);\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.emit('sdk:destroyed');\n\t\tthis.eventBus.clear();\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.identified = false;\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\t\tconst port = window.location.port;\n\n\t\tif (hostname.includes('staging')) {\n\t\t\treturn 'staging';\n\t\t}\n\n\t\tif (hostname === 'app.localhost' && port === '3005') {\n\t\t\treturn 'localstack';\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\tmetadata: null,\n\t\t\tposition: 'right',\n\t\t\ttheme: 'light',\n\t\t\tboardName: 'feature-requests',\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.metadata) {\n\t\t\tthis._validateMetadata(mergedConfig.metadata);\n\t\t}\n\n\t\treturn mergedConfig;\n\t}\n\n\t_validateMetadata(metadata) {\n\t\tif (!metadata.user_id && !metadata.email) {\n\t\t\tthrow new ConfigError('Metadata must include at least user_id or email');\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 (metadata[key] && typeof metadata[key] !== expectedType) {\n\t\t\t\tthrow new ConfigError(\n\t\t\t\t\t`Metadata 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.createFeedbackWidget = this.createFeedbackWidget.bind(this);\n\t\tthis.createMessengerWidget = this.createMessengerWidget.bind(this);\n\t\tthis.createChangelogWidget = this.createChangelogWidget.bind(this);\n\t\tthis.createSurveyWidget = this.createSurveyWidget.bind(this);\n\t\tthis.destroyWidget = this.destroyWidget.bind(this);\n\t\tthis.identify = this.identify.bind(this);\n\t\tthis.updateConfig = this.updateConfig.bind(this);\n\t}\n\n\tstatic create(config) {\n\t\treturn new Product7(config);\n\t}\n\n\tstatic async createAndInit(config) {\n\t\tconst sdk = new Product7(config);\n\t\tawait sdk.init();\n\t\treturn sdk;\n\t}\n\n\tstatic extractMetadataFromAuth(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\tasync _syncConfiguredMetadataAfterInit() {\n\t\tif (\n\t\t\t!this.config.metadata ||\n\t\t\tthis.apiService.identitySyncedToken === this.apiService.sessionToken\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\n\t\ttry {\n\t\t\treturn await this.identify(this.config.metadata);\n\t\t} catch (error) {\n\t\t\tif (this.config.debug) {\n\t\t\t\tconsole.warn('[Product7] Initial identify failed:', error);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t_extractIdentifyConfig(response) {\n\t\tconst payload = this._isPlainObject(response?.data)\n\t\t\t? response.data\n\t\t\t: response || {};\n\t\tconst configPatch = this._isPlainObject(payload.config)\n\t\t\t? payload.config\n\t\t\t: {};\n\n\t\tif (payload.last_feedback_at !== undefined) {\n\t\t\tconfigPatch.last_feedback_at = payload.last_feedback_at;\n\t\t} else if (payload.lastFeedbackAt !== undefined) {\n\t\t\tconfigPatch.last_feedback_at = payload.lastFeedbackAt;\n\t\t}\n\n\t\treturn this._omitUndefined(configPatch);\n\t}\n\n\t_applyIdentityToWidgets(metadata) {\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\tif (typeof widget.applyIdentity === 'function') {\n\t\t\t\twidget.applyIdentity(metadata);\n\t\t\t}\n\t\t}\n\t}\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","import { APIService } from './core/APIService.js';\nimport { EventBus } from './core/EventBus.js';\nimport { Product7 as Product7SDK } from './core/Product7.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\n// --- Identify: transform flat user data into internal format ---\n\nfunction transformIdentifyData(data) {\n\tconst {\n\t\torganization,\n\t\temail,\n\t\tname,\n\t\tuserId,\n\t\tprofilePicture,\n\t\tlocale,\n\t\tcompanies,\n\t\t...customAttrs\n\t} = data;\n\n\tconst metadata = {\n\t\tuser_id: userId,\n\t\temail,\n\t\tname,\n\t\tprofile_picture: profilePicture,\n\t};\n\n\t// Flat custom attributes → custom_fields\n\tconst knownKeys = [\n\t\t'organization',\n\t\t'email',\n\t\t'name',\n\t\t'userId',\n\t\t'profilePicture',\n\t\t'locale',\n\t\t'companies',\n\t\t'debug',\n\t\t'mock',\n\t\t'env',\n\t\t'apiUrl',\n\t];\n\tconst customFields = {};\n\tfor (const [key, value] of Object.entries(customAttrs)) {\n\t\tif (!knownKeys.includes(key)) {\n\t\t\tcustomFields[key] = value;\n\t\t}\n\t}\n\tif (Object.keys(customFields).length > 0) {\n\t\tmetadata.custom_fields = customFields;\n\t}\n\n\t// Companies array → company (use first for now, backend supports single)\n\tif (Array.isArray(companies) && companies.length > 0) {\n\t\tconst c = companies[0];\n\t\tmetadata.company = {\n\t\t\tid: c.id,\n\t\t\tname: c.name,\n\t\t\tmonthly_spend: c.monthlySpend,\n\t\t\tcustom_fields: {},\n\t\t};\n\t\tconst companyKnownKeys = ['id', 'name', 'monthlySpend', 'createdAt'];\n\t\tfor (const [key, value] of Object.entries(c)) {\n\t\t\tif (!companyKnownKeys.includes(key)) {\n\t\t\t\tmetadata.company.custom_fields[key] = value;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tworkspace: organization,\n\t\tmetadata,\n\t\tlocale,\n\t\tdebug: data.debug,\n\t\tmock: data.mock,\n\t\tenv: data.env,\n\t\tapiUrl: data.apiUrl,\n\t};\n}\n\nfunction cleanUndefined(obj) {\n\tObject.keys(obj).forEach((key) => {\n\t\tif (obj[key] === undefined) delete obj[key];\n\t});\n\treturn obj;\n}\n\nfunction hasIdentifyMetadata(metadata = {}) {\n\treturn Object.values(metadata).some((value) => value !== undefined);\n}\n\n// --- Ensure SDK is initialized (shared by widget inits) ---\n\nasync function ensureSDK(options) {\n\tif (\n\t\tProduct7._sdk &&\n\t\toptions.organization &&\n\t\tProduct7._sdk.config.workspace !== options.organization\n\t) {\n\t\tProduct7.destroy();\n\t}\n\n\tif (Product7._sdk) return Product7._sdk;\n\n\tif (options.organization) {\n\t\tconst config = cleanUndefined({\n\t\t\tworkspace: options.organization,\n\t\t\tdebug: options.debug,\n\t\t\tmock: options.mock,\n\t\t\tenv: options.env,\n\t\t\tapiUrl: options.apiUrl,\n\t\t});\n\n\t\tconst sdk = new Product7SDK(config);\n\t\tawait sdk.init();\n\t\tProduct7._sdk = sdk;\n\t\tProduct7._organization = options.organization;\n\t\treturn sdk;\n\t}\n\n\treturn null;\n}\n\n// --- Public API ---\n\nconst Product7 = {\n\t// Internal state\n\t_sdk: null,\n\t_identified: false,\n\t_organization: null,\n\t_q: [],\n\t_feedbackWidget: null,\n\t_messengerWidget: null,\n\t_surveyWidget: null,\n\n\tversion: '1.0.0',\n\n\t// ==================\n\t// Identify\n\t// ==================\n\n\tasync identify(data = {}, callback) {\n\t\ttry {\n\t\t\tconst transformed = transformIdentifyData(data);\n\t\t\tProduct7._organization =\n\t\t\t\ttransformed.workspace || Product7._organization || null;\n\n\t\t\tconst config = cleanUndefined({\n\t\t\t\tworkspace: Product7._organization,\n\t\t\t\tdebug: transformed.debug,\n\t\t\t\tmock: transformed.mock,\n\t\t\t\tenv: transformed.env,\n\t\t\t\tapiUrl: transformed.apiUrl,\n\t\t\t});\n\n\t\t\tlet sdk = Product7._sdk;\n\t\t\tconst requiresNewSDK =\n\t\t\t\t!sdk || (config.workspace && sdk.config.workspace !== config.workspace);\n\n\t\t\tif (requiresNewSDK) {\n\t\t\t\tif (Product7._sdk) {\n\t\t\t\t\tProduct7.destroy();\n\t\t\t\t\tProduct7._organization = config.workspace || null;\n\t\t\t\t}\n\t\t\t\tsdk = new Product7SDK(config);\n\t\t\t\tProduct7._sdk = sdk;\n\t\t\t}\n\n\t\t\tconst initData = sdk.initialized\n\t\t\t\t? {\n\t\t\t\t\t\talreadyInitialized: true,\n\t\t\t\t\t\tsessionToken: sdk.apiService?.sessionToken,\n\t\t\t\t\t}\n\t\t\t\t: await sdk.init();\n\n\t\t\tconst identifyData = hasIdentifyMetadata(transformed.metadata)\n\t\t\t\t? await sdk.identify(transformed.metadata)\n\t\t\t\t: null;\n\t\t\tProduct7._identified = Boolean(identifyData?.identified);\n\n\t\t\tProduct7._flushQueue();\n\n\t\t\tif (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('Product7Ready', {\n\t\t\t\t\t\tdetail: { sdk, config: sdk.config, initData, identifyData },\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof callback === 'function') callback(null);\n\t\t\treturn {\n\t\t\t\t...initData,\n\t\t\t\tidentified: Product7._identified,\n\t\t\t\tidentify: identifyData,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconsole.error('[Product7] Identify failed:', error);\n\n\t\t\tif (typeof window !== 'undefined' && typeof CustomEvent !== 'undefined') {\n\t\t\t\twindow.dispatchEvent(\n\t\t\t\t\tnew CustomEvent('Product7Error', {\n\t\t\t\t\t\tdetail: { error, phase: 'identify' },\n\t\t\t\t\t})\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof callback === 'function') callback(error);\n\t\t\tthrow error;\n\t\t}\n\t},\n\n\t// ==================\n\t// Feedback\n\t// ==================\n\n\tasync feedback(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['feedback', options, callback]);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst widgetOptions = cleanUndefined({\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\ttextColor: options.textColor,\n\t\t\tsuppressAfterSubmission: options.suppressAfterSubmission,\n\t\t\tsuppressionDays: options.suppressionDays,\n\t\t\tshowBackdrop: options.showBackdrop !== false,\n\t\t\tmetadata: options.metadata,\n\t\t});\n\n\t\t// placement → position\n\t\tif (options.placement === 'right') {\n\t\t\twidgetOptions.position = 'right';\n\t\t} else if (options.placement === 'left') {\n\t\t\twidgetOptions.position = 'left';\n\t\t} else if (options.placement) {\n\t\t\twidgetOptions.position = options.placement;\n\t\t}\n\n\t\t// defaultBoard → boardName\n\t\tif (options.defaultBoard) {\n\t\t\twidgetOptions.boardName = options.defaultBoard;\n\t\t}\n\n\t\t// No placement = modal mode, no floating button\n\t\tif (!options.placement) {\n\t\t\twidgetOptions.autoShow = false;\n\t\t\twidgetOptions.displayMode = 'modal';\n\t\t\twidgetOptions.headless = true;\n\t\t} else {\n\t\t\t// Trigger button is always visible when placement is set\n\t\t\twidgetOptions.suppressAfterSubmission = false;\n\t\t\twidgetOptions.enabled = true;\n\t\t}\n\n\t\ttry {\n\t\t\tconst widget = sdk.createFeedbackWidget(widgetOptions);\n\t\t\twidget.mount();\n\n\t\t\tif (options.placement) {\n\t\t\t\twidget.show();\n\t\t\t} else {\n\t\t\t\twidget.hide();\n\t\t\t}\n\n\t\t\tProduct7._feedbackWidget = widget;\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'widgetReady' });\n\n\t\t\t\tsdk.eventBus.on('feedback:submitted', (data) => {\n\t\t\t\t\tcallback({ action: 'feedbackSubmitted', post: data.feedback });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('feedback:error', (data) => {\n\t\t\t\t\tcallback({ action: 'feedbackError', error: data.error });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tProduct7._setupAttributeTriggers();\n\t\t\tProduct7._setupPostMessageListener();\n\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tconsole.error('[Product7] Failed to initialize feedback widget:', error);\n\t\t\tif (typeof callback === 'function') callback({ action: 'error', error });\n\t\t\treturn null;\n\t\t}\n\t},\n\n\topenFeedback(options = {}) {\n\t\tif (Product7._feedbackWidget) {\n\t\t\tif (options.setBoard) {\n\t\t\t\tProduct7._feedbackWidget.options.boardName = options.setBoard;\n\t\t\t}\n\t\t\tProduct7._feedbackWidget.open();\n\t\t}\n\t},\n\n\tcloseFeedback() {\n\t\tif (Product7._feedbackWidget) {\n\t\t\tProduct7._feedbackWidget.close();\n\t\t}\n\t},\n\n\tdestroyFeedback() {\n\t\tif (Product7._feedbackWidget) {\n\t\t\tProduct7._feedbackWidget.destroy();\n\t\t\tProduct7._feedbackWidget = null;\n\t\t}\n\t},\n\n\t// ==================\n\t// Messenger\n\t// ==================\n\n\tasync messenger(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['messenger', options, callback]);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst widgetOptions = cleanUndefined({\n\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\tprimaryColor: options.primaryColor,\n\t\t\tbackgroundColor: options.backgroundColor,\n\t\t\ttextColor: options.textColor,\n\t\t\tlogoUrl: options.logoUrl,\n\t\t\tteamName: options.teamName,\n\t\t\tteamAvatars: options.teamAvatars,\n\t\t\tgreetingMessage: options.greetingMessage,\n\t\t\twelcomeMessage: options.welcomeMessage,\n\t\t\tenableHelp: options.enableHelp,\n\t\t\tenableChangelog: options.enableChangelog,\n\t\t\tenableNews: options.enableNews,\n\t\t\tautoLoadData: options.autoLoadData,\n\t\t\tinitialView: options.initialView,\n\t\t\tfeaturedContent: options.featuredContent,\n\t\t\tfeedbackUrl: options.feedbackUrl,\n\t\t\tchangelogUrl: options.changelogUrl,\n\t\t\thelpUrl: options.helpUrl,\n\t\t\troadmapUrl: options.roadmapUrl,\n\t\t\tpreviewData: options.previewData,\n\t\t});\n\n\t\t// placement → position\n\t\tif (options.placement === 'right') {\n\t\t\twidgetOptions.position = 'right';\n\t\t} else if (options.placement === 'left') {\n\t\t\twidgetOptions.position = 'left';\n\t\t} else if (options.placement) {\n\t\t\twidgetOptions.position = options.placement;\n\t\t}\n\n\t\t// Messenger is always explicitly shown — never suppress based on feedback submission history\n\t\twidgetOptions.suppressAfterSubmission = false;\n\t\twidgetOptions.enabled = true;\n\n\t\ttry {\n\t\t\tconst widget = sdk.createMessengerWidget(widgetOptions);\n\t\t\twidget.mount();\n\t\t\twidget.show();\n\n\t\t\tProduct7._messengerWidget = widget;\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'widgetReady' });\n\n\t\t\t\tsdk.eventBus.on('messenger:messageSent', (data) => {\n\t\t\t\t\tcallback({ action: 'messageSent', message: data });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('messenger:opened', () => {\n\t\t\t\t\tcallback({ action: 'messengerOpened' });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('messenger:closed', () => {\n\t\t\t\t\tcallback({ action: 'messengerClosed' });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Listen for data-product7-messenger clicks\n\t\t\tProduct7._setupMessengerAttributeTriggers();\n\t\t\tProduct7._setupPostMessageListener();\n\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tconsole.error('[Product7] Failed to initialize messenger widget:', error);\n\t\t\tif (typeof callback === 'function') callback({ action: 'error', error });\n\t\t\treturn null;\n\t\t}\n\t},\n\n\topenMessenger() {\n\t\tif (Product7._messengerWidget) {\n\t\t\tProduct7._messengerWidget.open?.() ||\n\t\t\t\tProduct7._messengerWidget.openPanel?.();\n\t\t}\n\t},\n\n\tcloseMessenger() {\n\t\tif (Product7._messengerWidget) {\n\t\t\tProduct7._messengerWidget.close?.() ||\n\t\t\t\tProduct7._messengerWidget.closePanel?.();\n\t\t}\n\t},\n\n\tdestroyMessenger() {\n\t\tif (Product7._messengerWidget) {\n\t\t\tProduct7._messengerWidget.destroy();\n\t\t\tProduct7._messengerWidget = null;\n\t\t}\n\t},\n\n\t// ==================\n\t// Survey\n\t// ==================\n\n\tasync survey(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['survey', options, callback]);\n\t\t\treturn null;\n\t\t}\n\n\t\t// placement → position\n\t\tlet position = 'right';\n\t\tif (options.placement === 'right') {\n\t\t\tposition = 'right';\n\t\t} else if (options.placement === 'left') {\n\t\t\tposition = 'left';\n\t\t} else if (options.placement === 'center') {\n\t\t\tposition = 'center';\n\t\t} else if (options.placement === 'bottom') {\n\t\t\tposition = 'bottom';\n\t\t} else if (options.placement) {\n\t\t\tposition = options.placement;\n\t\t}\n\n\t\t// displayMode: \"popover\" (default), \"modal\", \"fullscreen\"\n\t\tconst displayMode = options.displayMode || 'popover';\n\t\tif (displayMode === 'modal' || displayMode === 'fullscreen') {\n\t\t\tposition = 'center';\n\t\t}\n\n\t\t// Wire up all lifecycle callbacks\n\t\tconst surveyCallbacks = {\n\t\t\tonSubmit: (response) => {\n\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\tcallback({ action: 'surveySubmitted', response });\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDismiss: () => {\n\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\tcallback({ action: 'surveyDismissed' });\n\t\t\t\t}\n\t\t\t},\n\t\t};\n\n\t\t// Register event bus listeners for additional callbacks\n\t\tif (typeof callback === 'function') {\n\t\t\tsdk.eventBus.on('survey:shown', (data) => {\n\t\t\t\tcallback({ action: 'surveyShown', survey: data });\n\t\t\t});\n\n\t\t\tsdk.eventBus.on('survey:questionAnswered', (data) => {\n\t\t\t\tcallback({\n\t\t\t\t\taction: 'questionAnswered',\n\t\t\t\t\tpageId: data.pageId,\n\t\t\t\t\tpageType: data.pageType,\n\t\t\t\t\tanswer: data.answer,\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tsdk.eventBus.on('survey:closed', () => {\n\t\t\t\tcallback({ action: 'surveyClosed' });\n\t\t\t});\n\t\t}\n\n\t\t// Display method: delayed, exitIntent, or immediate (default)\n\t\tconst displayMethod = options.displayMethod || 'immediate';\n\t\tconst showSurvey = async () => {\n\t\t\ttry {\n\t\t\t\tlet widget;\n\n\t\t\t\tif (options.surveyId) {\n\t\t\t\t\t// Show specific survey by ID\n\t\t\t\t\tconst showOpts = {\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\tdisplayMode,\n\t\t\t\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\t\t\t\tshowBackdrop:\n\t\t\t\t\t\t\tdisplayMode === 'modal' || displayMode === 'fullscreen',\n\t\t\t\t\t\t...surveyCallbacks,\n\t\t\t\t\t};\n\n\t\t\t\t\t// force flag: bypass eligibility checks\n\t\t\t\t\tif (options.force) {\n\t\t\t\t\t\tshowOpts.context = { includeIneligible: true };\n\t\t\t\t\t}\n\n\t\t\t\t\twidget = await sdk.showSurveyById(options.surveyId, showOpts);\n\t\t\t\t} else {\n\t\t\t\t\t// Auto-fetch and show first eligible survey\n\t\t\t\t\tconst fetchOpts = options.force ? { includeIneligible: true } : {};\n\t\t\t\t\tconst surveys = await sdk.getActiveSurveys(fetchOpts);\n\n\t\t\t\t\tif (surveys.length === 0) {\n\t\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\t\tcallback({ action: 'noSurveys' });\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst surveyConfig = surveys[0];\n\t\t\t\t\twidget = sdk.showSurvey({\n\t\t\t\t\t\tsurveyId: surveyConfig.surveyId || surveyConfig.id,\n\t\t\t\t\t\tsurveyType: surveyConfig.surveyType || surveyConfig.type || 'nps',\n\t\t\t\t\t\tposition,\n\t\t\t\t\t\tdisplayMode,\n\t\t\t\t\t\ttheme: options.theme || sdk.config.theme || 'light',\n\t\t\t\t\t\tshowBackdrop:\n\t\t\t\t\t\t\tdisplayMode === 'modal' || displayMode === 'fullscreen',\n\t\t\t\t\t\ttitle: surveyConfig.title,\n\t\t\t\t\t\tdescription: surveyConfig.description,\n\t\t\t\t\t\tlowLabel: surveyConfig.lowLabel,\n\t\t\t\t\t\thighLabel: surveyConfig.highLabel,\n\t\t\t\t\t\tratingScale: surveyConfig.ratingScale,\n\t\t\t\t\t\tshowFeedbackInput: surveyConfig.showFeedbackInput,\n\t\t\t\t\t\tshowSubmitButton: surveyConfig.showSubmitButton,\n\t\t\t\t\t\tautoSubmitOnSelect: surveyConfig.autoSubmitOnSelect,\n\t\t\t\t\t\tshowTitle: surveyConfig.showTitle,\n\t\t\t\t\t\tshowDescription: surveyConfig.showDescription,\n\t\t\t\t\t\tcustomQuestions: surveyConfig.customQuestions,\n\t\t\t\t\t\tpages: surveyConfig.pages,\n\t\t\t\t\t\tenabled: options.force ? true : surveyConfig.enabled,\n\t\t\t\t\t\t...surveyCallbacks,\n\t\t\t\t\t});\n\n\t\t\t\t\tif (typeof callback === 'function') {\n\t\t\t\t\t\tcallback({ action: 'surveyReady', survey: surveyConfig });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tProduct7._surveyWidget = widget;\n\t\t\t\treturn widget;\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[Product7] Failed to show survey:', error);\n\t\t\t\tif (typeof callback === 'function')\n\t\t\t\t\tcallback({ action: 'error', error });\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\n\t\t// Handle display methods\n\t\tif (displayMethod === 'delayed') {\n\t\t\tconst delay = options.displayDelay || 5000;\n\t\t\tProduct7._surveyTimer = setTimeout(showSurvey, delay);\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'surveyScheduled', delay });\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tif (displayMethod === 'exitIntent') {\n\t\t\tconst handler = (e) => {\n\t\t\t\tif (e.clientY <= 0) {\n\t\t\t\t\tdocument.removeEventListener('mouseout', handler);\n\t\t\t\t\tProduct7._exitIntentHandler = null;\n\t\t\t\t\tshowSurvey();\n\t\t\t\t}\n\t\t\t};\n\t\t\tProduct7._exitIntentHandler = handler;\n\t\t\tdocument.addEventListener('mouseout', handler);\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'surveyScheduled', trigger: 'exitIntent' });\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\tif (displayMethod === 'onScroll') {\n\t\t\tconst scrollPercent = options.scrollPercentage || 50;\n\t\t\tconst handler = () => {\n\t\t\t\tconst scrolled =\n\t\t\t\t\t(window.scrollY / (document.body.scrollHeight - window.innerHeight)) *\n\t\t\t\t\t100;\n\t\t\t\tif (scrolled >= scrollPercent) {\n\t\t\t\t\twindow.removeEventListener('scroll', handler);\n\t\t\t\t\tProduct7._scrollHandler = null;\n\t\t\t\t\tshowSurvey();\n\t\t\t\t}\n\t\t\t};\n\t\t\tProduct7._scrollHandler = handler;\n\t\t\twindow.addEventListener('scroll', handler, { passive: true });\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({\n\t\t\t\t\taction: 'surveyScheduled',\n\t\t\t\t\ttrigger: 'onScroll',\n\t\t\t\t\tscrollPercentage: scrollPercent,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\n\t\t// Default: immediate\n\t\treturn showSurvey();\n\t},\n\n\tcloseSurvey() {\n\t\tif (Product7._surveyWidget) {\n\t\t\tProduct7._surveyWidget.hide?.() || Product7._surveyWidget.closePanel?.();\n\t\t}\n\t},\n\n\tdestroySurvey() {\n\t\t// Clean up scheduled triggers\n\t\tif (Product7._surveyTimer) {\n\t\t\tclearTimeout(Product7._surveyTimer);\n\t\t\tProduct7._surveyTimer = null;\n\t\t}\n\t\tif (Product7._exitIntentHandler) {\n\t\t\tdocument.removeEventListener('mouseout', Product7._exitIntentHandler);\n\t\t\tProduct7._exitIntentHandler = null;\n\t\t}\n\t\tif (Product7._scrollHandler) {\n\t\t\twindow.removeEventListener('scroll', Product7._scrollHandler);\n\t\t\tProduct7._scrollHandler = null;\n\t\t}\n\t\tif (Product7._surveyWidget) {\n\t\t\tProduct7._surveyWidget.destroy();\n\t\t\tProduct7._surveyWidget = null;\n\t\t}\n\t},\n\n\t// ==================\n\t// Event Tracking\n\t// ==================\n\n\tasync track(eventName, properties = {}) {\n\t\tif (!Product7._sdk) {\n\t\t\tProduct7._q.push(['track', eventName, properties]);\n\t\t\treturn null;\n\t\t}\n\n\t\tconst sdk = Product7._sdk;\n\t\tif (!sdk.apiService?.sessionToken) return null;\n\n\t\ttry {\n\t\t\tconst result = await sdk.apiService._makeRequest('/widget/track', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tevent: eventName,\n\t\t\t\t\tproperties,\n\t\t\t\t\ttimestamp: new Date().toISOString(),\n\t\t\t\t}),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${sdk.apiService.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// If server returns a survey to show, show it\n\t\t\tif (result?.survey) {\n\t\t\t\tProduct7.survey({\n\t\t\t\t\tsurveyId: result.survey.id || result.survey.survey_id,\n\t\t\t\t\tforce: true,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tif (sdk.config.debug) {\n\t\t\t\tconsole.warn('[Product7] Track failed:', error);\n\t\t\t}\n\t\t\treturn null;\n\t\t}\n\t},\n\n\t// ==================\n\t// General\n\t// ==================\n\n\tgetInstance() {\n\t\treturn Product7._sdk;\n\t},\n\n\tisReady() {\n\t\treturn Boolean(Product7._sdk?.initialized);\n\t},\n\n\tonReady(callback) {\n\t\tif (typeof window === 'undefined') return;\n\n\t\tif (Product7.isReady()) {\n\t\t\tcallback(Product7._sdk);\n\t\t} else {\n\t\t\twindow.addEventListener(\n\t\t\t\t'Product7Ready',\n\t\t\t\t(event) => callback(event.detail.sdk, event.detail),\n\t\t\t\t{ once: true }\n\t\t\t);\n\t\t}\n\t},\n\n\tonError(callback) {\n\t\tif (typeof window === 'undefined') return;\n\n\t\twindow.addEventListener('Product7Error', (event) => {\n\t\t\tcallback(event.detail.error, event.detail);\n\t\t});\n\t},\n\n\tdestroy() {\n\t\tProduct7.destroyFeedback();\n\t\tProduct7.destroyMessenger();\n\t\tProduct7.destroySurvey();\n\t\tif (Product7._sdk) {\n\t\t\tProduct7._sdk.destroy();\n\t\t\tProduct7._sdk = null;\n\t\t}\n\t\tProduct7._identified = false;\n\t\tProduct7._organization = null;\n\t\tProduct7._q = [];\n\t\tProduct7._feedbackListenerAttached = false;\n\t\tProduct7._messengerListenerAttached = false;\n\t\tProduct7._postMessageListenerAttached = false;\n\t},\n\n\t// ==================\n\t// Internal\n\t// ==================\n\n\t_flushQueue() {\n\t\tconst queue = Product7._q.splice(0);\n\t\tfor (const [method, ...args] of queue) {\n\t\t\tif (typeof Product7[method] === 'function') {\n\t\t\t\tProduct7[method](...args);\n\t\t\t}\n\t\t}\n\t},\n\n\t_setupAttributeTriggers() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (Product7._feedbackListenerAttached) return;\n\t\tProduct7._feedbackListenerAttached = true;\n\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest('[data-product7-feedback]');\n\t\t\tif (trigger) {\n\t\t\t\te.preventDefault();\n\t\t\t\tProduct7.openFeedback();\n\t\t\t}\n\t\t});\n\t},\n\n\t_setupMessengerAttributeTriggers() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (Product7._messengerListenerAttached) return;\n\t\tProduct7._messengerListenerAttached = true;\n\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest('[data-product7-messenger]');\n\t\t\tif (trigger) {\n\t\t\t\te.preventDefault();\n\t\t\t\tProduct7.openMessenger();\n\t\t\t}\n\t\t});\n\t},\n\n\t_setupPostMessageListener() {\n\t\tif (typeof window === 'undefined') return;\n\t\tif (Product7._postMessageListenerAttached) return;\n\t\tProduct7._postMessageListenerAttached = true;\n\n\t\twindow.addEventListener('message', (event) => {\n\t\t\tif (event.data?.target !== 'Product7Widget') return;\n\n\t\t\tconst { action, setBoard } = event.data.data || {};\n\t\t\tswitch (action) {\n\t\t\t\tcase 'openFeedback':\n\t\t\t\t\tProduct7.openFeedback({ setBoard });\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeFeedback':\n\t\t\t\t\tProduct7.closeFeedback();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'openMessenger':\n\t\t\t\t\tProduct7.openMessenger();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeMessenger':\n\t\t\t\t\tProduct7.closeMessenger();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeSurvey':\n\t\t\t\t\tProduct7.closeSurvey();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t},\n\n\t// Expose internals for advanced/npm usage\n\tProduct7SDK,\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};\n\n// --- Pre-load queue support ---\nif (typeof window !== 'undefined') {\n\tconst existingQueue = window.Product7?._q || [];\n\twindow.Product7 = Product7;\n\n\tfor (const [method, ...args] of existingQueue) {\n\t\tif (typeof Product7[method] === 'function') {\n\t\t\tProduct7[method](...args);\n\t\t}\n\t}\n}\n\nexport default Product7;\n\nexport {\n\tAPIError,\n\tAPIService,\n\tBaseWidget,\n\tButtonWidget,\n\tChangelogWidget,\n\tConfigError,\n\tEventBus,\n\thelpers,\n\tInlineWidget,\n\tMessengerWidget,\n\tProduct7SDK as Product7,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\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","contact","getContactIdentity","payload","board","board_id","boardName","attachments","contactId","contact_id","contact_email","contactEmail","contact_name","contactName","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","available_agents","full_name","picture","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","uploadFile","base64Data","filename","file","identifyContact","identify","submitRating","rated","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","email","undefined","includeEligibility","include_eligibility","userProperties","user_properties","metadata","getMetadata","respondentId","userId","user_id","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","identitySyncedToken","env","baseURL","_getBaseURL","_loadStoredSession","_loadStoredMetadata","isSessionValid","apiUrl","ENV_URLS","production","base","withWorkspace","ws","staging","localstack","hostname","port","envConfig","init","setMetadata","_initMockSession","_initRealSession","_storeSession","primaryColor","backgroundColor","textColor","size","displayMode","expiresIn","initData","_extractInitResponseData","configVersion","error","session_token","Number","expires_in","isFinite","config_version","args","apply","_restoreIdentity","_buildIdentifyPayload","identified","_storeData","_removeData","clearSession","localStorage","sessionData","token","expiry","stored","getItem","parse","startsWith","removeItem","session","key","setItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","profile_picture","avatar_url","attributes","custom_fields","company","APIService","survey","messenger","help","changelog","r","mockResponse","is_new","_storeContactIdentity","parsed","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","console","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","log","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","trigger","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","eventBus","widget","reason","_hasRecentlySubmitted","querySelector","_render","appendChild","_attachEvents","triggerEl","Element","addEventListener","open","onMount","show","style","display","hide","openPanel","_renderPanel","requestAnimationFrame","classList","add","_showLoadingModal","className","loadingElement","_hideLoadingModal","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessInPanel","handleConfigUpdate","newConfig","theme","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","modeClass","sizeClass","themeClass","directionClass","String","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","close","toggle","openModal","closeModal","ButtonWidget","isMinimized","_hiddenForOpenPanel","_hasTrigger","buttonText","triggerText","button","assign","pointerType","shouldRestoreButton","_noTriggerButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","listModalBackdropElement","currentIndex","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","stopPropagation","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","_stripHtml","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBase","changelogBaseUrl","openInNewTab","onViewUpdate","html","tmp","innerText","_truncateDescription","maxLength","plain","trimEnd","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","_showSuccessMessage","originalContent","updateTitle","titleElement","setPlaceholder","input","NotificationSound","soundUrl","volume","_soundUrl","_volume","min","max","_enabled","_audioCtx","_audioBuffer","_loadPromise","_loadAudioFile","setEnabled","Boolean","setVolume","play","_playFile","_playSynthetic","_getAudioContext","AudioContext","webkitAudioContext","ctx","resume","currentTime","vol","freq","start","end","osc","createOscillator","gain","createGain","frequency","setValueAtTime","linearRampToValueAtTime","connect","destination","stop","arrayBuffer","decodeAudioData","createBufferSource","buffer","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_listeners","_onOpen","_onMessage","_onClose","_onError","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","_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","onlineMessage","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","closest","tabId","MessengerPanel","navigationTabs","currentViewComponent","viewRegistry","registerView","ViewClass","_renderCurrentView","viewsContainer","navContainer","hideNav","setHeader","headerContent","header","ChangelogView","_headerBg","_updateChangelogList","changelogContainer","_renderChangelogCard","_attachChangelogEvents","_renderEmptyState","coverImage","_truncateText","mobileCloseBtn","card","changelogId","changelogItem","n","onChangelogClick","ChatView","_typingTimeout","_isTyping","_typingIndicator","_isConversationClosed","_pendingAttachments","_emojiPickerOpen","_emojiOutsideHandler","banner","connected","_hideTypingIndicator","_appendMessage","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","_renderGroupedMessages","defaultPlaceholder","composePlaceholder","logoUrl","headerAvatarHtml","_escapeHtml","_scrollToBottom","_renderAttachmentPreviews","_setupScrollPill","_renderMessageAttachments","_renderMessage","isLastInGroup","isSystem","_renderSystemMessage","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","rawName","w","charAt","toUpperCase","slice","logoHtml","rawAction","action","avatarHtml","avatarUrl","_renderTeamAvatars","avatars","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollHeight","scrollTop","pill","isLast","nextMsg","nextTime","senderKey","nextSenderKey","_updateSendButtonState","sendBtn","preview","idx","currentTarget","_startTyping","shiftKey","_sendMessage","emojiBtn","_toggleEmojiPicker","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","_loadEmojiPicker","reject","script","head","existing","picker","compose","insertBefore","_insertEmoji","detail","unicode","contains","emoji","selectionStart","selectionEnd","dispatchEvent","Event","onTyping","ConversationsView","avatarColors","_getAvatarColor","charCode","charCodeAt","conversationsHtml","_renderConversationItem","unreadClass","closedClass","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","_renderMessageButton","_renderFeaturedCard","_renderAvailabilityStatus","_renderRecentMessageCard","hasUnread","featuredContent","coverText","recentCard","msgBtn","feedbackBtn","onFeedbackClick","seeAllBtn","featuredBtn","PreChatFormView","_isSubmitting","_handleYes","_handleNo","yesBtn","onIdentifyContact","MessengerWidget","_explicitOptions","resolvedTheme","hasExplicitTextColor","prototype","call","hasExplicitBackgroundColor","defaultTextColor","defaultBackgroundColor","resolvedEnableChangelog","enableNews","messengerOptions","autoLoadData","initialView","previewData","feedbackBoardName","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","messengerState","launcher","wsService","_wsUnsubscribers","_feedbackWidget","notificationSoundOption","notificationSound","_notificationSound","notificationVolume","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","_createInternalFeedbackWidget","createWidget","zIndex","styleElement","getElementById","adjustColor","percent","alpha","normalized","num","g","b","padStart","applyMessengerCustomStyles","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","markAsIdentified","applyIdentity","_initWebSocket","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","localMessage","navigateTo","setUnreadCount","getState","_applyPreviewData","availability","is_online","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","helpBase","sort","order","article_count","url_slug","newConversation","initialMessages","_fetchAndApplySettings","s","_hasExplicitOption","logo_url","checkAgentAvailability","publishedAt","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","progressPercent","round","submitLabel","backButton","_handleDismiss","surveyElement","_attachSurveyEvents","opacity","transform","_getCurrentPageConfig","npsScale","_getNPSScale","npsUsesSegmentedScale","values","npsContainerClass","npsButtonClass","npsLowLabel","npsHighLabel","npsPrompt","csatPrompt","cesPrompt","nps","_renderScaleLabels","csat","ces","custom","_renderCustomQuestions","rawScale","low","high","_isRatingSurveyType","_shouldAutoSubmitOnSelect","_getCurrentPage","_renderSurveyPage","_renderRatingPage","_renderMultipleChoicePage","_renderTextPage","_renderLinkPage","pageId","ratingConfig","topSurveyType","configType","ratingType","currentRating","defaultLowLabel","defaultHighLabel","usesSegmentedScale","buttonClass","starScale","multipleChoiceConfig","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","linkConfig","linkText","redirectUrl","openIn","clicked","_renderQuestionInput","question","opt","_handleSubmit","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","isStarRating","_setPageAnswer","star","starScore","hoverScore","existingValues","nextValues","v","pId","navigation","afterThisPage","goesTo","_maybeAutoSubmit","_setSubmitLoading","loading","_validateCurrentPage","nextPageIndex","_getNextPageIndex","normalizedPageAnswers","_normalizePageAnswersForSubmit","mergedAnswers","page_answers","_getSubmissionRating","_showSuccessNotification","pageType","answer","hasSingle","hasMany","fallbackNext","nextValue","normalizedId","pageIndex","output","sdkMetadata","apiMetadata","localMetadata","prepend","notification","transition","resetState","immediate","surveyEl","backdropEl","pos","TabWidget","textElement","WidgetFactory","register","WidgetClass","widgets","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","Product7$1","Product7","_validateAndMergeConfig","initialized","siteId","debug","_injectStyles","designTokens","alreadyInitialized","identifyResult","_syncConfiguredMetadataAfterInit","requestedType","normalizedType","_normalizeWidgetType","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","_normalizeWidgetOptions","widgetEnabled","_isWidgetEnabled","widgetOptions","internalType","createFeedbackWidget","createMessengerWidget","createChangelogWidget","createSurveyWidget","getWidget","surveys","_normalizeSurveyConfig","includeIneligible","_isSurveyEligible","showSurveyById","displayOptions","surveyConfig","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","_getWidgetTypeAliases","alias","_toCamelCaseObject","typeConfig","_toCamelCaseKey","nestedValue","headless","fromEntries","showChangelog","defaults","configDefaults","changelogEnabled","changelogWidget","getAllWidgets","destroyWidget","destroyAllWidgets","updateConfig","oldConfig","_validateMetadata","configPatch","_extractIdentifyConfig","_applyIdentityToWidgets","phase","reinitialize","newMetadata","hasFeedbackBeenSubmitted","cooldownDays","clearFeedbackSubmissionTracking","_detectEnvironment","existingConfig","mergedConfig","validStructure","expectedType","createAndInit","extractMetadataFromAuth","authData","sub","display_name","role","plan","subscription","organization","monthly_spend","lastFeedbackAt","cleanUndefined","ensureSDK","_sdk","Product7SDK","_organization","_identified","_q","_messengerWidget","_surveyWidget","version","transformed","profilePicture","locale","companies","customAttrs","knownKeys","customFields","monthlySpend","companyKnownKeys","transformIdentifyData","identifyData","some","hasIdentifyMetadata","_flushQueue","CustomEvent","placement","defaultBoard","post","_setupAttributeTriggers","_setupPostMessageListener","openFeedback","setBoard","closeFeedback","destroyFeedback","_setupMessengerAttributeTriggers","openMessenger","closeMessenger","destroyMessenger","surveyCallbacks","displayMethod","showOpts","force","fetchOpts","displayDelay","_surveyTimer","handler","clientY","_exitIntentHandler","scrollPercent","scrollPercentage","scrollY","_scrollHandler","passive","closeSurvey","destroySurvey","track","eventName","properties","getInstance","isReady","onReady","onError","_feedbackListenerAttached","_messengerListenerAttached","_postMessageListenerAttached","queue","helpers","existingQueue"],"mappings":"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"}
|