@product7/product7-js 0.3.2 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +53 -29
- package/dist/README.md +53 -29
- package/dist/product7-js.js +515 -141
- 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/api/services/MessengerService.js +1 -30
- package/src/core/APIService.js +87 -1
- package/src/core/BaseAPIService.js +128 -11
- package/src/core/Product7.js +183 -19
- package/src/docs/api.md +253 -89
- package/src/docs/example.md +203 -153
- package/src/docs/framework-integrations.md +236 -358
- package/src/docs/installation.md +171 -143
- package/src/index.js +48 -41
- package/src/widgets/MessengerWidget.js +30 -30
- package/src/widgets/SurveyWidget.js +20 -0
- package/src/widgets/messenger/views/ChatView.js +14 -8
- package/src/widgets/messenger/views/HomeView.js +5 -2
- package/types/index.d.ts +34 -0
|
@@ -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/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 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};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class MessengerService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getMessengerSettings() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tgreeting_message: 'Hi there! How can we help?',\n\t\t\t\t\tteam_name: 'Support Team',\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_CONVERSATIONS,\n\t\t\t\tmeta: { total: MOCK_CONVERSATIONS.length, page: 1, limit: 20 },\n\t\t\t};\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/messenger/conversations',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversation(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst conv = MOCK_CONVERSATIONS.find((c) => c.id === conversationId);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { ...conv, messages: MOCK_MESSAGES[conversationId] || [] },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}`,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync startConversation(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tcontent: data.content,\n\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t}),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getUnreadCount() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tconst count = MOCK_CONVERSATIONS.reduce(\n\t\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { unread_count: count, unread_conversations: count > 0 ? 1 : 0 },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/unread', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/read`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getMessages(conversationId, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_MESSAGES[conversationId] || [],\n\t\t\t\tmeta: { total: 0, page: 1, limit: 50 },\n\t\t\t};\n\t\t}\n\n\t\tconst params = { ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tcontact_id: 'mock_contact_' + Date.now(),\n\t\t\t\t\temail: data.email,\n\t\t\t\t\tname: data.name || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/identify', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\temail: data.email,\n\t\t\t\tname: data.name || '',\n\t\t\t\tphone: data.phone || '',\n\t\t\t\tcompany: data.company || '',\n\t\t\t\tavatar_url: data.avatar_url || '',\n\t\t\t\tmetadata: data.metadata || {},\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/typing`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ is_typing: isTyping }),\n\t\t\t}\n\t\t);\n\t}\n}\n","export class SDKError extends Error {\n\tconstructor(message, cause) {\n\t\tsuper(message);\n\t\tthis.name = 'SDKError';\n\t\tthis.cause = cause;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, SDKError);\n\t\t}\n\t}\n}\n\nexport class APIError extends Error {\n\tconstructor(status, message, response) {\n\t\tsuper(message);\n\t\tthis.name = 'APIError';\n\t\tthis.status = status;\n\t\tthis.response = response;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, APIError);\n\t\t}\n\t}\n\n\tisNetworkError() {\n\t\treturn this.status === 0;\n\t}\n\n\tisClientError() {\n\t\treturn this.status >= 400 && this.status < 500;\n\t}\n\n\tisServerError() {\n\t\treturn this.status >= 500 && this.status < 600;\n\t}\n}\n\nexport class WidgetError extends Error {\n\tconstructor(message, widgetType, widgetId) {\n\t\tsuper(message);\n\t\tthis.name = 'WidgetError';\n\t\tthis.widgetType = widgetType;\n\t\tthis.widgetId = widgetId;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, WidgetError);\n\t\t}\n\t}\n}\n\nexport class ConfigError extends Error {\n\tconstructor(message, configKey) {\n\t\tsuper(message);\n\t\tthis.name = 'ConfigError';\n\t\tthis.configKey = configKey;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ConfigError);\n\t\t}\n\t}\n}\n\nexport class ValidationError extends Error {\n\tconstructor(message, field, value) {\n\t\tsuper(message);\n\t\tthis.name = 'ValidationError';\n\t\tthis.field = field;\n\t\tthis.value = value;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ValidationError);\n\t\t}\n\t}\n}\n\nexport class ErrorHandler {\n\tconstructor(debug = false) {\n\t\tthis.debug = debug;\n\t}\n\n\thandle(error, context = '') {\n\t\tconst errorInfo = {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tcontext,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (error instanceof APIError) {\n\t\t\terrorInfo.status = error.status;\n\t\t\terrorInfo.type = 'api';\n\t\t} else if (error instanceof WidgetError) {\n\t\t\terrorInfo.widgetType = error.widgetType;\n\t\t\terrorInfo.widgetId = error.widgetId;\n\t\t\terrorInfo.type = 'widget';\n\t\t} else if (error instanceof ConfigError) {\n\t\t\terrorInfo.configKey = error.configKey;\n\t\t\terrorInfo.type = 'config';\n\t\t} else if (error instanceof ValidationError) {\n\t\t\terrorInfo.field = error.field;\n\t\t\terrorInfo.value = error.value;\n\t\t\terrorInfo.type = 'validation';\n\t\t} else {\n\t\t\terrorInfo.type = 'unknown';\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.error('[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\n\t\tconst payload = {\n\t\t\trating: responseData.rating,\n\t\t\tfeedback: responseData.feedback || '',\n\t\t\tanswers: responseData.answers || {},\n\t\t\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.metadata = config.metadata || null;\n\t\tthis.mock = config.mock || false;\n\t\tthis.env = config.env || 'production';\n\t\tthis.baseURL = this._getBaseURL(config);\n\n\t\tthis._loadStoredSession();\n\t}\n\n\t_getBaseURL(config) {\n\t\tif (config.apiUrl) return config.apiUrl;\n\n\t\tconst ENV_URLS = {\n\t\t\tproduction: {\n\t\t\t\tbase: 'https://api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tstaging: {\n\t\t\t\tbase: 'https://staging.api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.staging.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tlocalstack: {\n\t\t\t\tbase: 'http://localhost:1323/api/v1',\n\t\t\t\twithWorkspace: (ws) => `http://${ws}.localhost:1323/api/v1`,\n\t\t\t},\n\t\t};\n\n\t\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 = null) {\n\t\tif (metadata) {\n\t\t\tthis.metadata = 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 || !this.metadata) {\n\t\t\tthrow new APIError(\n\t\t\t\t400,\n\t\t\t\t`Missing ${!this.workspace ? 'workspace' : 'user context'} for initialization`\n\t\t\t);\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn this._initMockSession();\n\t\t}\n\n\t\treturn this._initRealSession();\n\t}\n\n\tasync _initMockSession() {\n\t\tthis.sessionToken = 'mock_session_' + Date.now();\n\t\tthis.sessionExpiry = new Date(Date.now() + 3600 * 1000);\n\t\tthis._storeSession();\n\t\treturn {\n\t\t\tsessionToken: this.sessionToken,\n\t\t\tconfig: {\n\t\t\t\tprimaryColor: '#21244A',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\ttextColor: '#1F2937',\n\t\t\t\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\tuser: this.metadata,\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this._makeRequest('/widget/init', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\t\t\tconst initData = this._extractInitResponseData(response);\n\n\t\t\tthis.sessionToken = initData.sessionToken;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + initData.expiresIn * 1000);\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: initData.config,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t\tstatus: initData.status,\n\t\t\t\tmessage: initData.message,\n\t\t\t\tconfigVersion: initData.configVersion,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthrow new APIError(\n\t\t\t\terror.status || 500,\n\t\t\t\t`Failed to initialize widget: ${error.message}`,\n\t\t\t\terror.response\n\t\t\t);\n\t\t}\n\t}\n\n\t_extractInitResponseData(response) {\n\t\tconst payload =\n\t\t\tresponse && typeof response.data === 'object'\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\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetMetadata(metadata) {\n\t\tthis.metadata = metadata;\n\t\tthis._storeData('product7_metadata', metadata);\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._removeData('product7_session');\n\t\tthis._removeData('product7_metadata');\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\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { MessengerService } from '../api/services/MessengerService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\n\nexport class APIService extends BaseAPIService {\n\tconstructor(config = {}) {\n\t\tsuper(config);\n\n\t\tthis.feedback = new FeedbackService(this);\n\t\tthis.survey = new SurveyService(this);\n\t\tthis.messenger = new MessengerService(this);\n\t\tthis.help = new HelpService(this);\n\t\tthis.changelog = new ChangelogService(this);\n\t}\n\n\tasync submitFeedback(data) {\n\t\treturn this.feedback.submitFeedback(data);\n\t}\n\n\tasync getActiveSurveys(context) {\n\t\treturn this.survey.getActiveSurveys(context);\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\treturn this.survey.submitSurveyResponse(surveyId, responseData);\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\treturn this.survey.dismissSurvey(surveyId);\n\t}\n\n\tasync getMessengerSettings() {\n\t\treturn this.messenger.getMessengerSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log(\n\t\t\t\t'[APIService] startConversation: session invalid, calling init...'\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[APIService] startConversation: init result, token:',\n\t\t\t\t\tthis.sessionToken ? 'set' : 'null'\n\t\t\t\t);\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[APIService] startConversation: init failed:',\n\t\t\t\t\tinitError.message\n\t\t\t\t);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error(\n\t\t\t\t'[APIService] startConversation: no session token after init'\n\t\t\t);\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log(\n\t\t\t'[APIService] startConversation: sending to',\n\t\t\t`${this.baseURL}/widget/messenger/conversations`,\n\t\t\t'mock:',\n\t\t\tthis.mock\n\t\t);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.messenger.identifyContact(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\tasync getChangelogs(options) {\n\t\treturn this.changelog.getChangelogs(options);\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('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\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[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 * 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('.messenger-connection-banner');\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 = this.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 ? this._formatMessageTime(message.timestamp) : '';\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${isOptimistic\n\t\t\t\t\t\t\t? `<span class=\"messenger-message-sent-status\">Sending…</span>`\n\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\treturn `\n\t\t\t<div class=\"messenger-message-system\">\n\t\t\t\t<span class=\"messenger-message-system-text\">${this._escapeHtml(content)}</span>\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) + (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('.messenger-home-recent-card');\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 { 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\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\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_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: 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\tthis.launcher = new MessengerLauncher(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t});\n\t\tcontainer.appendChild(this.launcher.render());\n\n\t\tthis.panel = new MessengerPanel(this.messengerState, {\n\t\t\tposition: this.messengerOptions.position,\n\t\t\ttheme: this.messengerOptions.theme,\n\t\t\tprimaryColor: this.messengerOptions.primaryColor,\n\t\t\tlogoUrl: this.messengerOptions.logoUrl,\n\t\t\tfeaturedContent: this.messengerOptions.featuredContent,\n\t\t\tonSendMessage:\n\t\t\t\tthis.messengerOptions.onSendMessage ||\n\t\t\t\tthis._handleSendMessage.bind(this),\n\t\t\tonStartConversation: this._handleStartConversation.bind(this),\n\t\t\tonTyping: this.sendTypingIndicator.bind(this),\n\t\t\tonSelectConversation: this._handleSelectConversation.bind(this),\n\t\t\tonStartNewConversation: this._handleNewConversationClick.bind(this),\n\t\t\tonIdentifyContact: this._handleIdentifyContact.bind(this),\n\t\t\tonFeedbackClick:\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\tconst response = await this.apiService.identifyContact({\n\t\t\t\tname: contactData.name,\n\t\t\t\temail: contactData.email,\n\t\t\t});\n\n\t\t\tif (response.status) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[MessengerWidget] Contact identified:',\n\t\t\t\t\tresponse.data.contact_id\n\t\t\t\t);\n\t\t\t\tthis.messengerState.setIdentified(true, {\n\t\t\t\t\tname: contactData.name,\n\t\t\t\t\temail: contactData.email,\n\t\t\t\t});\n\n\t\t\t\t// Start WebSocket now that session token is available\n\t\t\t\tif (this.apiService?.sessionToken && !this.wsService?.isConnected) {\n\t\t\t\t\tthis._initWebSocket();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn response;\n\t\t} catch (error) {\n\t\t\tconsole.error('[MessengerWidget] Failed to identify contact:', error);\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tmarkAsIdentified(name, email) {\n\t\tthis.messengerState.setIdentified(true, { name, email });\n\t\tconsole.log('[MessengerWidget] Marked as identified:', email);\n\n\t\t// Start WebSocket now that we have a session token\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\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(this._explicitOptions || {}, key);\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.surveyState.isVisible = true;\n\t\tthis.sdk.eventBus.emit('survey:shown', {\n\t\t\twidget: this,\n\t\t\ttype: this.surveyOptions.surveyType,\n\t\t});\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tthis._closeSurvey();\n\t\treturn this;\n\t}\n\n\t_renderSurvey() {\n\t\tthis._closeSurvey(false);\n\n\t\tconst config = this._getSurveyConfig();\n\t\tif (!config) return;\n\t\tconst isMultiPage = this._isMultiPageSurvey();\n\t\tconst isLastPage = this._isLastPage();\n\t\tconst showFeedbackInput = this._shouldShowFeedbackInput();\n\t\tconst showActions = this._shouldShowActions();\n\t\tconst showTitle = this._shouldShowTitle(config);\n\t\tconst showDescription = this._shouldShowDescription(config);\n\t\tconst 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\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\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\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.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(this.config.metadata);\n\n\t\t\tif (initData.config) {\n\t\t\t\tthis.config = deepMerge(initData.config, this.config);\n\t\t\t}\n\n\t\t\tthis.initialized = true;\n\t\t\tthis.eventBus.emit('sdk:initialized', {\n\t\t\t\tconfig: this.config,\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tinitialized: true,\n\t\t\t\tconfig: initData.config || {},\n\t\t\t\tsessionToken: initData.sessionToken,\n\t\t\t\texpiresIn: initData.expiresIn,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to initialize SDK: ${error.message}`, error);\n\t\t}\n\t}\n\n\tcreateWidget(type = 'button', options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before creating widgets. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst widgetId = generateId('widget');\n\t\tconst widgetConfig = this._getWidgetTypeConfig(type);\n\t\tconst explicitOptions = this._omitUndefined(options);\n\t\tconst widgetEnabled = this._isWidgetEnabled(type, {\n\t\t\t...widgetConfig,\n\t\t\t...explicitOptions,\n\t\t});\n\t\tconst widgetOptions = {\n\t\t\tid: widgetId,\n\t\t\tsdk: this,\n\t\t\tapiService: this.apiService,\n\t\t\t...this.config,\n\t\t\t...widgetConfig,\n\t\t\t...explicitOptions,\n\t\t\tenabled: widgetEnabled,\n\t\t};\n\n\t\ttry {\n\t\t\tconst widget = WidgetFactory.create(type, widgetOptions);\n\t\t\tthis.widgets.set(widgetId, widget);\n\t\t\tthis.eventBus.emit('widget:created', { widget, type });\n\t\t\treturn widget;\n\t\t} catch (error) {\n\t\t\tthrow new SDKError(`Failed to create widget: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetWidget(id) {\n\t\treturn this.widgets.get(id);\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getActiveSurveys(context);\n\t\t\tconst surveys = (result.data || []).map((survey) =>\n\t\t\t\tthis._normalizeSurveyConfig(survey)\n\t\t\t);\n\t\t\tif (context.includeIneligible) {\n\t\t\t\treturn surveys;\n\t\t\t}\n\t\t\treturn surveys.filter((survey) => this._isSurveyEligible(survey));\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(\n\t\t\t\t`Failed to fetch active surveys: ${error.message}`,\n\t\t\t\terror\n\t\t\t);\n\t\t}\n\t}\n\n\tasync showSurveyById(surveyId, options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before showing surveys. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\tconst { context = {}, ...displayOptions } = options;\n\t\tconst surveys = await this.getActiveSurveys({\n\t\t\t...context,\n\t\t\tincludeEligibility: true,\n\t\t\tincludeIneligible: true,\n\t\t});\n\t\tconst surveyConfig = surveys.find(\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.createWidget('survey', {\n\t\t\tsurveyId: normalizedOptions.surveyId,\n\t\t\tsurveyType:\n\t\t\t\tnormalizedOptions.surveyType || normalizedOptions.type || 'nps',\n\t\t\tposition:\n\t\t\t\tnormalizedOptions.position ??\n\t\t\t\tsurveyConfigDefaults.position ??\n\t\t\t\tthis.config.position ??\n\t\t\t\t'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 legacyTypeConfig = this._isPlainObject(this.config?.[type])\n\t\t\t? this.config[type]\n\t\t\t: {};\n\n\t\tconst namespacedTypeConfig = this._isPlainObject(widgetsConfig?.[type])\n\t\t\t? widgetsConfig[type]\n\t\t\t: {};\n\n\t\tconst mergedTypeConfig = deepMerge(legacyTypeConfig, namespacedTypeConfig);\n\t\treturn this._toCamelCaseObject(mergedTypeConfig);\n\t}\n\n\t_isWidgetEnabled(type, options = {}) {\n\t\tconst typeConfig = this._getWidgetTypeConfig(type);\n\t\tif (typeConfig.enabled === false) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (typeof options.enabled === 'boolean') {\n\t\t\treturn options.enabled;\n\t\t}\n\n\t\tif (typeof typeConfig.enabled === 'boolean') {\n\t\t\treturn typeConfig.enabled;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_isPlainObject(value) {\n\t\treturn Object.prototype.toString.call(value) === '[object Object]';\n\t}\n\n\t_toCamelCaseKey(key) {\n\t\treturn key.replace(/_([a-z])/g, (_, char) => char.toUpperCase());\n\t}\n\n\t_toCamelCaseObject(value) {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.map((item) => this._toCamelCaseObject(item));\n\t\t}\n\n\t\tif (!this._isPlainObject(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tconst normalized = {};\n\t\tfor (const [key, nestedValue] of Object.entries(value)) {\n\t\t\tnormalized[this._toCamelCaseKey(key)] =\n\t\t\t\tthis._toCamelCaseObject(nestedValue);\n\t\t}\n\t\treturn normalized;\n\t}\n\n\t_omitUndefined(value) {\n\t\tif (!this._isPlainObject(value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn Object.fromEntries(\n\t\t\tObject.entries(value).filter(\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.createWidget('changelog', {\n\t\t\t...defaults,\n\t\t\t...configDefaults,\n\t\t\t...explicitOptions,\n\t\t\tenabled: changelogEnabled,\n\t\t});\n\n\t\tchangelogWidget.mount();\n\t\tchangelogWidget.show();\n\n\t\treturn changelogWidget;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tif (!this.initialized) {\n\t\t\tthrow new SDKError(\n\t\t\t\t'SDK must be initialized before fetching changelogs. Call init() first.'\n\t\t\t);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await this.apiService.getChangelogs(options);\n\t\t\treturn result.data || [];\n\t\t} catch (error) {\n\t\t\tthis.eventBus.emit('sdk:error', { error });\n\t\t\tthrow new SDKError(`Failed to fetch changelogs: ${error.message}`, error);\n\t\t}\n\t}\n\n\tgetAllWidgets() {\n\t\treturn Array.from(this.widgets.values());\n\t}\n\n\tdestroyWidget(id) {\n\t\tconst widget = this.widgets.get(id);\n\t\tif (widget) {\n\t\t\twidget.destroy();\n\t\t\tthis.widgets.delete(id);\n\t\t\tthis.eventBus.emit('widget:removed', { widgetId: id });\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tdestroyAllWidgets() {\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.destroy();\n\t\t}\n\t\tthis.widgets.clear();\n\t\tthis.eventBus.emit('widgets:cleared');\n\t}\n\n\tupdateConfig(newConfig) {\n\t\tconst oldConfig = { ...this.config };\n\t\tthis.config = this._validateAndMergeConfig(newConfig, this.config);\n\n\t\tfor (const widget of this.widgets.values()) {\n\t\t\twidget.handleConfigUpdate(this.config);\n\t\t}\n\n\t\tthis.eventBus.emit('config:updated', {\n\t\t\toldConfig,\n\t\t\tnewConfig: this.config,\n\t\t});\n\t}\n\n\tsetMetadata(metadata) {\n\t\tthis.config.metadata = metadata;\n\t\tif (this.apiService) {\n\t\t\tthis.apiService.setMetadata(metadata);\n\t\t}\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 reinitialize(newMetadata = null) {\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\n\t\tif (newMetadata) {\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.removeAllListeners();\n\t\tthis.apiService.clearSession();\n\t\tthis.initialized = false;\n\t\tthis.eventBus.emit('sdk:destroyed');\n\t}\n\n\thasFeedbackBeenSubmitted(cooldownDays = 30) {\n\t\tconst cooldownMs = cooldownDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\treturn now - data.submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearFeedbackSubmissionTracking() {\n\t\ttry {\n\t\t\tconst storageKey = `feedback_submitted_${this.config.workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t\tthis.eventBus.emit('feedback:trackingCleared');\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear feedback tracking:', e);\n\t\t}\n\t}\n\n\t_detectEnvironment() {\n\t\tif (typeof window === 'undefined') {\n\t\t\treturn 'production';\n\t\t}\n\n\t\tconst hostname = window.location.hostname.toLowerCase();\n\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: 'general',\n\t\t\tautoShow: true,\n\t\t\tdebug: false,\n\t\t\tmock: false,\n\t\t\tenv: this._detectEnvironment(),\n\t\t};\n\n\t\tconst mergedConfig = deepMerge(\n\t\t\tdeepMerge(defaultConfig, existingConfig),\n\t\t\tnewConfig\n\t\t);\n\n\t\tif (!newConfig.env && !existingConfig.env) {\n\t\t\tmergedConfig.env = this._detectEnvironment();\n\t\t}\n\n\t\tif (!mergedConfig.workspace) {\n\t\t\tthrow new ConfigError('Missing required configuration: workspace');\n\t\t}\n\n\t\tif (mergedConfig.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.destroyWidget = this.destroyWidget.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","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\n// --- Ensure SDK is initialized (shared by widget inits) ---\n\nasync function ensureSDK(options) {\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 = transformed.workspace;\n\n\t\t\tconst config = cleanUndefined({\n\t\t\t\tworkspace: transformed.workspace,\n\t\t\t\tmetadata: transformed.metadata,\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\tconst sdk = new Product7SDK(config);\n\t\t\tconst initData = await sdk.init();\n\n\t\t\tProduct7._sdk = sdk;\n\t\t\tProduct7._identified = true;\n\n\t\t\t// Sync custom attributes + segments via /widget/identify\n\t\t\tif (transformed.metadata && sdk.apiService?.sessionToken) {\n\t\t\t\ttry {\n\t\t\t\t\tconst identifyPayload = {\n\t\t\t\t\t\tuser_id: transformed.metadata.user_id,\n\t\t\t\t\t\temail: transformed.metadata.email,\n\t\t\t\t\t\tname: transformed.metadata.name,\n\t\t\t\t\t\tavatar: transformed.metadata.profile_picture,\n\t\t\t\t\t\tattributes: transformed.metadata.custom_fields || {},\n\t\t\t\t\t};\n\t\t\t\t\tif (transformed.metadata.company) {\n\t\t\t\t\t\tidentifyPayload.company = transformed.metadata.company;\n\t\t\t\t\t}\n\t\t\t\t\tawait sdk.apiService._makeRequest('/widget/identify', {\n\t\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\t\tbody: JSON.stringify(identifyPayload),\n\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\t\tAuthorization: `Bearer ${sdk.apiService.sessionToken}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t} catch (identifyErr) {\n\t\t\t\t\tif (config.debug) {\n\t\t\t\t\t\tconsole.warn('[Product7] Attribute sync failed:', identifyErr);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\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, initData },\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 initData;\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._noTriggerButton = 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.createWidget('button', 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.openPanel();\n\t\t}\n\t},\n\n\tcloseFeedback() {\n\t\tif (Product7._feedbackWidget) {\n\t\t\tProduct7._feedbackWidget.closePanel();\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.createWidget('messenger', 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","payload","board","board_id","boardName","attachments","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","MessengerService","getMessengerSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","getMessages","identifyContact","contact_id","email","is_new","phone","company","avatar_url","metadata","sendTypingIndicator","isTyping","is_typing","SDKError","Error","cause","super","captureStackTrace","APIError","response","isNetworkError","isClientError","isServerError","WidgetError","widgetType","widgetId","ConfigError","configKey","ValidationError","field","value","SurveyService","getActiveSurveys","context","respondent","_getRespondentContext","window","location","href","respondent_id","undefined","includeEligibility","include_eligibility","userProperties","user_properties","getMetadata","respondentId","userId","user_id","submitSurveyResponse","surveyId","responseData","survey_id","rating","feedback","answers","dismissSurvey","BaseAPIService","config","workspace","sessionExpiry","env","baseURL","_getBaseURL","_loadStoredSession","apiUrl","ENV_URLS","production","base","withWorkspace","ws","staging","localstack","hostname","port","envConfig","init","isSessionValid","_initMockSession","_initRealSession","_storeSession","primaryColor","backgroundColor","textColor","size","displayMode","expiresIn","user","initData","_extractInitResponseData","configVersion","error","session_token","Number","expires_in","isFinite","config_version","args","apply","setMetadata","_storeData","clearSession","_removeData","localStorage","sessionData","token","expiry","stored","getItem","parse","key","setItem","removeItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","APIService","survey","messenger","help","changelog","available_agents","full_name","picture","console","log","initError","uploadFile","base64Data","filename","file","submitRating","startsWith","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","Array","isArray","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","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","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_listeners","_onOpen","_onMessage","_onClose","_onError","connect","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","_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","Boolean","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","avatarUrl","_renderTeamAvatars","avatars","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollHeight","scrollTop","pill","isLast","nextMsg","currentTime","nextTime","senderKey","nextSenderKey","_updateSendButtonState","sendBtn","preview","idx","currentTarget","min","_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","start","selectionStart","end","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","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","messengerState","launcher","wsService","_wsUnsubscribers","_feedbackWidget","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","_createInternalFeedbackWidget","createWidget","zIndex","styleElement","getElementById","adjustColor","percent","alpha","normalized","num","r","max","g","b","padStart","applyMessengerCustomStyles","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","_initWebSocket","markAsIdentified","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","mockResponse","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","freq","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","frequency","_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","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","widgetEnabled","_isWidgetEnabled","widgetOptions","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","_toCamelCaseObject","typeConfig","_toCamelCaseKey","nestedValue","fromEntries","showChangelog","defaults","configDefaults","changelogEnabled","changelogWidget","getAllWidgets","destroyWidget","destroyAllWidgets","updateConfig","oldConfig","reinitialize","newMetadata","removeAllListeners","hasFeedbackBeenSubmitted","cooldownDays","clearFeedbackSubmissionTracking","_detectEnvironment","existingConfig","mergedConfig","_validateMetadata","validStructure","custom_fields","expectedType","createAndInit","extractMetadataFromAuth","authData","sub","display_name","role","plan","subscription","organization","monthly_spend","cleanUndefined","ensureSDK","_sdk","Product7SDK","_organization","_identified","_q","_messengerWidget","_surveyWidget","version","identify","transformed","profilePicture","locale","companies","customAttrs","profile_picture","knownKeys","customFields","monthlySpend","companyKnownKeys","transformIdentifyData","identifyPayload","attributes","identifyErr","_flushQueue","CustomEvent","phase","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/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 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};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class MessengerService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getMessengerSettings() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tenabled: true,\n\t\t\t\t\tgreeting_message: 'Hi there! How can we help?',\n\t\t\t\t\tteam_name: 'Support Team',\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_CONVERSATIONS,\n\t\t\t\tmeta: { total: MOCK_CONVERSATIONS.length, page: 1, limit: 20 },\n\t\t\t};\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/messenger/conversations',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversation(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst conv = MOCK_CONVERSATIONS.find((c) => c.id === conversationId);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { ...conv, messages: MOCK_MESSAGES[conversationId] || [] },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}`,\n\t\t\t{\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync startConversation(data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tcontent: data.content,\n\t\t\t\t\tattachments: data.attachments || [],\n\t\t\t\t}),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getUnreadCount() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tconst count = MOCK_CONVERSATIONS.reduce(\n\t\t\t\t(sum, c) => sum + (c.unread || 0),\n\t\t\t\t0\n\t\t\t);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: { unread_count: count, unread_conversations: count > 0 ? 1 : 0 },\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/messenger/unread', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/read`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t}\n\t\t);\n\t}\n\n\tasync getMessages(conversationId, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: MOCK_MESSAGES[conversationId] || [],\n\t\t\t\tmeta: { total: 0, page: 1, limit: 50 },\n\t\t\t};\n\t\t}\n\n\t\tconst params = { ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.api.identify(data);\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\n\t\tconst payload = {\n\t\t\trating: responseData.rating,\n\t\t\tfeedback: responseData.feedback || '',\n\t\t\tanswers: responseData.answers || {},\n\t\t\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.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\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\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\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/agents/online', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.sessionToken}` },\n\t\t});\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.messenger.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.messenger.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.messenger.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tconsole.log(\n\t\t\t\t'[APIService] startConversation: session invalid, calling init...'\n\t\t\t);\n\t\t\ttry {\n\t\t\t\tawait this.init();\n\t\t\t\tconsole.log(\n\t\t\t\t\t'[APIService] startConversation: init result, token:',\n\t\t\t\t\tthis.sessionToken ? 'set' : 'null'\n\t\t\t\t);\n\t\t\t} catch (initError) {\n\t\t\t\tconsole.error(\n\t\t\t\t\t'[APIService] startConversation: init failed:',\n\t\t\t\t\tinitError.message\n\t\t\t\t);\n\t\t\t\tthrow initError;\n\t\t\t}\n\t\t}\n\n\t\tif (!this.sessionToken) {\n\t\t\tconsole.error(\n\t\t\t\t'[APIService] startConversation: no session token after init'\n\t\t\t);\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\n\t\tconsole.log(\n\t\t\t'[APIService] startConversation: sending to',\n\t\t\t`${this.baseURL}/widget/messenger/conversations`,\n\t\t\t'mock:',\n\t\t\tthis.mock\n\t\t);\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\tconst newConv = {\n\t\t\t\tid: 'conv_' + Date.now(),\n\t\t\t\tsubject: data.subject || 'New conversation',\n\t\t\t\tstatus: 'open',\n\t\t\t\tlast_message_at: new Date().toISOString(),\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\tmessages: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\t\t\tcontent: data.message,\n\t\t\t\t\t\tsender_type: 'customer',\n\t\t\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t};\n\t\t\tMOCK_CONVERSATIONS.unshift(newConv);\n\t\t\tMOCK_MESSAGES[newConv.id] = newConv.messages;\n\t\t\treturn { status: true, data: newConv };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/conversations', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tmessage: data.message,\n\t\t\t\tsubject: data.subject || '',\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 200));\n\t\t\tconst newMessage = {\n\t\t\t\tid: 'msg_' + Date.now(),\n\t\t\t\tcontent: data.content,\n\t\t\t\tattachments: data.attachments || [],\n\t\t\t\tsender_type: 'customer',\n\t\t\t\tcreated_at: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (!MOCK_MESSAGES[conversationId]) {\n\t\t\t\tMOCK_MESSAGES[conversationId] = [];\n\t\t\t}\n\t\t\tMOCK_MESSAGES[conversationId].push(newMessage);\n\t\t\treturn { status: true, data: newMessage };\n\t\t}\n\n\t\tconst payload = { content: data.content };\n\t\tif (data.attachments && data.attachments.length > 0) {\n\t\t\tpayload.attachments = data.attachments;\n\t\t}\n\n\t\treturn this._makeRequest(\n\t\t\t`/widget/messenger/conversations/${conversationId}/messages`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t}\n\t\t);\n\t}\n\n\t/**\n\t * Upload a file to CDN via widget endpoint\n\t * @param {string} base64Data - Base64 encoded file data (with or without data URI prefix)\n\t * @param {string} filename - Original filename\n\t * @returns {Promise<Object>} Response with url\n\t */\n\tasync uploadFile(base64Data, filename) {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, 300));\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this._makeRequest('/widget/messenger/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.messenger.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.messenger.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.messenger.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.messenger.submitRating(conversationId, data);\n\t}\n\n\tasync 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\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 response = await this._makeRequest('/widget/messenger/identify', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({\n\t\t\t\tuser_id: metadata.user_id || null,\n\t\t\t\temail: metadata.email || '',\n\t\t\t\tname: metadata.name || '',\n\t\t\t\tphone: metadata.phone || '',\n\t\t\t\tcompany: metadata.company || '',\n\t\t\t\tavatar_url: metadata.avatar_url || '',\n\t\t\t\tmetadata: metadata.custom_fields || {},\n\t\t\t}),\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\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\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\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) {\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[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 * 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\treturn `\n\t\t\t<div class=\"messenger-message-system\">\n\t\t\t\t<span class=\"messenger-message-system-text\">${this._escapeHtml(content)}</span>\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 { 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\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\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","payload","board","board_id","boardName","attachments","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","MessengerService","getMessengerSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","getMessages","identifyContact","identify","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","contactId","contactEmail","contactName","localStorage","sessionData","token","expiry","stored","getItem","parse","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","available_agents","full_name","picture","console","log","initError","uploadFile","base64Data","filename","file","submitRating","r","mockResponse","contact_id","is_new","_storeContactIdentity","phone","getContactIdentity","parsed","startsWith","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","Array","isArray","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","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","WebSocketService","reconnectAttempts","maxReconnectAttempts","reconnectDelay","pingInterval","isConnected","_listeners","_onOpen","_onMessage","_onClose","_onError","connect","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","_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","Boolean","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","avatarUrl","_renderTeamAvatars","avatars","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollHeight","scrollTop","pill","isLast","nextMsg","currentTime","nextTime","senderKey","nextSenderKey","_updateSendButtonState","sendBtn","preview","idx","currentTarget","min","_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","start","selectionStart","end","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","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","_createInternalFeedbackWidget","createWidget","zIndex","styleElement","getElementById","adjustColor","percent","alpha","normalized","num","max","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","freq","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","frequency","_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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"}
|