@product7/product7-js 0.6.8 → 0.6.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"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/LiveChatService.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/styles/liveChatCustomStyles.js","../src/utils/NotificationSound.js","../src/utils/notificationSoundData.js","../src/widgets/liveChat/LiveChatState.js","../src/widgets/liveChat/components/LiveChatLauncher.js","../src/widgets/liveChat/components/NavigationTabs.js","../src/widgets/liveChat/components/LiveChatPanel.js","../src/widgets/liveChat/views/ChangelogView.js","../src/widgets/liveChat/views/ChatView.js","../src/widgets/liveChat/views/ConversationsView.js","../src/widgets/liveChat/views/HelpView.js","../src/widgets/liveChat/views/HomeView.js","../src/widgets/liveChat/views/FeedbackFormView.js","../src/widgets/liveChat/views/PreChatFormView.js","../src/widgets/LiveChatWidget.js","../src/widgets/SurveyWidget.js","../src/widgets/TabWidget.js","../src/widgets/WidgetFactory.js","../src/core/Product7.js","../src/styles/styles.js","../src/index.js"],"sourcesContent":["export const MOCK_CHANGELOGS = [\n\t{\n\t\tid: 'changelog_1',\n\t\ttitle:\n\t\t\t'Feature prioritization, multiple roadmaps, and feature request analytics.',\n\t\texcerpt:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tdescription:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=',\n\t\tslug: 'feature-prioritization-roadmaps-analytics',\n\t\tpublished_at: '2025-03-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'New Feature', color: '#10B981' },\n\t\t\t{ name: 'Analytics', color: '#6366F1' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_2',\n\t\ttitle: 'Dark mode support and UI improvements',\n\t\texcerpt:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tdescription:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+',\n\t\tslug: 'dark-mode-ui-improvements',\n\t\tpublished_at: '2025-03-01T10:00:00Z',\n\t\tlabels: [{ name: 'Enhancement', color: '#8B5CF6' }],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_3',\n\t\ttitle: 'Performance improvements and bug fixes',\n\t\texcerpt:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tdescription:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tslug: 'performance-improvements-bug-fixes',\n\t\tpublished_at: '2025-02-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'Bug Fix', color: '#EF4444' },\n\t\t\t{ name: 'Performance', color: '#F59E0B' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n];\n\nexport const MOCK_CONVERSATIONS = [\n\t{\n\t\tid: 'conv_1',\n\t\tsubject: 'Question about pricing',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 1,\n\t\tassigned_user: {\n\t\t\tid: 'user_1',\n\t\t\tname: 'Sarah',\n\t\t\tavatar: null,\n\t\t},\n\t},\n\t{\n\t\tid: 'conv_2',\n\t\tsubject: 'Feature request',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(\n\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000\n\t\t).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 0,\n\t\tassigned_user: {\n\t\t\tid: 'user_2',\n\t\t\tname: 'Tom',\n\t\t\tavatar: null,\n\t\t},\n\t},\n];\n\nexport const MOCK_MESSAGES = {\n\tconv_1: [\n\t\t{\n\t\t\tid: 'msg_1',\n\t\t\tcontent: \"Hi there! 👋 I'm Sarah. How can I help you today?\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Sarah',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 50 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_2',\n\t\t\tcontent: 'Hi! I have a question about your enterprise pricing.',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n\tconv_2: [\n\t\t{\n\t\t\tid: 'msg_3',\n\t\t\tcontent: \"Hello! I'm Tom from the product team.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_4',\n\t\t\tcontent: 'I would love to see a dark mode feature!',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(\n\t\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000 - 30 * 60 * 1000\n\t\t\t).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_5',\n\t\t\tcontent:\n\t\t\t\t\"Great suggestion! That feature will be available next week. I'll let you know when it's ready.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n};\n\nexport const MOCK_HELP_COLLECTIONS = [\n\t{\n\t\tid: 'collection_1',\n\t\ttitle: 'Product Overview',\n\t\tdescription: 'See how your AI-first customer service solution works.',\n\t\tarticleCount: 24,\n\t\ticon: 'ph-book-open',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_2',\n\t\ttitle: 'Getting Started',\n\t\tdescription: 'Everything you need to know to get started with Product7.',\n\t\tarticleCount: 30,\n\t\ticon: 'ph-rocket',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_3',\n\t\ttitle: 'AI Agent',\n\t\tdescription:\n\t\t\t'Resolving customer questions instantly and accurately—from live chat to email.',\n\t\tarticleCount: 82,\n\t\ticon: 'ph-robot',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_4',\n\t\ttitle: 'Channels',\n\t\tdescription:\n\t\t\t'Enabling the channels you use to communicate with customers, all from the Inbox.',\n\t\tarticleCount: 45,\n\t\ticon: 'ph-chat-circle',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_5',\n\t\ttitle: 'Billing & Payments',\n\t\tdescription: 'Manage your subscription, invoices, and payment methods.',\n\t\tarticleCount: 12,\n\t\ticon: 'ph-credit-card',\n\t\turl: '#',\n\t},\n];\n\nexport const MOCK_SURVEYS = [\n\t{\n\t\tid: 'mock_nps_survey',\n\t\tname: 'NPS Score',\n\t\tslug: 'nps',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'nps-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How likely are you to recommend us to a friend?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: {\n\t\t\t\t\tscale: 11,\n\t\t\t\t\tlow_label: 'Very unlikely',\n\t\t\t\t\thigh_label: 'Very likely',\n\t\t\t\t\tsurvey_type: 'nps',\n\t\t\t\t},\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\tname: 'CSAT Survey',\n\t\tslug: 'csat',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'csat-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How satisfied are you with our service?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very dissatisfied',\n\t\t\t\t\thigh_label: 'Very satisfied',\n\t\t\t\t\tsurvey_type: 'emoji',\n\t\t\t\t},\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\tname: 'Customer Effort Score',\n\t\tslug: 'ces',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'ces-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How easy was it to use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very difficult',\n\t\t\t\t\thigh_label: 'Very easy',\n\t\t\t\t\tsurvey_type: 'ces',\n\t\t\t\t},\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_open_question_survey',\n\t\tname: 'Open Question',\n\t\tslug: 'open-question',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'open-page-1',\n\t\t\t\ttype: 'text',\n\t\t\t\ttitle: 'What could we do better?',\n\t\t\t\tdescription:\n\t\t\t\t\t'Is there anything we could do to make our product better for you?',\n\t\t\t\tplaceholder: 'Type your answer here',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_product_idea_poll_survey',\n\t\tname: 'Product Idea Poll',\n\t\tslug: 'product-idea-poll',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'poll-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'Which feature should we add next?',\n\t\t\t\tdescription: 'Vote on the feature you would like to see next.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'opt1', label: 'Better reporting' },\n\t\t\t\t\t\t{ id: 'opt2', label: 'Mobile app' },\n\t\t\t\t\t\t{ id: 'opt3', label: 'Integrations' },\n\t\t\t\t\t\t{ id: 'opt4', label: 'AI features' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_pmf_survey',\n\t\tname: 'Product Market Fit (PMF)',\n\t\tslug: 'pmf',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'pmf-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'How would you feel if you could no longer use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'very_disappointed', label: 'Very disappointed' },\n\t\t\t\t\t\t{ id: 'somewhat_disappointed', label: 'Somewhat disappointed' },\n\t\t\t\t\t\t{ id: 'not_disappointed', label: 'Not disappointed' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_user_interview_survey',\n\t\tname: 'User Interview Request',\n\t\tslug: 'user-interview',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'interview-page-1',\n\t\t\t\ttype: 'link',\n\t\t\t\ttitle: 'Would you like to hop on a quick demo?',\n\t\t\t\tdescription:\n\t\t\t\t\t'We would love to hear your thoughts and answer any questions you have.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: {\n\t\t\t\t\tbutton_text: 'Book a demo',\n\t\t\t\t\tlink_text: '',\n\t\t\t\t\tredirect_url: 'https://example.com',\n\t\t\t\t\topen_in: 'new_tab',\n\t\t\t\t},\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n];\n","export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function getDeviceInfo() {\n\tif (typeof navigator === 'undefined') {\n\t\treturn { device: null, browser: null, os: null };\n\t}\n\n\tconst ua = navigator.userAgent;\n\n\tlet device = 'desktop';\n\tif (/Mobi|Android/i.test(ua)) {\n\t\tdevice = /Tablet|iPad/i.test(ua) ? 'tablet' : 'mobile';\n\t}\n\n\tlet browser = 'unknown';\n\tif (ua.includes('Firefox')) browser = 'firefox';\n\telse if (ua.includes('Edg')) browser = 'edge';\n\telse if (ua.includes('Chrome')) browser = 'chrome';\n\telse if (ua.includes('Safari')) browser = 'safari';\n\telse if (ua.includes('Opera') || ua.includes('OPR')) browser = 'opera';\n\n\tlet os = 'unknown';\n\tif (ua.includes('Windows')) os = 'windows';\n\telse if (ua.includes('Mac')) os = 'macos';\n\telse if (ua.includes('Linux')) os = 'linux';\n\telse if (ua.includes('Android')) os = 'android';\n\telse if (ua.includes('iPhone') || ua.includes('iPad')) os = 'ios';\n\n\treturn { device, browser, os };\n}\n","import { MOCK_CHANGELOGS } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class ChangelogService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { success: true, data: MOCK_CHANGELOGS };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/changelogs',\n\t\t\t\toptions\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n}\n","import { delay } from '../utils/helpers.js';\n\nexport class FeedbackService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync submitFeedback(feedbackData) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(500);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_post_' + Date.now(),\n\t\t\t\t\ttitle: feedbackData.title,\n\t\t\t\t\tcontent: feedbackData.content,\n\t\t\t\t},\n\t\t\t\tmessage: 'Feedback submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst contact = this.api.getContactIdentity();\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardName,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class LiveChatService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getLiveChatSettings() {\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/livechat/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/livechat/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/livechat/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/livechat/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/livechat/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/livechat/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/livechat/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/livechat/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/livechat/conversations/${conversationId}/messages`,\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync uploadFile(base64Data, filename) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/livechat/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.api.identify(data);\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true, data: { rated: true } };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/livechat/conversations/${conversationId}/rating`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/livechat/conversations/${conversationId}/typing`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ is_typing: isTyping }),\n\t\t\t}\n\t\t);\n\t}\n}\n","export class SDKError extends Error {\n\tconstructor(message, cause) {\n\t\tsuper(message);\n\t\tthis.name = 'SDKError';\n\t\tthis.cause = cause;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, SDKError);\n\t\t}\n\t}\n}\n\nexport class APIError extends Error {\n\tconstructor(status, message, response) {\n\t\tsuper(message);\n\t\tthis.name = 'APIError';\n\t\tthis.status = status;\n\t\tthis.response = response;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, APIError);\n\t\t}\n\t}\n\n\tisNetworkError() {\n\t\treturn this.status === 0;\n\t}\n\n\tisClientError() {\n\t\treturn this.status >= 400 && this.status < 500;\n\t}\n\n\tisServerError() {\n\t\treturn this.status >= 500 && this.status < 600;\n\t}\n}\n\nexport class WidgetError extends Error {\n\tconstructor(message, widgetType, widgetId) {\n\t\tsuper(message);\n\t\tthis.name = 'WidgetError';\n\t\tthis.widgetType = widgetType;\n\t\tthis.widgetId = widgetId;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, WidgetError);\n\t\t}\n\t}\n}\n\nexport class ConfigError extends Error {\n\tconstructor(message, configKey) {\n\t\tsuper(message);\n\t\tthis.name = 'ConfigError';\n\t\tthis.configKey = configKey;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ConfigError);\n\t\t}\n\t}\n}\n\nexport class ValidationError extends Error {\n\tconstructor(message, field, value) {\n\t\tsuper(message);\n\t\tthis.name = 'ValidationError';\n\t\tthis.field = field;\n\t\tthis.value = value;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ValidationError);\n\t\t}\n\t}\n}\n\nexport class ErrorHandler {\n\tconstructor(debug = false) {\n\t\tthis.debug = debug;\n\t}\n\n\thandle(error, context = '') {\n\t\tconst errorInfo = {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tcontext,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (error instanceof APIError) {\n\t\t\terrorInfo.status = error.status;\n\t\t\terrorInfo.type = 'api';\n\t\t} else if (error instanceof WidgetError) {\n\t\t\terrorInfo.widgetType = error.widgetType;\n\t\t\terrorInfo.widgetId = error.widgetId;\n\t\t\terrorInfo.type = 'widget';\n\t\t} else if (error instanceof ConfigError) {\n\t\t\terrorInfo.configKey = error.configKey;\n\t\t\terrorInfo.type = 'config';\n\t\t} else if (error instanceof ValidationError) {\n\t\t\terrorInfo.field = error.field;\n\t\t\terrorInfo.value = error.value;\n\t\t\terrorInfo.type = 'validation';\n\t\t} else {\n\t\t\terrorInfo.type = 'unknown';\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.error('[Product7 Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[Product7 Error]', error.message);\n\t\t}\n\n\t\treturn errorInfo;\n\t}\n\n\tgetUserMessage(error) {\n\t\tif (error instanceof APIError) {\n\t\t\tif (error.isNetworkError()) {\n\t\t\t\treturn 'Network error. Please check your connection and try again.';\n\t\t\t} else if (error.isClientError()) {\n\t\t\t\treturn 'Invalid request. Please check your input and try again.';\n\t\t\t} else if (error.isServerError()) {\n\t\t\t\treturn 'Server error. Please try again later.';\n\t\t\t}\n\t\t\treturn 'Failed to submit feedback. Please try again.';\n\t\t}\n\n\t\tif (error instanceof ValidationError) {\n\t\t\treturn `Please check your ${error.field}: ${error.message}`;\n\t\t}\n\n\t\tif (error instanceof ConfigError) {\n\t\t\treturn 'Configuration error. Please check your SDK setup.';\n\t\t}\n\n\t\tif (error instanceof WidgetError) {\n\t\t\treturn 'Widget error. Please try refreshing the page.';\n\t\t}\n\n\t\treturn 'An unexpected error occurred. Please try again.';\n\t}\n}\n","import { APIError } from '../../utils/errors.js';\nimport { MOCK_SURVEYS } from '../mock-data/index.js';\nimport { delay, getDeviceInfo } from '../utils/helpers.js';\n\nexport class SurveyService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { success: true, data: MOCK_SURVEYS };\n\t\t}\n\n\t\tconst respondent = this._getRespondentContext(context);\n\n\t\tconst params = {\n\t\t\turl:\n\t\t\t\tcontext.url ||\n\t\t\t\t(typeof window !== 'undefined' ? window.location.href : ''),\n\t\t\t...getDeviceInfo(),\n\t\t\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t\t...(context.includeEligibility !== undefined && {\n\t\t\t\tinclude_eligibility: context.includeEligibility,\n\t\t\t}),\n\t\t\t...(context.userProperties && {\n\t\t\t\tuser_properties: context.userProperties,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/surveys/active',\n\t\t\t\tparams\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n\n\t_getRespondentContext(context = {}) {\n\t\tconst metadata =\n\t\t\ttypeof this.api.getMetadata === 'function'\n\t\t\t\t? this.api.getMetadata() || {}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\trespondent_id:\n\t\t\t\tcontext.respondentId || context.userId || metadata.user_id || null,\n\t\t\temail: context.email || metadata.email || null,\n\t\t};\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_response_' + Date.now(),\n\t\t\t\t\tsurvey_id: surveyId,\n\t\t\t\t\t...responseData,\n\t\t\t\t},\n\t\t\t\tmessage: 'Survey response submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst respondent = this._getRespondentContext(responseData);\n\t\tconst contact = this.api.getContactIdentity?.() || null;\n\n\t\tconst payload = {\n\t\t\tanswers: Array.isArray(responseData.answers) ? responseData.answers : [],\n\t\t\t...(responseData.feedback && { feedback: responseData.feedback }),\n\t\t\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.metadata = config.metadata || null;\n\t\tthis.identitySyncedToken = null;\n\t\tthis.mock = config.mock || false;\n\t\tthis.env = config.env || 'production';\n\t\tthis.baseURL = this._getBaseURL(config);\n\n\t\tthis._loadStoredSession();\n\t\tthis._loadStoredMetadata();\n\t\tif (this.isSessionValid() && this.metadata) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t}\n\t}\n\n\t_getBaseURL(config) {\n\t\tif (config.apiUrl) return config.apiUrl;\n\n\t\tconst ENV_URLS = {\n\t\t\tproduction: {\n\t\t\t\tbase: 'https://api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tstaging: {\n\t\t\t\tbase: 'https://staging.api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.staging.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tlocalstack: {\n\t\t\t\tbase: 'http://localhost:1323/api/v1',\n\t\t\t\twithWorkspace: (ws) => `http://${ws}.localhost:1323/api/v1`,\n\t\t\t},\n\t\t};\n\n\t\tlet env = this.env;\n\t\tif (!env || env === 'production') {\n\t\t\tconst hostname =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.hostname) || '';\n\t\t\tconst port =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.port) || '';\n\t\t\tif (hostname.includes('staging')) {\n\t\t\t\tenv = 'staging';\n\t\t\t} else if (hostname === 'app.localhost' && port === '3005') {\n\t\t\t\tenv = 'localstack';\n\t\t\t}\n\t\t}\n\n\t\tconst envConfig = ENV_URLS[env] || ENV_URLS.production;\n\t\treturn this.workspace\n\t\t\t? envConfig.withWorkspace(this.workspace)\n\t\t\t: envConfig.base;\n\t}\n\n\tasync init(metadata = undefined) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\n\t\t}\n\n\t\tif (this.isSessionValid()) {\n\t\t\treturn { sessionToken: this.sessionToken };\n\t\t}\n\n\t\tif (!this.workspace) {\n\t\t\tthrow new APIError(400, 'Missing workspace for initialization');\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn this._initMockSession();\n\t\t}\n\n\t\treturn this._initRealSession();\n\t}\n\n\tasync _initMockSession() {\n\t\tthis.sessionToken = 'mock_session_' + Date.now();\n\t\tthis.sessionExpiry = new Date(Date.now() + 3600 * 1000);\n\t\tthis.identitySyncedToken = null;\n\t\tthis._storeSession();\n\t\treturn {\n\t\t\tsessionToken: this.sessionToken,\n\t\t\tconfig: {\n\t\t\t\tprimaryColor: '#21244A',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\ttextColor: '#1F2937',\n\t\t\t\tboardName: 'feature-requests',\n\t\t\t\tsize: 'medium',\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t},\n\t\t\texpiresIn: 3600,\n\t\t};\n\t}\n\n\tasync _initRealSession() {\n\t\tconst payload = {\n\t\t\tworkspace: this.workspace,\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this._makeRequest('/widget/init', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\t\t\tconst initData = this._extractInitResponseData(response);\n\n\t\t\tthis.sessionToken = initData.sessionToken;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + initData.expiresIn * 1000);\n\t\t\tthis.identitySyncedToken = null;\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: initData.config,\n\t\t\t\twidgets: initData.widgets,\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 configData =\n\t\t\tpayload.config && typeof payload.config === 'object'\n\t\t\t\t? payload.config\n\t\t\t\t: {};\n\n\t\tconst sessionToken =\n\t\t\tpayload.session_token ||\n\t\t\tpayload.sessionToken ||\n\t\t\tconfigData.session_token ||\n\t\t\tconfigData.sessionToken;\n\n\t\tconst expiresIn = Number(\n\t\t\tpayload.expires_in ??\n\t\t\t\tpayload.expiresIn ??\n\t\t\t\tconfigData.expires_in ??\n\t\t\t\tconfigData.expiresIn\n\t\t);\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: configData,\n\t\t\twidgets:\n\t\t\t\tpayload.widgets && typeof payload.widgets === 'object'\n\t\t\t\t\t? payload.widgets\n\t\t\t\t\t: null,\n\t\t\tconfigVersion:\n\t\t\t\tconfigData.config_version ??\n\t\t\t\tconfigData.configVersion ??\n\t\t\t\tpayload.config_version ??\n\t\t\t\tpayload.configVersion ??\n\t\t\t\tnull,\n\t\t\tstatus: response?.status ?? payload?.status ?? true,\n\t\t\tmessage: response?.message ?? payload?.message ?? null,\n\t\t};\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\tawait this._restoreIdentity();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync identify(metadata = this.metadata) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\n\t\t}\n\n\t\tif (!this.metadata) {\n\t\t\tthrow new APIError(400, 'Missing user context for identify');\n\t\t}\n\n\t\tawait this._ensureSession();\n\n\t\tconst payload = this._buildIdentifyPayload(this.metadata);\n\n\t\tif (this.mock) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tidentified: true,\n\t\t\t\tdata: {\n\t\t\t\t\tuser_id: payload.user_id || null,\n\t\t\t\t\temail: payload.email || null,\n\t\t\t\t\tname: payload.name || null,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst response = await this._makeRequest('/widget/identify', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(payload),\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t});\n\n\t\tthis.identitySyncedToken = this.sessionToken;\n\t\treturn response;\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetMetadata(metadata) {\n\t\tthis.metadata = metadata || null;\n\t\tthis.identitySyncedToken = null;\n\t\tif (this.metadata) {\n\t\t\tthis._storeData('product7_metadata', this.metadata);\n\t\t} else {\n\t\t\tthis._removeData('product7_metadata');\n\t\t}\n\t}\n\n\tgetMetadata() {\n\t\treturn this.metadata;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.identitySyncedToken = null;\n\t\tthis.contactId = null;\n\t\tthis.contactEmail = null;\n\t\tthis.contactName = null;\n\t\tthis._removeData('product7_session');\n\t\tthis._removeData('product7_metadata');\n\t\tthis._removeData('product7_contact');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('product7_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('product7_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken =\n\t\t\t\tsessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('product7_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.workspace &&\n\t\t\t\tsessionData.workspace &&\n\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t) {\n\t\t\t\tlocalStorage.removeItem('product7_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_loadStoredMetadata() {\n\t\tif (this.metadata || typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst session = localStorage.getItem('product7_session');\n\t\t\tif (session) {\n\t\t\t\tconst sessionData = JSON.parse(session);\n\t\t\t\tif (\n\t\t\t\t\tthis.workspace &&\n\t\t\t\t\tsessionData.workspace &&\n\t\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stored = localStorage.getItem('product7_metadata');\n\t\t\tif (!stored) return false;\n\n\t\t\tthis.metadata = JSON.parse(stored);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n\n\t_buildIdentifyPayload(metadata = {}) {\n\t\tconst payload = {\n\t\t\tuser_id: metadata.user_id,\n\t\t\temail: metadata.email,\n\t\t\tname: metadata.name,\n\t\t\tavatar:\n\t\t\t\tmetadata.profile_picture || metadata.avatar_url || metadata.avatar,\n\t\t\tattributes: metadata.custom_fields || {},\n\t\t};\n\n\t\tif (metadata.company) {\n\t\t\tpayload.company = metadata.company;\n\t\t}\n\n\t\treturn payload;\n\t}\n\n\tasync _restoreIdentity() {\n\t\tif (\n\t\t\t!this.metadata ||\n\t\t\t!this.sessionToken ||\n\t\t\t!this.identitySyncedToken ||\n\t\t\tthis.identitySyncedToken === this.sessionToken\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.identify(this.metadata);\n\t}\n}\n","import { ChangelogService } from '../api/services/ChangelogService.js';\nimport { FeedbackService } from '../api/services/FeedbackService.js';\nimport { HelpService } from '../api/services/HelpService.js';\nimport { LiveChatService } from '../api/services/LiveChatService.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.liveChat = new LiveChatService(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 getLiveChatSettings() {\n\t\treturn this.liveChat.getLiveChatSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\treturn this.liveChat.checkAgentsOnline();\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.liveChat.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.liveChat.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.liveChat.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\treturn this.liveChat.startConversation(data);\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\treturn this.liveChat.sendMessage(conversationId, data);\n\t}\n\n\tasync uploadFile(base64Data, filename) {\n\t\treturn this.liveChat.uploadFile(base64Data, filename);\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.liveChat.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.liveChat.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.liveChat.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.liveChat.submitRating(conversationId, data);\n\t}\n\n\tasync identify(metadata) {\n\t\tawait this._ensureSession();\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((r) => setTimeout(r, 300));\n\t\t\tconst mockResponse = {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tcontact_id: 'mock_contact_' + Date.now(),\n\t\t\t\t\temail: metadata.email || '',\n\t\t\t\t\tname: metadata.name || '',\n\t\t\t\t\tavatar: metadata.avatar || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis._storeContactIdentity(mockResponse.data, metadata);\n\t\t\treturn mockResponse;\n\t\t}\n\n\t\tconst payload = {};\n\n\t\tif (metadata.email) payload.email = metadata.email;\n\t\tif (metadata.user_id) payload.user_id = metadata.user_id;\n\t\tif (metadata.name) payload.name = metadata.name;\n\t\tif (metadata.avatar) payload.avatar = metadata.avatar;\n\t\tif (metadata.attributes) payload.attributes = metadata.attributes;\n\t\tif (metadata.company) payload.company = metadata.company;\n\n\t\tconst response = await this._makeRequest('/widget/identify', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\n\t\tif (response?.status && response?.data) {\n\t\t\tthis._storeContactIdentity(response.data, metadata);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t_storeContactIdentity(data, metadata = {}) {\n\t\tthis.contactId = data.contact_id || null;\n\t\tthis.contactEmail = data.email || metadata.email || null;\n\t\tthis.contactName = data.name || metadata.name || null;\n\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\t'product7_contact',\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tcontactId: this.contactId,\n\t\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\t\tcontactName: this.contactName,\n\t\t\t\t})\n\t\t\t);\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\t}\n\n\tgetContactIdentity() {\n\t\tif (this.contactId) {\n\t\t\treturn {\n\t\t\t\tcontactId: this.contactId,\n\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\tcontactName: this.contactName,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('product7_contact');\n\t\t\tif (stored) {\n\t\t\t\tconst parsed = JSON.parse(stored);\n\t\t\t\tthis.contactId = parsed.contactId;\n\t\t\t\tthis.contactEmail = parsed.contactEmail;\n\t\t\t\tthis.contactName = parsed.contactName;\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.identify(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\tasync getChangelogs(options) {\n\t\treturn this.changelog.getChangelogs(options);\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[Product7] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30;\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardName: this.sdk.config.boardName,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true,\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\ttrigger: true,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\tif (this.options.enabled === false) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\ttype: this.type,\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.options.suppressAfterSubmission && this._hasRecentlySubmitted()) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\treason: 'recently_submitted',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof container === 'string') {\n\t\t\tcontainer = document.querySelector(container);\n\t\t}\n\n\t\tif (!container) {\n\t\t\tcontainer = document.body;\n\t\t}\n\n\t\tthis.container = container;\n\t\tthis.element = this._render();\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis.mounted = true;\n\t\tthis._attachEvents();\n\n\t\t// Bind to a custom trigger element if a selector or element was provided\n\t\tif (this.options.trigger && this.options.trigger !== true) {\n\t\t\tconst triggerEl =\n\t\t\t\ttypeof this.options.trigger === 'string'\n\t\t\t\t\t? document.querySelector(this.options.trigger)\n\t\t\t\t\t: this.options.trigger instanceof Element\n\t\t\t\t\t\t? this.options.trigger\n\t\t\t\t\t\t: null;\n\t\t\tif (triggerEl) {\n\t\t\t\ttriggerEl.addEventListener('click', () => this.open());\n\t\t\t}\n\t\t}\n\n\t\tthis.onMount();\n\n\t\tif (this.options.autoShow) {\n\t\t\tthis.show();\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('widget:mounted', { widget: this });\n\t\treturn this;\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t\treturn this;\n\t}\n\n\topenPanel() {\n\t\tthis.state.isOpen = true;\n\n\t\tthis._renderPanel();\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.panelElement) {\n\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t}\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\t_showLoadingModal() {\n\t\tthis.state.isLoading = true;\n\n\t\tif (this.options.showBackdrop) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t}\n\n\t\tthis.loadingElement = document.createElement('div');\n\t\tthis.loadingElement.className = 'feedback-loading-modal';\n\t\tthis.loadingElement.innerHTML = `\n\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t`;\n\t\tdocument.body.appendChild(this.loadingElement);\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t\tthis.loadingElement.classList.add('show');\n\t\t});\n\t}\n\n\t_hideLoadingModal() {\n\t\tthis.state.isLoading = false;\n\t\tif (this.loadingElement) {\n\t\t\tthis.loadingElement.remove();\n\t\t\tthis.loadingElement = null;\n\t\t}\n\t}\n\n\tclosePanel() {\n\t\tif (this.panelElement) {\n\t\t\tthis.panelElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tthis.state.isOpen = false;\n\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\tthis.panelElement = null;\n\t\t}\n\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\t\tthis._resetForm();\n\t}\n\n\tasync submitFeedback() {\n\t\tif (this.state.isSubmitting) return;\n\n\t\tthis._hideError();\n\n\t\ttry {\n\t\t\tthis.state.isSubmitting = true;\n\t\t\tthis._updateSubmitButton();\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: this.state.title || 'Feedback',\n\t\t\t\tcontent: this.state.content,\n\t\t\t\temail: this.state.email,\n\t\t\t\tboard_id: this.options.boardName,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.title.trim()) {\n\t\t\t\tthis._showError('Please enter a title.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.state.content.trim()) {\n\t\t\t\tthis._showError('Please enter your feedback message.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst response = await this.apiService.submitFeedback(payload);\n\n\t\t\tthis._trackSubmission();\n\n\t\t\tthis._showSuccessInPanel();\n\n\t\t\tthis.sdk.eventBus.emit('feedback:submitted', {\n\t\t\t\twidget: this,\n\t\t\t\tfeedback: response,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._showError('Failed to submit feedback. Please try again.');\n\t\t\tthis.sdk.eventBus.emit('feedback:error', { widget: this, error });\n\t\t} finally {\n\t\t\tthis.state.isSubmitting = false;\n\t\t\tthis._updateSubmitButton();\n\t\t}\n\t}\n\n\thandleConfigUpdate(newConfig) {\n\t\tthis.options.theme = newConfig.theme;\n\t\tif (this.element) {\n\t\t\tthis._updateTheme();\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.destroyed) return;\n\n\t\tthis.onDestroy();\n\t\tthis.closePanel();\n\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\n\t\tthis.destroyed = true;\n\t\tthis.mounted = false;\n\t\tthis.sdk.eventBus.emit('widget:destroyed', { widget: this });\n\t}\n\n\tonMount() {}\n\tonDestroy() {}\n\n\t_trackSubmission() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst data = {\n\t\t\t\tsubmittedAt: Date.now(),\n\t\t\t\tboardName: this.options.boardName,\n\t\t\t};\n\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(data));\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to track feedback submission:', e);\n\t\t}\n\t}\n\n\t_hasRecentlySubmitted() {\n\t\tconst cooldownMs = this.options.suppressionDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.sdk.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.sdk.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\tconst submittedAt = data.submittedAt;\n\n\t\t\treturn now - submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearSubmissionTracking() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear submission tracking:', e);\n\t\t}\n\t}\n\n\tshouldShow() {\n\t\tif (!this.options.suppressAfterSubmission) return true;\n\t\treturn !this._hasRecentlySubmitted();\n\t}\n\n\t_render() {\n\t\tthrow new Error('_render() must be implemented by concrete widget');\n\t}\n\n\t_attachEvents() {\n\t\t// Override in concrete widgets\n\t}\n\n\t_bindMethods() {\n\t\tthis.openPanel = this.openPanel.bind(this);\n\t\tthis.closePanel = this.closePanel.bind(this);\n\t\tthis.submitFeedback = this.submitFeedback.bind(this);\n\t}\n\n\t_renderPanel() {\n\t\tif (this.panelElement) return;\n\n\t\tif (this.options.showBackdrop && !this.backdropElement) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\t\tthis.backdropElement.addEventListener('click', this.closePanel);\n\t\t}\n\n\t\tconst modeClass =\n\t\t\tthis.options.displayMode === 'modal'\n\t\t\t\t? 'feedback-modal'\n\t\t\t\t: 'feedback-panel';\n\t\tconst sizeClass = `size-${this.options.size}`;\n\t\tthis.panelElement = document.createElement('div');\n\t\tconst themeClass = `theme-${this.options.theme || 'light'}`;\n\t\tconst isLeftPosition =\n\t\t\tmodeClass === 'feedback-panel' &&\n\t\t\tString(this.options.position).includes('left');\n\t\tconst directionClass = isLeftPosition ? 'panel-from-left' : '';\n\t\tthis.panelElement.className =\n\t\t\t`${modeClass} ${sizeClass} ${themeClass} ${directionClass}`.trim();\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--color-primary',\n\t\t\tthis.options.primaryColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-bg',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-text',\n\t\t\tthis.options.textColor\n\t\t);\n\t\tthis.panelElement.innerHTML = this._getPanelHTML();\n\n\t\tdocument.body.appendChild(this.panelElement);\n\t\tthis._attachPanelEvents();\n\n\t\tconst firstInput = this.panelElement.querySelector('input, textarea');\n\t\tif (firstInput) {\n\t\t\tsetTimeout(() => firstInput.focus(), 350);\n\t\t}\n\t}\n\n\t_getPanelHTML() {\n\t\treturn `\n <div class=\"feedback-panel-content\">\n<div class=\"feedback-panel-header\">\n <h3>Send Feedback</h3>\n <button class=\"sdk-close-btn\" type=\"button\" aria-label=\"Close\">\n <iconify-icon icon=\"ph:x\" 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\" 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\" 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 web chat 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\t// Reconnect indefinitely with capped exponential backoff. The\n\t\t// previous 5-attempt hard cap meant ~31s of churn on a flaky network\n\t\t// permanently killed the live-chat connection until page refresh —\n\t\t// the dominant \"messages don't arrive\" symptom in production.\n\t\tthis.reconnectBaseDelay = 1000;\n\t\tthis.reconnectMaxDelay = 30_000;\n\t\tthis.pingInterval = null;\n\t\tthis.isConnected = false;\n\n\t\t// Heartbeat watchdog. The browser's onclose/onerror only fires when\n\t\t// it notices the TCP socket is dead — on stalled-but-not-closed\n\t\t// connections (NAT timeouts, sleeping mobile, some intermediaries)\n\t\t// that can take many minutes. We track the wall-clock time of the\n\t\t// last received frame and force a reconnect if nothing arrives\n\t\t// within the timeout. Server's protocol-level pings come every 54s\n\t\t// (pkg/websocket/client.go pingPeriod) and our app-level pings/pongs\n\t\t// every 30s, so 90s catches a dead pipe with one cycle of headroom.\n\t\tthis.lastFrameAt = 0;\n\t\tthis.heartbeatTimeoutMs = 90_000;\n\t\tthis.heartbeatCheckIntervalMs = 15_000;\n\t\tthis.heartbeatInterval = null;\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\tthis._intentionallyClosed = false;\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/livechat/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._intentionallyClosed = true; // 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\tthis._stopHeartbeat();\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_startHeartbeat() {\n\t\tthis._stopHeartbeat();\n\t\tthis.lastFrameAt = Date.now();\n\t\tthis.heartbeatInterval = setInterval(() => {\n\t\t\tif (Date.now() - this.lastFrameAt > this.heartbeatTimeoutMs) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[WebSocket] No frames in ${this.heartbeatTimeoutMs}ms, forcing reconnect`\n\t\t\t\t);\n\t\t\t\t// Closing the socket fires onclose, which schedules a\n\t\t\t\t// reconnect through the normal path.\n\t\t\t\tthis._stopHeartbeat();\n\t\t\t\tif (this.ws) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.ws.close();\n\t\t\t\t\t} catch (_) {\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, this.heartbeatCheckIntervalMs);\n\t}\n\n\t_stopHeartbeat() {\n\t\tif (this.heartbeatInterval) {\n\t\t\tclearInterval(this.heartbeatInterval);\n\t\t\tthis.heartbeatInterval = 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._intentionallyClosed = false;\n\t\tthis._startHeartbeat();\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\t// Any inbound frame counts as a sign of life for the watchdog —\n\t\t// including pongs, message:new, typing, etc.\n\t\tthis.lastFrameAt = Date.now();\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._stopHeartbeat();\n\n\t\tthis._emit('disconnected', { code: event.code, reason: event.reason });\n\t\t// Skip reconnect if disconnect() was called intentionally.\n\t\tif (!this._intentionallyClosed) {\n\t\t\tthis._scheduleReconnect();\n\t\t}\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._intentionallyClosed) return;\n\n\t\tthis.reconnectAttempts++;\n\t\tconst delay = Math.min(\n\t\t\tthis.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts - 1),\n\t\t\tthis.reconnectMaxDelay\n\t\t);\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 function applyliveChatCustomStyles(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('product7-liveChat-custom-styles');\n\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.id = 'product7-liveChat-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-liveChat-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.liveChat-launcher-btn {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t}\n\n\t\t.liveChat-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.liveChat-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.liveChat-nav-tab.active .liveChat-nav-icon,\n\t\t.liveChat-nav-tab.active .liveChat-nav-label {\n\t\t\tcolor: ${primaryColor} !important;\n\t\t}\n\n\t\t.liveChat-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.liveChat-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.liveChat-panel-content,\n\t\t.liveChat-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 liveChat-core.js */\n\t`;\n\n\tconsole.log('✅ Custom web chat styles applied:', { primaryColor, theme });\n}\n\nexport function removeliveChatCustomStyles() {\n\tconst styleElement = document.getElementById(\n\t\t'product7-liveChat-custom-styles'\n\t);\n\tif (styleElement && styleElement.parentNode) {\n\t\tstyleElement.parentNode.removeChild(styleElement);\n\t}\n}\n","/**\n * NotificationSound — plays a soft ping when a new agent message arrives.\n *\n * Default: the bundled notification-sound.mp3 (inlined as base64 at build time).\n * Falls back to a Web Audio API synthetic chime if the file was not bundled.\n * Override: pass `soundUrl` (MP3/OGG/WAV URL or base64 data URI) to use a different file.\n */\nimport BUNDLED_SOUND from './notificationSoundData.js';\n\nexport class NotificationSound {\n\tconstructor({ soundUrl = BUNDLED_SOUND, volume = 0.4 } = {}) {\n\t\tthis._soundUrl = soundUrl;\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t\tthis._enabled = true;\n\t\tthis._audioCtx = null;\n\t\tthis._audioBuffer = null;\n\t\tthis._loadPromise = null;\n\n\t\tif (soundUrl) {\n\t\t\tthis._loadPromise = this._loadAudioFile(soundUrl);\n\t\t}\n\t}\n\n\tsetEnabled(enabled) {\n\t\tthis._enabled = Boolean(enabled);\n\t}\n\n\tsetVolume(volume) {\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t}\n\n\tasync play() {\n\t\tif (!this._enabled) return;\n\t\tif (typeof window === 'undefined') return;\n\n\t\ttry {\n\t\t\tif (this._soundUrl) {\n\t\t\t\tawait this._playFile();\n\t\t\t} else {\n\t\t\t\tawait this._playSynthetic();\n\t\t\t}\n\t\t} catch {\n\t\t\t/* autoplay policy or context suspended — silent fail */\n\t\t}\n\t}\n\n\t// ── Private ────────────────────────────────────────────────────────────────\n\n\t_getAudioContext() {\n\t\tif (!this._audioCtx || this._audioCtx.state === 'closed') {\n\t\t\tconst AudioContext = window.AudioContext || window.webkitAudioContext;\n\t\t\tif (!AudioContext) return null;\n\t\t\tthis._audioCtx = new AudioContext();\n\t\t}\n\t\treturn this._audioCtx;\n\t}\n\n\t/**\n\t * Synthetic two-tone chime via Web Audio API — no file required.\n\t * • First tone: 880 Hz, 0–80 ms\n\t * • Second tone: 1100 Hz, 60–160 ms\n\t * Sounds like a gentle message ping.\n\t */\n\tasync _playSynthetic() {\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tawait ctx.resume();\n\t\t}\n\n\t\tconst now = ctx.currentTime;\n\t\tconst vol = this._volume;\n\n\t\tconst tones = [\n\t\t\t{ freq: 880, start: 0, end: 0.08 },\n\t\t\t{ freq: 1100, start: 0.06, end: 0.16 },\n\t\t];\n\n\t\ttones.forEach(({ freq, start, end }) => {\n\t\t\tconst osc = ctx.createOscillator();\n\t\t\tconst gain = ctx.createGain();\n\n\t\t\tosc.type = 'sine';\n\t\t\tosc.frequency.value = freq;\n\n\t\t\tgain.gain.setValueAtTime(0, now + start);\n\t\t\tgain.gain.linearRampToValueAtTime(vol, now + start + 0.01);\n\t\t\tgain.gain.linearRampToValueAtTime(0, now + end);\n\n\t\t\tosc.connect(gain);\n\t\t\tgain.connect(ctx.destination);\n\n\t\t\tosc.start(now + start);\n\t\t\tosc.stop(now + end + 0.01);\n\t\t});\n\t}\n\n\tasync _loadAudioFile(url) {\n\t\ttry {\n\t\t\tconst ctx = this._getAudioContext();\n\t\t\tif (!ctx) return;\n\n\t\t\tconst response = await fetch(url);\n\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\tthis._audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\t\t} catch {\n\t\t\t/* failed to load — fall back to synthetic */\n\t\t\tthis._soundUrl = null;\n\t\t}\n\t}\n\n\tasync _playFile() {\n\t\tif (this._loadPromise) {\n\t\t\tawait this._loadPromise;\n\t\t\tthis._loadPromise = null;\n\t\t}\n\n\t\tif (!this._audioBuffer) {\n\t\t\tthis._playSynthetic();\n\t\t\treturn;\n\t\t}\n\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tawait ctx.resume();\n\t\t}\n\n\t\tconst source = ctx.createBufferSource();\n\t\tconst gain = ctx.createGain();\n\n\t\tsource.buffer = this._audioBuffer;\n\t\tgain.gain.value = this._volume;\n\n\t\tsource.connect(gain);\n\t\tgain.connect(ctx.destination);\n\t\tsource.start();\n\t}\n}\n","export default \"data:audio/mpeg;base64,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BeaJKOtqtegdfu08KKta9TmppaKVKbNRgAAdr/tXGB6CSCPl1Lelt7XW7T01ifVk2zjE1bLW839346gs//uAZPGAAtMh2Hn4GlhT52rfPeJdDAirVe28aaE2Dmr9tY0siLho4mUCDpWMFgQGgu42pLnLawWb/bpWNprQxluj9TNaXJSgOIMS1KzM0TRIAAAABFakEh3cgBQEGVwwSAstoCBiYpGhkVAplAwJmPAkYLCBkEDgYHpEhgdJRk+AeYkqaA6eReiyrxNIvmnxxStER14EjE2/9hljaO2siCoAhzKnpuRt269O0veD7Pq/uNbdzt6jfydzch/Kkpf1/dcqV6ta/y3Y1MWIft8iMqtZzUahrWPO71nqvG43fsROXu5Y3KZJGnRZbEH1clnOWX//OZ/+2WTnxeAH4ZfTSxQdl7ovLbXkoM0tW5UzXqqe3b9bPWP/+H7q59vrHa/P1WVuvIHDdeijc/LKqG114l3Joq5VSQSsRUcUBhEnmWs49v5f///////////////y/mff///////////////3Ad21LEZyZxNSU0SUaZb/+8Bk6AADBiBVfWGgCEbieq+nmAEjzhFJ+cyQBEdCKT85gkCgwCAAAAA6AP0AywXlGoy0hpYVBKCMGkNVAtKWyXWFQkQg10C3jJ4dCWsMS6ezji0j3yF6W6MVa5lLJbaXvIFSNMi8Vdp4aejr0kYgJ/IpLXJpq0lmN4S38scPty+3K4brc1En1pL+vzx/k/bwt3IYllNldscl0R/HlzH9/zJ2IEd+3kzt34vWlVWVWqbn5Z/njz8O/+aXAXCHDZovNNc0AZypebBMlXypavJwV2u4yFL1vG4qA//93+9d/ff/Fg5dCKWEFHZcd41TwOim499QNk7qNZnHhm2uvA4NA5XIelTssq//5////////////////KFL24Op////////////////I3ifN9VM55RBBXv+tQAA8aAYzpLaSOxTi1EgJ6SJFPyUphVqcwGS1LvW/Hx+27zX1/f7Y2w5rdPTwuJkLERYGnMZHg0LksCgqGoKvEWkqYTKtOnRLvoGgFPadXgqdiKxbu2ws92sNCIOHN0xkAtG+saAAuK4rNZxyl0v8x2rfuXaCm7ruwZLSEFAQkKru7B2WMZy0qeUZjNZr5eXDP+8VVSOR/5cly6S3120bi5SXY5P/1/U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\";\n","export class LiveChatState {\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\t\tthis.startButtonText = options.startButtonText || 'Send us a message';\n\t\tthis.showAvatars = options.showAvatars !== false;\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\t\tthis.homeModuleEnabled = options.homeModuleEnabled !== false;\n\t\tthis.messagesModuleEnabled = options.messagesModuleEnabled !== false;\n\n\t\tthis.requireEmailBeforeChat = options.requireEmailBeforeChat || false;\n\t\tthis.allowAttachments = options.allowAttachments !== false;\n\t\tthis.allowEmoji = options.allowEmoji !== false;\n\t\tthis.showReplyTime = options.showReplyTime !== 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.businessHoursState = options.businessHoursState || null;\n\t\tthis.nextOpenAt = options.nextOpenAt || null;\n\t\tthis.holidayName = options.holidayName || null;\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 LiveChatLauncher {\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 = `liveChat-launcher liveChat-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=\"liveChat-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=\"liveChat-launcher-btn\" aria-label=\"Open live chat\">\n <span class=\"liveChat-launcher-icon liveChat-launcher-icon-chat\">\n <iconify-icon icon=\"ph:chats-circle\" width=\"24\" height=\"24\"></iconify-icon>\n </span>\n <span class=\"liveChat-launcher-icon liveChat-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('.liveChat-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('.liveChat-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('.liveChat-launcher-icon-chat');\n\t\tconst closeIcon = this.element.querySelector(\n\t\t\t'.liveChat-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('liveChat-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('liveChat-launcher-open');\n\t\t}\n\t}\n\n\t_updateBadge() {\n\t\tconst existingBadge = this.element.querySelector(\n\t\t\t'.liveChat-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 = 'liveChat-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('.liveChat-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 = 'liveChat-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} else if (type === 'settingsUpdate') {\n\t\t\t\tthis._updateContent();\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\n\t\tif (this.state.homeModuleEnabled !== false) {\n\t\t\ttabs.push({ id: 'home', label: 'Home', icon: 'ph:house-simple' });\n\t\t}\n\n\t\tif (this.state.messagesModuleEnabled !== false) {\n\t\t\ttabs.push({\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: 'ph:chats',\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' });\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',\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=\"liveChat-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=\"liveChat-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-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=\"liveChat-nav-tabs\">\n\t\t\t\t${tabsHtml}\n\t\t\t</div>\n\t\t\t<div class=\"liveChat-nav-footer\">\n\t\t\t\t<a href=\"https://product7.io\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"liveChat-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('.liveChat-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('.liveChat-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('.liveChat-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 = 'liveChat-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 LiveChatPanel {\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\tthis._expanded = false;\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 = `liveChat-panel liveChat-panel-${this.options.position}`;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-panel-content\">\n\t\t\t\t<div class=\"liveChat-panel-views\"></div>\n\t\t\t\t<div class=\"liveChat-panel-nav\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.options.onToggleExpand = () => this._toggleExpand();\n\t\tthis.options.isExpanded = () => this._expanded;\n\n\t\tthis.navigationTabs = new NavigationTabs(this.state, this.options);\n\t\tconst navContainer = this.element.querySelector('.liveChat-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_toggleExpand() {\n\t\tthis._expanded = !this._expanded;\n\t\tthis.element.classList.toggle('liveChat-panel-expanded', this._expanded);\n\n\t\tconst menuIcon = this.element.querySelector(\n\t\t\t'.liveChat-expand-window-btn iconify-icon'\n\t\t);\n\t\tconst menuLabel = this.element.querySelector(\n\t\t\t'.liveChat-expand-window-btn span'\n\t\t);\n\t\tif (menuIcon)\n\t\t\tmenuIcon.setAttribute(\n\t\t\t\t'icon',\n\t\t\t\tthis._expanded ? 'ph:arrows-in' : 'ph:arrows-out'\n\t\t\t);\n\t\tif (menuLabel)\n\t\t\tmenuLabel.textContent = this._expanded\n\t\t\t\t? 'Collapse window'\n\t\t\t\t: 'Expand window';\n\t}\n\n\t_renderCurrentView() {\n\t\tconst viewsContainer = this.element.querySelector('.liveChat-panel-views');\n\t\tconst navContainer = this.element.querySelector('.liveChat-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\t// Collapse expanded state when leaving chat view\n\t\tif (this.state.currentView !== 'chat' && this._expanded) {\n\t\t\tthis._expanded = false;\n\t\t\tthis.element.classList.remove('liveChat-panel-expanded');\n\t\t}\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=\"liveChat-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, prechat and feedback 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\t\tthis.state.currentView === 'feedback';\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('.liveChat-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 = 'liveChat-view liveChat-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=\"liveChat-changelog-header\">\n\t\t\t\t<div class=\"liveChat-changelog-header-top\">\n\t\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn liveChat-changelog-close-btn liveChat-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=\"liveChat-changelog-body\">\n\t\t\t\t<div class=\"liveChat-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'.liveChat-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=\"liveChat-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${item.coverImage ? `<div class=\"liveChat-changelog-thumb\"><img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.parentElement.style.display='none';\" /></div>` : ''}\n\t\t\t\t<div class=\"liveChat-changelog-content\">\n\t\t\t\t\t<h3 class=\"liveChat-changelog-title\">${item.title}</h3>\n\t\t\t\t\t${item.description ? `<p class=\"liveChat-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=\"liveChat-empty-state\">\n\t\t\t\t<div class=\"liveChat-empty-state-icon\">\n\t\t\t\t\t<iconify-icon icon=\"ph:megaphone\" 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'.liveChat-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('.liveChat-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\tthis._menuOutsideHandler = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'liveChat-view liveChat-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'.liveChat-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} else if (type === 'settingsUpdate') {\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\" width=\"20\" height=\"20\"></iconify-icon>`;\n\n\t\tconst isExpanded = this.options.isExpanded?.() ?? false;\n\t\tconst expandIcon = isExpanded ? 'ph:arrows-in' : 'ph:arrows-out';\n\t\tconst expandLabel = isExpanded ? 'Collapse window' : 'Expand window';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-chat-header\">\n\t\t\t\t<button class=\"sdk-btn-icon liveChat-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=\"liveChat-chat-header-avatar\">\n\t\t\t\t\t${headerAvatarHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"liveChat-chat-header-info\">\n\t\t\t\t\t<span class=\"liveChat-chat-title\">${this._escapeHtml(teamName)}</span>\n\t\t\t\t\t${isClosed || this.state.showReplyTime !== false ? `<span class=\"liveChat-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=\"liveChat-chat-header-actions\">\n\t\t\t\t\t<div class=\"liveChat-chat-menu-wrapper\">\n\t\t\t\t\t\t<button class=\"sdk-btn-icon liveChat-chat-menu-btn\" aria-label=\"Options\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:dots-three\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class=\"liveChat-chat-menu-dropdown\">\n\t\t\t\t\t\t\t<button class=\"liveChat-chat-menu-item liveChat-expand-window-btn\">\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"${expandIcon}\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t\t\t\t<span>${expandLabel}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"sdk-btn-icon sdk-close-btn liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-closed-banner\">\n\t\t\t\t\t<iconify-icon icon=\"ph:check-circle\" 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=\"liveChat-typing-indicator\">\n\t\t\t\t\t<div class=\"liveChat-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=\"liveChat-typing-text\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"liveChat-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=\"liveChat-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"liveChat-chat-compose\">\n\t\t\t\t<div class=\"liveChat-compose-input-wrapper\">\n\t\t\t\t\t<textarea class=\"liveChat-compose-input\" placeholder=\"${placeholder}\" rows=\"1\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"liveChat-compose-bottom\">\n\t\t\t\t\t<div class=\"liveChat-compose-actions\">\n\t\t\t\t\t\t${this.state.allowAttachments !== false ? `<button class=\"sdk-btn-icon liveChat-compose-attach\" aria-label=\"Attach file\"><iconify-icon icon=\"ph:paperclip\" width=\"20\" height=\"20\"></iconify-icon></button>` : ''}\n\t\t\t\t\t\t${this.state.allowEmoji !== false ? `<button class=\"sdk-btn-icon liveChat-emoji-btn\" aria-label=\"Emoji\"><iconify-icon icon=\"ph:smiley\" width=\"20\" height=\"20\"></iconify-icon></button>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"liveChat-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${this.state.allowAttachments !== false ? `<input type=\"file\" class=\"liveChat-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'.liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-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\" 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=\"liveChat-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? 'liveChat-message-own'\n\t\t\t: 'liveChat-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=\"liveChat-message-content\">${this._formatMessageContent(message.content)}</div>`\n\t\t\t: '';\n\t\tconst bubbleHtml = contentHtml\n\t\t\t? `<div class=\"liveChat-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=\"liveChat-message-meta liveChat-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=\"liveChat-message-sent-status\">Sending…</span>`\n\t\t\t\t\t\t\t\t: `<span class=\"liveChat-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=\"liveChat-message ${messageClass}${isOptimistic ? ' liveChat-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=\"liveChat-message ${messageClass}\">\n\t\t\t\t<div class=\"liveChat-message-row\">\n\t\t\t\t\t<div class=\"liveChat-message-avatar\">${avatarHtml}</div>\n\t\t\t\t\t<div class=\"liveChat-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=\"liveChat-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=\"liveChat-message-system-event\">\n\t\t\t\t\t<div class=\"liveChat-message-system-event-avatar\">${logoHtml}</div>\n\t\t\t\t\t<span class=\"liveChat-message-system-event-name\">${this._escapeHtml(name)}</span>\n\t\t\t\t\t<span class=\"liveChat-message-system-event-action\">${this._escapeHtml(action)}</span>\n\t\t\t\t\t${timeStr ? `<span class=\"liveChat-message-system-event-time\">${timeStr}</span>` : ''}\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\t// Render automated/bot messages as a proper received chat bubble\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst avatarHtml = logoUrl\n\t\t\t? `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(teamName)}\" /></div>`\n\t\t\t: `<div class=\"sdk-avatar sdk-avatar-sm\">${teamName.charAt(0).toUpperCase()}</div>`;\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\n\t\treturn `\n\t\t\t<div class=\"liveChat-message liveChat-message-received\">\n\t\t\t\t<div class=\"liveChat-message-row\">\n\t\t\t\t\t<div class=\"liveChat-message-avatar\">${avatarHtml}</div>\n\t\t\t\t\t<div class=\"liveChat-message-wrapper\">\n\t\t\t\t\t\t<div class=\"liveChat-message-bubble\">\n\t\t\t\t\t\t\t<div class=\"liveChat-message-content\">${this._formatMessageContent(content)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${timeStr ? `<div class=\"liveChat-message-meta\"><span>${timeStr}</span></div>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSenderAvatar(sender) {\n\t\tif (sender?.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${sender.avatarUrl}\" alt=\"${sender.name}\" /></div>`;\n\t\t}\n\t\tconst initial = (sender?.name || 'S').charAt(0).toUpperCase();\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${initial}</div>`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"liveChat-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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.liveChat-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.liveChat-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('.liveChat-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'.liveChat-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'.liveChat-chat-messages'\n\t\t);\n\t\tconst pill = this.element.querySelector('.liveChat-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('.liveChat-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.liveChat-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'.liveChat-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=\"liveChat-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t\t: `<div class=\"liveChat-attachment-thumb liveChat-attachment-file-icon\"><iconify-icon icon=\"ph:file\" width=\"24\" height=\"24\"></iconify-icon></div>`;\n\t\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"liveChat-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">&times;</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tcontainer.querySelectorAll('.liveChat-attachment-remove').forEach((btn) => {\n\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\tthis._updateSendButtonState();\n\t\t\t});\n\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.liveChat-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'.liveChat-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 menuBtn = this.element.querySelector('.liveChat-chat-menu-btn');\n\t\tconst dropdown = this.element.querySelector('.liveChat-chat-menu-dropdown');\n\t\tif (menuBtn && dropdown) {\n\t\t\tmenuBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tdropdown.classList.toggle('open');\n\t\t\t\tif (\n\t\t\t\t\tdropdown.classList.contains('open') &&\n\t\t\t\t\tthis._menuOutsideHandler === null\n\t\t\t\t) {\n\t\t\t\t\tthis._menuOutsideHandler = (ev) => {\n\t\t\t\t\t\tif (!dropdown.contains(ev.target) && !menuBtn.contains(ev.target)) {\n\t\t\t\t\t\t\tdropdown.classList.remove('open');\n\t\t\t\t\t\t\tdocument.removeEventListener('click', this._menuOutsideHandler);\n\t\t\t\t\t\t\tthis._menuOutsideHandler = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tsetTimeout(\n\t\t\t\t\t\t() => document.addEventListener('click', this._menuOutsideHandler),\n\t\t\t\t\t\t0\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst expandWindowBtn = this.element.querySelector(\n\t\t\t'.liveChat-expand-window-btn'\n\t\t);\n\t\tif (expandWindowBtn && dropdown) {\n\t\t\texpandWindowBtn.addEventListener('click', () => {\n\t\t\t\tdropdown.classList.remove('open');\n\t\t\t\tif (this._menuOutsideHandler) {\n\t\t\t\t\tdocument.removeEventListener('click', this._menuOutsideHandler);\n\t\t\t\t\tthis._menuOutsideHandler = null;\n\t\t\t\t}\n\t\t\t\tthis.options.onToggleExpand?.();\n\t\t\t});\n\t\t}\n\n\t\tconst input = this.element.querySelector('.liveChat-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.liveChat-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('.liveChat-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('.liveChat-compose-attach');\n\t\tconst fileInput = this.element.querySelector(\n\t\t\t'.liveChat-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'.liveChat-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('.liveChat-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('.liveChat-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\n\t\tconst input = this.element.querySelector('.liveChat-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'.liveChat-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 = 'liveChat-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('.liveChat-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('.liveChat-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('.liveChat-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'.liveChat-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._menuOutsideHandler) {\n\t\t\tdocument.removeEventListener('click', this._menuOutsideHandler);\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 = 'liveChat-view liveChat-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=\"liveChat-empty-state\">\n <div class=\"liveChat-empty-state-icon\">\n <iconify-icon icon=\"ph:chat-circle\" 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=\"liveChat-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=\"liveChat-conversations-header\">\n <h2>Messages</h2>\n <button class=\"sdk-close-btn liveChat-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=\"liveChat-conversations-body\">\n ${conversationsHtml}\n </div>\n\n <div class=\"liveChat-conversations-footer\">\n <button class=\"liveChat-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=\"liveChat-conversation-item ${unreadClass} ${closedClass}\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"liveChat-conversation-avatars\">\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"liveChat-conversation-content\">\n\t\t\t\t\t<div class=\"liveChat-conversation-header\">\n\t\t\t\t\t\t<span class=\"liveChat-conversation-title\">${conversation.title || 'Chat with team'}</span>\n\t\t\t\t\t\t<span class=\"liveChat-conversation-time\">${timeAgo}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"liveChat-conversation-preview\">\n\t\t\t\t\t\t${conversation.unread > 0 ? '<span class=\"liveChat-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t${isClosed ? '<span class=\"liveChat-conversation-resolved-badge\">Resolved</span>' : ''}\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-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=\"liveChat-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('.liveChat-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('.liveChat-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 = 'liveChat-view liveChat-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=\"liveChat-help-header\">\n\t\t\t\t<div class=\"liveChat-help-header-top\">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn liveChat-help-close-btn liveChat-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=\"liveChat-help-search-wrap\">\n\t\t\t\t\t<span class=\"liveChat-help-search-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:magnifying-glass\" 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=\"liveChat-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=\"liveChat-help-body\">\n\t\t\t\t<div class=\"liveChat-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('.liveChat-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=\"liveChat-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=\"liveChat-help-collection-avatar liveChat-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=\"liveChat-help-collection-icon\">${icon}</span>`;\n\t\t}\n\n\t\tif (icon.startsWith('ph:')) {\n\t\t\treturn `<span class=\"liveChat-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=\"liveChat-help-collection-icon\">\n\t\t\t<iconify-icon icon=\"ph:book-open\"></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=\"liveChat-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t${this._resolveCollectionIcon(collection.icon)}\n\t\t\t\t<div class=\"liveChat-help-collection-content\">\n\t\t\t\t\t<div class=\"liveChat-help-collection-title\">${collection.title}</div>\n\t\t\t\t\t${collection.description ? `<p class=\"liveChat-help-collection-desc\">${collection.description}</p>` : ''}\n\t\t\t\t\t<div class=\"liveChat-help-collection-meta\">\n\t\t\t\t\t\t${this._renderAuthorAvatar(collection)}\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-empty-state\">\n\t\t\t\t\t<div class=\"liveChat-empty-state-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:magnifying-glass\" 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=\"liveChat-empty-state\">\n\t\t\t\t<div class=\"liveChat-empty-state-icon\">\n\t\t\t\t\t<iconify-icon icon=\"ph:books\" 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'.liveChat-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'.liveChat-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('.liveChat-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 = 'liveChat-view liveChat-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\ttype === 'settingsUpdate'\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 isUnavailable = this.state.businessHoursState === 'offline' || this.state.businessHoursState === 'away';\n\t\tconst avatarsHtml = (this.state.showAvatars && !isUnavailable) ? this._renderAvatarStack() : '';\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\t\tconst availabilityHtml = this._renderAvailabilityStatus();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-home-scroll\">\n\t\t\t\t<div class=\"liveChat-home-header\">\n\t\t\t\t\t<div class=\"liveChat-home-header-top\">\n\t\t\t\t\t\t<div class=\"liveChat-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=\"liveChat-home-avatars\">${avatarsHtml || availabilityHtml}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"liveChat-home-welcome\">\n\t\t\t\t\t\t<span class=\"liveChat-home-greeting\">${this.state.greetingMessage}</span>\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-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=\"liveChat-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_renderAvailabilityStatus() {\n\t\tconst businessState = this.state.businessHoursState;\n\n\t\tif (businessState === 'offline') {\n\t\t\tlet offlineText = \"We're currently closed\";\n\t\t\tif (this.state.holidayName) {\n\t\t\t\tofflineText = `Closed for ${this.state.holidayName}`;\n\t\t\t} else if (this.state.nextOpenAt) {\n\t\t\t\tconst opens = new Date(this.state.nextOpenAt);\n\t\t\t\tconst now = new Date();\n\t\t\t\tconst diffHours = Math.round((opens - now) / 3600000);\n\t\t\t\tofflineText = diffHours < 24\n\t\t\t\t\t? `Opens in ${diffHours}h`\n\t\t\t\t\t: `Opens ${opens.toLocaleDateString('en-US', { weekday: 'short', hour: 'numeric', hour12: true })}`;\n\t\t\t}\n\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-home-availability\">\n\t\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-away\"></span>\n\t\t\t\t\t<span class=\"liveChat-availability-text\">${offlineText}</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (businessState === 'away') {\n\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-home-availability\">\n\t\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-away\"></span>\n\t\t\t\t\t<span class=\"liveChat-availability-text\">We're currently away</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (this.state.agentsOnline) {\n\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-home-availability\">\n\t\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-online\"></span>\n\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-home-availability\">\n\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-away\"></span>\n\t\t\t\t<span class=\"liveChat-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 isUnavailable = this.state.businessHoursState === 'offline' || this.state.businessHoursState === 'away';\n\t\tconst buttonLabel = isUnavailable ? 'Leave us a message' : this.state.startButtonText;\n\t\tconst buttonSubtext = isUnavailable\n\t\t\t? \"We'll get back to you when we're back\"\n\t\t\t: (this.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=\"liveChat-home-message-btn\">\n\t\t\t\t<div class=\"liveChat-home-continue-info\">\n\t\t\t\t\t<span class=\"liveChat-home-continue-label\">${buttonLabel}</span>\n\t\t\t\t\t<span class=\"liveChat-home-message-subtext\">${buttonSubtext}</span>\n\t\t\t\t</div>\n\t\t\t\t${sendIcon}\n\t\t\t</button>\n\t\t\t<button class=\"liveChat-home-message-btn liveChat-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=\"liveChat-home-recent-avatar liveChat-home-recent-avatar-logo\"><img src=\"${logoUrl}\" alt=\"${teamName}\" /></div>`\n\t\t\t: `<div class=\"liveChat-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=\"liveChat-home-recent-card\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"liveChat-home-recent-card-label\">Recent message</div>\n\t\t\t\t<div class=\"liveChat-home-recent-card-row\">\n\t\t\t\t\t${logoHtml}\n\t\t\t\t\t<div class=\"liveChat-home-recent-card-content\">\n\t\t\t\t\t\t<div class=\"liveChat-home-recent-card-header\">\n\t\t\t\t\t\t\t<span class=\"liveChat-home-recent-card-name\">${title}</span>\n\t\t\t\t\t\t\t<span class=\"liveChat-home-recent-card-time\">${timeAgo}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"liveChat-home-recent-card-preview\">\n\t\t\t\t\t\t\t<span class=\"liveChat-home-recent-card-message\">${preview}</span>\n\t\t\t\t\t\t\t${hasUnread ? '<span class=\"liveChat-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=\"liveChat-home-featured\">\n\t\t\t\t${imageUrl ? `<img src=\"${imageUrl}\" alt=\"${title}\" class=\"liveChat-home-featured-image\" onerror=\"this.style.display='none';\" />` : ''}\n\t\t\t\t<div class=\"liveChat-home-featured-divider\"></div>\n\t\t\t\t<div class=\"liveChat-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 liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-home-changelog-card-content\">\n\t\t\t\t\t<h4 class=\"liveChat-home-changelog-card-title\">${item.title}</h4>\n\t\t\t\t\t<p class=\"liveChat-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=\"liveChat-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('.liveChat-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'.liveChat-home-message-btn:not(.liveChat-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('.liveChat-feedback-btn');\n\t\tif (feedbackBtn) {\n\t\t\tfeedbackBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('feedback');\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.liveChat-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'.liveChat-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'.liveChat-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 FeedbackFormView {\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\tthis._selectedRating = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'liveChat-view liveChat-feedback-view';\n\t\tthis._renderForm();\n\t\treturn this.element;\n\t}\n\n\t_renderForm() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-feedback-header\">\n\t\t\t\t<button class=\"sdk-btn-icon liveChat-feedback-back-btn\">\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<span class=\"liveChat-feedback-title\">Leave us feedback</span>\n\t\t\t</div>\n\t\t\t<div class=\"liveChat-feedback-body\">\n\t\t\t\t<p class=\"liveChat-feedback-prompt\">Share your thoughts with us. We read every message.</p>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclass=\"liveChat-feedback-input\"\n\t\t\t\t\tplaceholder=\"Title\"\n\t\t\t\t/>\n\t\t\t\t<textarea\n\t\t\t\t\tclass=\"liveChat-feedback-textarea\"\n\t\t\t\t\tplaceholder=\"Your feedback...\"\n\t\t\t\t\trows=\"5\"\n\t\t\t\t></textarea>\n\t\t\t\t<button class=\"liveChat-feedback-submit\">Send feedback</button>\n\t\t\t</div>\n\t\t`;\n\t\tthis._attachEvents();\n\t}\n\n\t_renderThankYou() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-feedback-header\">\n\t\t\t\t<button class=\"sdk-btn-icon liveChat-feedback-back-btn\">\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<span class=\"liveChat-feedback-title\">Leave us feedback</span>\n\t\t\t</div>\n\t\t\t<div class=\"liveChat-feedback-thankyou\">\n\t\t\t\t<span class=\"liveChat-feedback-thankyou-emoji\">🙏</span>\n\t\t\t\t<h3>Thanks for your feedback!</h3>\n\t\t\t\t<p>We appreciate you taking the time to share your thoughts.</p>\n\t\t\t\t<button class=\"liveChat-feedback-done-btn\">Done</button>\n\t\t\t</div>\n\t\t`;\n\t\tthis.element.querySelector('.liveChat-feedback-back-btn').addEventListener('click', () => {\n\t\t\tthis.state.setView('home');\n\t\t});\n\t\tthis.element.querySelector('.liveChat-feedback-done-btn').addEventListener('click', () => {\n\t\t\tthis.state.setView('home');\n\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element.querySelector('.liveChat-feedback-back-btn').addEventListener('click', () => {\n\t\t\tthis.state.setView('home');\n\t\t});\n\n\t\tconst submitBtn = this.element.querySelector('.liveChat-feedback-submit');\n\t\tsubmitBtn.addEventListener('click', async () => {\n\t\t\tif (this._isSubmitting) return;\n\t\t\tconst title = this.element.querySelector('.liveChat-feedback-input').value.trim();\n\t\t\tconst message = this.element.querySelector('.liveChat-feedback-textarea').value.trim();\n\t\t\tawait this._submit(title, message);\n\t\t});\n\t}\n\n\tasync _submit(title, message) {\n\t\tthis._isSubmitting = true;\n\t\tconst submitBtn = this.element.querySelector('.liveChat-feedback-submit');\n\t\tif (submitBtn) {\n\t\t\tsubmitBtn.disabled = true;\n\t\t\tsubmitBtn.textContent = 'Sending...';\n\t\t}\n\n\t\ttry {\n\t\t\tif (this.options.onSubmitFeedback) {\n\t\t\t\tawait this.options.onSubmitFeedback({ title, message });\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.warn('[FeedbackFormView] Submit error:', e);\n\t\t}\n\n\t\tthis._renderThankYou();\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","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 = 'liveChat-view liveChat-prechat-view';\n\t\tthis._updateContent();\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-prechat-overlay\">\n\t\t\t\t<div class=\"liveChat-prechat-card\">\n\t\t\t\t\t<h4 class=\"liveChat-prechat-title\">Before we continue</h4>\n\t\t\t\t\t<p class=\"liveChat-prechat-subtitle\">Enter your details so we can get back to you.</p>\n\t\t\t\t\t<form class=\"liveChat-prechat-form\" novalidate>\n\t\t\t\t\t\t<div class=\"liveChat-prechat-field\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\t\tclass=\"liveChat-prechat-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"Your name\"\n\t\t\t\t\t\t\t\tautocomplete=\"name\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"liveChat-prechat-field\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t\tclass=\"liveChat-prechat-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"Your email address\"\n\t\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class=\"liveChat-prechat-error\" style=\"display:none;\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button type=\"submit\" class=\"liveChat-prechat-submit\">\n\t\t\t\t\t\t\tStart chat\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('.liveChat-prechat-form');\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tawait this._handleSubmit();\n\t\t});\n\t}\n\n\tasync _handleSubmit() {\n\t\tif (this._isSubmitting) return;\n\n\t\tconst emailInput = this.element.querySelector('input[name=\"email\"]');\n\t\tconst nameInput = this.element.querySelector('input[name=\"name\"]');\n\t\tconst errorEl = this.element.querySelector('.liveChat-prechat-error');\n\t\tconst submitBtn = this.element.querySelector('.liveChat-prechat-submit');\n\n\t\tconst email = emailInput.value.trim();\n\t\tconst name = nameInput.value.trim();\n\n\t\tif (!email || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n\t\t\terrorEl.textContent = 'Please enter a valid email address.';\n\t\t\terrorEl.style.display = 'block';\n\t\t\temailInput.focus();\n\t\t\treturn;\n\t\t}\n\n\t\terrorEl.style.display = 'none';\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitBtn.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\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({\n\t\t\t\t\tname: name || undefined,\n\t\t\t\t\temail,\n\t\t\t\t});\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\terrorEl.textContent = 'Something went wrong. Please try again.';\n\t\t\terrorEl.style.display = 'block';\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitBtn.textContent = 'Start chat';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { WebSocketService } from '../core/WebSocketService.js';\nimport {\n\tapplyliveChatCustomStyles,\n\tremoveliveChatCustomStyles,\n} from '../styles/liveChatCustomStyles.js';\nimport { NotificationSound } from '../utils/NotificationSound.js';\nimport { BaseWidget } from './BaseWidget.js';\nimport { LiveChatState } from './liveChat/LiveChatState.js';\nimport { LiveChatLauncher } from './liveChat/components/LiveChatLauncher.js';\nimport { LiveChatPanel } from './liveChat/components/LiveChatPanel.js';\nimport { ChangelogView } from './liveChat/views/ChangelogView.js';\nimport { ChatView } from './liveChat/views/ChatView.js';\nimport { ConversationsView } from './liveChat/views/ConversationsView.js';\nimport { HelpView } from './liveChat/views/HelpView.js';\nimport { HomeView } from './liveChat/views/HomeView.js';\nimport { FeedbackFormView } from './liveChat/views/FeedbackFormView.js';\nimport { PreChatFormView } from './liveChat/views/PreChatFormView.js';\n\nexport class LiveChatWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'liveChat' });\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.liveChatOptions = {\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\tconst sdkMetadata = this.sdk?.apiService?.getMetadata() || null;\n\n\t\tthis.LiveChatState = new LiveChatState({\n\t\t\tteamName: this.liveChatOptions.teamName,\n\t\t\tteamAvatars: this.liveChatOptions.teamAvatars,\n\t\t\tgreetingMessage: this.liveChatOptions.greetingMessage,\n\t\t\twelcomeMessage: this.liveChatOptions.welcomeMessage,\n\t\t\tonlineMessage: this.liveChatOptions.onlineMessage,\n\t\t\tresponseTime: this.liveChatOptions.responseTime,\n\t\t\tenableHelp: this.liveChatOptions.enableHelp,\n\t\t\tenableChangelog: this.liveChatOptions.enableChangelog,\n\t\t\tmetadata: sdkMetadata,\n\t\t\turls: {\n\t\t\t\tfeedback: this.liveChatOptions.feedbackUrl,\n\t\t\t\tchangelog: this.liveChatOptions.changelogUrl,\n\t\t\t\thelp: this.liveChatOptions.helpUrl,\n\t\t\t\troadmap: this.liveChatOptions.roadmapUrl,\n\t\t\t},\n\t\t});\n\n\t\t// If identify() was called before this widget was created, pre-seed identity\n\t\tif (this.sdk?.identified && sdkMetadata) {\n\t\t\tthis.LiveChatState.isIdentified = true;\n\t\t}\n\n\t\tthis.launcher = null;\n\t\tthis.panel = null;\n\t\tthis.wsService = null;\n\t\tthis._wsUnsubscribers = [];\n\t\tthis._feedbackWidget = null;\n\n\t\tconst notificationSoundOption =\n\t\t\toptions.notificationSound !== undefined\n\t\t\t\t? options.notificationSound\n\t\t\t\t: true;\n\n\t\tthis._notificationSound = new NotificationSound({\n\t\t\tsoundUrl:\n\t\t\t\ttypeof notificationSoundOption === 'string'\n\t\t\t\t\t? notificationSoundOption\n\t\t\t\t\t: undefined,\n\t\t\tvolume: options.notificationVolume ?? 0.4,\n\t\t});\n\n\t\tif (notificationSoundOption === false) {\n\t\t\tthis._notificationSound.setEnabled(false);\n\t\t}\n\n\t\tthis._handleOpenChange = this._handleOpenChange.bind(this);\n\t\tthis._handleWebSocketMessage = this._handleWebSocketMessage.bind(this);\n\t\tthis._handleTypingStarted = this._handleTypingStarted.bind(this);\n\t\tthis._handleTypingStopped = this._handleTypingStopped.bind(this);\n\t\tthis._handleConversationClosed = this._handleConversationClosed.bind(this);\n\t}\n\n\t_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_createInternalFeedbackWidget() {\n\t\ttry {\n\t\t\tconst widget = this.sdk.createWidget('button', {\n\t\t\t\ttrigger: false,\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t\tboardName:\n\t\t\t\t\tthis.liveChatOptions.feedbackBoardName || this.sdk.config.boardName,\n\t\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\t\ttheme: this.liveChatOptions.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('[LiveChat] 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 = `liveChat-widget theme-${this.liveChatOptions.theme}`;\n\t\tcontainer.style.zIndex = '999999';\n\t\tcontainer.style.setProperty(\n\t\t\t'--liveChat-h-padding',\n\t\t\t`${this.liveChatOptions.horizontalPadding ?? 20}px`\n\t\t);\n\t\tcontainer.style.setProperty(\n\t\t\t'--liveChat-v-padding',\n\t\t\t`${this.liveChatOptions.verticalPadding ?? 20}px`\n\t\t);\n\t\tthis._widgetContainer = container;\n\n\t\tapplyliveChatCustomStyles({\n\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\ttextColor: this.liveChatOptions.textColor,\n\t\t\tbackgroundColor: this.liveChatOptions.backgroundColor,\n\t\t\ttheme: this.liveChatOptions.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.liveChatOptions.onFeedbackClick) {\n\t\t\tthis._feedbackWidget = this._createInternalFeedbackWidget();\n\t\t}\n\n\t\tif (this._hasTrigger()) {\n\t\t\tthis.launcher = new LiveChatLauncher(this.LiveChatState, {\n\t\t\t\tposition: this.liveChatOptions.position,\n\t\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\t});\n\t\t\tcontainer.appendChild(this.launcher.render());\n\t\t}\n\n\t\tthis.panel = new LiveChatPanel(this.LiveChatState, {\n\t\t\tposition: this.liveChatOptions.position,\n\t\t\ttheme: this.liveChatOptions.theme,\n\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\tlogoUrl: this.liveChatOptions.logoUrl,\n\t\t\tfeaturedContent: this.liveChatOptions.featuredContent,\n\t\t\tonSendMessage:\n\t\t\t\tthis.liveChatOptions.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.liveChatOptions.onFeedbackClick ||\n\t\t\t\t(this._feedbackWidget ? () => this._feedbackWidget.open() : null),\n\t\t\tonArticleClick: this.liveChatOptions.onArticleClick,\n\t\t\tonChangelogClick: this.liveChatOptions.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('feedback', FeedbackFormView);\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.LiveChatState.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('liveChat:opened', { widget: this });\n\t\t} else {\n\t\t\tthis.panel.hide();\n\t\t\tthis.LiveChatState.reset();\n\t\t\tthis.sdk.eventBus.emit('liveChat: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 (\n\t\t\t\tthis.LiveChatState.requireEmailBeforeChat &&\n\t\t\t\t!this.LiveChatState.isIdentified\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.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.LiveChatState.setView('prechat');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst openConversation = this.LiveChatState.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.LiveChatState.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('[LiveChatWidget] 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('[LiveChatWidget] Failed to fetch messages:', error);\n\t\t}\n\t}\n\n\t_handleNewConversationClick() {\n\t\tconst openConversation = this.LiveChatState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.LiveChatState.setActiveConversation(openConversation.id);\n\t\t\tthis.LiveChatState.setView('chat');\n\t\t\tthis._handleSelectConversation(openConversation.id);\n\t\t} else {\n\t\t\tthis.LiveChatState.setActiveConversation(null);\n\t\t\tthis.LiveChatState.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 live chat 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('[LiveChatWidget] 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.LiveChatState.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('[LiveChatWidget] 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'[LiveChatWidget] 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('liveChat: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\t// Reconcile the optimistic 'Sending…' message with the server's\n\t\t\t\t// confirmation as soon as the POST returns. Don't depend on the WS\n\t\t\t\t// echo alone — when the WebSocket frame is dropped (brief\n\t\t\t\t// disconnect, slow network, server send-buffer full), the\n\t\t\t\t// optimistic message stays stuck on 'Sending…' forever because\n\t\t\t\t// upsertMessage's match window is finite.\n\t\t\t\tconst serverData = response.data;\n\t\t\t\tlet attachments = [];\n\t\t\t\tif (serverData.attachments) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tattachments =\n\t\t\t\t\t\t\ttypeof serverData.attachments === 'string'\n\t\t\t\t\t\t\t\t? JSON.parse(serverData.attachments)\n\t\t\t\t\t\t\t\t: serverData.attachments;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tattachments = [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.LiveChatState.upsertMessage(\n\t\t\t\t\tconversationId,\n\t\t\t\t\t{\n\t\t\t\t\t\tid: serverData.id,\n\t\t\t\t\t\tcontent: serverData.content,\n\t\t\t\t\t\tisOwn: true,\n\t\t\t\t\t\ttimestamp: serverData.created_at,\n\t\t\t\t\t\tattachments:\n\t\t\t\t\t\t\tArray.isArray(attachments) && attachments.length > 0\n\t\t\t\t\t\t\t\t? attachments\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t\t{ reconcileOwnOptimistic: true, optimisticMatchWindowMs: 60000 }\n\t\t\t\t);\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.LiveChatState.addMessage(conversationId, mockResponse);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[LiveChatWidget] 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.LiveChatState.upsertMessage(conversation_id, localMessage, {\n\t\t\treconcileOwnOptimistic: true,\n\t\t\toptimisticMatchWindowMs: 30000,\n\t\t});\n\n\t\tconst isOwnMessage = message.sender_type === 'customer';\n\n\t\tif (!isOwnMessage && this.LiveChatState.isIdentified) {\n\t\t\tthis._notificationSound.play();\n\t\t}\n\n\t\tif (\n\t\t\t!this.LiveChatState.isOpen ||\n\t\t\tthis.LiveChatState.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.LiveChatState._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.LiveChatState._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.LiveChatState.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.LiveChatState.unreadCount = response.data.unread_count || 0;\n\t\t\t\tthis.LiveChatState._notify('unreadCountChange', {\n\t\t\t\t\tcount: this.LiveChatState.unreadCount,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[LiveChatWidget] 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\t// Track first vs reconnect locally so we only backfill on reconnects.\n\t\t// First connect is right after _initWebSocket() and the surrounding\n\t\t// flow has already loaded fresh data — re-fetching would be wasted.\n\t\tlet wsHasConnectedBefore = false;\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tconsole.log('[LiveChatWidget] WebSocket connected');\n\t\t\t\tconst isReconnect = wsHasConnectedBefore;\n\t\t\t\twsHasConnectedBefore = true;\n\t\t\t\tif (this.LiveChatState.activeConversationId) {\n\t\t\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\t\t\tconversation_id: this.LiveChatState.activeConversationId,\n\t\t\t\t\t});\n\t\t\t\t\t// On reconnect, refetch the active conversation's messages.\n\t\t\t\t\t// The server doesn't replay events that fired during the WS\n\t\t\t\t\t// disconnect, so anything broadcast in the gap is otherwise\n\t\t\t\t\t// permanently lost from the customer's view until they\n\t\t\t\t\t// refresh the page.\n\t\t\t\t\tif (isReconnect) {\n\t\t\t\t\t\tthis.fetchMessages(this.LiveChatState.activeConversationId).catch(\n\t\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t'[LiveChatWidget] Failed to backfill messages on reconnect:',\n\t\t\t\t\t\t\t\t\terr\n\t\t\t\t\t\t\t\t);\n\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\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('disconnected', () => {\n\t\t\t\tconsole.log('[LiveChatWidget] WebSocket disconnected');\n\t\t\t\tthis.LiveChatState._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.LiveChatState._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.LiveChatState.setOpen(true);\n\t}\n\n\tclose() {\n\t\tthis.LiveChatState.setOpen(false);\n\t}\n\n\ttoggle() {\n\t\tthis.LiveChatState.setOpen(!this.LiveChatState.isOpen);\n\t}\n\n\tnavigateTo(view) {\n\t\tthis.LiveChatState.setView(view);\n\t\tif (!this.LiveChatState.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.LiveChatState.setConversations(conversations);\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tthis.LiveChatState.addMessage(conversationId, message);\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.LiveChatState.setHelpArticles(articles);\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.LiveChatState.setHomeChangelogItems(items);\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.LiveChatState.setChangelogItems(items);\n\t}\n\n\tsetUnreadCount(count) {\n\t\tthis.LiveChatState.unreadCount = count;\n\t\tthis.LiveChatState._notify('unreadCountChange', { count });\n\t}\n\n\tgetState() {\n\t\treturn {\n\t\t\tisOpen: this.LiveChatState.isOpen,\n\t\t\tcurrentView: this.LiveChatState.currentView,\n\t\t\tunreadCount: this.LiveChatState.unreadCount,\n\t\t\tconversations: this.LiveChatState.conversations,\n\t\t};\n\t}\n\n\t_applyPreviewData() {\n\t\tconst data = this.liveChatOptions.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.LiveChatState.setConversations(data.conversations);\n\t\t}\n\n\t\tif (Array.isArray(data.helpArticles)) {\n\t\t\tthis.LiveChatState.setHelpArticles(data.helpArticles);\n\t\t}\n\n\t\tif (Array.isArray(data.homeChangelogItems)) {\n\t\t\tthis.LiveChatState.setHomeChangelogItems(data.homeChangelogItems);\n\t\t}\n\n\t\tif (Array.isArray(data.changelogItems)) {\n\t\t\tthis.LiveChatState.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.LiveChatState.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.LiveChatState.onlineCount =\n\t\t\t\tavailability.onlineCount ?? availability.online_count ?? 0;\n\t\t\tthis.LiveChatState.responseTime =\n\t\t\t\tavailability.responseTime ??\n\t\t\t\tavailability.response_time ??\n\t\t\t\tthis.LiveChatState.responseTime;\n\t\t\tthis.LiveChatState._notify('availabilityUpdate', availability);\n\t\t}\n\n\t\tif (typeof data.currentView === 'string') {\n\t\t\tthis.LiveChatState.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.LiveChatState.setConversations(conversations);\n\t\t} catch (error) {\n\t\t\tconsole.error('[LiveChatWidget] Failed to load conversations:', error);\n\t\t}\n\n\t\tif (this.liveChatOptions.enableHelp) {\n\t\t\ttry {\n\t\t\t\tconst articles = await this._fetchHelpArticles();\n\t\t\t\tthis.LiveChatState.setHelpArticles(articles);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[LiveChatWidget] Failed to load help articles:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.liveChatOptions.enableChangelog) {\n\t\t\ttry {\n\t\t\t\tconst { homeItems, changelogItems } = await this._fetchChangelog();\n\t\t\t\tthis.LiveChatState.setHomeChangelogItems(homeItems);\n\t\t\t\tthis.LiveChatState.setChangelogItems(changelogItems);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[LiveChatWidget] 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('[LiveChatWidget] 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.liveChatOptions.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('[LiveChatWidget] 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.LiveChatState.setMessages(conversationId, messages);\n\n\t\t\t\tawait this.apiService.markConversationAsRead(conversationId);\n\t\t\t\tthis.LiveChatState.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('[LiveChatWidget] 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.LiveChatState.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.LiveChatState.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.LiveChatState.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.LiveChatState.setMessages(conv.id, initialMessages);\n\n\t\t\t\tthis.LiveChatState.setActiveConversation(conv.id);\n\t\t\t\tthis.LiveChatState.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('[LiveChatWidget] 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.getLiveChatSettings();\n\t\t\tif (!response?.status || !response?.data) return;\n\n\t\t\tconst s = response.data;\n\t\t\tlet stylesChanged = false;\n\n\t\t\t// Team info\n\t\t\tif (s.team_name && !this._hasExplicitOption('teamName')) {\n\t\t\t\tthis.liveChatOptions.teamName = s.team_name;\n\t\t\t\tthis.LiveChatState.teamName = s.team_name;\n\t\t\t}\n\t\t\tif (s.logo_url && !this._hasExplicitOption('logoUrl')) {\n\t\t\t\tthis.liveChatOptions.logoUrl = s.logo_url;\n\t\t\t}\n\t\t\tif (s.greeting_message && !this._hasExplicitOption('greetingMessage')) {\n\t\t\t\tthis.LiveChatState.greetingMessage = s.greeting_message;\n\t\t\t}\n\t\t\tif (s.welcome_message && !this._hasExplicitOption('welcomeMessage')) {\n\t\t\t\tthis.LiveChatState.welcomeMessage = s.welcome_message;\n\t\t\t}\n\t\t\tif (s.response_time && !this._hasExplicitOption('responseTime')) {\n\t\t\t\tthis.LiveChatState.responseTime = s.response_time;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tArray.isArray(s.team_avatars) &&\n\t\t\t\ts.team_avatars.length > 0 &&\n\t\t\t\t!this._hasExplicitOption('teamAvatars')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.teamAvatars = s.team_avatars;\n\t\t\t}\n\n\t\t\t// Colors / theme\n\t\t\tif (s.primary_color && !this._hasExplicitOption('primaryColor')) {\n\t\t\t\tthis.liveChatOptions.primaryColor = s.primary_color;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (s.background_color && !this._hasExplicitOption('backgroundColor')) {\n\t\t\t\tthis.liveChatOptions.backgroundColor = s.background_color;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (s.text_color && !this._hasExplicitOption('textColor')) {\n\t\t\t\tthis.liveChatOptions.textColor = s.text_color;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (s.theme && !this._hasExplicitOption('theme')) {\n\t\t\t\tthis.liveChatOptions.theme = s.theme;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (stylesChanged) {\n\t\t\t\tapplyliveChatCustomStyles({\n\t\t\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\t\t\ttextColor: this.liveChatOptions.textColor,\n\t\t\t\t\tbackgroundColor: this.liveChatOptions.backgroundColor,\n\t\t\t\t\ttheme: this.liveChatOptions.theme,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Launcher position & padding\n\t\t\tif (s.launcher_position && !this._hasExplicitOption('position')) {\n\t\t\t\tconst parts = s.launcher_position.split('-');\n\t\t\t\tthis.liveChatOptions.position = parts[parts.length - 1] || 'right';\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.horizontal_padding === 'number' &&\n\t\t\t\t!this._hasExplicitOption('horizontalPadding')\n\t\t\t) {\n\t\t\t\tthis.liveChatOptions.horizontalPadding = s.horizontal_padding;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.vertical_padding === 'number' &&\n\t\t\t\t!this._hasExplicitOption('verticalPadding')\n\t\t\t) {\n\t\t\t\tthis.liveChatOptions.verticalPadding = s.vertical_padding;\n\t\t\t}\n\t\t\tif (this._widgetContainer) {\n\t\t\t\tthis._widgetContainer.style.setProperty(\n\t\t\t\t\t'--liveChat-h-padding',\n\t\t\t\t\t`${this.liveChatOptions.horizontalPadding ?? 20}px`\n\t\t\t\t);\n\t\t\t\tthis._widgetContainer.style.setProperty(\n\t\t\t\t\t'--liveChat-v-padding',\n\t\t\t\t\t`${this.liveChatOptions.verticalPadding ?? 20}px`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Module visibility\n\t\t\tif (\n\t\t\t\ttypeof s.home_module_enabled === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('homeModuleEnabled')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.homeModuleEnabled = s.home_module_enabled;\n\t\t\t\tif (\n\t\t\t\t\t!s.home_module_enabled &&\n\t\t\t\t\tthis.LiveChatState.currentView === 'home'\n\t\t\t\t) {\n\t\t\t\t\tthis.LiveChatState.currentView =\n\t\t\t\t\t\tthis.LiveChatState.messagesModuleEnabled !== false\n\t\t\t\t\t\t\t? 'messages'\n\t\t\t\t\t\t\t: 'help';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.messages_module_enabled === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('messagesModuleEnabled')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.messagesModuleEnabled = s.messages_module_enabled;\n\t\t\t\tif (\n\t\t\t\t\t!s.messages_module_enabled &&\n\t\t\t\t\tthis.LiveChatState.currentView === 'messages'\n\t\t\t\t) {\n\t\t\t\t\tthis.LiveChatState.currentView =\n\t\t\t\t\t\tthis.LiveChatState.homeModuleEnabled !== false ? 'home' : 'help';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Feature flags\n\t\t\tif (\n\t\t\t\ttypeof s.show_avatars === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('showAvatars')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.showAvatars = s.show_avatars;\n\t\t\t}\n\t\t\tif (s.start_button_text && !this._hasExplicitOption('startButtonText')) {\n\t\t\t\tthis.LiveChatState.startButtonText = s.start_button_text;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.require_email_before_chat === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('requireEmailBeforeChat')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.requireEmailBeforeChat = s.require_email_before_chat;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.allow_attachments === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('allowAttachments')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.allowAttachments = s.allow_attachments;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.allow_emoji === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('allowEmoji')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.allowEmoji = s.allow_emoji;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.show_reply_time === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('showReplyTime')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.showReplyTime = s.show_reply_time;\n\t\t\t}\n\n\t\t\t// URLs\n\t\t\tif (s.feedback_url && !this._hasExplicitOption('feedbackUrl')) {\n\t\t\t\tthis.liveChatOptions.feedbackUrl = s.feedback_url;\n\t\t\t\tthis.LiveChatState.urls.feedback = s.feedback_url;\n\t\t\t}\n\t\t\tif (s.help_url && !this._hasExplicitOption('helpUrl')) {\n\t\t\t\tthis.liveChatOptions.helpUrl = s.help_url;\n\t\t\t\tthis.LiveChatState.urls.help = s.help_url;\n\t\t\t}\n\t\t\tif (s.changelog_url && !this._hasExplicitOption('changelogUrl')) {\n\t\t\t\tthis.liveChatOptions.changelogUrl = s.changelog_url;\n\t\t\t\tthis.LiveChatState.urls.changelog = s.changelog_url;\n\t\t\t}\n\t\t\tif (s.roadmap_url && !this._hasExplicitOption('roadmapUrl')) {\n\t\t\t\tthis.liveChatOptions.roadmapUrl = s.roadmap_url;\n\t\t\t\tthis.LiveChatState.urls.roadmap = s.roadmap_url;\n\t\t\t}\n\n\t\t\t// Business hours availability\n\t\t\tif (s.availability && typeof s.availability === 'object') {\n\t\t\t\tthis.LiveChatState.businessHoursState = s.availability.state || null;\n\t\t\t\tthis.LiveChatState.nextOpenAt = s.availability.next_open_at || null;\n\t\t\t\tthis.LiveChatState.holidayName = s.availability.holiday_name || null;\n\t\t\t}\n\n\t\t\tthis.LiveChatState._notify('settingsUpdate', {});\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.LiveChatState.agentsOnline =\n\t\t\t\t\tresponse.data.agents_online ?? response.data.is_online ?? false;\n\t\t\t\tthis.LiveChatState.onlineCount = response.data.online_count || 0;\n\t\t\t\tthis.LiveChatState.responseTime = response.data.response_time || '';\n\n\t\t\t\tif (response.data.available_agents && this.LiveChatState.showAvatars !== false) {\n\t\t\t\t\tthis.LiveChatState.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.LiveChatState._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('[LiveChatWidget] 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 = (this.liveChatOptions.changelogUrl || '').replace(\n\t\t\t\t\t/\\/$/,\n\t\t\t\t\t''\n\t\t\t\t);\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('[LiveChatWidget] 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.liveChatOptions.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.liveChatOptions.initialView &&\n\t\t\tthis.liveChatOptions.initialView !== this.LiveChatState.currentView\n\t\t) {\n\t\t\tthis.LiveChatState.setView(this.liveChatOptions.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\tremoveliveChatCustomStyles();\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","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\tthankYouConfig:\n\t\t\t\toptions.thankYouConfig || options.thank_you_config || null,\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\" 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\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\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.rating_config || page.ratingConfig || {};\n\t\tconst scale = Number(config.scale) || 5;\n\t\tconst ratingType = config.survey_type || 'number';\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst currentRating = pageAnswer.rating;\n\n\t\tconst labelDefaults = {\n\t\t\tnps:\n\t\t\t\tscale === 11\n\t\t\t\t\t? ['Not likely', 'Very likely']\n\t\t\t\t\t: ['Strongly Disagree', 'Strongly Agree'],\n\t\t\temoji: ['Very dissatisfied', 'Very satisfied'],\n\t\t\tnumber: ['Poor', 'Excellent'],\n\t\t\tstar: ['Poor', 'Excellent'],\n\t\t};\n\t\tconst [defaultLow, defaultHigh] = labelDefaults[ratingType] || ['', ''];\n\t\tconst lowLabel = config.low_label || defaultLow;\n\t\tconst highLabel = config.high_label || defaultHigh;\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 : 11;\n\t\t\tconst start = npsScale === 11 ? 0 : 1;\n\t\t\tconst values = Array.from({ length: npsScale }, (_, i) => start + i);\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-nps\" 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=\"feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-nps-score-${n}${selected}\" data-page-id=\"${pageId}\" data-score=\"${n}\">${n}</button>`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</div>\n\t\t\t\t${labels}\n\t\t\t`;\n\t\t}\n\n\t\tif (ratingType === 'emoji') {\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\tconst emojiScale =\n\t\t\t\tNumber.isFinite(scale) && scale >= 2 ? Math.min(scale, 5) : 5;\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.slice(0, emojiScale)\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.from({ length: starScale }, (_, i) => {\n\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\tconst filled =\n\t\t\t\t\t\t\ttypeof currentRating === 'number' && currentRating >= score\n\t\t\t\t\t\t\t\t? ' filled'\n\t\t\t\t\t\t\t\t: '';\n\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}\"><iconify-icon icon=\"ph:star\" width=\"32\" height=\"32\" style=\"pointer-events:none;\"></iconify-icon></button>`;\n\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\tconst numScale = Number.isFinite(scale) && scale >= 2 ? scale : 5;\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-rating-scale\" data-page-id=\"${pageId}\">\n\t\t\t\t${Array.from({ length: numScale }, (_, i) => {\n\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\tconst selected = currentRating === score ? ' selected' : '';\n\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}).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_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\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\tbtn.classList.toggle('selected', btnScore === score);\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\tbtn.classList.toggle('selected', btnScore === score);\n\t\t\t});\n\t\tthis._maybeAutoSubmit();\n\t}\n\n\t_maybeAutoSubmit() {\n\t\tif (!this._shouldAutoSubmitOnSelect()) return;\n\t\tthis._handleSubmit();\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\n\t\tconst responseData = {\n\t\t\tanswers: this._normalizePageAnswersForSubmit(),\n\t\t\t...(this.surveyState.feedback && { feedback: this.surveyState.feedback }),\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\tanswers: responseData.answers,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\ttry {\n\t\t\tconst surveyId =\n\t\t\t\tthis.surveyOptions.surveyId || `local_${type}_${Date.now()}`;\n\t\t\tawait this.apiService.submitSurveyResponse(surveyId, responseData);\n\n\t\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\t\t\tthis._showThankYouScreen(() => {\n\t\t\t\tif (this.surveyOptions.onSubmit) {\n\t\t\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t\t\t}\n\t\t\t});\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 !== true) return true;\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\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 hasAnswer =\n\t\t\t\tBoolean(answer.value) ||\n\t\t\t\t(Array.isArray(answer.values) && answer.values.length > 0);\n\t\t\tif (!hasAnswer) {\n\t\t\t\tthis._showError('Please select an option');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (page.type === 'text') {\n\t\t\tif (!answer.text || !String(answer.text).trim()) {\n\t\t\t\tthis._showError('Please enter an answer');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_getNextPageIndex() {\n\t\tif (!this._isMultiPageSurvey()) return -1;\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.after_this_page || page.afterThisPage : null;\n\t\tif (!navigation) return fallbackNext;\n\n\t\tconst conditions = Array.isArray(navigation.conditions)\n\t\t\t? navigation.conditions\n\t\t\t: [];\n\t\tconst pageId = page.id || `page_${currentIndex}`;\n\t\tconst answer = this.surveyState.pageAnswers[pageId] || {};\n\n\t\tfor (const condition of conditions) {\n\t\t\tif (this._evaluateCondition(condition, page, answer)) {\n\t\t\t\treturn this._resolvePageTarget(condition.go_to, total, fallbackNext);\n\t\t\t}\n\t\t}\n\n\t\treturn this._resolvePageTarget(navigation.default, total, fallbackNext);\n\t}\n\n\t_evaluateCondition(condition, page, answer) {\n\t\tconst { operator, values } = condition;\n\t\tif (!operator || !Array.isArray(values)) return false;\n\n\t\tlet answerValue = null;\n\t\tif (page.type === 'rating') {\n\t\t\tanswerValue = typeof answer.rating === 'number' ? answer.rating : null;\n\t\t} else if (page.type === 'multiple_choice') {\n\t\t\tanswerValue =\n\t\t\t\tanswer.value ||\n\t\t\t\t(Array.isArray(answer.values) ? answer.values[0] : null);\n\t\t} else if (page.type === 'text') {\n\t\t\tanswerValue = answer.text || null;\n\t\t}\n\n\t\tif (operator === 'is_empty')\n\t\t\treturn answerValue === null || answerValue === '';\n\t\tif (operator === 'not_empty')\n\t\t\treturn answerValue !== null && answerValue !== '';\n\t\tif (answerValue === null) return false;\n\n\t\tconst [v1, v2] = values;\n\t\tswitch (operator) {\n\t\t\tcase 'equals':\n\t\t\t\treturn String(answerValue) === String(v1);\n\t\t\tcase 'greater_than':\n\t\t\t\treturn Number(answerValue) > Number(v1);\n\t\t\tcase 'less_than':\n\t\t\t\treturn Number(answerValue) < Number(v1);\n\t\t\tcase 'between':\n\t\t\t\treturn (\n\t\t\t\t\tNumber(answerValue) >= Number(v1) && Number(answerValue) <= Number(v2)\n\t\t\t\t);\n\t\t\tcase 'contains':\n\t\t\t\treturn String(answerValue).includes(String(v1));\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\t_resolvePageTarget(target, total, fallback) {\n\t\tif (!target) return fallback;\n\t\tif (target === 'end_survey') return -1;\n\t\tif (target === 'next_page' || target === 'next') return fallback;\n\t\tif (typeof target === 'number')\n\t\t\treturn target >= 0 && target < total ? target : fallback;\n\t\tif (typeof target === 'string') {\n\t\t\tconst normalizedId = target.replace(/^page:/, '');\n\t\t\tconst idx = this.surveyOptions.pages.findIndex(\n\t\t\t\t(p) => p.id === normalizedId\n\t\t\t);\n\t\t\treturn idx >= 0 ? idx : fallback;\n\t\t}\n\t\treturn fallback;\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\t// Single-rating surveys (NPS / CSAT / CES / star / emoji) have no pages\n\t\tif (!this._isMultiPageSurvey()) {\n\t\t\tif (typeof this.surveyState.score === 'number') {\n\t\t\t\treturn [{ page_id: 'p1', value: this.surveyState.score }];\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tconst output = [];\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 == null) continue;\n\n\t\t\tlet value = null;\n\n\t\t\tif (page.type === 'rating' && typeof answer.rating === 'number') {\n\t\t\t\tvalue = answer.rating;\n\t\t\t} else if (page.type === 'multiple_choice') {\n\t\t\t\tconst config =\n\t\t\t\t\tpage.multipleChoiceConfig || page.multiple_choice_config || {};\n\t\t\t\tconst allowMultiple =\n\t\t\t\t\tconfig.allow_multiple === true ||\n\t\t\t\t\tconfig.multiple === true ||\n\t\t\t\t\tconfig.allow_multiple_selection === true;\n\n\t\t\t\tif (\n\t\t\t\t\tallowMultiple &&\n\t\t\t\t\tArray.isArray(answer.values) &&\n\t\t\t\t\tanswer.values.length > 0\n\t\t\t\t) {\n\t\t\t\t\tvalue = answer.values;\n\t\t\t\t} else if (answer.value != null && answer.value !== '') {\n\t\t\t\t\tvalue = answer.value;\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tpage.type === 'text' &&\n\t\t\t\ttypeof answer.text === 'string' &&\n\t\t\t\tanswer.text.trim()\n\t\t\t) {\n\t\t\t\tvalue = answer.text.trim();\n\t\t\t} else if (page.type === 'link' && typeof answer.clicked === 'boolean') {\n\t\t\t\tvalue = answer.clicked;\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\toutput.push({ page_id: pageId, value });\n\t\t\t}\n\t\t}\n\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\" 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_showThankYouScreen(onAfterClose) {\n\t\tif (!this.surveyElement) return;\n\n\t\tconst pages = this.surveyOptions.pages || [];\n\t\tconst currentPage =\n\t\t\tpages[this.surveyState.currentPageIndex] ||\n\t\t\tpages[pages.length - 1] ||\n\t\t\tnull;\n\t\tconst pageConfig = currentPage?.thankYouConfig || null;\n\t\tconst surveyConfig = this.surveyOptions.thankYouConfig || null;\n\t\tconst config =\n\t\t\t(pageConfig?.title ? pageConfig : null) ||\n\t\t\t(surveyConfig?.title ? surveyConfig : null) ||\n\t\t\t{};\n\t\tconst title = config.title || 'Thanks for your feedback!';\n\t\tconst buttonText = config.button_text || null;\n\t\tconst rawUrl = config.button_url || '';\n\t\tconst buttonUrl = rawUrl\n\t\t\t? /^https?:\\/\\//i.test(rawUrl)\n\t\t\t\t? rawUrl\n\t\t\t\t: `https://${rawUrl}`\n\t\t\t: '#';\n\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\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\"><iconify-icon icon=\"ph:x\" width=\"16\" height=\"16\"></iconify-icon></button>\n\t\t\t<div class=\"feedback-survey-thankyou\">\n\t\t\t\t<iconify-icon icon=\"ph:check-circle\" width=\"48\" height=\"48\" class=\"feedback-survey-thankyou-icon\"></iconify-icon>\n\t\t\t\t<h3 class=\"feedback-survey-thankyou-title\">${title}</h3>\n\t\t\t\t${\n\t\t\t\t\tbuttonText\n\t\t\t\t\t\t? `\n\t\t\t\t\t<a class=\"feedback-survey-thankyou-btn\" href=\"${buttonUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t\t\t${buttonText}\n\t\t\t\t\t\t<iconify-icon icon=\"ph:arrow-square-out\" width=\"15\" height=\"15\" style=\"pointer-events:none;\"></iconify-icon>\n\t\t\t\t\t</a>`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t</div>\n\t\t`;\n\n\t\tconst closeBtn = this.surveyElement.querySelector('.feedback-survey-close');\n\t\tif (closeBtn) closeBtn.addEventListener('click', () => this._closeSurvey());\n\n\t\tsetTimeout(\n\t\t\t() => {\n\t\t\t\tif (this.surveyElement) this._closeSurvey();\n\t\t\t\tif (onAfterClose) onAfterClose();\n\t\t\t},\n\t\t\tbuttonText ? 6000 : 3500\n\t\t);\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 { LiveChatWidget } from './LiveChatWidget.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['liveChat', LiveChatWidget],\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\tconst serverConfig = initData.config ? { ...initData.config } : {};\n\t\t\tif (initData.widgets) {\n\t\t\t\tconst widgets = { ...initData.widgets };\n\t\t\t\tif (widgets.web_chat && !widgets.liveChat) {\n\t\t\t\t\twidgets.liveChat = widgets.web_chat;\n\t\t\t\t\tdelete widgets.web_chat;\n\t\t\t\t}\n\t\t\t\tserverConfig.widgets = widgets;\n\t\t\t}\n\t\t\tif (Object.keys(serverConfig).length > 0) {\n\t\t\t\tthis.config = deepMerge(serverConfig, 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\tcreateLiveChatWidget(options = {}) {\n\t\treturn this.createWidget('liveChat', 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\tthankYouConfig:\n\t\t\t\tsurveyConfig.thankYouConfig || surveyConfig.thank_you_config || null,\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\tthankYouConfig: normalizedOptions.thankYouConfig,\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\tthankYouConfig: survey.thankYouConfig || survey.thank_you_config || null,\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 === true,\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\tthankYouConfig: page.thankYouConfig || page.thank_you_config || 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.createLiveChatWidget = this.createLiveChatWidget.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 { liveChatStyles } from './liveChat.js';\nimport { surveyStyles } from './survey.js';\n\nexport const CSS_STYLES =\n\tdesignTokens +\n\tbaseStyles +\n\tcomponentsStyles +\n\tfeedbackStyles +\n\tchangelogStyles +\n\tsurveyStyles +\n\tliveChatStyles;\n\nexport {\n\tbaseStyles,\n\tchangelogStyles,\n\tcomponentsStyles,\n\tdesignTokens,\n\tfeedbackStyles,\n\tliveChatStyles,\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 { LiveChatWidget } from './widgets/LiveChatWidget.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_LiveChatWidget: 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// Web Chat\n\t// ==================\n\n\tasync liveChat(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['liveChat', 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// Web Chat 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.createLiveChatWidget(widgetOptions);\n\t\t\twidget.mount();\n\t\t\twidget.show();\n\n\t\t\tProduct7._LiveChatWidget = widget;\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'widgetReady' });\n\n\t\t\t\tsdk.eventBus.on('liveChat: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('liveChat:opened', () => {\n\t\t\t\t\tcallback({ action: 'liveChatOpened' });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('liveChat:closed', () => {\n\t\t\t\t\tcallback({ action: 'liveChatClosed' });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Listen for data-product7-liveChat clicks\n\t\t\tProduct7._setupLiveChatAttributeTriggers();\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 web chat 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\topenLiveChat() {\n\t\tif (Product7._LiveChatWidget) {\n\t\t\tProduct7._LiveChatWidget.open?.() ||\n\t\t\t\tProduct7._LiveChatWidget.openPanel?.();\n\t\t}\n\t},\n\n\tcloseLiveChat() {\n\t\tif (Product7._LiveChatWidget) {\n\t\t\tProduct7._LiveChatWidget.close?.() ||\n\t\t\t\tProduct7._LiveChatWidget.closePanel?.();\n\t\t}\n\t},\n\n\tdestroyLiveChat() {\n\t\tif (Product7._LiveChatWidget) {\n\t\t\tProduct7._LiveChatWidget.destroy();\n\t\t\tProduct7._LiveChatWidget = 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.destroyLiveChat();\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._liveChatListenerAttached = 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_setupLiveChatAttributeTriggers() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (Product7._liveChatListenerAttached) return;\n\t\tProduct7._liveChatListenerAttached = true;\n\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest('[data-product7-liveChat]');\n\t\t\tif (trigger) {\n\t\t\t\te.preventDefault();\n\t\t\t\tProduct7.openLiveChat();\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 'openLiveChat':\n\t\t\t\t\tProduct7.openLiveChat();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeLiveChat':\n\t\t\t\t\tProduct7.closeLiveChat();\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\tLiveChatWidget,\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\tLiveChatWidget,\n\tProduct7SDK as Product7,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\n};\n"],"names":["MOCK_CHANGELOGS","id","title","excerpt","description","cover_image","slug","published_at","labels","name","color","status","MOCK_CONVERSATIONS","subject","last_message_at","Date","now","toISOString","created_at","unread","assigned_user","avatar","MOCK_MESSAGES","conv_1","content","sender_type","sender_name","sender_avatar","conv_2","MOCK_HELP_COLLECTIONS","articleCount","icon","url","MOCK_SURVEYS","trigger_type","pages","type","placeholder","rating_config","scale","low_label","high_label","survey_type","multiple_choice_config","link_config","after_this_page","default","conditions","required","allow_multiple_selection","options","label","button_text","link_text","redirect_url","open_in","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","_ensureSession","mock","success","data","_handleAuthRetry","async","endpoint","_getEndpointWithParams","_makeRequest","method","headers","Authorization","sessionToken","FeedbackService","submitFeedback","feedbackData","message","contact","getContactIdentity","payload","board","board_id","boardName","attachments","contactId","contact_id","contact_email","contactEmail","contact_name","contactName","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","LiveChatService","getLiveChatSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","available_agents","full_name","picture","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","getMessages","uploadFile","base64Data","filename","file","identifyContact","identify","submitRating","rated","sendTypingIndicator","isTyping","is_typing","SDKError","Error","cause","super","captureStackTrace","APIError","response","isNetworkError","isClientError","isServerError","WidgetError","widgetType","widgetId","ConfigError","configKey","ValidationError","field","value","SurveyService","getActiveSurveys","context","respondent","_getRespondentContext","window","location","href","respondent_id","email","undefined","includeEligibility","include_eligibility","userProperties","user_properties","metadata","getMetadata","respondentId","userId","user_id","submitSurveyResponse","surveyId","responseData","survey_id","answers","Array","isArray","feedback","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","widgets","configVersion","error","configData","session_token","Number","expires_in","isFinite","config_version","args","apply","_restoreIdentity","_buildIdentifyPayload","identified","_storeData","_removeData","clearSession","localStorage","sessionData","token","expiry","stored","getItem","parse","startsWith","removeItem","session","key","setItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","profile_picture","avatar_url","attributes","custom_fields","company","APIService","survey","liveChat","help","changelog","r","mockResponse","is_new","_storeContactIdentity","parsed","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","console","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","log","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","trigger","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","eventBus","widget","reason","_hasRecentlySubmitted","querySelector","_render","appendChild","_attachEvents","triggerEl","Element","addEventListener","open","onMount","show","style","display","hide","openPanel","_renderPanel","requestAnimationFrame","classList","add","_showLoadingModal","className","loadingElement","_hideLoadingModal","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessInPanel","handleConfigUpdate","newConfig","theme","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","modeClass","sizeClass","themeClass","directionClass","String","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","close","toggle","openModal","closeModal","ButtonWidget","isMinimized","_hiddenForOpenPanel","_hasTrigger","buttonText","triggerText","button","assign","pointerType","shouldRestoreButton","_noTriggerButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","listModalBackdropElement","currentIndex","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","stopPropagation","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","_stripHtml","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBase","changelogBaseUrl","openInNewTab","onViewUpdate","html","tmp","innerText","_truncateDescription","maxLength","plain","trimEnd","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","_showSuccessMessage","originalContent","updateTitle","titleElement","setPlaceholder","input","WebSocketService","reconnectAttempts","reconnectBaseDelay","reconnectMaxDelay","pingInterval","isConnected","lastFrameAt","heartbeatTimeoutMs","heartbeatCheckIntervalMs","heartbeatInterval","_listeners","_onOpen","_onMessage","_onClose","_onError","connect","_intentionallyClosed","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","_stopHeartbeat","_mockInterval","_startHeartbeat","setInterval","Set","delete","send","readyState","OPEN","code","min","conversation_id","user_name","is_agent","simulateMessage","applyliveChatCustomStyles","styleElement","getElementById","head","adjustColor","percent","alpha","normalized","num","max","g","b","padStart","NotificationSound","soundUrl","volume","_soundUrl","_volume","_enabled","_audioCtx","_audioBuffer","_loadPromise","_loadAudioFile","setEnabled","Boolean","setVolume","play","_playFile","_playSynthetic","_getAudioContext","AudioContext","webkitAudioContext","ctx","resume","currentTime","vol","freq","start","end","osc","createOscillator","gain","createGain","frequency","setValueAtTime","linearRampToValueAtTime","destination","stop","arrayBuffer","decodeAudioData","createBufferSource","buffer","LiveChatState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","greetingMessage","welcomeMessage","startButtonText","showAvatars","isIdentified","pendingMessage","enableHelp","enableChangelog","homeModuleEnabled","messagesModuleEnabled","requireEmailBeforeChat","allowAttachments","allowEmoji","showReplyTime","agentsOnline","onlineCount","onlineMessage","responseTime","businessHoursState","nextOpenAt","holidayName","typingUsers","isLoadingMessages","urls","roadmap","subscribe","_notify","changeType","cb","setView","view","previousView","setOpen","setActiveConversation","previousConversationId","setIdentified","setConversations","_updateUnreadCount","addConversation","conversation","setMessages","_getMessageAttachmentsSignature","att","_findOptimisticMatchIndex","incomingMessage","matchWindowMs","incomingTimestamp","timestamp","incomingSignature","candidate","isOptimistic","isOwn","candidateTimestamp","isNaN","abs","_updateConversationFromMessage","countUnread","conv","lastMessage","lastMessageTime","upsertMessage","reconcileOwnOptimistic","optimisticMatchWindowMs","existingIndex","findIndex","msg","optimisticIndex","storedMessage","addMessage","updateConversation","updates","markAsRead","setHelpArticles","articles","setHelpSearchQuery","setHomeChangelogItems","items","setChangelogItems","getActiveConversation","getActiveMessages","setTeamAvatarsFromAgents","agents","agent","getFilteredHelpArticles","article","reset","LiveChatLauncher","_unsubscribe","render","_updateContent","_updateIcon","_updateBadge","badgeHtml","btn","chatIcon","closeIcon","existingBadge","NavigationTabs","_updateActiveTab","_getTabs","tabs","tabsHtml","tab","isActive","closest","tabId","LiveChatPanel","navigationTabs","currentViewComponent","viewRegistry","_expanded","registerView","ViewClass","onToggleExpand","_toggleExpand","isExpanded","_renderCurrentView","menuIcon","menuLabel","setAttribute","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","_menuOutsideHandler","banner","connected","_hideTypingIndicator","_appendMessage","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","_renderGroupedMessages","defaultPlaceholder","composePlaceholder","logoUrl","headerAvatarHtml","_escapeHtml","expandIcon","expandLabel","_scrollToBottom","_renderAttachmentPreviews","_setupScrollPill","_renderMessageAttachments","_renderMessage","isLastInGroup","isSystem","_renderSystemMessage","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","rawName","w","charAt","toUpperCase","slice","logoHtml","rawAction","action","avatarHtml","avatarUrl","_renderTeamAvatars","avatars","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollHeight","scrollTop","pill","isLast","nextMsg","nextTime","senderKey","nextSenderKey","_updateSendButtonState","sendBtn","preview","idx","currentTarget","menuBtn","dropdown","contains","ev","expandWindowBtn","_startTyping","shiftKey","_sendMessage","emojiBtn","_toggleEmojiPicker","attachBtn","fileInput","click","files","from","reader","FileReader","onload","readAsDataURL","fileLink","_downloadFile","img","src","blob","blobUrl","URL","createObjectURL","a","download","revokeObjectURL","hasAttachments","_stopTyping","attachmentsToSend","onStartConversation","onSendMessage","_loadEmojiPicker","reject","script","existing","picker","compose","insertBefore","_insertEmoji","detail","unicode","emoji","selectionStart","selectionEnd","dispatchEvent","Event","onTyping","ConversationsView","avatarColors","_getAvatarColor","charCode","charCodeAt","conversationsHtml","_renderConversationItem","unreadClass","closedClass","timeAgo","_formatTimeAgo","avatarsHtml","_renderConversationAvatars","participants","_truncateMessage","p","initial","_renderAvatarStack","diffMs","diffMins","diffHours","diffDays","closeBtn","convId","onSelectConversation","newMsgBtn","_startNewConversation","openConversation","onStartNewConversation","HelpView","_updateCollectionsList","searchQuery","collections","filtered","_renderCollectionItem","_attachCollectionEvents","_avatarColors","bg","hash","acc","char","_getInitials","_renderAuthorAvatar","collection","author","initials","_resolveCollectionIcon","trimStart","_defaultCollectionIcon","searchTimeout","collectionId","onArticleClick","HomeView","isUnavailable","recentChangelogHtml","_renderRecentChangelog","availabilityHtml","_renderAvailabilityStatus","_renderMessageButton","_renderFeaturedCard","businessState","offlineText","opens","round","weekday","buttonLabel","buttonSubtext","_renderRecentMessageCard","hasUnread","featuredContent","coverText","recentCard","msgBtn","feedbackBtn","seeAllBtn","featuredBtn","FeedbackFormView","_isSubmitting","_selectedRating","_renderForm","_renderThankYou","_submit","onSubmitFeedback","PreChatFormView","_handleSubmit","emailInput","nameInput","errorEl","onIdentifyContact","LiveChatWidget","_explicitOptions","resolvedTheme","hasExplicitTextColor","prototype","call","hasExplicitBackgroundColor","defaultTextColor","defaultBackgroundColor","resolvedEnableChangelog","enableNews","liveChatOptions","autoLoadData","initialView","previewData","feedbackBoardName","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","onFeedbackClick","sdkMetadata","launcher","wsService","_wsUnsubscribers","_feedbackWidget","notificationSoundOption","notificationSound","_notificationSound","notificationVolume","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","_createInternalFeedbackWidget","createWidget","zIndex","horizontalPadding","verticalPadding","_widgetContainer","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","markAsIdentified","applyIdentity","_initWebSocket","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","serverData","localMessage","wsHasConnectedBefore","isReconnect","catch","navigateTo","setUnreadCount","getState","_applyPreviewData","availability","is_online","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","helpBase","sort","order","article_count","url_slug","newConversation","initialMessages","_fetchAndApplySettings","s","stylesChanged","_hasExplicitOption","logo_url","welcome_message","team_avatars","primary_color","background_color","text_color","launcher_position","parts","horizontal_padding","vertical_padding","home_module_enabled","messages_module_enabled","show_avatars","start_button_text","require_email_before_chat","allow_attachments","allow_emoji","show_reply_time","feedback_url","help_url","changelog_url","roadmap_url","next_open_at","holiday_name","checkAgentAvailability","publishedAt","mappedItems","_availabilityInterval","unsub","removeliveChatCustomStyles","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","ratingScale","showFeedbackInput","showSubmitButton","autoSubmitOnSelect","showTitle","showDescription","customQuestions","thankYouConfig","thank_you_config","onSubmit","onDismiss","surveyState","score","customAnswers","pageAnswers","currentPageIndex","isVisible","removeDanglingElements","el","_renderSurvey","_closeSurvey","_getSurveyConfig","isMultiPage","_isMultiPageSurvey","isLastPage","_isLastPage","_shouldShowFeedbackInput","showActions","_shouldShowActions","_shouldShowTitle","_shouldShowDescription","progressPercent","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","pageId","ratingConfig","ratingType","currentRating","rating","labelDefaults","number","star","defaultLow","defaultHigh","emojis","emojiScale","starScale","numScale","multipleChoiceConfig","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","_renderQuestionInput","question","opt","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","isStarRating","_setPageAnswer","starScore","hoverScore","existingValues","nextValues","v","btnScore","_maybeAutoSubmit","_setSubmitLoading","loading","_validateCurrentPage","nextPageIndex","_getNextPageIndex","_normalizePageAnswersForSubmit","_showThankYouScreen","pageType","answer","fallbackNext","navigation","afterThisPage","condition","_evaluateCondition","_resolvePageTarget","go_to","operator","answerValue","v1","v2","normalizedId","_getSubmissionRating","page_id","output","clicked","apiMetadata","localMetadata","prepend","onAfterClose","currentPage","pageConfig","surveyConfig","rawUrl","button_url","buttonUrl","resetState","immediate","surveyEl","backdropEl","pos","TabWidget","textElement","WidgetFactory","register","WidgetClass","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","Product7$1","Product7","_validateAndMergeConfig","initialized","siteId","debug","_injectStyles","designTokens","alreadyInitialized","serverConfig","web_chat","identifyResult","_syncConfiguredMetadataAfterInit","requestedType","normalizedType","_normalizeWidgetType","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","_normalizeWidgetOptions","widgetEnabled","_isWidgetEnabled","widgetOptions","internalType","createFeedbackWidget","createLiveChatWidget","createChangelogWidget","createSurveyWidget","getWidget","surveys","_normalizeSurveyConfig","includeIneligible","_isSurveyEligible","showSurveyById","displayOptions","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","linkConfig","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","_LiveChatWidget","_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","_setupLiveChatAttributeTriggers","openLiveChat","closeLiveChat","destroyLiveChat","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","_liveChatListenerAttached","_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/LiveChatService.js","../src/utils/errors.js","../src/api/services/SurveyService.js","../src/core/BaseAPIService.js","../src/utils/getIpInfo.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/styles/liveChatCustomStyles.js","../src/utils/NotificationSound.js","../src/utils/notificationSoundData.js","../src/widgets/liveChat/LiveChatState.js","../src/widgets/liveChat/components/LiveChatLauncher.js","../src/widgets/liveChat/components/NavigationTabs.js","../src/widgets/liveChat/components/LiveChatPanel.js","../src/widgets/liveChat/views/ChangelogView.js","../src/widgets/liveChat/views/ChatView.js","../src/widgets/liveChat/views/ConversationsView.js","../src/widgets/liveChat/views/HelpView.js","../src/widgets/liveChat/views/HomeView.js","../src/widgets/liveChat/views/FeedbackFormView.js","../src/widgets/liveChat/views/PreChatFormView.js","../src/widgets/LiveChatWidget.js","../src/widgets/SurveyWidget.js","../src/widgets/TabWidget.js","../src/widgets/WidgetFactory.js","../src/core/Product7.js","../src/styles/styles.js","../src/index.js"],"sourcesContent":["export const MOCK_CHANGELOGS = [\n\t{\n\t\tid: 'changelog_1',\n\t\ttitle:\n\t\t\t'Feature prioritization, multiple roadmaps, and feature request analytics.',\n\t\texcerpt:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tdescription:\n\t\t\t'We are super excited to bring you the long-waited feature prioritization together with many quality updates!',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=',\n\t\tslug: 'feature-prioritization-roadmaps-analytics',\n\t\tpublished_at: '2025-03-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'New Feature', color: '#10B981' },\n\t\t\t{ name: 'Analytics', color: '#6366F1' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_2',\n\t\ttitle: 'Dark mode support and UI improvements',\n\t\texcerpt:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tdescription:\n\t\t\t'You asked for it, we delivered! Dark mode is now available across all pages.',\n\t\tcover_image:\n\t\t\t'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+',\n\t\tslug: 'dark-mode-ui-improvements',\n\t\tpublished_at: '2025-03-01T10:00:00Z',\n\t\tlabels: [{ name: 'Enhancement', color: '#8B5CF6' }],\n\t\tstatus: 'published',\n\t},\n\t{\n\t\tid: 'changelog_3',\n\t\ttitle: 'Performance improvements and bug fixes',\n\t\texcerpt:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tdescription:\n\t\t\t'This release includes major performance improvements and several bug fixes.',\n\t\tslug: 'performance-improvements-bug-fixes',\n\t\tpublished_at: '2025-02-15T10:00:00Z',\n\t\tlabels: [\n\t\t\t{ name: 'Bug Fix', color: '#EF4444' },\n\t\t\t{ name: 'Performance', color: '#F59E0B' },\n\t\t],\n\t\tstatus: 'published',\n\t},\n];\n\nexport const MOCK_CONVERSATIONS = [\n\t{\n\t\tid: 'conv_1',\n\t\tsubject: 'Question about pricing',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 1,\n\t\tassigned_user: {\n\t\t\tid: 'user_1',\n\t\t\tname: 'Sarah',\n\t\t\tavatar: null,\n\t\t},\n\t},\n\t{\n\t\tid: 'conv_2',\n\t\tsubject: 'Feature request',\n\t\tstatus: 'open',\n\t\tlast_message_at: new Date(\n\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000\n\t\t).toISOString(),\n\t\tcreated_at: new Date(Date.now() - 10 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tunread: 0,\n\t\tassigned_user: {\n\t\t\tid: 'user_2',\n\t\t\tname: 'Tom',\n\t\t\tavatar: null,\n\t\t},\n\t},\n];\n\nexport const MOCK_MESSAGES = {\n\tconv_1: [\n\t\t{\n\t\t\tid: 'msg_1',\n\t\t\tcontent: \"Hi there! 👋 I'm Sarah. How can I help you today?\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Sarah',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 50 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_2',\n\t\t\tcontent: 'Hi! I have a question about your enterprise pricing.',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(Date.now() - 49 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n\tconv_2: [\n\t\t{\n\t\t\tid: 'msg_3',\n\t\t\tcontent: \"Hello! I'm Tom from the product team.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_4',\n\t\t\tcontent: 'I would love to see a dark mode feature!',\n\t\t\tsender_type: 'customer',\n\t\t\tcreated_at: new Date(\n\t\t\t\tDate.now() - 6 * 24 * 60 * 60 * 1000 - 30 * 60 * 1000\n\t\t\t).toISOString(),\n\t\t},\n\t\t{\n\t\t\tid: 'msg_5',\n\t\t\tcontent:\n\t\t\t\t\"Great suggestion! That feature will be available next week. I'll let you know when it's ready.\",\n\t\t\tsender_type: 'agent',\n\t\t\tsender_name: 'Tom',\n\t\t\tsender_avatar: null,\n\t\t\tcreated_at: new Date(Date.now() - 6 * 24 * 60 * 60 * 1000).toISOString(),\n\t\t},\n\t],\n};\n\nexport const MOCK_HELP_COLLECTIONS = [\n\t{\n\t\tid: 'collection_1',\n\t\ttitle: 'Product Overview',\n\t\tdescription: 'See how your AI-first customer service solution works.',\n\t\tarticleCount: 24,\n\t\ticon: 'ph-book-open',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_2',\n\t\ttitle: 'Getting Started',\n\t\tdescription: 'Everything you need to know to get started with Product7.',\n\t\tarticleCount: 30,\n\t\ticon: 'ph-rocket',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_3',\n\t\ttitle: 'AI Agent',\n\t\tdescription:\n\t\t\t'Resolving customer questions instantly and accurately—from live chat to email.',\n\t\tarticleCount: 82,\n\t\ticon: 'ph-robot',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_4',\n\t\ttitle: 'Channels',\n\t\tdescription:\n\t\t\t'Enabling the channels you use to communicate with customers, all from the Inbox.',\n\t\tarticleCount: 45,\n\t\ticon: 'ph-chat-circle',\n\t\turl: '#',\n\t},\n\t{\n\t\tid: 'collection_5',\n\t\ttitle: 'Billing & Payments',\n\t\tdescription: 'Manage your subscription, invoices, and payment methods.',\n\t\tarticleCount: 12,\n\t\ticon: 'ph-credit-card',\n\t\turl: '#',\n\t},\n];\n\nexport const MOCK_SURVEYS = [\n\t{\n\t\tid: 'mock_nps_survey',\n\t\tname: 'NPS Score',\n\t\tslug: 'nps',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'nps-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How likely are you to recommend us to a friend?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: {\n\t\t\t\t\tscale: 11,\n\t\t\t\t\tlow_label: 'Very unlikely',\n\t\t\t\t\thigh_label: 'Very likely',\n\t\t\t\t\tsurvey_type: 'nps',\n\t\t\t\t},\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_csat_survey',\n\t\tname: 'CSAT Survey',\n\t\tslug: 'csat',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'csat-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How satisfied are you with our service?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very dissatisfied',\n\t\t\t\t\thigh_label: 'Very satisfied',\n\t\t\t\t\tsurvey_type: 'emoji',\n\t\t\t\t},\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_ces_survey',\n\t\tname: 'Customer Effort Score',\n\t\tslug: 'ces',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'ces-page-1',\n\t\t\t\ttype: 'rating',\n\t\t\t\ttitle: 'How easy was it to use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: {\n\t\t\t\t\tscale: 5,\n\t\t\t\t\tlow_label: 'Very difficult',\n\t\t\t\t\thigh_label: 'Very easy',\n\t\t\t\t\tsurvey_type: 'ces',\n\t\t\t\t},\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_open_question_survey',\n\t\tname: 'Open Question',\n\t\tslug: 'open-question',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'open-page-1',\n\t\t\t\ttype: 'text',\n\t\t\t\ttitle: 'What could we do better?',\n\t\t\t\tdescription:\n\t\t\t\t\t'Is there anything we could do to make our product better for you?',\n\t\t\t\tplaceholder: 'Type your answer here',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_product_idea_poll_survey',\n\t\tname: 'Product Idea Poll',\n\t\tslug: 'product-idea-poll',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'poll-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'Which feature should we add next?',\n\t\t\t\tdescription: 'Vote on the feature you would like to see next.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'opt1', label: 'Better reporting' },\n\t\t\t\t\t\t{ id: 'opt2', label: 'Mobile app' },\n\t\t\t\t\t\t{ id: 'opt3', label: 'Integrations' },\n\t\t\t\t\t\t{ id: 'opt4', label: 'AI features' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_pmf_survey',\n\t\tname: 'Product Market Fit (PMF)',\n\t\tslug: 'pmf',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'pmf-page-1',\n\t\t\t\ttype: 'multiple_choice',\n\t\t\t\ttitle: 'How would you feel if you could no longer use our product?',\n\t\t\t\tdescription: '',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: {\n\t\t\t\t\tallow_multiple_selection: false,\n\t\t\t\t\tsurvey_type: 'regular',\n\t\t\t\t\toptions: [\n\t\t\t\t\t\t{ id: 'very_disappointed', label: 'Very disappointed' },\n\t\t\t\t\t\t{ id: 'somewhat_disappointed', label: 'Somewhat disappointed' },\n\t\t\t\t\t\t{ id: 'not_disappointed', label: 'Not disappointed' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\tlink_config: null,\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tid: 'mock_user_interview_survey',\n\t\tname: 'User Interview Request',\n\t\tslug: 'user-interview',\n\t\tstatus: 'active',\n\t\ttrigger_type: 'manual',\n\t\tpages: [\n\t\t\t{\n\t\t\t\tid: 'interview-page-1',\n\t\t\t\ttype: 'link',\n\t\t\t\ttitle: 'Would you like to hop on a quick demo?',\n\t\t\t\tdescription:\n\t\t\t\t\t'We would love to hear your thoughts and answer any questions you have.',\n\t\t\t\tplaceholder: '',\n\t\t\t\trating_config: null,\n\t\t\t\tmultiple_choice_config: null,\n\t\t\t\tlink_config: {\n\t\t\t\t\tbutton_text: 'Book a demo',\n\t\t\t\t\tlink_text: '',\n\t\t\t\t\tredirect_url: 'https://example.com',\n\t\t\t\t\topen_in: 'new_tab',\n\t\t\t\t},\n\t\t\t\tafter_this_page: { default: 'end_survey', conditions: [] },\n\t\t\t\trequired: true,\n\t\t\t},\n\t\t],\n\t},\n];\n","export const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));\n\nexport function getDeviceInfo() {\n\tif (typeof navigator === 'undefined') {\n\t\treturn { device: null, browser: null, os: null };\n\t}\n\n\tconst ua = navigator.userAgent;\n\n\tlet device = 'desktop';\n\tif (/Mobi|Android/i.test(ua)) {\n\t\tdevice = /Tablet|iPad/i.test(ua) ? 'tablet' : 'mobile';\n\t}\n\n\tlet browser = 'unknown';\n\tif (ua.includes('Firefox')) browser = 'firefox';\n\telse if (ua.includes('Edg')) browser = 'edge';\n\telse if (ua.includes('Chrome')) browser = 'chrome';\n\telse if (ua.includes('Safari')) browser = 'safari';\n\telse if (ua.includes('Opera') || ua.includes('OPR')) browser = 'opera';\n\n\tlet os = 'unknown';\n\tif (ua.includes('Windows')) os = 'windows';\n\telse if (ua.includes('Mac')) os = 'macos';\n\telse if (ua.includes('Linux')) os = 'linux';\n\telse if (ua.includes('Android')) os = 'android';\n\telse if (ua.includes('iPhone') || ua.includes('iPad')) os = 'ios';\n\n\treturn { device, browser, os };\n}\n","import { MOCK_CHANGELOGS } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class ChangelogService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getChangelogs(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { success: true, data: MOCK_CHANGELOGS };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/changelogs',\n\t\t\t\toptions\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n}\n","import { delay } from '../utils/helpers.js';\n\nexport class FeedbackService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync submitFeedback(feedbackData) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(500);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_post_' + Date.now(),\n\t\t\t\t\ttitle: feedbackData.title,\n\t\t\t\t\tcontent: feedbackData.content,\n\t\t\t\t},\n\t\t\t\tmessage: 'Feedback submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst contact = this.api.getContactIdentity();\n\n\t\tconst payload = {\n\t\t\tboard:\n\t\t\t\tfeedbackData.board_id || feedbackData.board || feedbackData.boardName,\n\t\t\ttitle: feedbackData.title,\n\t\t\tcontent: feedbackData.content,\n\t\t\tattachments: feedbackData.attachments || [],\n\t\t\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst response = await this.api._makeRequest('/widget/feedback', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn response;\n\t\t});\n\t}\n}\n","import { MOCK_HELP_COLLECTIONS } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class HelpService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getHelpCollections(options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { status: true, data: MOCK_HELP_COLLECTIONS };\n\t\t}\n\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/collections',\n\t\t\toptions\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync searchHelpArticles(query, options = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\tconst filtered = MOCK_HELP_COLLECTIONS.filter(\n\t\t\t\t(c) =>\n\t\t\t\t\tc.title.toLowerCase().includes(query.toLowerCase()) ||\n\t\t\t\t\tc.description.toLowerCase().includes(query.toLowerCase())\n\t\t\t);\n\t\t\treturn { status: true, data: filtered };\n\t\t}\n\n\t\tconst params = { q: query, ...options };\n\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t'/widget/help/search',\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n}\n","import { MOCK_CONVERSATIONS, MOCK_MESSAGES } from '../mock-data/index.js';\nimport { delay } from '../utils/helpers.js';\n\nexport class LiveChatService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getLiveChatSettings() {\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/livechat/settings', {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync checkAgentsOnline() {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tagents_online: true,\n\t\t\t\t\tonline_count: 2,\n\t\t\t\t\tresponse_time: 'Usually replies within a few minutes',\n\t\t\t\t\tavailable_agents: [\n\t\t\t\t\t\t{ full_name: 'Sarah', picture: '' },\n\t\t\t\t\t\t{ full_name: 'Tom', picture: '' },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/livechat/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/livechat/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/livechat/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/livechat/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/livechat/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/livechat/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/livechat/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/livechat/conversations/${conversationId}/messages`,\n\t\t\tparams\n\t\t);\n\t\treturn this.api._makeRequest(endpoint, {\n\t\t\tmethod: 'GET',\n\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t});\n\t}\n\n\tasync uploadFile(base64Data, filename) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn { status: true, url: `https://mock-cdn.example.com/${filename}` };\n\t\t}\n\n\t\treturn this.api._makeRequest('/widget/livechat/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify({ file: base64Data, filename }),\n\t\t});\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.api.identify(data);\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true, data: { rated: true } };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/livechat/conversations/${conversationId}/rating`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t}\n\t\t);\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\treturn { status: true };\n\t\t}\n\n\t\treturn this.api._makeRequest(\n\t\t\t`/widget/livechat/conversations/${conversationId}/typing`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t},\n\t\t\t\tbody: JSON.stringify({ is_typing: isTyping }),\n\t\t\t}\n\t\t);\n\t}\n}\n","export class SDKError extends Error {\n\tconstructor(message, cause) {\n\t\tsuper(message);\n\t\tthis.name = 'SDKError';\n\t\tthis.cause = cause;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, SDKError);\n\t\t}\n\t}\n}\n\nexport class APIError extends Error {\n\tconstructor(status, message, response) {\n\t\tsuper(message);\n\t\tthis.name = 'APIError';\n\t\tthis.status = status;\n\t\tthis.response = response;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, APIError);\n\t\t}\n\t}\n\n\tisNetworkError() {\n\t\treturn this.status === 0;\n\t}\n\n\tisClientError() {\n\t\treturn this.status >= 400 && this.status < 500;\n\t}\n\n\tisServerError() {\n\t\treturn this.status >= 500 && this.status < 600;\n\t}\n}\n\nexport class WidgetError extends Error {\n\tconstructor(message, widgetType, widgetId) {\n\t\tsuper(message);\n\t\tthis.name = 'WidgetError';\n\t\tthis.widgetType = widgetType;\n\t\tthis.widgetId = widgetId;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, WidgetError);\n\t\t}\n\t}\n}\n\nexport class ConfigError extends Error {\n\tconstructor(message, configKey) {\n\t\tsuper(message);\n\t\tthis.name = 'ConfigError';\n\t\tthis.configKey = configKey;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ConfigError);\n\t\t}\n\t}\n}\n\nexport class ValidationError extends Error {\n\tconstructor(message, field, value) {\n\t\tsuper(message);\n\t\tthis.name = 'ValidationError';\n\t\tthis.field = field;\n\t\tthis.value = value;\n\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, ValidationError);\n\t\t}\n\t}\n}\n\nexport class ErrorHandler {\n\tconstructor(debug = false) {\n\t\tthis.debug = debug;\n\t}\n\n\thandle(error, context = '') {\n\t\tconst errorInfo = {\n\t\t\tname: error.name,\n\t\t\tmessage: error.message,\n\t\t\tcontext,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\tif (error instanceof APIError) {\n\t\t\terrorInfo.status = error.status;\n\t\t\terrorInfo.type = 'api';\n\t\t} else if (error instanceof WidgetError) {\n\t\t\terrorInfo.widgetType = error.widgetType;\n\t\t\terrorInfo.widgetId = error.widgetId;\n\t\t\terrorInfo.type = 'widget';\n\t\t} else if (error instanceof ConfigError) {\n\t\t\terrorInfo.configKey = error.configKey;\n\t\t\terrorInfo.type = 'config';\n\t\t} else if (error instanceof ValidationError) {\n\t\t\terrorInfo.field = error.field;\n\t\t\terrorInfo.value = error.value;\n\t\t\terrorInfo.type = 'validation';\n\t\t} else {\n\t\t\terrorInfo.type = 'unknown';\n\t\t}\n\n\t\tif (this.debug) {\n\t\t\tconsole.error('[Product7 Error]', errorInfo, error);\n\t\t} else {\n\t\t\tconsole.error('[Product7 Error]', error.message);\n\t\t}\n\n\t\treturn errorInfo;\n\t}\n\n\tgetUserMessage(error) {\n\t\tif (error instanceof APIError) {\n\t\t\tif (error.isNetworkError()) {\n\t\t\t\treturn 'Network error. Please check your connection and try again.';\n\t\t\t} else if (error.isClientError()) {\n\t\t\t\treturn 'Invalid request. Please check your input and try again.';\n\t\t\t} else if (error.isServerError()) {\n\t\t\t\treturn 'Server error. Please try again later.';\n\t\t\t}\n\t\t\treturn 'Failed to submit feedback. Please try again.';\n\t\t}\n\n\t\tif (error instanceof ValidationError) {\n\t\t\treturn `Please check your ${error.field}: ${error.message}`;\n\t\t}\n\n\t\tif (error instanceof ConfigError) {\n\t\t\treturn 'Configuration error. Please check your SDK setup.';\n\t\t}\n\n\t\tif (error instanceof WidgetError) {\n\t\t\treturn 'Widget error. Please try refreshing the page.';\n\t\t}\n\n\t\treturn 'An unexpected error occurred. Please try again.';\n\t}\n}\n","import { APIError } from '../../utils/errors.js';\nimport { MOCK_SURVEYS } from '../mock-data/index.js';\nimport { delay, getDeviceInfo } from '../utils/helpers.js';\n\nexport class SurveyService {\n\tconstructor(baseAPI) {\n\t\tthis.api = baseAPI;\n\t}\n\n\tasync getActiveSurveys(context = {}) {\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(200);\n\t\t\treturn { success: true, data: MOCK_SURVEYS };\n\t\t}\n\n\t\tconst respondent = this._getRespondentContext(context);\n\n\t\tconst params = {\n\t\t\turl:\n\t\t\t\tcontext.url ||\n\t\t\t\t(typeof window !== 'undefined' ? window.location.href : ''),\n\t\t\t...getDeviceInfo(),\n\t\t\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t\t...(context.includeEligibility !== undefined && {\n\t\t\t\tinclude_eligibility: context.includeEligibility,\n\t\t\t}),\n\t\t\t...(context.userProperties && {\n\t\t\t\tuser_properties: context.userProperties,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\tconst endpoint = this.api._getEndpointWithParams(\n\t\t\t\t'/widget/surveys/active',\n\t\t\t\tparams\n\t\t\t);\n\t\t\treturn await this.api._makeRequest(endpoint, {\n\t\t\t\tmethod: 'GET',\n\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t});\n\t\t});\n\t}\n\n\t_getRespondentContext(context = {}) {\n\t\tconst metadata =\n\t\t\ttypeof this.api.getMetadata === 'function'\n\t\t\t\t? this.api.getMetadata() || {}\n\t\t\t\t: {};\n\n\t\treturn {\n\t\t\trespondent_id:\n\t\t\t\tcontext.respondentId || context.userId || metadata.user_id || null,\n\t\t\temail: context.email || metadata.email || null,\n\t\t};\n\t}\n\n\tasync submitSurveyResponse(surveyId, responseData) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(300);\n\t\t\treturn {\n\t\t\t\tsuccess: true,\n\t\t\t\tdata: {\n\t\t\t\t\tid: 'mock_response_' + Date.now(),\n\t\t\t\t\tsurvey_id: surveyId,\n\t\t\t\t\t...responseData,\n\t\t\t\t},\n\t\t\t\tmessage: 'Survey response submitted successfully!',\n\t\t\t};\n\t\t}\n\n\t\tconst respondent = this._getRespondentContext(responseData);\n\t\tconst contact = this.api.getContactIdentity?.() || null;\n\n\t\tconst payload = {\n\t\t\tanswers: Array.isArray(responseData.answers) ? responseData.answers : [],\n\t\t\t...(responseData.feedback && { feedback: responseData.feedback }),\n\t\t\t...(respondent.respondent_id && {\n\t\t\t\trespondent_id: respondent.respondent_id,\n\t\t\t}),\n\t\t\t...(respondent.email && { email: respondent.email }),\n\t\t\t...(contact?.contactId && {\n\t\t\t\tcontact_id: contact.contactId,\n\t\t\t\tcontact_email: contact.contactEmail,\n\t\t\t\tcontact_name: contact.contactName,\n\t\t\t}),\n\t\t};\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/responses`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\t\theaders: {\n\t\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t\tAuthorization: `Bearer ${this.api.sessionToken}`,\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n\n\tasync dismissSurvey(surveyId) {\n\t\tif (!surveyId) throw new APIError(400, 'Survey ID is required');\n\n\t\tawait this.api._ensureSession();\n\n\t\tif (this.api.mock) {\n\t\t\tawait delay(100);\n\t\t\treturn { success: true, message: 'Survey dismissed successfully' };\n\t\t}\n\n\t\treturn this.api._handleAuthRetry(async () => {\n\t\t\treturn await this.api._makeRequest(\n\t\t\t\t`/widget/surveys/${surveyId}/dismiss`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { Authorization: `Bearer ${this.api.sessionToken}` },\n\t\t\t\t}\n\t\t\t);\n\t\t});\n\t}\n}\n","import { APIError } from '../utils/errors.js';\n\nexport class BaseAPIService {\n\tconstructor(config = {}) {\n\t\tthis.workspace = config.workspace;\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.metadata = config.metadata || null;\n\t\tthis.identitySyncedToken = null;\n\t\tthis.mock = config.mock || false;\n\t\tthis.env = config.env || 'production';\n\t\tthis.baseURL = this._getBaseURL(config);\n\n\t\tthis._loadStoredSession();\n\t\tthis._loadStoredMetadata();\n\t\tif (this.isSessionValid() && this.metadata) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t}\n\t}\n\n\t_getBaseURL(config) {\n\t\tif (config.apiUrl) return config.apiUrl;\n\n\t\tconst ENV_URLS = {\n\t\t\tproduction: {\n\t\t\t\tbase: 'https://api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tstaging: {\n\t\t\t\tbase: 'https://staging.api.product7.io/api/v1',\n\t\t\t\twithWorkspace: (ws) => `https://${ws}.staging.api.product7.io/api/v1`,\n\t\t\t},\n\t\t\tlocalstack: {\n\t\t\t\tbase: 'http://localhost:1323/api/v1',\n\t\t\t\twithWorkspace: (ws) => `http://${ws}.localhost:1323/api/v1`,\n\t\t\t},\n\t\t};\n\n\t\tlet env = this.env;\n\t\tif (!env || env === 'production') {\n\t\t\tconst hostname =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.hostname) || '';\n\t\t\tconst port =\n\t\t\t\t(typeof window !== 'undefined' && window.location?.port) || '';\n\t\t\tif (hostname.includes('staging')) {\n\t\t\t\tenv = 'staging';\n\t\t\t} else if (hostname === 'app.localhost' && port === '3005') {\n\t\t\t\tenv = 'localstack';\n\t\t\t}\n\t\t}\n\n\t\tconst envConfig = ENV_URLS[env] || ENV_URLS.production;\n\t\treturn this.workspace\n\t\t\t? envConfig.withWorkspace(this.workspace)\n\t\t\t: envConfig.base;\n\t}\n\n\tasync init(metadata = undefined) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\n\t\t}\n\n\t\tif (this.isSessionValid()) {\n\t\t\treturn { sessionToken: this.sessionToken };\n\t\t}\n\n\t\tif (!this.workspace) {\n\t\t\tthrow new APIError(400, 'Missing workspace for initialization');\n\t\t}\n\n\t\tif (this.mock) {\n\t\t\treturn this._initMockSession();\n\t\t}\n\n\t\treturn this._initRealSession();\n\t}\n\n\tasync _initMockSession() {\n\t\tthis.sessionToken = 'mock_session_' + Date.now();\n\t\tthis.sessionExpiry = new Date(Date.now() + 3600 * 1000);\n\t\tthis.identitySyncedToken = null;\n\t\tthis._storeSession();\n\t\treturn {\n\t\t\tsessionToken: this.sessionToken,\n\t\t\tconfig: {\n\t\t\t\tprimaryColor: '#21244A',\n\t\t\t\tbackgroundColor: '#ffffff',\n\t\t\t\ttextColor: '#1F2937',\n\t\t\t\tboardName: 'feature-requests',\n\t\t\t\tsize: 'medium',\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t},\n\t\t\texpiresIn: 3600,\n\t\t};\n\t}\n\n\tasync _initRealSession() {\n\t\tconst payload = {\n\t\t\tworkspace: this.workspace,\n\t\t};\n\n\t\ttry {\n\t\t\tconst response = await this._makeRequest('/widget/init', {\n\t\t\t\tmethod: 'POST',\n\t\t\t\tbody: JSON.stringify(payload),\n\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t});\n\t\t\tconst initData = this._extractInitResponseData(response);\n\n\t\t\tthis.sessionToken = initData.sessionToken;\n\t\t\tthis.sessionExpiry = new Date(Date.now() + initData.expiresIn * 1000);\n\t\t\tthis.identitySyncedToken = null;\n\t\t\tthis._storeSession();\n\n\t\t\treturn {\n\t\t\t\tsessionToken: this.sessionToken,\n\t\t\t\tconfig: initData.config,\n\t\t\t\twidgets: initData.widgets,\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 configData =\n\t\t\tpayload.config && typeof payload.config === 'object'\n\t\t\t\t? payload.config\n\t\t\t\t: {};\n\n\t\tconst sessionToken =\n\t\t\tpayload.session_token ||\n\t\t\tpayload.sessionToken ||\n\t\t\tconfigData.session_token ||\n\t\t\tconfigData.sessionToken;\n\n\t\tconst expiresIn = Number(\n\t\t\tpayload.expires_in ??\n\t\t\t\tpayload.expiresIn ??\n\t\t\t\tconfigData.expires_in ??\n\t\t\t\tconfigData.expiresIn\n\t\t);\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: configData,\n\t\t\twidgets:\n\t\t\t\tpayload.widgets && typeof payload.widgets === 'object'\n\t\t\t\t\t? payload.widgets\n\t\t\t\t\t: null,\n\t\t\tconfigVersion:\n\t\t\t\tconfigData.config_version ??\n\t\t\t\tconfigData.configVersion ??\n\t\t\t\tpayload.config_version ??\n\t\t\t\tpayload.configVersion ??\n\t\t\t\tnull,\n\t\t\tstatus: response?.status ?? payload?.status ?? true,\n\t\t\tmessage: response?.message ?? payload?.message ?? null,\n\t\t};\n\t}\n\n\tasync _ensureSession() {\n\t\tif (!this.isSessionValid()) {\n\t\t\tawait this.init();\n\t\t}\n\t\tif (!this.sessionToken) {\n\t\t\tthrow new APIError(401, 'No valid session token available');\n\t\t}\n\t}\n\n\tasync _handleAuthRetry(method, ...args) {\n\t\ttry {\n\t\t\treturn await method.apply(this, args);\n\t\t} catch (error) {\n\t\t\tif (error.status === 401) {\n\t\t\t\tthis.sessionToken = null;\n\t\t\t\tthis.sessionExpiry = null;\n\t\t\t\tawait this.init();\n\t\t\t\tawait this._restoreIdentity();\n\t\t\t\treturn await method.apply(this, args);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync identify(metadata = this.metadata) {\n\t\tif (metadata !== undefined) {\n\t\t\tthis.setMetadata(metadata);\n\t\t}\n\n\t\tif (!this.metadata) {\n\t\t\tthrow new APIError(400, 'Missing user context for identify');\n\t\t}\n\n\t\tawait this._ensureSession();\n\n\t\tconst payload = this._buildIdentifyPayload(this.metadata);\n\n\t\tif (this.mock) {\n\t\t\tthis.identitySyncedToken = this.sessionToken;\n\t\t\treturn {\n\t\t\t\tstatus: true,\n\t\t\t\tidentified: true,\n\t\t\t\tdata: {\n\t\t\t\t\tuser_id: payload.user_id || null,\n\t\t\t\t\temail: payload.email || null,\n\t\t\t\t\tname: payload.name || null,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\tconst response = await this._makeRequest('/widget/identify', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify(payload),\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t});\n\n\t\tthis.identitySyncedToken = this.sessionToken;\n\t\treturn response;\n\t}\n\n\tisSessionValid() {\n\t\treturn (\n\t\t\tthis.sessionToken && this.sessionExpiry && new Date() < this.sessionExpiry\n\t\t);\n\t}\n\n\tsetMetadata(metadata) {\n\t\tthis.metadata = metadata || null;\n\t\tthis.identitySyncedToken = null;\n\t\tif (this.metadata) {\n\t\t\tthis._storeData('product7_metadata', this.metadata);\n\t\t} else {\n\t\t\tthis._removeData('product7_metadata');\n\t\t}\n\t}\n\n\tgetMetadata() {\n\t\treturn this.metadata;\n\t}\n\n\tclearSession() {\n\t\tthis.sessionToken = null;\n\t\tthis.sessionExpiry = null;\n\t\tthis.identitySyncedToken = null;\n\t\tthis.contactId = null;\n\t\tthis.contactEmail = null;\n\t\tthis.contactName = null;\n\t\tthis._removeData('product7_session');\n\t\tthis._removeData('product7_metadata');\n\t\tthis._removeData('product7_contact');\n\t}\n\n\t_storeSession() {\n\t\tif (typeof localStorage === 'undefined') return;\n\t\ttry {\n\t\t\tconst sessionData = {\n\t\t\t\ttoken: this.sessionToken,\n\t\t\t\texpiry: this.sessionExpiry.toISOString(),\n\t\t\t\tworkspace: this.workspace,\n\t\t\t};\n\t\t\tthis._storeData('product7_session', sessionData);\n\t\t} catch (error) {\n\t\t\t// Silent fail\n\t\t}\n\t}\n\n\t_loadStoredSession() {\n\t\tif (typeof localStorage === 'undefined') return false;\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('product7_session');\n\t\t\tif (!stored) return false;\n\n\t\t\tconst sessionData = JSON.parse(stored);\n\n\t\t\t// Invalidate mock tokens when not in mock mode (and vice versa)\n\t\t\tconst isMockToken =\n\t\t\t\tsessionData.token && sessionData.token.startsWith('mock_');\n\t\t\tif (isMockToken !== this.mock) {\n\t\t\t\tlocalStorage.removeItem('product7_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\tthis.workspace &&\n\t\t\t\tsessionData.workspace &&\n\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t) {\n\t\t\t\tlocalStorage.removeItem('product7_session');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tthis.sessionToken = sessionData.token;\n\t\t\tthis.sessionExpiry = new Date(sessionData.expiry);\n\n\t\t\treturn this.isSessionValid();\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_loadStoredMetadata() {\n\t\tif (this.metadata || typeof localStorage === 'undefined') return false;\n\n\t\ttry {\n\t\t\tconst session = localStorage.getItem('product7_session');\n\t\t\tif (session) {\n\t\t\t\tconst sessionData = JSON.parse(session);\n\t\t\t\tif (\n\t\t\t\t\tthis.workspace &&\n\t\t\t\t\tsessionData.workspace &&\n\t\t\t\t\tsessionData.workspace !== this.workspace\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst stored = localStorage.getItem('product7_metadata');\n\t\t\tif (!stored) return false;\n\n\t\t\tthis.metadata = JSON.parse(stored);\n\t\t\treturn true;\n\t\t} catch (error) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t_storeData(key, value) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.setItem(key, JSON.stringify(value));\n\t\t}\n\t}\n\n\t_removeData(key) {\n\t\tif (typeof localStorage !== 'undefined') {\n\t\t\tlocalStorage.removeItem(key);\n\t\t}\n\t}\n\n\tasync _makeRequest(endpoint, options = {}) {\n\t\tconst url = `${this.baseURL}${endpoint}`;\n\n\t\ttry {\n\t\t\tconst response = await fetch(url, options);\n\n\t\t\tif (!response.ok) {\n\t\t\t\tlet errorMessage = `HTTP ${response.status}`;\n\t\t\t\tlet responseData = null;\n\n\t\t\t\ttry {\n\t\t\t\t\tresponseData = await response.json();\n\t\t\t\t\terrorMessage =\n\t\t\t\t\t\tresponseData.message || responseData.error || errorMessage;\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrorMessage = (await response.text()) || errorMessage;\n\t\t\t\t}\n\n\t\t\t\tthrow new APIError(response.status, errorMessage, responseData);\n\t\t\t}\n\n\t\t\tconst contentType = response.headers.get('content-type');\n\t\t\tif (contentType && contentType.includes('application/json')) {\n\t\t\t\treturn await response.json();\n\t\t\t}\n\n\t\t\treturn await response.text();\n\t\t} catch (error) {\n\t\t\tif (error instanceof APIError) throw error;\n\t\t\tthrow new APIError(0, error.message, null);\n\t\t}\n\t}\n\n\t_buildQueryParams(params) {\n\t\tconst queryParams = new URLSearchParams();\n\t\tObject.entries(params).forEach(([key, value]) => {\n\t\t\tif (value !== undefined && value !== null) {\n\t\t\t\tqueryParams.append(\n\t\t\t\t\tkey,\n\t\t\t\t\ttypeof value === 'object' ? JSON.stringify(value) : value\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t\treturn queryParams.toString();\n\t}\n\n\t_getEndpointWithParams(endpoint, params) {\n\t\tconst queryString = this._buildQueryParams(params);\n\t\treturn `${endpoint}${queryString ? '?' + queryString : ''}`;\n\t}\n\n\t_buildIdentifyPayload(metadata = {}) {\n\t\tconst payload = {\n\t\t\tuser_id: metadata.user_id,\n\t\t\temail: metadata.email,\n\t\t\tname: metadata.name,\n\t\t\tavatar:\n\t\t\t\tmetadata.profile_picture || metadata.avatar_url || metadata.avatar,\n\t\t\tattributes: metadata.custom_fields || {},\n\t\t};\n\n\t\tif (metadata.company) {\n\t\t\tpayload.company = metadata.company;\n\t\t}\n\n\t\treturn payload;\n\t}\n\n\tasync _restoreIdentity() {\n\t\tif (\n\t\t\t!this.metadata ||\n\t\t\t!this.sessionToken ||\n\t\t\t!this.identitySyncedToken ||\n\t\t\tthis.identitySyncedToken === this.sessionToken\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tawait this.identify(this.metadata);\n\t}\n}\n","let _cached = null;\n\nexport async function getIpInfo() {\n\tif (_cached) return _cached;\n\n\ttry {\n\t\tconst res = await fetch('http://ip-api.com/json');\n\t\tif (!res.ok) return null;\n\t\tconst data = await res.json();\n\t\tif (data.status === 'success') {\n\t\t\t_cached = data;\n\t\t}\n\t\treturn _cached;\n\t} catch {\n\t\treturn null;\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 { LiveChatService } from '../api/services/LiveChatService.js';\nimport { SurveyService } from '../api/services/SurveyService.js';\nimport { BaseAPIService } from './BaseAPIService.js';\nimport { getIpInfo } from '../utils/getIpInfo.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.liveChat = new LiveChatService(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 getLiveChatSettings() {\n\t\treturn this.liveChat.getLiveChatSettings();\n\t}\n\n\tasync checkAgentsOnline() {\n\t\treturn this.liveChat.checkAgentsOnline();\n\t}\n\n\tasync getConversations(options) {\n\t\treturn this.liveChat.getConversations(options);\n\t}\n\n\tasync getConversation(conversationId) {\n\t\treturn this.liveChat.getConversation(conversationId);\n\t}\n\n\tasync getMessages(conversationId, options) {\n\t\treturn this.liveChat.getMessages(conversationId, options);\n\t}\n\n\tasync startConversation(data) {\n\t\treturn this.liveChat.startConversation(data);\n\t}\n\n\tasync sendMessage(conversationId, data) {\n\t\treturn this.liveChat.sendMessage(conversationId, data);\n\t}\n\n\tasync uploadFile(base64Data, filename) {\n\t\treturn this.liveChat.uploadFile(base64Data, filename);\n\t}\n\n\tasync sendTypingIndicator(conversationId, isTyping) {\n\t\treturn this.liveChat.sendTypingIndicator(conversationId, isTyping);\n\t}\n\n\tasync markConversationAsRead(conversationId) {\n\t\treturn this.liveChat.markConversationAsRead(conversationId);\n\t}\n\n\tasync getUnreadCount() {\n\t\treturn this.liveChat.getUnreadCount();\n\t}\n\n\tasync submitRating(conversationId, data) {\n\t\treturn this.liveChat.submitRating(conversationId, data);\n\t}\n\n\tasync identify(metadata) {\n\t\tawait this._ensureSession();\n\n\t\tif (this.mock) {\n\t\t\tawait new Promise((r) => setTimeout(r, 300));\n\t\t\tconst mockResponse = {\n\t\t\t\tstatus: true,\n\t\t\t\tdata: {\n\t\t\t\t\tcontact_id: 'mock_contact_' + Date.now(),\n\t\t\t\t\temail: metadata.email || '',\n\t\t\t\t\tname: metadata.name || '',\n\t\t\t\t\tavatar: metadata.avatar || '',\n\t\t\t\t\tis_new: true,\n\t\t\t\t},\n\t\t\t};\n\t\t\tthis._storeContactIdentity(mockResponse.data, metadata);\n\t\t\treturn mockResponse;\n\t\t}\n\n\t\tconst payload = {};\n\n\t\tif (metadata.email) payload.email = metadata.email;\n\t\tif (metadata.user_id) payload.user_id = metadata.user_id;\n\t\tif (metadata.name) payload.name = metadata.name;\n\t\tif (metadata.avatar) payload.avatar = metadata.avatar;\n\t\tif (metadata.attributes) payload.attributes = metadata.attributes;\n\t\tif (metadata.company) payload.company = metadata.company;\n\n\t\tconst ipInfo = await getIpInfo();\n\t\tif (ipInfo) payload.ip_info = ipInfo;\n\n\t\tconst response = await this._makeRequest('/widget/identify', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\tAuthorization: `Bearer ${this.sessionToken}`,\n\t\t\t},\n\t\t\tbody: JSON.stringify(payload),\n\t\t});\n\n\t\tif (response?.status && response?.data) {\n\t\t\tthis._storeContactIdentity(response.data, metadata);\n\t\t}\n\n\t\treturn response;\n\t}\n\n\t_storeContactIdentity(data, metadata = {}) {\n\t\tthis.contactId = data.contact_id || null;\n\t\tthis.contactEmail = data.email || metadata.email || null;\n\t\tthis.contactName = data.name || metadata.name || null;\n\n\t\ttry {\n\t\t\tlocalStorage.setItem(\n\t\t\t\t'product7_contact',\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tcontactId: this.contactId,\n\t\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\t\tcontactName: this.contactName,\n\t\t\t\t})\n\t\t\t);\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\t}\n\n\tgetContactIdentity() {\n\t\tif (this.contactId) {\n\t\t\treturn {\n\t\t\t\tcontactId: this.contactId,\n\t\t\t\tcontactEmail: this.contactEmail,\n\t\t\t\tcontactName: this.contactName,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst stored = localStorage.getItem('product7_contact');\n\t\t\tif (stored) {\n\t\t\t\tconst parsed = JSON.parse(stored);\n\t\t\t\tthis.contactId = parsed.contactId;\n\t\t\t\tthis.contactEmail = parsed.contactEmail;\n\t\t\t\tthis.contactName = parsed.contactName;\n\t\t\t\treturn parsed;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t/* silent */\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tasync identifyContact(data) {\n\t\treturn this.identify(data);\n\t}\n\n\tasync getHelpCollections(options) {\n\t\treturn this.help.getHelpCollections(options);\n\t}\n\n\tasync searchHelpArticles(query, options) {\n\t\treturn this.help.searchHelpArticles(query, options);\n\t}\n\n\tasync getChangelogs(options) {\n\t\treturn this.changelog.getChangelogs(options);\n\t}\n}\n","export class EventBus {\n\tconstructor() {\n\t\tthis.events = new Map();\n\t}\n\n\ton(event, callback) {\n\t\tif (!this.events.has(event)) {\n\t\t\tthis.events.set(event, []);\n\t\t}\n\t\tthis.events.get(event).push(callback);\n\n\t\treturn () => this.off(event, callback);\n\t}\n\n\toff(event, callback) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tconst index = callbacks.indexOf(callback);\n\t\t\tif (index > -1) {\n\t\t\t\tcallbacks.splice(index, 1);\n\t\t\t}\n\t\t}\n\t}\n\n\temit(event, data) {\n\t\tconst callbacks = this.events.get(event);\n\t\tif (callbacks) {\n\t\t\tcallbacks.forEach((callback) => {\n\t\t\t\ttry {\n\t\t\t\t\tcallback(data);\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconsole.error('[Product7] Event callback error:', error);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tonce(event, callback) {\n\t\tconst unsubscribe = this.on(event, (data) => {\n\t\t\tcallback(data);\n\t\t\tunsubscribe();\n\t\t});\n\t\treturn unsubscribe;\n\t}\n\n\tclear() {\n\t\tthis.events.clear();\n\t}\n\n\tgetListenerCount(event) {\n\t\tconst callbacks = this.events.get(event);\n\t\treturn callbacks ? callbacks.length : 0;\n\t}\n}\n","export function generateId(prefix = 'feedback') {\n\tconst timestamp = Date.now();\n\tconst random = Math.random().toString(36).substring(2, 9);\n\treturn `${prefix}_${timestamp}_${random}`;\n}\n\nexport function deepMerge(target, source) {\n\tconst result = { ...target };\n\n\tfor (const key in source) {\n\t\tif (source.hasOwnProperty(key)) {\n\t\t\tif (\n\t\t\t\tsource[key] &&\n\t\t\t\ttypeof source[key] === 'object' &&\n\t\t\t\t!Array.isArray(source[key])\n\t\t\t) {\n\t\t\t\tresult[key] = deepMerge(target[key] || {}, source[key]);\n\t\t\t} else {\n\t\t\t\tresult[key] = source[key];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function executedFunction(...args) {\n\t\tconst later = () => {\n\t\t\tclearTimeout(timeout);\n\t\t\tfunc(...args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n}\n\nexport function throttle(func, limit) {\n\tlet lastFunc;\n\tlet lastRan;\n\treturn function (...args) {\n\t\tif (!lastRan) {\n\t\t\tfunc(...args);\n\t\t\tlastRan = Date.now();\n\t\t} else {\n\t\t\tclearTimeout(lastFunc);\n\t\t\tlastFunc = setTimeout(\n\t\t\t\t() => {\n\t\t\t\t\tif (Date.now() - lastRan >= limit) {\n\t\t\t\t\t\tfunc(...args);\n\t\t\t\t\t\tlastRan = Date.now();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tlimit - (Date.now() - lastRan)\n\t\t\t);\n\t\t}\n\t};\n}\n\nexport function isValidEmail(email) {\n\tif (!email || typeof email !== 'string') return false;\n\n\tconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\treturn emailRegex.test(email.trim());\n}\n\nexport function sanitizeHTML(str) {\n\tif (!str || typeof str !== 'string') return '';\n\n\tconst div = document.createElement('div');\n\tdiv.textContent = str;\n\treturn div.innerHTML;\n}\n\nexport function getCSSProperty(element, property, fallback = '') {\n\tif (!element || !property) return fallback;\n\n\ttry {\n\t\tconst style = window.getComputedStyle(element);\n\t\treturn style.getPropertyValue(property) || fallback;\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function isInViewport(element) {\n\tif (!element) return false;\n\n\tconst rect = element.getBoundingClientRect();\n\treturn (\n\t\trect.top >= 0 &&\n\t\trect.left >= 0 &&\n\t\trect.bottom <=\n\t\t\t(window.innerHeight || document.documentElement.clientHeight) &&\n\t\trect.right <= (window.innerWidth || document.documentElement.clientWidth)\n\t);\n}\n\nexport function scrollToElement(element, options = {}) {\n\tif (!element) return;\n\n\tconst defaultOptions = {\n\t\tbehavior: 'smooth',\n\t\tblock: 'center',\n\t\tinline: 'nearest',\n\t};\n\n\telement.scrollIntoView({ ...defaultOptions, ...options });\n}\n\nexport function getBrowserInfo() {\n\tconst userAgent = navigator.userAgent;\n\tconst platform = navigator.platform;\n\n\treturn {\n\t\tuserAgent,\n\t\tplatform,\n\t\tlanguage: navigator.language || navigator.userLanguage,\n\t\tcookieEnabled: navigator.cookieEnabled,\n\t\tscreenResolution: `${screen.width}x${screen.height}`,\n\t\twindowSize: `${window.innerWidth}x${window.innerHeight}`,\n\t\ttimezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n\t};\n}\n\nexport function formatFileSize(bytes) {\n\tif (bytes === 0) return '0 Bytes';\n\n\tconst k = 1024;\n\tconst sizes = ['Bytes', 'KB', 'MB', 'GB'];\n\tconst i = Math.floor(Math.log(bytes) / Math.log(k));\n\n\treturn parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n}\n\nexport function delay(ms) {\n\treturn new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function safeJsonParse(str, fallback = null) {\n\ttry {\n\t\treturn JSON.parse(str);\n\t} catch (error) {\n\t\treturn fallback;\n\t}\n}\n\nexport function escapeRegex(string) {\n\treturn string.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function getNestedProperty(obj, path, defaultValue = undefined) {\n\tif (!obj || !path) return defaultValue;\n\n\tconst keys = path.split('.');\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (current === null || current === undefined || !(key in current)) {\n\t\t\treturn defaultValue;\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\treturn current;\n}\n\nexport function setNestedProperty(obj, path, value) {\n\tif (!obj || !path) return obj;\n\n\tconst keys = path.split('.');\n\tconst lastKey = keys.pop();\n\tlet current = obj;\n\n\tfor (const key of keys) {\n\t\tif (!(key in current) || typeof current[key] !== 'object') {\n\t\t\tcurrent[key] = {};\n\t\t}\n\t\tcurrent = current[key];\n\t}\n\n\tcurrent[lastKey] = value;\n\treturn obj;\n}\n\nexport function isBrowser() {\n\treturn typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\nexport function isMobile() {\n\tif (!isBrowser()) return false;\n\n\treturn (\n\t\t/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n\t\t\tnavigator.userAgent\n\t\t) || window.innerWidth <= 768\n\t);\n}\n\nexport function getCurrentTimestamp() {\n\treturn new Date().toISOString();\n}\n\nexport function validateConfig(config, required = []) {\n\tconst missing = [];\n\n\tfor (const key of required) {\n\t\tif (!config[key]) {\n\t\t\tmissing.push(key);\n\t\t}\n\t}\n\n\tif (missing.length > 0) {\n\t\tthrow new Error(`Missing required configuration: ${missing.join(', ')}`);\n\t}\n\n\treturn true;\n}\n","export class BaseWidget {\n\tstatic STORAGE_KEY = 'feedback_submitted';\n\tstatic DEFAULT_COOLDOWN_DAYS = 30;\n\n\tconstructor(options = {}) {\n\t\tthis.id = options.id;\n\t\tthis.sdk = options.sdk;\n\t\tthis.apiService = options.apiService;\n\t\tthis.type = options.type || 'base';\n\n\t\tthis.options = {\n\t\t\tcontainer: null,\n\t\t\tposition: this.sdk.config.position,\n\t\t\tboardName: this.sdk.config.boardName,\n\t\t\tdisplayMode: options.displayMode || 'panel',\n\t\t\tsize: options.size || 'medium',\n\t\t\tprimaryColor: options.primaryColor || '#155EEF',\n\t\t\tbackgroundColor: options.backgroundColor || '#ffffff',\n\t\t\ttextColor: options.textColor || '#1F2937',\n\t\t\tautoShow: false,\n\t\t\tshowBackdrop: true,\n\t\t\tcustomStyles: {},\n\t\t\tsuppressAfterSubmission: true,\n\t\t\tsuppressionDays: BaseWidget.DEFAULT_COOLDOWN_DAYS,\n\t\t\ttrigger: true,\n\t\t\t...options,\n\t\t};\n\n\t\tthis.element = null;\n\t\tthis.panelElement = null;\n\t\tthis.backdropElement = null;\n\t\tthis.mounted = false;\n\t\tthis.destroyed = false;\n\n\t\tthis.state = {\n\t\t\tisOpen: false,\n\t\t\tisLoading: false,\n\t\t\tisSubmitting: false,\n\t\t\ttitle: '',\n\t\t\tcontent: '',\n\t\t\temail: '',\n\t\t\tattachments: [],\n\t\t\terrors: {},\n\t\t};\n\n\t\tthis._bindMethods();\n\t}\n\n\tmount(container) {\n\t\tif (this.mounted || this.destroyed) return this;\n\n\t\tif (this.options.enabled === false) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\ttype: this.type,\n\t\t\t\treason: 'disabled',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (this.options.suppressAfterSubmission && this._hasRecentlySubmitted()) {\n\t\t\tthis.sdk.eventBus.emit('widget:suppressed', {\n\t\t\t\twidget: this,\n\t\t\t\treason: 'recently_submitted',\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tif (typeof container === 'string') {\n\t\t\tcontainer = document.querySelector(container);\n\t\t}\n\n\t\tif (!container) {\n\t\t\tcontainer = document.body;\n\t\t}\n\n\t\tthis.container = container;\n\t\tthis.element = this._render();\n\t\tthis.container.appendChild(this.element);\n\n\t\tthis.mounted = true;\n\t\tthis._attachEvents();\n\n\t\t// Bind to a custom trigger element if a selector or element was provided\n\t\tif (this.options.trigger && this.options.trigger !== true) {\n\t\t\tconst triggerEl =\n\t\t\t\ttypeof this.options.trigger === 'string'\n\t\t\t\t\t? document.querySelector(this.options.trigger)\n\t\t\t\t\t: this.options.trigger instanceof Element\n\t\t\t\t\t\t? this.options.trigger\n\t\t\t\t\t\t: null;\n\t\t\tif (triggerEl) {\n\t\t\t\ttriggerEl.addEventListener('click', () => this.open());\n\t\t\t}\n\t\t}\n\n\t\tthis.onMount();\n\n\t\tif (this.options.autoShow) {\n\t\t\tthis.show();\n\t\t}\n\n\t\tthis.sdk.eventBus.emit('widget:mounted', { widget: this });\n\t\treturn this;\n\t}\n\n\tshow() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'block';\n\t\t}\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tif (this.element) {\n\t\t\tthis.element.style.display = 'none';\n\t\t}\n\t\treturn this;\n\t}\n\n\topenPanel() {\n\t\tthis.state.isOpen = true;\n\n\t\tthis._renderPanel();\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.panelElement) {\n\t\t\t\tthis.panelElement.classList.add('open');\n\t\t\t}\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t});\n\t}\n\n\t_showLoadingModal() {\n\t\tthis.state.isLoading = true;\n\n\t\tif (this.options.showBackdrop) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\t\t}\n\n\t\tthis.loadingElement = document.createElement('div');\n\t\tthis.loadingElement.className = 'feedback-loading-modal';\n\t\tthis.loadingElement.innerHTML = `\n\t\t\t<div class=\"sdk-spinner\"></div>\n\t\t`;\n\t\tdocument.body.appendChild(this.loadingElement);\n\n\t\trequestAnimationFrame(() => {\n\t\t\tif (this.backdropElement) {\n\t\t\t\tthis.backdropElement.classList.add('show');\n\t\t\t}\n\t\t\tthis.loadingElement.classList.add('show');\n\t\t});\n\t}\n\n\t_hideLoadingModal() {\n\t\tthis.state.isLoading = false;\n\t\tif (this.loadingElement) {\n\t\t\tthis.loadingElement.remove();\n\t\t\tthis.loadingElement = null;\n\t\t}\n\t}\n\n\tclosePanel() {\n\t\tif (this.panelElement) {\n\t\t\tthis.panelElement.classList.remove('open');\n\t\t}\n\t\tif (this.backdropElement) {\n\t\t\tthis.backdropElement.classList.remove('show');\n\t\t}\n\n\t\tthis.state.isOpen = false;\n\t\tif (this.panelElement && this.panelElement.parentNode) {\n\t\t\tthis.panelElement.parentNode.removeChild(this.panelElement);\n\t\t\tthis.panelElement = null;\n\t\t}\n\t\tif (this.backdropElement && this.backdropElement.parentNode) {\n\t\t\tthis.backdropElement.parentNode.removeChild(this.backdropElement);\n\t\t\tthis.backdropElement = null;\n\t\t}\n\t\tthis._resetForm();\n\t}\n\n\tasync submitFeedback() {\n\t\tif (this.state.isSubmitting) return;\n\n\t\tthis._hideError();\n\n\t\ttry {\n\t\t\tthis.state.isSubmitting = true;\n\t\t\tthis._updateSubmitButton();\n\n\t\t\tconst payload = {\n\t\t\t\ttitle: this.state.title || 'Feedback',\n\t\t\t\tcontent: this.state.content,\n\t\t\t\temail: this.state.email,\n\t\t\t\tboard_id: this.options.boardName,\n\t\t\t\tattachments: this.state.attachments,\n\t\t\t};\n\n\t\t\tif (!this.state.title.trim()) {\n\t\t\t\tthis._showError('Please enter a title.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!this.state.content.trim()) {\n\t\t\t\tthis._showError('Please enter your feedback message.');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst response = await this.apiService.submitFeedback(payload);\n\n\t\t\tthis._trackSubmission();\n\n\t\t\tthis._showSuccessInPanel();\n\n\t\t\tthis.sdk.eventBus.emit('feedback:submitted', {\n\t\t\t\twidget: this,\n\t\t\t\tfeedback: response,\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tthis._showError('Failed to submit feedback. Please try again.');\n\t\t\tthis.sdk.eventBus.emit('feedback:error', { widget: this, error });\n\t\t} finally {\n\t\t\tthis.state.isSubmitting = false;\n\t\t\tthis._updateSubmitButton();\n\t\t}\n\t}\n\n\thandleConfigUpdate(newConfig) {\n\t\tthis.options.theme = newConfig.theme;\n\t\tif (this.element) {\n\t\t\tthis._updateTheme();\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.destroyed) return;\n\n\t\tthis.onDestroy();\n\t\tthis.closePanel();\n\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\n\t\tthis.destroyed = true;\n\t\tthis.mounted = false;\n\t\tthis.sdk.eventBus.emit('widget:destroyed', { widget: this });\n\t}\n\n\tonMount() {}\n\tonDestroy() {}\n\n\t_trackSubmission() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst data = {\n\t\t\t\tsubmittedAt: Date.now(),\n\t\t\t\tboardName: this.options.boardName,\n\t\t\t};\n\t\t\tlocalStorage.setItem(storageKey, JSON.stringify(data));\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to track feedback submission:', e);\n\t\t}\n\t}\n\n\t_hasRecentlySubmitted() {\n\t\tconst cooldownMs = this.options.suppressionDays * 24 * 60 * 60 * 1000;\n\t\tconst now = Date.now();\n\n\t\tif (this.sdk.config.last_feedback_at) {\n\t\t\ttry {\n\t\t\t\tconst backendTimestamp = new Date(\n\t\t\t\t\tthis.sdk.config.last_feedback_at\n\t\t\t\t).getTime();\n\t\t\t\tif (now - backendTimestamp < cooldownMs) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t// Invalid date format, continue to localStorage check\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tconst stored = localStorage.getItem(storageKey);\n\n\t\t\tif (!stored) return false;\n\n\t\t\tconst data = JSON.parse(stored);\n\t\t\tconst submittedAt = data.submittedAt;\n\n\t\t\treturn now - submittedAt < cooldownMs;\n\t\t} catch (e) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tclearSubmissionTracking() {\n\t\ttry {\n\t\t\tconst workspace = this.sdk.config.workspace;\n\t\t\tconst storageKey = `${BaseWidget.STORAGE_KEY}_${workspace}`;\n\t\t\tlocalStorage.removeItem(storageKey);\n\t\t} catch (e) {\n\t\t\tconsole.warn('Failed to clear submission tracking:', e);\n\t\t}\n\t}\n\n\tshouldShow() {\n\t\tif (!this.options.suppressAfterSubmission) return true;\n\t\treturn !this._hasRecentlySubmitted();\n\t}\n\n\t_render() {\n\t\tthrow new Error('_render() must be implemented by concrete widget');\n\t}\n\n\t_attachEvents() {\n\t\t// Override in concrete widgets\n\t}\n\n\t_bindMethods() {\n\t\tthis.openPanel = this.openPanel.bind(this);\n\t\tthis.closePanel = this.closePanel.bind(this);\n\t\tthis.submitFeedback = this.submitFeedback.bind(this);\n\t}\n\n\t_renderPanel() {\n\t\tif (this.panelElement) return;\n\n\t\tif (this.options.showBackdrop && !this.backdropElement) {\n\t\t\tthis.backdropElement = document.createElement('div');\n\t\t\tthis.backdropElement.className = 'sdk-modal-backdrop';\n\t\t\tdocument.body.appendChild(this.backdropElement);\n\n\t\t\tthis.backdropElement.addEventListener('click', this.closePanel);\n\t\t}\n\n\t\tconst modeClass =\n\t\t\tthis.options.displayMode === 'modal'\n\t\t\t\t? 'feedback-modal'\n\t\t\t\t: 'feedback-panel';\n\t\tconst sizeClass = `size-${this.options.size}`;\n\t\tthis.panelElement = document.createElement('div');\n\t\tconst themeClass = `theme-${this.options.theme || 'light'}`;\n\t\tconst isLeftPosition =\n\t\t\tmodeClass === 'feedback-panel' &&\n\t\t\tString(this.options.position).includes('left');\n\t\tconst directionClass = isLeftPosition ? 'panel-from-left' : '';\n\t\tthis.panelElement.className =\n\t\t\t`${modeClass} ${sizeClass} ${themeClass} ${directionClass}`.trim();\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--color-primary',\n\t\t\tthis.options.primaryColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-bg',\n\t\t\tthis.options.backgroundColor\n\t\t);\n\t\tthis.panelElement.style.setProperty(\n\t\t\t'--feedback-panel-text',\n\t\t\tthis.options.textColor\n\t\t);\n\t\tthis.panelElement.innerHTML = this._getPanelHTML();\n\n\t\tdocument.body.appendChild(this.panelElement);\n\t\tthis._attachPanelEvents();\n\n\t\tconst firstInput = this.panelElement.querySelector('input, textarea');\n\t\tif (firstInput) {\n\t\t\tsetTimeout(() => firstInput.focus(), 350);\n\t\t}\n\t}\n\n\t_getPanelHTML() {\n\t\treturn `\n <div class=\"feedback-panel-content\">\n<div class=\"feedback-panel-header\">\n <h3>Send Feedback</h3>\n <button class=\"sdk-close-btn\" type=\"button\" aria-label=\"Close\">\n <iconify-icon icon=\"ph:x\" 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\" 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\" 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 web chat 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\t// Reconnect indefinitely with capped exponential backoff. The\n\t\t// previous 5-attempt hard cap meant ~31s of churn on a flaky network\n\t\t// permanently killed the live-chat connection until page refresh —\n\t\t// the dominant \"messages don't arrive\" symptom in production.\n\t\tthis.reconnectBaseDelay = 1000;\n\t\tthis.reconnectMaxDelay = 30_000;\n\t\tthis.pingInterval = null;\n\t\tthis.isConnected = false;\n\n\t\t// Heartbeat watchdog. The browser's onclose/onerror only fires when\n\t\t// it notices the TCP socket is dead — on stalled-but-not-closed\n\t\t// connections (NAT timeouts, sleeping mobile, some intermediaries)\n\t\t// that can take many minutes. We track the wall-clock time of the\n\t\t// last received frame and force a reconnect if nothing arrives\n\t\t// within the timeout. Server's protocol-level pings come every 54s\n\t\t// (pkg/websocket/client.go pingPeriod) and our app-level pings/pongs\n\t\t// every 30s, so 90s catches a dead pipe with one cycle of headroom.\n\t\tthis.lastFrameAt = 0;\n\t\tthis.heartbeatTimeoutMs = 90_000;\n\t\tthis.heartbeatCheckIntervalMs = 15_000;\n\t\tthis.heartbeatInterval = null;\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\tthis._intentionallyClosed = false;\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/livechat/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._intentionallyClosed = true; // 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\tthis._stopHeartbeat();\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_startHeartbeat() {\n\t\tthis._stopHeartbeat();\n\t\tthis.lastFrameAt = Date.now();\n\t\tthis.heartbeatInterval = setInterval(() => {\n\t\t\tif (Date.now() - this.lastFrameAt > this.heartbeatTimeoutMs) {\n\t\t\t\tconsole.warn(\n\t\t\t\t\t`[WebSocket] No frames in ${this.heartbeatTimeoutMs}ms, forcing reconnect`\n\t\t\t\t);\n\t\t\t\t// Closing the socket fires onclose, which schedules a\n\t\t\t\t// reconnect through the normal path.\n\t\t\t\tthis._stopHeartbeat();\n\t\t\t\tif (this.ws) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tthis.ws.close();\n\t\t\t\t\t} catch (_) {\n\t\t\t\t\t\t// ignore\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, this.heartbeatCheckIntervalMs);\n\t}\n\n\t_stopHeartbeat() {\n\t\tif (this.heartbeatInterval) {\n\t\t\tclearInterval(this.heartbeatInterval);\n\t\t\tthis.heartbeatInterval = 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._intentionallyClosed = false;\n\t\tthis._startHeartbeat();\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\t// Any inbound frame counts as a sign of life for the watchdog —\n\t\t// including pongs, message:new, typing, etc.\n\t\tthis.lastFrameAt = Date.now();\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._stopHeartbeat();\n\n\t\tthis._emit('disconnected', { code: event.code, reason: event.reason });\n\t\t// Skip reconnect if disconnect() was called intentionally.\n\t\tif (!this._intentionallyClosed) {\n\t\t\tthis._scheduleReconnect();\n\t\t}\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._intentionallyClosed) return;\n\n\t\tthis.reconnectAttempts++;\n\t\tconst delay = Math.min(\n\t\t\tthis.reconnectBaseDelay * Math.pow(2, this.reconnectAttempts - 1),\n\t\t\tthis.reconnectMaxDelay\n\t\t);\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 function applyliveChatCustomStyles(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('product7-liveChat-custom-styles');\n\n\tif (!styleElement) {\n\t\tstyleElement = document.createElement('style');\n\t\tstyleElement.id = 'product7-liveChat-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-liveChat-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.liveChat-launcher-btn {\n\t\t\tbackground: ${primaryColor} !important;\n\t\t}\n\n\t\t.liveChat-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.liveChat-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.liveChat-nav-tab.active .liveChat-nav-icon,\n\t\t.liveChat-nav-tab.active .liveChat-nav-label {\n\t\t\tcolor: ${primaryColor} !important;\n\t\t}\n\n\t\t.liveChat-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.liveChat-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.liveChat-panel-content,\n\t\t.liveChat-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 liveChat-core.js */\n\t`;\n\n\tconsole.log('✅ Custom web chat styles applied:', { primaryColor, theme });\n}\n\nexport function removeliveChatCustomStyles() {\n\tconst styleElement = document.getElementById(\n\t\t'product7-liveChat-custom-styles'\n\t);\n\tif (styleElement && styleElement.parentNode) {\n\t\tstyleElement.parentNode.removeChild(styleElement);\n\t}\n}\n","/**\n * NotificationSound — plays a soft ping when a new agent message arrives.\n *\n * Default: the bundled notification-sound.mp3 (inlined as base64 at build time).\n * Falls back to a Web Audio API synthetic chime if the file was not bundled.\n * Override: pass `soundUrl` (MP3/OGG/WAV URL or base64 data URI) to use a different file.\n */\nimport BUNDLED_SOUND from './notificationSoundData.js';\n\nexport class NotificationSound {\n\tconstructor({ soundUrl = BUNDLED_SOUND, volume = 0.4 } = {}) {\n\t\tthis._soundUrl = soundUrl;\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t\tthis._enabled = true;\n\t\tthis._audioCtx = null;\n\t\tthis._audioBuffer = null;\n\t\tthis._loadPromise = null;\n\n\t\tif (soundUrl) {\n\t\t\tthis._loadPromise = this._loadAudioFile(soundUrl);\n\t\t}\n\t}\n\n\tsetEnabled(enabled) {\n\t\tthis._enabled = Boolean(enabled);\n\t}\n\n\tsetVolume(volume) {\n\t\tthis._volume = Math.min(1, Math.max(0, volume));\n\t}\n\n\tasync play() {\n\t\tif (!this._enabled) return;\n\t\tif (typeof window === 'undefined') return;\n\n\t\ttry {\n\t\t\tif (this._soundUrl) {\n\t\t\t\tawait this._playFile();\n\t\t\t} else {\n\t\t\t\tawait this._playSynthetic();\n\t\t\t}\n\t\t} catch {\n\t\t\t/* autoplay policy or context suspended — silent fail */\n\t\t}\n\t}\n\n\t// ── Private ────────────────────────────────────────────────────────────────\n\n\t_getAudioContext() {\n\t\tif (!this._audioCtx || this._audioCtx.state === 'closed') {\n\t\t\tconst AudioContext = window.AudioContext || window.webkitAudioContext;\n\t\t\tif (!AudioContext) return null;\n\t\t\tthis._audioCtx = new AudioContext();\n\t\t}\n\t\treturn this._audioCtx;\n\t}\n\n\t/**\n\t * Synthetic two-tone chime via Web Audio API — no file required.\n\t * • First tone: 880 Hz, 0–80 ms\n\t * • Second tone: 1100 Hz, 60–160 ms\n\t * Sounds like a gentle message ping.\n\t */\n\tasync _playSynthetic() {\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tawait ctx.resume();\n\t\t}\n\n\t\tconst now = ctx.currentTime;\n\t\tconst vol = this._volume;\n\n\t\tconst tones = [\n\t\t\t{ freq: 880, start: 0, end: 0.08 },\n\t\t\t{ freq: 1100, start: 0.06, end: 0.16 },\n\t\t];\n\n\t\ttones.forEach(({ freq, start, end }) => {\n\t\t\tconst osc = ctx.createOscillator();\n\t\t\tconst gain = ctx.createGain();\n\n\t\t\tosc.type = 'sine';\n\t\t\tosc.frequency.value = freq;\n\n\t\t\tgain.gain.setValueAtTime(0, now + start);\n\t\t\tgain.gain.linearRampToValueAtTime(vol, now + start + 0.01);\n\t\t\tgain.gain.linearRampToValueAtTime(0, now + end);\n\n\t\t\tosc.connect(gain);\n\t\t\tgain.connect(ctx.destination);\n\n\t\t\tosc.start(now + start);\n\t\t\tosc.stop(now + end + 0.01);\n\t\t});\n\t}\n\n\tasync _loadAudioFile(url) {\n\t\ttry {\n\t\t\tconst ctx = this._getAudioContext();\n\t\t\tif (!ctx) return;\n\n\t\t\tconst response = await fetch(url);\n\t\t\tconst arrayBuffer = await response.arrayBuffer();\n\t\t\tthis._audioBuffer = await ctx.decodeAudioData(arrayBuffer);\n\t\t} catch {\n\t\t\t/* failed to load — fall back to synthetic */\n\t\t\tthis._soundUrl = null;\n\t\t}\n\t}\n\n\tasync _playFile() {\n\t\tif (this._loadPromise) {\n\t\t\tawait this._loadPromise;\n\t\t\tthis._loadPromise = null;\n\t\t}\n\n\t\tif (!this._audioBuffer) {\n\t\t\tthis._playSynthetic();\n\t\t\treturn;\n\t\t}\n\n\t\tconst ctx = this._getAudioContext();\n\t\tif (!ctx) return;\n\n\t\tif (ctx.state === 'suspended') {\n\t\t\tawait ctx.resume();\n\t\t}\n\n\t\tconst source = ctx.createBufferSource();\n\t\tconst gain = ctx.createGain();\n\n\t\tsource.buffer = this._audioBuffer;\n\t\tgain.gain.value = this._volume;\n\n\t\tsource.connect(gain);\n\t\tgain.connect(ctx.destination);\n\t\tsource.start();\n\t}\n}\n","export default \"data:audio/mpeg;base64,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BeaJKOtqtegdfu08KKta9TmppaKVKbNRgAAdr/tXGB6CSCPl1Lelt7XW7T01ifVk2zjE1bLW839346gs//uAZPGAAtMh2Hn4GlhT52rfPeJdDAirVe28aaE2Dmr9tY0siLho4mUCDpWMFgQGgu42pLnLawWb/bpWNprQxluj9TNaXJSgOIMS1KzM0TRIAAAABFakEh3cgBQEGVwwSAstoCBiYpGhkVAplAwJmPAkYLCBkEDgYHpEhgdJRk+AeYkqaA6eReiyrxNIvmnxxStER14EjE2/9hljaO2siCoAhzKnpuRt269O0veD7Pq/uNbdzt6jfydzch/Kkpf1/dcqV6ta/y3Y1MWIft8iMqtZzUahrWPO71nqvG43fsROXu5Y3KZJGnRZbEH1clnOWX//OZ/+2WTnxeAH4ZfTSxQdl7ovLbXkoM0tW5UzXqqe3b9bPWP/+H7q59vrHa/P1WVuvIHDdeijc/LKqG114l3Joq5VSQSsRUcUBhEnmWs49v5f///////////////y/mff///////////////3Ad21LEZyZxNSU0SUaZb/+8Bk6AADBiBVfWGgCEbieq+nmAEjzhFJ+cyQBEdCKT85gkCgwCAAAAA6AP0AywXlGoy0hpYVBKCMGkNVAtKWyXWFQkQg10C3jJ4dCWsMS6ezji0j3yF6W6MVa5lLJbaXvIFSNMi8Vdp4aejr0kYgJ/IpLXJpq0lmN4S38scPty+3K4brc1En1pL+vzx/k/bwt3IYllNldscl0R/HlzH9/zJ2IEd+3kzt34vWlVWVWqbn5Z/njz8O/+aXAXCHDZovNNc0AZypebBMlXypavJwV2u4yFL1vG4qA//93+9d/ff/Fg5dCKWEFHZcd41TwOim499QNk7qNZnHhm2uvA4NA5XIelTssq//5////////////////KFL24Op////////////////I3ifN9VM55RBBXv+tQAA8aAYzpLaSOxTi1EgJ6SJFPyUphVqcwGS1LvW/Hx+27zX1/f7Y2w5rdPTwuJkLERYGnMZHg0LksCgqGoKvEWkqYTKtOnRLvoGgFPadXgqdiKxbu2ws92sNCIOHN0xkAtG+saAAuK4rNZxyl0v8x2rfuXaCm7ruwZLSEFAQkKru7B2WMZy0qeUZjNZr5eXDP+8VVSOR/5cly6S3120bi5SXY5P/1/U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\";\n","export class LiveChatState {\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\t\tthis.startButtonText = options.startButtonText || 'Send us a message';\n\t\tthis.showAvatars = options.showAvatars !== false;\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\t\tthis.homeModuleEnabled = options.homeModuleEnabled !== false;\n\t\tthis.messagesModuleEnabled = options.messagesModuleEnabled !== false;\n\n\t\tthis.requireEmailBeforeChat = options.requireEmailBeforeChat || false;\n\t\tthis.allowAttachments = options.allowAttachments !== false;\n\t\tthis.allowEmoji = options.allowEmoji !== false;\n\t\tthis.showReplyTime = options.showReplyTime !== 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.businessHoursState = options.businessHoursState || null;\n\t\tthis.nextOpenAt = options.nextOpenAt || null;\n\t\tthis.holidayName = options.holidayName || null;\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 LiveChatLauncher {\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 = `liveChat-launcher liveChat-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=\"liveChat-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=\"liveChat-launcher-btn\" aria-label=\"Open live chat\">\n <span class=\"liveChat-launcher-icon liveChat-launcher-icon-chat\">\n <iconify-icon icon=\"ph:chats-circle\" width=\"24\" height=\"24\"></iconify-icon>\n </span>\n <span class=\"liveChat-launcher-icon liveChat-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('.liveChat-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('.liveChat-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('.liveChat-launcher-icon-chat');\n\t\tconst closeIcon = this.element.querySelector(\n\t\t\t'.liveChat-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('liveChat-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('liveChat-launcher-open');\n\t\t}\n\t}\n\n\t_updateBadge() {\n\t\tconst existingBadge = this.element.querySelector(\n\t\t\t'.liveChat-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 = 'liveChat-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('.liveChat-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 = 'liveChat-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} else if (type === 'settingsUpdate') {\n\t\t\t\tthis._updateContent();\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\n\t\tif (this.state.homeModuleEnabled !== false) {\n\t\t\ttabs.push({ id: 'home', label: 'Home', icon: 'ph:house-simple' });\n\t\t}\n\n\t\tif (this.state.messagesModuleEnabled !== false) {\n\t\t\ttabs.push({\n\t\t\t\tid: 'messages',\n\t\t\t\tlabel: 'Messages',\n\t\t\t\ticon: 'ph:chats',\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' });\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',\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=\"liveChat-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=\"liveChat-nav-tab ${isActive ? 'active' : ''}\" data-tab=\"${tab.id}\">\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-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=\"liveChat-nav-tabs\">\n\t\t\t\t${tabsHtml}\n\t\t\t</div>\n\t\t\t<div class=\"liveChat-nav-footer\">\n\t\t\t\t<a href=\"https://product7.io\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"liveChat-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('.liveChat-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('.liveChat-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('.liveChat-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 = 'liveChat-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 LiveChatPanel {\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\tthis._expanded = false;\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 = `liveChat-panel liveChat-panel-${this.options.position}`;\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-panel-content\">\n\t\t\t\t<div class=\"liveChat-panel-views\"></div>\n\t\t\t\t<div class=\"liveChat-panel-nav\"></div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis.options.onToggleExpand = () => this._toggleExpand();\n\t\tthis.options.isExpanded = () => this._expanded;\n\n\t\tthis.navigationTabs = new NavigationTabs(this.state, this.options);\n\t\tconst navContainer = this.element.querySelector('.liveChat-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_toggleExpand() {\n\t\tthis._expanded = !this._expanded;\n\t\tthis.element.classList.toggle('liveChat-panel-expanded', this._expanded);\n\n\t\tconst menuIcon = this.element.querySelector(\n\t\t\t'.liveChat-expand-window-btn iconify-icon'\n\t\t);\n\t\tconst menuLabel = this.element.querySelector(\n\t\t\t'.liveChat-expand-window-btn span'\n\t\t);\n\t\tif (menuIcon)\n\t\t\tmenuIcon.setAttribute(\n\t\t\t\t'icon',\n\t\t\t\tthis._expanded ? 'ph:arrows-in' : 'ph:arrows-out'\n\t\t\t);\n\t\tif (menuLabel)\n\t\t\tmenuLabel.textContent = this._expanded\n\t\t\t\t? 'Collapse window'\n\t\t\t\t: 'Expand window';\n\t}\n\n\t_renderCurrentView() {\n\t\tconst viewsContainer = this.element.querySelector('.liveChat-panel-views');\n\t\tconst navContainer = this.element.querySelector('.liveChat-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\t// Collapse expanded state when leaving chat view\n\t\tif (this.state.currentView !== 'chat' && this._expanded) {\n\t\t\tthis._expanded = false;\n\t\t\tthis.element.classList.remove('liveChat-panel-expanded');\n\t\t}\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=\"liveChat-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, prechat and feedback 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\t\tthis.state.currentView === 'feedback';\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('.liveChat-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 = 'liveChat-view liveChat-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=\"liveChat-changelog-header\">\n\t\t\t\t<div class=\"liveChat-changelog-header-top\">\n\t\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn liveChat-changelog-close-btn liveChat-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=\"liveChat-changelog-body\">\n\t\t\t\t<div class=\"liveChat-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'.liveChat-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=\"liveChat-changelog-card\" data-changelog-id=\"${item.id}\">\n\t\t\t\t${item.coverImage ? `<div class=\"liveChat-changelog-thumb\"><img src=\"${item.coverImage}\" alt=\"${item.title}\" onerror=\"this.parentElement.style.display='none';\" /></div>` : ''}\n\t\t\t\t<div class=\"liveChat-changelog-content\">\n\t\t\t\t\t<h3 class=\"liveChat-changelog-title\">${item.title}</h3>\n\t\t\t\t\t${item.description ? `<p class=\"liveChat-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=\"liveChat-empty-state\">\n\t\t\t\t<div class=\"liveChat-empty-state-icon\">\n\t\t\t\t\t<iconify-icon icon=\"ph:megaphone\" 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'.liveChat-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('.liveChat-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\tthis._menuOutsideHandler = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'liveChat-view liveChat-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'.liveChat-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} else if (type === 'settingsUpdate') {\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\" width=\"20\" height=\"20\"></iconify-icon>`;\n\n\t\tconst isExpanded = this.options.isExpanded?.() ?? false;\n\t\tconst expandIcon = isExpanded ? 'ph:arrows-in' : 'ph:arrows-out';\n\t\tconst expandLabel = isExpanded ? 'Collapse window' : 'Expand window';\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-chat-header\">\n\t\t\t\t<button class=\"sdk-btn-icon liveChat-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=\"liveChat-chat-header-avatar\">\n\t\t\t\t\t${headerAvatarHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"liveChat-chat-header-info\">\n\t\t\t\t\t<span class=\"liveChat-chat-title\">${this._escapeHtml(teamName)}</span>\n\t\t\t\t\t${isClosed || this.state.showReplyTime !== false ? `<span class=\"liveChat-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=\"liveChat-chat-header-actions\">\n\t\t\t\t\t<div class=\"liveChat-chat-menu-wrapper\">\n\t\t\t\t\t\t<button class=\"sdk-btn-icon liveChat-chat-menu-btn\" aria-label=\"Options\">\n\t\t\t\t\t\t\t<iconify-icon icon=\"ph:dots-three\" width=\"20\" height=\"20\"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class=\"liveChat-chat-menu-dropdown\">\n\t\t\t\t\t\t\t<button class=\"liveChat-chat-menu-item liveChat-expand-window-btn\">\n\t\t\t\t\t\t\t\t<iconify-icon icon=\"${expandIcon}\" width=\"16\" height=\"16\"></iconify-icon>\n\t\t\t\t\t\t\t\t<span>${expandLabel}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"sdk-btn-icon sdk-close-btn liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-closed-banner\">\n\t\t\t\t\t<iconify-icon icon=\"ph:check-circle\" 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=\"liveChat-typing-indicator\">\n\t\t\t\t\t<div class=\"liveChat-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=\"liveChat-typing-text\"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class=\"liveChat-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=\"liveChat-compose-attachments-preview\"></div>\n\n\t\t\t<div class=\"liveChat-chat-compose\">\n\t\t\t\t<div class=\"liveChat-compose-input-wrapper\">\n\t\t\t\t\t<textarea class=\"liveChat-compose-input\" placeholder=\"${placeholder}\" rows=\"1\"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"liveChat-compose-bottom\">\n\t\t\t\t\t<div class=\"liveChat-compose-actions\">\n\t\t\t\t\t\t${this.state.allowAttachments !== false ? `<button class=\"sdk-btn-icon liveChat-compose-attach\" aria-label=\"Attach file\"><iconify-icon icon=\"ph:paperclip\" width=\"20\" height=\"20\"></iconify-icon></button>` : ''}\n\t\t\t\t\t\t${this.state.allowEmoji !== false ? `<button class=\"sdk-btn-icon liveChat-emoji-btn\" aria-label=\"Emoji\"><iconify-icon icon=\"ph:smiley\" width=\"20\" height=\"20\"></iconify-icon></button>` : ''}\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class=\"liveChat-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${this.state.allowAttachments !== false ? `<input type=\"file\" class=\"liveChat-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'.liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-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\" 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=\"liveChat-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? 'liveChat-message-own'\n\t\t\t: 'liveChat-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=\"liveChat-message-content\">${this._formatMessageContent(message.content)}</div>`\n\t\t\t: '';\n\t\tconst bubbleHtml = contentHtml\n\t\t\t? `<div class=\"liveChat-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=\"liveChat-message-meta liveChat-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=\"liveChat-message-sent-status\">Sending…</span>`\n\t\t\t\t\t\t\t\t: `<span class=\"liveChat-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=\"liveChat-message ${messageClass}${isOptimistic ? ' liveChat-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=\"liveChat-message ${messageClass}\">\n\t\t\t\t<div class=\"liveChat-message-row\">\n\t\t\t\t\t<div class=\"liveChat-message-avatar\">${avatarHtml}</div>\n\t\t\t\t\t<div class=\"liveChat-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=\"liveChat-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=\"liveChat-message-system-event\">\n\t\t\t\t\t<div class=\"liveChat-message-system-event-avatar\">${logoHtml}</div>\n\t\t\t\t\t<span class=\"liveChat-message-system-event-name\">${this._escapeHtml(name)}</span>\n\t\t\t\t\t<span class=\"liveChat-message-system-event-action\">${this._escapeHtml(action)}</span>\n\t\t\t\t\t${timeStr ? `<span class=\"liveChat-message-system-event-time\">${timeStr}</span>` : ''}\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\t// Render automated/bot messages as a proper received chat bubble\n\t\tconst teamName = this.state.teamName || 'Support';\n\t\tconst logoUrl = this.options.logoUrl;\n\t\tconst avatarHtml = logoUrl\n\t\t\t? `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${this._escapeHtml(logoUrl)}\" alt=\"${this._escapeHtml(teamName)}\" /></div>`\n\t\t\t: `<div class=\"sdk-avatar sdk-avatar-sm\">${teamName.charAt(0).toUpperCase()}</div>`;\n\t\tconst timeStr = this._formatMessageTime(message.timestamp);\n\n\t\treturn `\n\t\t\t<div class=\"liveChat-message liveChat-message-received\">\n\t\t\t\t<div class=\"liveChat-message-row\">\n\t\t\t\t\t<div class=\"liveChat-message-avatar\">${avatarHtml}</div>\n\t\t\t\t\t<div class=\"liveChat-message-wrapper\">\n\t\t\t\t\t\t<div class=\"liveChat-message-bubble\">\n\t\t\t\t\t\t\t<div class=\"liveChat-message-content\">${this._formatMessageContent(content)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${timeStr ? `<div class=\"liveChat-message-meta\"><span>${timeStr}</span></div>` : ''}\n\t\t\t</div>\n\t\t`;\n\t}\n\n\t_renderSenderAvatar(sender) {\n\t\tif (sender?.avatarUrl) {\n\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\"><img src=\"${sender.avatarUrl}\" alt=\"${sender.name}\" /></div>`;\n\t\t}\n\t\tconst initial = (sender?.name || 'S').charAt(0).toUpperCase();\n\t\treturn `<div class=\"sdk-avatar sdk-avatar-sm\">${initial}</div>`;\n\t}\n\n\t_renderTeamAvatars() {\n\t\tconst avatars = this.state.teamAvatars;\n\t\tif (!avatars || avatars.length === 0) {\n\t\t\treturn '';\n\t\t}\n\n\t\tconst avatarItems = avatars\n\t\t\t.slice(0, 3)\n\t\t\t.map((avatar) => {\n\t\t\t\tif (typeof avatar === 'string' && avatar.startsWith('http')) {\n\t\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\"><img src=\"${avatar}\" alt=\"Team member\" /></div>`;\n\t\t\t\t}\n\t\t\t\treturn `<div class=\"sdk-avatar sdk-avatar-md\">${avatar.charAt(0).toUpperCase()}</div>`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\treturn `<div class=\"liveChat-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, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\\n/g, '<br>');\n\t}\n\n\t_appendMessage(message) {\n\t\tconst messagesContainer = this.element.querySelector(\n\t\t\t'.liveChat-chat-messages'\n\t\t);\n\t\tconst emptyState = messagesContainer.querySelector('.liveChat-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('.liveChat-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'.liveChat-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'.liveChat-chat-messages'\n\t\t);\n\t\tconst pill = this.element.querySelector('.liveChat-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('.liveChat-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.liveChat-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'.liveChat-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=\"liveChat-attachment-thumb\" src=\"${att.preview}\" alt=\"${this._escapeHtml(att.file.name)}\" />`\n\t\t\t\t\t: `<div class=\"liveChat-attachment-thumb liveChat-attachment-file-icon\"><iconify-icon icon=\"ph:file\" width=\"24\" height=\"24\"></iconify-icon></div>`;\n\t\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-attachment-preview\" data-index=\"${i}\">\n\t\t\t\t\t${thumb}\n\t\t\t\t\t<button class=\"liveChat-attachment-remove\" data-index=\"${i}\" aria-label=\"Remove\">&times;</button>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t\t})\n\t\t\t.join('');\n\n\t\tcontainer.querySelectorAll('.liveChat-attachment-remove').forEach((btn) => {\n\t\t\tbtn.addEventListener('click', (e) => {\n\t\t\t\tconst idx = parseInt(e.currentTarget.dataset.index, 10);\n\t\t\t\tthis._pendingAttachments.splice(idx, 1);\n\t\t\t\tthis._renderAttachmentPreviews();\n\t\t\t\tthis._updateSendButtonState();\n\t\t\t});\n\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element\n\t\t\t.querySelector('.liveChat-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'.liveChat-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 menuBtn = this.element.querySelector('.liveChat-chat-menu-btn');\n\t\tconst dropdown = this.element.querySelector('.liveChat-chat-menu-dropdown');\n\t\tif (menuBtn && dropdown) {\n\t\t\tmenuBtn.addEventListener('click', (e) => {\n\t\t\t\te.stopPropagation();\n\t\t\t\tdropdown.classList.toggle('open');\n\t\t\t\tif (\n\t\t\t\t\tdropdown.classList.contains('open') &&\n\t\t\t\t\tthis._menuOutsideHandler === null\n\t\t\t\t) {\n\t\t\t\t\tthis._menuOutsideHandler = (ev) => {\n\t\t\t\t\t\tif (!dropdown.contains(ev.target) && !menuBtn.contains(ev.target)) {\n\t\t\t\t\t\t\tdropdown.classList.remove('open');\n\t\t\t\t\t\t\tdocument.removeEventListener('click', this._menuOutsideHandler);\n\t\t\t\t\t\t\tthis._menuOutsideHandler = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tsetTimeout(\n\t\t\t\t\t\t() => document.addEventListener('click', this._menuOutsideHandler),\n\t\t\t\t\t\t0\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tconst expandWindowBtn = this.element.querySelector(\n\t\t\t'.liveChat-expand-window-btn'\n\t\t);\n\t\tif (expandWindowBtn && dropdown) {\n\t\t\texpandWindowBtn.addEventListener('click', () => {\n\t\t\t\tdropdown.classList.remove('open');\n\t\t\t\tif (this._menuOutsideHandler) {\n\t\t\t\t\tdocument.removeEventListener('click', this._menuOutsideHandler);\n\t\t\t\t\tthis._menuOutsideHandler = null;\n\t\t\t\t}\n\t\t\t\tthis.options.onToggleExpand?.();\n\t\t\t});\n\t\t}\n\n\t\tconst input = this.element.querySelector('.liveChat-compose-input');\n\t\tconst sendBtn = this.element.querySelector('.liveChat-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('.liveChat-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('.liveChat-compose-attach');\n\t\tconst fileInput = this.element.querySelector(\n\t\t\t'.liveChat-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'.liveChat-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('.liveChat-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('.liveChat-message-image');\n\t\t\t\tif (img) {\n\t\t\t\t\tconst url = img.dataset.url || img.src;\n\t\t\t\t\twindow.open(url, '_blank');\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync _downloadFile(url, name) {\n\t\ttry {\n\t\t\tconst response = await fetch(url);\n\t\t\tconst blob = await response.blob();\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement('a');\n\t\t\ta.href = blobUrl;\n\t\t\ta.download = name || 'download';\n\t\t\ta.style.display = 'none';\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\tdocument.body.removeChild(a);\n\t\t\tURL.revokeObjectURL(blobUrl);\n\t\t} catch {\n\t\t\twindow.open(url, '_blank');\n\t\t}\n\t}\n\n\t_escapeHtml(text) {\n\t\tif (!text) return '';\n\t\treturn text\n\t\t\t.replace(/&/g, '&amp;')\n\t\t\t.replace(/</g, '&lt;')\n\t\t\t.replace(/>/g, '&gt;')\n\t\t\t.replace(/\"/g, '&quot;');\n\t}\n\n\tasync _sendMessage() {\n\t\tif (this._isConversationClosed) return;\n\n\t\tconst input = this.element.querySelector('.liveChat-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'.liveChat-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 = 'liveChat-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('.liveChat-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('.liveChat-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('.liveChat-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'.liveChat-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._menuOutsideHandler) {\n\t\t\tdocument.removeEventListener('click', this._menuOutsideHandler);\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 = 'liveChat-view liveChat-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=\"liveChat-empty-state\">\n <div class=\"liveChat-empty-state-icon\">\n <iconify-icon icon=\"ph:chat-circle\" 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=\"liveChat-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=\"liveChat-conversations-header\">\n <h2>Messages</h2>\n <button class=\"sdk-close-btn liveChat-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=\"liveChat-conversations-body\">\n ${conversationsHtml}\n </div>\n\n <div class=\"liveChat-conversations-footer\">\n <button class=\"liveChat-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=\"liveChat-conversation-item ${unreadClass} ${closedClass}\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"liveChat-conversation-avatars\">\n\t\t\t\t\t${avatarsHtml}\n\t\t\t\t</div>\n\t\t\t\t<div class=\"liveChat-conversation-content\">\n\t\t\t\t\t<div class=\"liveChat-conversation-header\">\n\t\t\t\t\t\t<span class=\"liveChat-conversation-title\">${conversation.title || 'Chat with team'}</span>\n\t\t\t\t\t\t<span class=\"liveChat-conversation-time\">${timeAgo}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"liveChat-conversation-preview\">\n\t\t\t\t\t\t${conversation.unread > 0 ? '<span class=\"liveChat-unread-dot\"></span>' : ''}\n\t\t\t\t\t\t${isClosed ? '<span class=\"liveChat-conversation-resolved-badge\">Resolved</span>' : ''}\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-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=\"liveChat-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('.liveChat-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('.liveChat-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 = 'liveChat-view liveChat-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=\"liveChat-help-header\">\n\t\t\t\t<div class=\"liveChat-help-header-top\">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class=\"sdk-close-btn liveChat-help-close-btn liveChat-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=\"liveChat-help-search-wrap\">\n\t\t\t\t\t<span class=\"liveChat-help-search-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:magnifying-glass\" 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=\"liveChat-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=\"liveChat-help-body\">\n\t\t\t\t<div class=\"liveChat-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('.liveChat-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=\"liveChat-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=\"liveChat-help-collection-avatar liveChat-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=\"liveChat-help-collection-icon\">${icon}</span>`;\n\t\t}\n\n\t\tif (icon.startsWith('ph:')) {\n\t\t\treturn `<span class=\"liveChat-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=\"liveChat-help-collection-icon\">\n\t\t\t<iconify-icon icon=\"ph:book-open\"></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=\"liveChat-help-collection\" data-collection-id=\"${collection.id}\">\n\t\t\t\t${this._resolveCollectionIcon(collection.icon)}\n\t\t\t\t<div class=\"liveChat-help-collection-content\">\n\t\t\t\t\t<div class=\"liveChat-help-collection-title\">${collection.title}</div>\n\t\t\t\t\t${collection.description ? `<p class=\"liveChat-help-collection-desc\">${collection.description}</p>` : ''}\n\t\t\t\t\t<div class=\"liveChat-help-collection-meta\">\n\t\t\t\t\t\t${this._renderAuthorAvatar(collection)}\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-empty-state\">\n\t\t\t\t\t<div class=\"liveChat-empty-state-icon\">\n\t\t\t\t\t\t<iconify-icon icon=\"ph:magnifying-glass\" 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=\"liveChat-empty-state\">\n\t\t\t\t<div class=\"liveChat-empty-state-icon\">\n\t\t\t\t\t<iconify-icon icon=\"ph:books\" 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'.liveChat-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'.liveChat-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('.liveChat-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 = 'liveChat-view liveChat-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\ttype === 'settingsUpdate'\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 isUnavailable = this.state.businessHoursState === 'offline' || this.state.businessHoursState === 'away';\n\t\tconst avatarsHtml = (this.state.showAvatars && !isUnavailable) ? this._renderAvatarStack() : '';\n\t\tconst recentChangelogHtml = this._renderRecentChangelog();\n\t\tconst availabilityHtml = this._renderAvailabilityStatus();\n\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-home-scroll\">\n\t\t\t\t<div class=\"liveChat-home-header\">\n\t\t\t\t\t<div class=\"liveChat-home-header-top\">\n\t\t\t\t\t\t<div class=\"liveChat-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=\"liveChat-home-avatars\">${avatarsHtml || availabilityHtml}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class=\"liveChat-home-welcome\">\n\t\t\t\t\t\t<span class=\"liveChat-home-greeting\">${this.state.greetingMessage}</span>\n\t\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-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=\"liveChat-avatar-stack\">${avatarItems}</div>`;\n\t}\n\n\t_renderAvailabilityStatus() {\n\t\tconst businessState = this.state.businessHoursState;\n\n\t\tif (businessState === 'offline') {\n\t\t\tlet offlineText = \"We're currently closed\";\n\t\t\tif (this.state.holidayName) {\n\t\t\t\tofflineText = `Closed for ${this.state.holidayName}`;\n\t\t\t} else if (this.state.nextOpenAt) {\n\t\t\t\tconst opens = new Date(this.state.nextOpenAt);\n\t\t\t\tconst now = new Date();\n\t\t\t\tconst diffHours = Math.round((opens - now) / 3600000);\n\t\t\t\tofflineText = diffHours < 24\n\t\t\t\t\t? `Opens in ${diffHours}h`\n\t\t\t\t\t: `Opens ${opens.toLocaleDateString('en-US', { weekday: 'short', hour: 'numeric', hour12: true })}`;\n\t\t\t}\n\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-home-availability\">\n\t\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-away\"></span>\n\t\t\t\t\t<span class=\"liveChat-availability-text\">${offlineText}</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (businessState === 'away') {\n\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-home-availability\">\n\t\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-away\"></span>\n\t\t\t\t\t<span class=\"liveChat-availability-text\">We're currently away</span>\n\t\t\t\t</div>\n\t\t\t`;\n\t\t}\n\n\t\tif (this.state.agentsOnline) {\n\t\t\treturn `\n\t\t\t\t<div class=\"liveChat-home-availability\">\n\t\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-online\"></span>\n\t\t\t\t\t<span class=\"liveChat-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=\"liveChat-home-availability\">\n\t\t\t\t<span class=\"liveChat-availability-dot liveChat-availability-away\"></span>\n\t\t\t\t<span class=\"liveChat-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 isUnavailable = this.state.businessHoursState === 'offline' || this.state.businessHoursState === 'away';\n\t\tconst buttonLabel = isUnavailable ? 'Leave us a message' : this.state.startButtonText;\n\t\tconst buttonSubtext = isUnavailable\n\t\t\t? \"We'll get back to you when we're back\"\n\t\t\t: (this.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=\"liveChat-home-message-btn\">\n\t\t\t\t<div class=\"liveChat-home-continue-info\">\n\t\t\t\t\t<span class=\"liveChat-home-continue-label\">${buttonLabel}</span>\n\t\t\t\t\t<span class=\"liveChat-home-message-subtext\">${buttonSubtext}</span>\n\t\t\t\t</div>\n\t\t\t\t${sendIcon}\n\t\t\t</button>\n\t\t\t<button class=\"liveChat-home-message-btn liveChat-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=\"liveChat-home-recent-avatar liveChat-home-recent-avatar-logo\"><img src=\"${logoUrl}\" alt=\"${teamName}\" /></div>`\n\t\t\t: `<div class=\"liveChat-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=\"liveChat-home-recent-card\" data-conversation-id=\"${conversation.id}\">\n\t\t\t\t<div class=\"liveChat-home-recent-card-label\">Recent message</div>\n\t\t\t\t<div class=\"liveChat-home-recent-card-row\">\n\t\t\t\t\t${logoHtml}\n\t\t\t\t\t<div class=\"liveChat-home-recent-card-content\">\n\t\t\t\t\t\t<div class=\"liveChat-home-recent-card-header\">\n\t\t\t\t\t\t\t<span class=\"liveChat-home-recent-card-name\">${title}</span>\n\t\t\t\t\t\t\t<span class=\"liveChat-home-recent-card-time\">${timeAgo}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"liveChat-home-recent-card-preview\">\n\t\t\t\t\t\t\t<span class=\"liveChat-home-recent-card-message\">${preview}</span>\n\t\t\t\t\t\t\t${hasUnread ? '<span class=\"liveChat-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=\"liveChat-home-featured\">\n\t\t\t\t${imageUrl ? `<img src=\"${imageUrl}\" alt=\"${title}\" class=\"liveChat-home-featured-image\" onerror=\"this.style.display='none';\" />` : ''}\n\t\t\t\t<div class=\"liveChat-home-featured-divider\"></div>\n\t\t\t\t<div class=\"liveChat-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 liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-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=\"liveChat-home-changelog-card-content\">\n\t\t\t\t\t<h4 class=\"liveChat-home-changelog-card-title\">${item.title}</h4>\n\t\t\t\t\t<p class=\"liveChat-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=\"liveChat-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('.liveChat-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'.liveChat-home-message-btn:not(.liveChat-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('.liveChat-feedback-btn');\n\t\tif (feedbackBtn) {\n\t\t\tfeedbackBtn.addEventListener('click', () => {\n\t\t\t\tthis.state.setView('feedback');\n\t\t\t});\n\t\t}\n\n\t\tthis.element\n\t\t\t.querySelectorAll('.liveChat-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'.liveChat-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'.liveChat-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 FeedbackFormView {\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\tthis._selectedRating = null;\n\t}\n\n\trender() {\n\t\tthis.element = document.createElement('div');\n\t\tthis.element.className = 'liveChat-view liveChat-feedback-view';\n\t\tthis._renderForm();\n\t\treturn this.element;\n\t}\n\n\t_renderForm() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-feedback-header\">\n\t\t\t\t<button class=\"sdk-btn-icon liveChat-feedback-back-btn\">\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<span class=\"liveChat-feedback-title\">Leave us feedback</span>\n\t\t\t</div>\n\t\t\t<div class=\"liveChat-feedback-body\">\n\t\t\t\t<p class=\"liveChat-feedback-prompt\">Share your thoughts with us. We read every message.</p>\n\t\t\t\t<input\n\t\t\t\t\ttype=\"text\"\n\t\t\t\t\tclass=\"liveChat-feedback-input\"\n\t\t\t\t\tplaceholder=\"Title\"\n\t\t\t\t/>\n\t\t\t\t<textarea\n\t\t\t\t\tclass=\"liveChat-feedback-textarea\"\n\t\t\t\t\tplaceholder=\"Your feedback...\"\n\t\t\t\t\trows=\"5\"\n\t\t\t\t></textarea>\n\t\t\t\t<button class=\"liveChat-feedback-submit\">Send feedback</button>\n\t\t\t</div>\n\t\t`;\n\t\tthis._attachEvents();\n\t}\n\n\t_renderThankYou() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-feedback-header\">\n\t\t\t\t<button class=\"sdk-btn-icon liveChat-feedback-back-btn\">\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<span class=\"liveChat-feedback-title\">Leave us feedback</span>\n\t\t\t</div>\n\t\t\t<div class=\"liveChat-feedback-thankyou\">\n\t\t\t\t<span class=\"liveChat-feedback-thankyou-emoji\">🙏</span>\n\t\t\t\t<h3>Thanks for your feedback!</h3>\n\t\t\t\t<p>We appreciate you taking the time to share your thoughts.</p>\n\t\t\t\t<button class=\"liveChat-feedback-done-btn\">Done</button>\n\t\t\t</div>\n\t\t`;\n\t\tthis.element.querySelector('.liveChat-feedback-back-btn').addEventListener('click', () => {\n\t\t\tthis.state.setView('home');\n\t\t});\n\t\tthis.element.querySelector('.liveChat-feedback-done-btn').addEventListener('click', () => {\n\t\t\tthis.state.setView('home');\n\t\t});\n\t}\n\n\t_attachEvents() {\n\t\tthis.element.querySelector('.liveChat-feedback-back-btn').addEventListener('click', () => {\n\t\t\tthis.state.setView('home');\n\t\t});\n\n\t\tconst submitBtn = this.element.querySelector('.liveChat-feedback-submit');\n\t\tsubmitBtn.addEventListener('click', async () => {\n\t\t\tif (this._isSubmitting) return;\n\t\t\tconst title = this.element.querySelector('.liveChat-feedback-input').value.trim();\n\t\t\tconst message = this.element.querySelector('.liveChat-feedback-textarea').value.trim();\n\t\t\tawait this._submit(title, message);\n\t\t});\n\t}\n\n\tasync _submit(title, message) {\n\t\tthis._isSubmitting = true;\n\t\tconst submitBtn = this.element.querySelector('.liveChat-feedback-submit');\n\t\tif (submitBtn) {\n\t\t\tsubmitBtn.disabled = true;\n\t\t\tsubmitBtn.textContent = 'Sending...';\n\t\t}\n\n\t\ttry {\n\t\t\tif (this.options.onSubmitFeedback) {\n\t\t\t\tawait this.options.onSubmitFeedback({ title, message });\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tconsole.warn('[FeedbackFormView] Submit error:', e);\n\t\t}\n\n\t\tthis._renderThankYou();\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","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 = 'liveChat-view liveChat-prechat-view';\n\t\tthis._updateContent();\n\t\treturn this.element;\n\t}\n\n\t_updateContent() {\n\t\tthis.element.innerHTML = `\n\t\t\t<div class=\"liveChat-prechat-overlay\">\n\t\t\t\t<div class=\"liveChat-prechat-card\">\n\t\t\t\t\t<h4 class=\"liveChat-prechat-title\">Before we continue</h4>\n\t\t\t\t\t<p class=\"liveChat-prechat-subtitle\">Enter your details so we can get back to you.</p>\n\t\t\t\t\t<form class=\"liveChat-prechat-form\" novalidate>\n\t\t\t\t\t\t<div class=\"liveChat-prechat-field\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\tname=\"name\"\n\t\t\t\t\t\t\t\tclass=\"liveChat-prechat-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"Your name\"\n\t\t\t\t\t\t\t\tautocomplete=\"name\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"liveChat-prechat-field\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"email\"\n\t\t\t\t\t\t\t\tname=\"email\"\n\t\t\t\t\t\t\t\tclass=\"liveChat-prechat-input\"\n\t\t\t\t\t\t\t\tplaceholder=\"Your email address\"\n\t\t\t\t\t\t\t\tautocomplete=\"email\"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class=\"liveChat-prechat-error\" style=\"display:none;\"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button type=\"submit\" class=\"liveChat-prechat-submit\">\n\t\t\t\t\t\t\tStart chat\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`;\n\n\t\tthis._attachEvents();\n\t}\n\n\t_attachEvents() {\n\t\tconst form = this.element.querySelector('.liveChat-prechat-form');\n\t\tform.addEventListener('submit', async (e) => {\n\t\t\te.preventDefault();\n\t\t\tawait this._handleSubmit();\n\t\t});\n\t}\n\n\tasync _handleSubmit() {\n\t\tif (this._isSubmitting) return;\n\n\t\tconst emailInput = this.element.querySelector('input[name=\"email\"]');\n\t\tconst nameInput = this.element.querySelector('input[name=\"name\"]');\n\t\tconst errorEl = this.element.querySelector('.liveChat-prechat-error');\n\t\tconst submitBtn = this.element.querySelector('.liveChat-prechat-submit');\n\n\t\tconst email = emailInput.value.trim();\n\t\tconst name = nameInput.value.trim();\n\n\t\tif (!email || !/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email)) {\n\t\t\terrorEl.textContent = 'Please enter a valid email address.';\n\t\t\terrorEl.style.display = 'block';\n\t\t\temailInput.focus();\n\t\t\treturn;\n\t\t}\n\n\t\terrorEl.style.display = 'none';\n\t\tthis._isSubmitting = true;\n\t\tsubmitBtn.disabled = true;\n\t\tsubmitBtn.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\tif (this.options.onIdentifyContact) {\n\t\t\t\tawait this.options.onIdentifyContact({\n\t\t\t\t\tname: name || undefined,\n\t\t\t\t\temail,\n\t\t\t\t});\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\terrorEl.textContent = 'Something went wrong. Please try again.';\n\t\t\terrorEl.style.display = 'block';\n\t\t\tthis._isSubmitting = false;\n\t\t\tsubmitBtn.disabled = false;\n\t\t\tsubmitBtn.textContent = 'Start chat';\n\t\t}\n\t}\n\n\tdestroy() {\n\t\tif (this.element && this.element.parentNode) {\n\t\t\tthis.element.parentNode.removeChild(this.element);\n\t\t}\n\t}\n}\n","import { WebSocketService } from '../core/WebSocketService.js';\nimport {\n\tapplyliveChatCustomStyles,\n\tremoveliveChatCustomStyles,\n} from '../styles/liveChatCustomStyles.js';\nimport { NotificationSound } from '../utils/NotificationSound.js';\nimport { BaseWidget } from './BaseWidget.js';\nimport { LiveChatState } from './liveChat/LiveChatState.js';\nimport { LiveChatLauncher } from './liveChat/components/LiveChatLauncher.js';\nimport { LiveChatPanel } from './liveChat/components/LiveChatPanel.js';\nimport { ChangelogView } from './liveChat/views/ChangelogView.js';\nimport { ChatView } from './liveChat/views/ChatView.js';\nimport { ConversationsView } from './liveChat/views/ConversationsView.js';\nimport { HelpView } from './liveChat/views/HelpView.js';\nimport { HomeView } from './liveChat/views/HomeView.js';\nimport { FeedbackFormView } from './liveChat/views/FeedbackFormView.js';\nimport { PreChatFormView } from './liveChat/views/PreChatFormView.js';\n\nexport class LiveChatWidget extends BaseWidget {\n\tconstructor(options) {\n\t\tsuper({ ...options, type: 'liveChat' });\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.liveChatOptions = {\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\tconst sdkMetadata = this.sdk?.apiService?.getMetadata() || null;\n\n\t\tthis.LiveChatState = new LiveChatState({\n\t\t\tteamName: this.liveChatOptions.teamName,\n\t\t\tteamAvatars: this.liveChatOptions.teamAvatars,\n\t\t\tgreetingMessage: this.liveChatOptions.greetingMessage,\n\t\t\twelcomeMessage: this.liveChatOptions.welcomeMessage,\n\t\t\tonlineMessage: this.liveChatOptions.onlineMessage,\n\t\t\tresponseTime: this.liveChatOptions.responseTime,\n\t\t\tenableHelp: this.liveChatOptions.enableHelp,\n\t\t\tenableChangelog: this.liveChatOptions.enableChangelog,\n\t\t\tmetadata: sdkMetadata,\n\t\t\turls: {\n\t\t\t\tfeedback: this.liveChatOptions.feedbackUrl,\n\t\t\t\tchangelog: this.liveChatOptions.changelogUrl,\n\t\t\t\thelp: this.liveChatOptions.helpUrl,\n\t\t\t\troadmap: this.liveChatOptions.roadmapUrl,\n\t\t\t},\n\t\t});\n\n\t\t// If identify() was called before this widget was created, pre-seed identity\n\t\tif (this.sdk?.identified && sdkMetadata) {\n\t\t\tthis.LiveChatState.isIdentified = true;\n\t\t}\n\n\t\tthis.launcher = null;\n\t\tthis.panel = null;\n\t\tthis.wsService = null;\n\t\tthis._wsUnsubscribers = [];\n\t\tthis._feedbackWidget = null;\n\n\t\tconst notificationSoundOption =\n\t\t\toptions.notificationSound !== undefined\n\t\t\t\t? options.notificationSound\n\t\t\t\t: true;\n\n\t\tthis._notificationSound = new NotificationSound({\n\t\t\tsoundUrl:\n\t\t\t\ttypeof notificationSoundOption === 'string'\n\t\t\t\t\t? notificationSoundOption\n\t\t\t\t\t: undefined,\n\t\t\tvolume: options.notificationVolume ?? 0.4,\n\t\t});\n\n\t\tif (notificationSoundOption === false) {\n\t\t\tthis._notificationSound.setEnabled(false);\n\t\t}\n\n\t\tthis._handleOpenChange = this._handleOpenChange.bind(this);\n\t\tthis._handleWebSocketMessage = this._handleWebSocketMessage.bind(this);\n\t\tthis._handleTypingStarted = this._handleTypingStarted.bind(this);\n\t\tthis._handleTypingStopped = this._handleTypingStopped.bind(this);\n\t\tthis._handleConversationClosed = this._handleConversationClosed.bind(this);\n\t}\n\n\t_hasTrigger() {\n\t\treturn this.options.trigger === true || this.options.trigger === undefined;\n\t}\n\n\t_createInternalFeedbackWidget() {\n\t\ttry {\n\t\t\tconst widget = this.sdk.createWidget('button', {\n\t\t\t\ttrigger: false,\n\t\t\t\tdisplayMode: 'modal',\n\t\t\t\tboardName:\n\t\t\t\t\tthis.liveChatOptions.feedbackBoardName || this.sdk.config.boardName,\n\t\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\t\ttheme: this.liveChatOptions.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('[LiveChat] 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 = `liveChat-widget theme-${this.liveChatOptions.theme}`;\n\t\tcontainer.style.zIndex = '999999';\n\t\tcontainer.style.setProperty(\n\t\t\t'--liveChat-h-padding',\n\t\t\t`${this.liveChatOptions.horizontalPadding ?? 20}px`\n\t\t);\n\t\tcontainer.style.setProperty(\n\t\t\t'--liveChat-v-padding',\n\t\t\t`${this.liveChatOptions.verticalPadding ?? 20}px`\n\t\t);\n\t\tthis._widgetContainer = container;\n\n\t\tapplyliveChatCustomStyles({\n\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\ttextColor: this.liveChatOptions.textColor,\n\t\t\tbackgroundColor: this.liveChatOptions.backgroundColor,\n\t\t\ttheme: this.liveChatOptions.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.liveChatOptions.onFeedbackClick) {\n\t\t\tthis._feedbackWidget = this._createInternalFeedbackWidget();\n\t\t}\n\n\t\tif (this._hasTrigger()) {\n\t\t\tthis.launcher = new LiveChatLauncher(this.LiveChatState, {\n\t\t\t\tposition: this.liveChatOptions.position,\n\t\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\t});\n\t\t\tcontainer.appendChild(this.launcher.render());\n\t\t}\n\n\t\tthis.panel = new LiveChatPanel(this.LiveChatState, {\n\t\t\tposition: this.liveChatOptions.position,\n\t\t\ttheme: this.liveChatOptions.theme,\n\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\tlogoUrl: this.liveChatOptions.logoUrl,\n\t\t\tfeaturedContent: this.liveChatOptions.featuredContent,\n\t\t\tonSendMessage:\n\t\t\t\tthis.liveChatOptions.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.liveChatOptions.onFeedbackClick ||\n\t\t\t\t(this._feedbackWidget ? () => this._feedbackWidget.open() : null),\n\t\t\tonArticleClick: this.liveChatOptions.onArticleClick,\n\t\t\tonChangelogClick: this.liveChatOptions.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('feedback', FeedbackFormView);\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.LiveChatState.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('liveChat:opened', { widget: this });\n\t\t} else {\n\t\t\tthis.panel.hide();\n\t\t\tthis.LiveChatState.reset();\n\t\t\tthis.sdk.eventBus.emit('liveChat: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 (\n\t\t\t\tthis.LiveChatState.requireEmailBeforeChat &&\n\t\t\t\t!this.LiveChatState.isIdentified\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.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.LiveChatState.setView('prechat');\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconst openConversation = this.LiveChatState.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.LiveChatState.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('[LiveChatWidget] 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('[LiveChatWidget] Failed to fetch messages:', error);\n\t\t}\n\t}\n\n\t_handleNewConversationClick() {\n\t\tconst openConversation = this.LiveChatState.conversations.find(\n\t\t\t(c) => c.status === 'open'\n\t\t);\n\n\t\tif (openConversation) {\n\t\t\tthis.LiveChatState.setActiveConversation(openConversation.id);\n\t\t\tthis.LiveChatState.setView('chat');\n\t\t\tthis._handleSelectConversation(openConversation.id);\n\t\t} else {\n\t\t\tthis.LiveChatState.setActiveConversation(null);\n\t\t\tthis.LiveChatState.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 live chat 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('[LiveChatWidget] 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.LiveChatState.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('[LiveChatWidget] 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'[LiveChatWidget] 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('liveChat: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\t// Reconcile the optimistic 'Sending…' message with the server's\n\t\t\t\t// confirmation as soon as the POST returns. Don't depend on the WS\n\t\t\t\t// echo alone — when the WebSocket frame is dropped (brief\n\t\t\t\t// disconnect, slow network, server send-buffer full), the\n\t\t\t\t// optimistic message stays stuck on 'Sending…' forever because\n\t\t\t\t// upsertMessage's match window is finite.\n\t\t\t\tconst serverData = response.data;\n\t\t\t\tlet attachments = [];\n\t\t\t\tif (serverData.attachments) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tattachments =\n\t\t\t\t\t\t\ttypeof serverData.attachments === 'string'\n\t\t\t\t\t\t\t\t? JSON.parse(serverData.attachments)\n\t\t\t\t\t\t\t\t: serverData.attachments;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\tattachments = [];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.LiveChatState.upsertMessage(\n\t\t\t\t\tconversationId,\n\t\t\t\t\t{\n\t\t\t\t\t\tid: serverData.id,\n\t\t\t\t\t\tcontent: serverData.content,\n\t\t\t\t\t\tisOwn: true,\n\t\t\t\t\t\ttimestamp: serverData.created_at,\n\t\t\t\t\t\tattachments:\n\t\t\t\t\t\t\tArray.isArray(attachments) && attachments.length > 0\n\t\t\t\t\t\t\t\t? attachments\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t\t{ reconcileOwnOptimistic: true, optimisticMatchWindowMs: 60000 }\n\t\t\t\t);\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.LiveChatState.addMessage(conversationId, mockResponse);\n\t\t\t\t}, 1500);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[LiveChatWidget] 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.LiveChatState.upsertMessage(conversation_id, localMessage, {\n\t\t\treconcileOwnOptimistic: true,\n\t\t\toptimisticMatchWindowMs: 30000,\n\t\t});\n\n\t\tconst isOwnMessage = message.sender_type === 'customer';\n\n\t\tif (!isOwnMessage && this.LiveChatState.isIdentified) {\n\t\t\tthis._notificationSound.play();\n\t\t}\n\n\t\tif (\n\t\t\t!this.LiveChatState.isOpen ||\n\t\t\tthis.LiveChatState.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.LiveChatState._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.LiveChatState._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.LiveChatState.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.LiveChatState.unreadCount = response.data.unread_count || 0;\n\t\t\t\tthis.LiveChatState._notify('unreadCountChange', {\n\t\t\t\t\tcount: this.LiveChatState.unreadCount,\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error('[LiveChatWidget] 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\t// Track first vs reconnect locally so we only backfill on reconnects.\n\t\t// First connect is right after _initWebSocket() and the surrounding\n\t\t// flow has already loaded fresh data — re-fetching would be wasted.\n\t\tlet wsHasConnectedBefore = false;\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('connected', () => {\n\t\t\t\tconsole.log('[LiveChatWidget] WebSocket connected');\n\t\t\t\tconst isReconnect = wsHasConnectedBefore;\n\t\t\t\twsHasConnectedBefore = true;\n\t\t\t\tif (this.LiveChatState.activeConversationId) {\n\t\t\t\t\tthis.wsService.send('conversation:subscribe', {\n\t\t\t\t\t\tconversation_id: this.LiveChatState.activeConversationId,\n\t\t\t\t\t});\n\t\t\t\t\t// On reconnect, refetch the active conversation's messages.\n\t\t\t\t\t// The server doesn't replay events that fired during the WS\n\t\t\t\t\t// disconnect, so anything broadcast in the gap is otherwise\n\t\t\t\t\t// permanently lost from the customer's view until they\n\t\t\t\t\t// refresh the page.\n\t\t\t\t\tif (isReconnect) {\n\t\t\t\t\t\tthis.fetchMessages(this.LiveChatState.activeConversationId).catch(\n\t\t\t\t\t\t\t(err) => {\n\t\t\t\t\t\t\t\tconsole.error(\n\t\t\t\t\t\t\t\t\t'[LiveChatWidget] Failed to backfill messages on reconnect:',\n\t\t\t\t\t\t\t\t\terr\n\t\t\t\t\t\t\t\t);\n\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\t\t\t})\n\t\t);\n\t\tthis._wsUnsubscribers.push(\n\t\t\tthis.wsService.on('disconnected', () => {\n\t\t\t\tconsole.log('[LiveChatWidget] WebSocket disconnected');\n\t\t\t\tthis.LiveChatState._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.LiveChatState._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.LiveChatState.setOpen(true);\n\t}\n\n\tclose() {\n\t\tthis.LiveChatState.setOpen(false);\n\t}\n\n\ttoggle() {\n\t\tthis.LiveChatState.setOpen(!this.LiveChatState.isOpen);\n\t}\n\n\tnavigateTo(view) {\n\t\tthis.LiveChatState.setView(view);\n\t\tif (!this.LiveChatState.isOpen) {\n\t\t\tthis.open();\n\t\t}\n\t}\n\n\tsetConversations(conversations) {\n\t\tthis.LiveChatState.setConversations(conversations);\n\t}\n\n\taddMessage(conversationId, message) {\n\t\tthis.LiveChatState.addMessage(conversationId, message);\n\t}\n\n\tsetHelpArticles(articles) {\n\t\tthis.LiveChatState.setHelpArticles(articles);\n\t}\n\n\tsetHomeChangelogItems(items) {\n\t\tthis.LiveChatState.setHomeChangelogItems(items);\n\t}\n\n\tsetChangelogItems(items) {\n\t\tthis.LiveChatState.setChangelogItems(items);\n\t}\n\n\tsetUnreadCount(count) {\n\t\tthis.LiveChatState.unreadCount = count;\n\t\tthis.LiveChatState._notify('unreadCountChange', { count });\n\t}\n\n\tgetState() {\n\t\treturn {\n\t\t\tisOpen: this.LiveChatState.isOpen,\n\t\t\tcurrentView: this.LiveChatState.currentView,\n\t\t\tunreadCount: this.LiveChatState.unreadCount,\n\t\t\tconversations: this.LiveChatState.conversations,\n\t\t};\n\t}\n\n\t_applyPreviewData() {\n\t\tconst data = this.liveChatOptions.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.LiveChatState.setConversations(data.conversations);\n\t\t}\n\n\t\tif (Array.isArray(data.helpArticles)) {\n\t\t\tthis.LiveChatState.setHelpArticles(data.helpArticles);\n\t\t}\n\n\t\tif (Array.isArray(data.homeChangelogItems)) {\n\t\t\tthis.LiveChatState.setHomeChangelogItems(data.homeChangelogItems);\n\t\t}\n\n\t\tif (Array.isArray(data.changelogItems)) {\n\t\t\tthis.LiveChatState.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.LiveChatState.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.LiveChatState.onlineCount =\n\t\t\t\tavailability.onlineCount ?? availability.online_count ?? 0;\n\t\t\tthis.LiveChatState.responseTime =\n\t\t\t\tavailability.responseTime ??\n\t\t\t\tavailability.response_time ??\n\t\t\t\tthis.LiveChatState.responseTime;\n\t\t\tthis.LiveChatState._notify('availabilityUpdate', availability);\n\t\t}\n\n\t\tif (typeof data.currentView === 'string') {\n\t\t\tthis.LiveChatState.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.LiveChatState.setConversations(conversations);\n\t\t} catch (error) {\n\t\t\tconsole.error('[LiveChatWidget] Failed to load conversations:', error);\n\t\t}\n\n\t\tif (this.liveChatOptions.enableHelp) {\n\t\t\ttry {\n\t\t\t\tconst articles = await this._fetchHelpArticles();\n\t\t\t\tthis.LiveChatState.setHelpArticles(articles);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[LiveChatWidget] Failed to load help articles:', error);\n\t\t\t}\n\t\t}\n\n\t\tif (this.liveChatOptions.enableChangelog) {\n\t\t\ttry {\n\t\t\t\tconst { homeItems, changelogItems } = await this._fetchChangelog();\n\t\t\t\tthis.LiveChatState.setHomeChangelogItems(homeItems);\n\t\t\t\tthis.LiveChatState.setChangelogItems(changelogItems);\n\t\t\t} catch (error) {\n\t\t\t\tconsole.error('[LiveChatWidget] 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('[LiveChatWidget] 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.liveChatOptions.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('[LiveChatWidget] 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.LiveChatState.setMessages(conversationId, messages);\n\n\t\t\t\tawait this.apiService.markConversationAsRead(conversationId);\n\t\t\t\tthis.LiveChatState.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('[LiveChatWidget] 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.LiveChatState.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.LiveChatState.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.LiveChatState.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.LiveChatState.setMessages(conv.id, initialMessages);\n\n\t\t\t\tthis.LiveChatState.setActiveConversation(conv.id);\n\t\t\t\tthis.LiveChatState.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('[LiveChatWidget] 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.getLiveChatSettings();\n\t\t\tif (!response?.status || !response?.data) return;\n\n\t\t\tconst s = response.data;\n\t\t\tlet stylesChanged = false;\n\n\t\t\t// Team info\n\t\t\tif (s.team_name && !this._hasExplicitOption('teamName')) {\n\t\t\t\tthis.liveChatOptions.teamName = s.team_name;\n\t\t\t\tthis.LiveChatState.teamName = s.team_name;\n\t\t\t}\n\t\t\tif (s.logo_url && !this._hasExplicitOption('logoUrl')) {\n\t\t\t\tthis.liveChatOptions.logoUrl = s.logo_url;\n\t\t\t}\n\t\t\tif (s.greeting_message && !this._hasExplicitOption('greetingMessage')) {\n\t\t\t\tthis.LiveChatState.greetingMessage = s.greeting_message;\n\t\t\t}\n\t\t\tif (s.welcome_message && !this._hasExplicitOption('welcomeMessage')) {\n\t\t\t\tthis.LiveChatState.welcomeMessage = s.welcome_message;\n\t\t\t}\n\t\t\tif (s.response_time && !this._hasExplicitOption('responseTime')) {\n\t\t\t\tthis.LiveChatState.responseTime = s.response_time;\n\t\t\t}\n\t\t\tif (\n\t\t\t\tArray.isArray(s.team_avatars) &&\n\t\t\t\ts.team_avatars.length > 0 &&\n\t\t\t\t!this._hasExplicitOption('teamAvatars')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.teamAvatars = s.team_avatars;\n\t\t\t}\n\n\t\t\t// Colors / theme\n\t\t\tif (s.primary_color && !this._hasExplicitOption('primaryColor')) {\n\t\t\t\tthis.liveChatOptions.primaryColor = s.primary_color;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (s.background_color && !this._hasExplicitOption('backgroundColor')) {\n\t\t\t\tthis.liveChatOptions.backgroundColor = s.background_color;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (s.text_color && !this._hasExplicitOption('textColor')) {\n\t\t\t\tthis.liveChatOptions.textColor = s.text_color;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (s.theme && !this._hasExplicitOption('theme')) {\n\t\t\t\tthis.liveChatOptions.theme = s.theme;\n\t\t\t\tstylesChanged = true;\n\t\t\t}\n\t\t\tif (stylesChanged) {\n\t\t\t\tapplyliveChatCustomStyles({\n\t\t\t\t\tprimaryColor: this.liveChatOptions.primaryColor,\n\t\t\t\t\ttextColor: this.liveChatOptions.textColor,\n\t\t\t\t\tbackgroundColor: this.liveChatOptions.backgroundColor,\n\t\t\t\t\ttheme: this.liveChatOptions.theme,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Launcher position & padding\n\t\t\tif (s.launcher_position && !this._hasExplicitOption('position')) {\n\t\t\t\tconst parts = s.launcher_position.split('-');\n\t\t\t\tthis.liveChatOptions.position = parts[parts.length - 1] || 'right';\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.horizontal_padding === 'number' &&\n\t\t\t\t!this._hasExplicitOption('horizontalPadding')\n\t\t\t) {\n\t\t\t\tthis.liveChatOptions.horizontalPadding = s.horizontal_padding;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.vertical_padding === 'number' &&\n\t\t\t\t!this._hasExplicitOption('verticalPadding')\n\t\t\t) {\n\t\t\t\tthis.liveChatOptions.verticalPadding = s.vertical_padding;\n\t\t\t}\n\t\t\tif (this._widgetContainer) {\n\t\t\t\tthis._widgetContainer.style.setProperty(\n\t\t\t\t\t'--liveChat-h-padding',\n\t\t\t\t\t`${this.liveChatOptions.horizontalPadding ?? 20}px`\n\t\t\t\t);\n\t\t\t\tthis._widgetContainer.style.setProperty(\n\t\t\t\t\t'--liveChat-v-padding',\n\t\t\t\t\t`${this.liveChatOptions.verticalPadding ?? 20}px`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Module visibility\n\t\t\tif (\n\t\t\t\ttypeof s.home_module_enabled === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('homeModuleEnabled')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.homeModuleEnabled = s.home_module_enabled;\n\t\t\t\tif (\n\t\t\t\t\t!s.home_module_enabled &&\n\t\t\t\t\tthis.LiveChatState.currentView === 'home'\n\t\t\t\t) {\n\t\t\t\t\tthis.LiveChatState.currentView =\n\t\t\t\t\t\tthis.LiveChatState.messagesModuleEnabled !== false\n\t\t\t\t\t\t\t? 'messages'\n\t\t\t\t\t\t\t: 'help';\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.messages_module_enabled === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('messagesModuleEnabled')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.messagesModuleEnabled = s.messages_module_enabled;\n\t\t\t\tif (\n\t\t\t\t\t!s.messages_module_enabled &&\n\t\t\t\t\tthis.LiveChatState.currentView === 'messages'\n\t\t\t\t) {\n\t\t\t\t\tthis.LiveChatState.currentView =\n\t\t\t\t\t\tthis.LiveChatState.homeModuleEnabled !== false ? 'home' : 'help';\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Feature flags\n\t\t\tif (\n\t\t\t\ttypeof s.show_avatars === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('showAvatars')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.showAvatars = s.show_avatars;\n\t\t\t}\n\t\t\tif (s.start_button_text && !this._hasExplicitOption('startButtonText')) {\n\t\t\t\tthis.LiveChatState.startButtonText = s.start_button_text;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.require_email_before_chat === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('requireEmailBeforeChat')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.requireEmailBeforeChat = s.require_email_before_chat;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.allow_attachments === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('allowAttachments')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.allowAttachments = s.allow_attachments;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.allow_emoji === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('allowEmoji')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.allowEmoji = s.allow_emoji;\n\t\t\t}\n\t\t\tif (\n\t\t\t\ttypeof s.show_reply_time === 'boolean' &&\n\t\t\t\t!this._hasExplicitOption('showReplyTime')\n\t\t\t) {\n\t\t\t\tthis.LiveChatState.showReplyTime = s.show_reply_time;\n\t\t\t}\n\n\t\t\t// URLs\n\t\t\tif (s.feedback_url && !this._hasExplicitOption('feedbackUrl')) {\n\t\t\t\tthis.liveChatOptions.feedbackUrl = s.feedback_url;\n\t\t\t\tthis.LiveChatState.urls.feedback = s.feedback_url;\n\t\t\t}\n\t\t\tif (s.help_url && !this._hasExplicitOption('helpUrl')) {\n\t\t\t\tthis.liveChatOptions.helpUrl = s.help_url;\n\t\t\t\tthis.LiveChatState.urls.help = s.help_url;\n\t\t\t}\n\t\t\tif (s.changelog_url && !this._hasExplicitOption('changelogUrl')) {\n\t\t\t\tthis.liveChatOptions.changelogUrl = s.changelog_url;\n\t\t\t\tthis.LiveChatState.urls.changelog = s.changelog_url;\n\t\t\t}\n\t\t\tif (s.roadmap_url && !this._hasExplicitOption('roadmapUrl')) {\n\t\t\t\tthis.liveChatOptions.roadmapUrl = s.roadmap_url;\n\t\t\t\tthis.LiveChatState.urls.roadmap = s.roadmap_url;\n\t\t\t}\n\n\t\t\t// Business hours availability\n\t\t\tif (s.availability && typeof s.availability === 'object') {\n\t\t\t\tthis.LiveChatState.businessHoursState = s.availability.state || null;\n\t\t\t\tthis.LiveChatState.nextOpenAt = s.availability.next_open_at || null;\n\t\t\t\tthis.LiveChatState.holidayName = s.availability.holiday_name || null;\n\t\t\t}\n\n\t\t\tthis.LiveChatState._notify('settingsUpdate', {});\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.LiveChatState.agentsOnline =\n\t\t\t\t\tresponse.data.agents_online ?? response.data.is_online ?? false;\n\t\t\t\tthis.LiveChatState.onlineCount = response.data.online_count || 0;\n\t\t\t\tthis.LiveChatState.responseTime = response.data.response_time || '';\n\n\t\t\t\tif (response.data.available_agents && this.LiveChatState.showAvatars !== false) {\n\t\t\t\t\tthis.LiveChatState.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.LiveChatState._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('[LiveChatWidget] 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 = (this.liveChatOptions.changelogUrl || '').replace(\n\t\t\t\t\t/\\/$/,\n\t\t\t\t\t''\n\t\t\t\t);\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('[LiveChatWidget] 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.liveChatOptions.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.liveChatOptions.initialView &&\n\t\t\tthis.liveChatOptions.initialView !== this.LiveChatState.currentView\n\t\t) {\n\t\t\tthis.LiveChatState.setView(this.liveChatOptions.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\tremoveliveChatCustomStyles();\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","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\tthankYouConfig:\n\t\t\t\toptions.thankYouConfig || options.thank_you_config || null,\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\" 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\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\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.rating_config || page.ratingConfig || {};\n\t\tconst scale = Number(config.scale) || 5;\n\t\tconst ratingType = config.survey_type || 'number';\n\t\tconst pageAnswer = this.surveyState.pageAnswers[pageId] || {};\n\t\tconst currentRating = pageAnswer.rating;\n\n\t\tconst labelDefaults = {\n\t\t\tnps:\n\t\t\t\tscale === 11\n\t\t\t\t\t? ['Not likely', 'Very likely']\n\t\t\t\t\t: ['Strongly Disagree', 'Strongly Agree'],\n\t\t\temoji: ['Very dissatisfied', 'Very satisfied'],\n\t\t\tnumber: ['Poor', 'Excellent'],\n\t\t\tstar: ['Poor', 'Excellent'],\n\t\t};\n\t\tconst [defaultLow, defaultHigh] = labelDefaults[ratingType] || ['', ''];\n\t\tconst lowLabel = config.low_label || defaultLow;\n\t\tconst highLabel = config.high_label || defaultHigh;\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 : 11;\n\t\t\tconst start = npsScale === 11 ? 0 : 1;\n\t\t\tconst values = Array.from({ length: npsScale }, (_, i) => start + i);\n\t\t\treturn `\n\t\t\t\t<div class=\"feedback-survey-nps\" 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=\"feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-nps-score-${n}${selected}\" data-page-id=\"${pageId}\" data-score=\"${n}\">${n}</button>`;\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.join('')}\n\t\t\t\t</div>\n\t\t\t\t${labels}\n\t\t\t`;\n\t\t}\n\n\t\tif (ratingType === 'emoji') {\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\tconst emojiScale =\n\t\t\t\tNumber.isFinite(scale) && scale >= 2 ? Math.min(scale, 5) : 5;\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.slice(0, emojiScale)\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.from({ length: starScale }, (_, i) => {\n\t\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\t\tconst filled =\n\t\t\t\t\t\t\ttypeof currentRating === 'number' && currentRating >= score\n\t\t\t\t\t\t\t\t? ' filled'\n\t\t\t\t\t\t\t\t: '';\n\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}\"><iconify-icon icon=\"ph:star\" width=\"32\" height=\"32\" style=\"pointer-events:none;\"></iconify-icon></button>`;\n\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\tconst numScale = Number.isFinite(scale) && scale >= 2 ? scale : 5;\n\t\treturn `\n\t\t\t<div class=\"feedback-survey-rating-scale\" data-page-id=\"${pageId}\">\n\t\t\t\t${Array.from({ length: numScale }, (_, i) => {\n\t\t\t\t\tconst score = i + 1;\n\t\t\t\t\tconst selected = currentRating === score ? ' selected' : '';\n\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}).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_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\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\tbtn.classList.toggle('selected', btnScore === score);\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\tbtn.classList.toggle('selected', btnScore === score);\n\t\t\t});\n\t\tthis._maybeAutoSubmit();\n\t}\n\n\t_maybeAutoSubmit() {\n\t\tif (!this._shouldAutoSubmitOnSelect()) return;\n\t\tthis._handleSubmit();\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\n\t\tconst responseData = {\n\t\t\tanswers: this._normalizePageAnswersForSubmit(),\n\t\t\t...(this.surveyState.feedback && { feedback: this.surveyState.feedback }),\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\tanswers: responseData.answers,\n\t\t\tfeedback: this.surveyState.feedback,\n\t\t\ttimestamp: new Date().toISOString(),\n\t\t};\n\n\t\ttry {\n\t\t\tconst surveyId =\n\t\t\t\tthis.surveyOptions.surveyId || `local_${type}_${Date.now()}`;\n\t\t\tawait this.apiService.submitSurveyResponse(surveyId, responseData);\n\n\t\t\tthis.sdk.eventBus.emit('survey:submitted', { widget: this, response });\n\t\t\tthis._showThankYouScreen(() => {\n\t\t\t\tif (this.surveyOptions.onSubmit) {\n\t\t\t\t\tthis.surveyOptions.onSubmit(response);\n\t\t\t\t}\n\t\t\t});\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 !== true) return true;\n\t\tconst pageId = page.id || `page_${this.surveyState.currentPageIndex}`;\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 hasAnswer =\n\t\t\t\tBoolean(answer.value) ||\n\t\t\t\t(Array.isArray(answer.values) && answer.values.length > 0);\n\t\t\tif (!hasAnswer) {\n\t\t\t\tthis._showError('Please select an option');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tif (page.type === 'text') {\n\t\t\tif (!answer.text || !String(answer.text).trim()) {\n\t\t\t\tthis._showError('Please enter an answer');\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t_getNextPageIndex() {\n\t\tif (!this._isMultiPageSurvey()) return -1;\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.after_this_page || page.afterThisPage : null;\n\t\tif (!navigation) return fallbackNext;\n\n\t\tconst conditions = Array.isArray(navigation.conditions)\n\t\t\t? navigation.conditions\n\t\t\t: [];\n\t\tconst pageId = page.id || `page_${currentIndex}`;\n\t\tconst answer = this.surveyState.pageAnswers[pageId] || {};\n\n\t\tfor (const condition of conditions) {\n\t\t\tif (this._evaluateCondition(condition, page, answer)) {\n\t\t\t\treturn this._resolvePageTarget(condition.go_to, total, fallbackNext);\n\t\t\t}\n\t\t}\n\n\t\treturn this._resolvePageTarget(navigation.default, total, fallbackNext);\n\t}\n\n\t_evaluateCondition(condition, page, answer) {\n\t\tconst { operator, values } = condition;\n\t\tif (!operator || !Array.isArray(values)) return false;\n\n\t\tlet answerValue = null;\n\t\tif (page.type === 'rating') {\n\t\t\tanswerValue = typeof answer.rating === 'number' ? answer.rating : null;\n\t\t} else if (page.type === 'multiple_choice') {\n\t\t\tanswerValue =\n\t\t\t\tanswer.value ||\n\t\t\t\t(Array.isArray(answer.values) ? answer.values[0] : null);\n\t\t} else if (page.type === 'text') {\n\t\t\tanswerValue = answer.text || null;\n\t\t}\n\n\t\tif (operator === 'is_empty')\n\t\t\treturn answerValue === null || answerValue === '';\n\t\tif (operator === 'not_empty')\n\t\t\treturn answerValue !== null && answerValue !== '';\n\t\tif (answerValue === null) return false;\n\n\t\tconst [v1, v2] = values;\n\t\tswitch (operator) {\n\t\t\tcase 'equals':\n\t\t\t\treturn String(answerValue) === String(v1);\n\t\t\tcase 'greater_than':\n\t\t\t\treturn Number(answerValue) > Number(v1);\n\t\t\tcase 'less_than':\n\t\t\t\treturn Number(answerValue) < Number(v1);\n\t\t\tcase 'between':\n\t\t\t\treturn (\n\t\t\t\t\tNumber(answerValue) >= Number(v1) && Number(answerValue) <= Number(v2)\n\t\t\t\t);\n\t\t\tcase 'contains':\n\t\t\t\treturn String(answerValue).includes(String(v1));\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\n\t_resolvePageTarget(target, total, fallback) {\n\t\tif (!target) return fallback;\n\t\tif (target === 'end_survey') return -1;\n\t\tif (target === 'next_page' || target === 'next') return fallback;\n\t\tif (typeof target === 'number')\n\t\t\treturn target >= 0 && target < total ? target : fallback;\n\t\tif (typeof target === 'string') {\n\t\t\tconst normalizedId = target.replace(/^page:/, '');\n\t\t\tconst idx = this.surveyOptions.pages.findIndex(\n\t\t\t\t(p) => p.id === normalizedId\n\t\t\t);\n\t\t\treturn idx >= 0 ? idx : fallback;\n\t\t}\n\t\treturn fallback;\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\t// Single-rating surveys (NPS / CSAT / CES / star / emoji) have no pages\n\t\tif (!this._isMultiPageSurvey()) {\n\t\t\tif (typeof this.surveyState.score === 'number') {\n\t\t\t\treturn [{ page_id: 'p1', value: this.surveyState.score }];\n\t\t\t}\n\t\t\treturn [];\n\t\t}\n\n\t\tconst output = [];\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 == null) continue;\n\n\t\t\tlet value = null;\n\n\t\t\tif (page.type === 'rating' && typeof answer.rating === 'number') {\n\t\t\t\tvalue = answer.rating;\n\t\t\t} else if (page.type === 'multiple_choice') {\n\t\t\t\tconst config =\n\t\t\t\t\tpage.multipleChoiceConfig || page.multiple_choice_config || {};\n\t\t\t\tconst allowMultiple =\n\t\t\t\t\tconfig.allow_multiple === true ||\n\t\t\t\t\tconfig.multiple === true ||\n\t\t\t\t\tconfig.allow_multiple_selection === true;\n\n\t\t\t\tif (\n\t\t\t\t\tallowMultiple &&\n\t\t\t\t\tArray.isArray(answer.values) &&\n\t\t\t\t\tanswer.values.length > 0\n\t\t\t\t) {\n\t\t\t\t\tvalue = answer.values;\n\t\t\t\t} else if (answer.value != null && answer.value !== '') {\n\t\t\t\t\tvalue = answer.value;\n\t\t\t\t}\n\t\t\t} else if (\n\t\t\t\tpage.type === 'text' &&\n\t\t\t\ttypeof answer.text === 'string' &&\n\t\t\t\tanswer.text.trim()\n\t\t\t) {\n\t\t\t\tvalue = answer.text.trim();\n\t\t\t} else if (page.type === 'link' && typeof answer.clicked === 'boolean') {\n\t\t\t\tvalue = answer.clicked;\n\t\t\t}\n\n\t\t\tif (value !== null) {\n\t\t\t\toutput.push({ page_id: pageId, value });\n\t\t\t}\n\t\t}\n\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\" 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_showThankYouScreen(onAfterClose) {\n\t\tif (!this.surveyElement) return;\n\n\t\tconst pages = this.surveyOptions.pages || [];\n\t\tconst currentPage =\n\t\t\tpages[this.surveyState.currentPageIndex] ||\n\t\t\tpages[pages.length - 1] ||\n\t\t\tnull;\n\t\tconst pageConfig = currentPage?.thankYouConfig || null;\n\t\tconst surveyConfig = this.surveyOptions.thankYouConfig || null;\n\t\tconst config =\n\t\t\t(pageConfig?.title ? pageConfig : null) ||\n\t\t\t(surveyConfig?.title ? surveyConfig : null) ||\n\t\t\t{};\n\t\tconst title = config.title || 'Thanks for your feedback!';\n\t\tconst buttonText = config.button_text || null;\n\t\tconst rawUrl = config.button_url || '';\n\t\tconst buttonUrl = rawUrl\n\t\t\t? /^https?:\\/\\//i.test(rawUrl)\n\t\t\t\t? rawUrl\n\t\t\t\t: `https://${rawUrl}`\n\t\t\t: '#';\n\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\tthis.surveyElement.innerHTML = `\n\t\t\t<button class=\"feedback-survey-close\"><iconify-icon icon=\"ph:x\" width=\"16\" height=\"16\"></iconify-icon></button>\n\t\t\t<div class=\"feedback-survey-thankyou\">\n\t\t\t\t<iconify-icon icon=\"ph:check-circle\" width=\"48\" height=\"48\" class=\"feedback-survey-thankyou-icon\"></iconify-icon>\n\t\t\t\t<h3 class=\"feedback-survey-thankyou-title\">${title}</h3>\n\t\t\t\t${\n\t\t\t\t\tbuttonText\n\t\t\t\t\t\t? `\n\t\t\t\t\t<a class=\"feedback-survey-thankyou-btn\" href=\"${buttonUrl}\" target=\"_blank\" rel=\"noopener noreferrer\">\n\t\t\t\t\t\t${buttonText}\n\t\t\t\t\t\t<iconify-icon icon=\"ph:arrow-square-out\" width=\"15\" height=\"15\" style=\"pointer-events:none;\"></iconify-icon>\n\t\t\t\t\t</a>`\n\t\t\t\t\t\t: ''\n\t\t\t\t}\n\t\t\t</div>\n\t\t`;\n\n\t\tconst closeBtn = this.surveyElement.querySelector('.feedback-survey-close');\n\t\tif (closeBtn) closeBtn.addEventListener('click', () => this._closeSurvey());\n\n\t\tsetTimeout(\n\t\t\t() => {\n\t\t\t\tif (this.surveyElement) this._closeSurvey();\n\t\t\t\tif (onAfterClose) onAfterClose();\n\t\t\t},\n\t\t\tbuttonText ? 6000 : 3500\n\t\t);\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 { LiveChatWidget } from './LiveChatWidget.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['liveChat', LiveChatWidget],\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\tconst serverConfig = initData.config ? { ...initData.config } : {};\n\t\t\tif (initData.widgets) {\n\t\t\t\tconst widgets = { ...initData.widgets };\n\t\t\t\tif (widgets.web_chat && !widgets.liveChat) {\n\t\t\t\t\twidgets.liveChat = widgets.web_chat;\n\t\t\t\t\tdelete widgets.web_chat;\n\t\t\t\t}\n\t\t\t\tserverConfig.widgets = widgets;\n\t\t\t}\n\t\t\tif (Object.keys(serverConfig).length > 0) {\n\t\t\t\tthis.config = deepMerge(serverConfig, 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\tcreateLiveChatWidget(options = {}) {\n\t\treturn this.createWidget('liveChat', 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\tthankYouConfig:\n\t\t\t\tsurveyConfig.thankYouConfig || surveyConfig.thank_you_config || null,\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\tthankYouConfig: normalizedOptions.thankYouConfig,\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\tthankYouConfig: survey.thankYouConfig || survey.thank_you_config || null,\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 === true,\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\tthankYouConfig: page.thankYouConfig || page.thank_you_config || 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.createLiveChatWidget = this.createLiveChatWidget.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 { liveChatStyles } from './liveChat.js';\nimport { surveyStyles } from './survey.js';\n\nexport const CSS_STYLES =\n\tdesignTokens +\n\tbaseStyles +\n\tcomponentsStyles +\n\tfeedbackStyles +\n\tchangelogStyles +\n\tsurveyStyles +\n\tliveChatStyles;\n\nexport {\n\tbaseStyles,\n\tchangelogStyles,\n\tcomponentsStyles,\n\tdesignTokens,\n\tfeedbackStyles,\n\tliveChatStyles,\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 { LiveChatWidget } from './widgets/LiveChatWidget.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_LiveChatWidget: 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// Web Chat\n\t// ==================\n\n\tasync liveChat(options = {}, callback) {\n\t\tconst sdk = await ensureSDK(options);\n\t\tif (!sdk) {\n\t\t\tProduct7._q.push(['liveChat', 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// Web Chat 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.createLiveChatWidget(widgetOptions);\n\t\t\twidget.mount();\n\t\t\twidget.show();\n\n\t\t\tProduct7._LiveChatWidget = widget;\n\n\t\t\tif (typeof callback === 'function') {\n\t\t\t\tcallback({ action: 'widgetReady' });\n\n\t\t\t\tsdk.eventBus.on('liveChat: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('liveChat:opened', () => {\n\t\t\t\t\tcallback({ action: 'liveChatOpened' });\n\t\t\t\t});\n\n\t\t\t\tsdk.eventBus.on('liveChat:closed', () => {\n\t\t\t\t\tcallback({ action: 'liveChatClosed' });\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Listen for data-product7-liveChat clicks\n\t\t\tProduct7._setupLiveChatAttributeTriggers();\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 web chat 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\topenLiveChat() {\n\t\tif (Product7._LiveChatWidget) {\n\t\t\tProduct7._LiveChatWidget.open?.() ||\n\t\t\t\tProduct7._LiveChatWidget.openPanel?.();\n\t\t}\n\t},\n\n\tcloseLiveChat() {\n\t\tif (Product7._LiveChatWidget) {\n\t\t\tProduct7._LiveChatWidget.close?.() ||\n\t\t\t\tProduct7._LiveChatWidget.closePanel?.();\n\t\t}\n\t},\n\n\tdestroyLiveChat() {\n\t\tif (Product7._LiveChatWidget) {\n\t\t\tProduct7._LiveChatWidget.destroy();\n\t\t\tProduct7._LiveChatWidget = 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.destroyLiveChat();\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._liveChatListenerAttached = 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_setupLiveChatAttributeTriggers() {\n\t\tif (typeof document === 'undefined') return;\n\t\tif (Product7._liveChatListenerAttached) return;\n\t\tProduct7._liveChatListenerAttached = true;\n\n\t\tdocument.addEventListener('click', (e) => {\n\t\t\tconst trigger = e.target.closest('[data-product7-liveChat]');\n\t\t\tif (trigger) {\n\t\t\t\te.preventDefault();\n\t\t\t\tProduct7.openLiveChat();\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 'openLiveChat':\n\t\t\t\t\tProduct7.openLiveChat();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closeLiveChat':\n\t\t\t\t\tProduct7.closeLiveChat();\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\tLiveChatWidget,\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\tLiveChatWidget,\n\tProduct7SDK as Product7,\n\tSDKError,\n\tSurveyWidget,\n\tTabWidget,\n\tValidationError,\n\tWidgetError,\n\tWidgetFactory,\n};\n"],"names":["MOCK_CHANGELOGS","id","title","excerpt","description","cover_image","slug","published_at","labels","name","color","status","MOCK_CONVERSATIONS","subject","last_message_at","Date","now","toISOString","created_at","unread","assigned_user","avatar","MOCK_MESSAGES","conv_1","content","sender_type","sender_name","sender_avatar","conv_2","MOCK_HELP_COLLECTIONS","articleCount","icon","url","MOCK_SURVEYS","trigger_type","pages","type","placeholder","rating_config","scale","low_label","high_label","survey_type","multiple_choice_config","link_config","after_this_page","default","conditions","required","allow_multiple_selection","options","label","button_text","link_text","redirect_url","open_in","delay","ms","Promise","resolve","setTimeout","getDeviceInfo","navigator","device","browser","os","ua","userAgent","test","includes","ChangelogService","constructor","baseAPI","this","api","getChangelogs","_ensureSession","mock","success","data","_handleAuthRetry","async","endpoint","_getEndpointWithParams","_makeRequest","method","headers","Authorization","sessionToken","FeedbackService","submitFeedback","feedbackData","message","contact","getContactIdentity","payload","board","board_id","boardName","attachments","contactId","contact_id","contact_email","contactEmail","contact_name","contactName","body","JSON","stringify","HelpService","getHelpCollections","searchHelpArticles","query","filter","c","toLowerCase","params","q","LiveChatService","getLiveChatSettings","enabled","greeting_message","team_name","response_time","checkAgentsOnline","agents_online","online_count","available_agents","full_name","picture","getConversations","meta","total","length","page","limit","getConversation","conversationId","find","messages","startConversation","newConv","unshift","sendMessage","newMessage","push","getUnreadCount","count","reduce","sum","unread_count","unread_conversations","markConversationAsRead","getMessages","uploadFile","base64Data","filename","file","identifyContact","identify","submitRating","rated","sendTypingIndicator","isTyping","is_typing","SDKError","Error","cause","super","captureStackTrace","APIError","response","isNetworkError","isClientError","isServerError","WidgetError","widgetType","widgetId","ConfigError","configKey","ValidationError","field","value","SurveyService","getActiveSurveys","context","respondent","_getRespondentContext","window","location","href","respondent_id","email","undefined","includeEligibility","include_eligibility","userProperties","user_properties","metadata","getMetadata","respondentId","userId","user_id","submitSurveyResponse","surveyId","responseData","survey_id","answers","Array","isArray","feedback","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","widgets","configVersion","error","configData","session_token","Number","expires_in","isFinite","config_version","args","apply","_restoreIdentity","_buildIdentifyPayload","identified","_storeData","_removeData","clearSession","localStorage","sessionData","token","expiry","stored","getItem","parse","startsWith","removeItem","session","key","setItem","fetch","ok","errorMessage","json","e","text","contentType","get","_buildQueryParams","queryParams","URLSearchParams","Object","entries","forEach","append","toString","queryString","profile_picture","avatar_url","attributes","custom_fields","company","_cached","APIService","survey","liveChat","help","changelog","r","mockResponse","is_new","_storeContactIdentity","ipInfo","res","getIpInfo","ip_info","parsed","EventBus","events","Map","on","event","callback","has","set","off","callbacks","index","indexOf","splice","emit","console","once","unsubscribe","clear","getListenerCount","generateId","prefix","Math","random","substring","deepMerge","target","source","result","hasOwnProperty","isBrowser","document","func","wait","timeout","clearTimeout","string","replace","bytes","i","floor","log","parseFloat","pow","toFixed","platform","language","userLanguage","cookieEnabled","screenResolution","screen","width","height","windowSize","innerWidth","innerHeight","timezone","Intl","DateTimeFormat","resolvedOptions","timeZone","element","property","fallback","getComputedStyle","getPropertyValue","obj","path","defaultValue","keys","split","current","rect","getBoundingClientRect","top","left","bottom","documentElement","clientHeight","right","clientWidth","trim","str","div","createElement","textContent","innerHTML","scrollIntoView","behavior","block","inline","lastKey","pop","lastFunc","lastRan","missing","join","BaseWidget","static","sdk","apiService","container","position","autoShow","showBackdrop","customStyles","suppressAfterSubmission","suppressionDays","DEFAULT_COOLDOWN_DAYS","trigger","panelElement","backdropElement","mounted","destroyed","state","isOpen","isLoading","isSubmitting","errors","_bindMethods","mount","eventBus","widget","reason","_hasRecentlySubmitted","querySelector","_render","appendChild","_attachEvents","triggerEl","Element","addEventListener","open","onMount","show","style","display","hide","openPanel","_renderPanel","requestAnimationFrame","classList","add","_showLoadingModal","className","loadingElement","_hideLoadingModal","remove","closePanel","parentNode","removeChild","_resetForm","_hideError","_updateSubmitButton","_showError","_trackSubmission","_showSuccessInPanel","handleConfigUpdate","newConfig","theme","_updateTheme","destroy","onDestroy","storageKey","STORAGE_KEY","submittedAt","warn","cooldownMs","last_feedback_at","getTime","clearSubmissionTracking","shouldShow","bind","modeClass","sizeClass","themeClass","directionClass","String","setProperty","_getPanelHTML","_attachPanelEvents","firstInput","focus","panel","preventDefault","handleEscape","removeEventListener","submitBtn","disabled","errorElement","close","toggle","openModal","closeModal","ButtonWidget","isMinimized","_hiddenForOpenPanel","_hasTrigger","buttonText","triggerText","button","assign","pointerType","shouldRestoreButton","_noTriggerButton","updateText","textEl","updatePosition","ChangelogWidget","changelogs","modalElement","sidebarElement","listModalBackdropElement","currentIndex","showBadge","openSidebar","_createModal","_loadChangelogs","_renderCurrentChangelog","overflow","stopPropagation","_escapeHandler","listModalElement","_createListModal","_renderChangelogList","_showConfetti","colors","confetti","animationDelay","animationDuration","shapes","shape","borderRadius","closeSidebar","_listModalEscapeHandler","map","_renderChangelogListItem","querySelectorAll","item","_handleViewUpdate","hasImage","image","imageUrl","date","_formatDate","_stripHtml","_getContrastColor","hasMultiple","viewButtonText","_","dot","parseInt","dataset","changelogBase","changelogBaseUrl","openInNewTab","onViewUpdate","html","tmp","innerText","_truncateDescription","maxLength","plain","trimEnd","dateString","toLocaleDateString","year","month","day","hexColor","hex","substr","hideBadge","badge","nextChangelog","prevChangelog","refresh","InlineWidget","form","textarea","_showSuccessMessage","originalContent","updateTitle","titleElement","setPlaceholder","input","WebSocketService","reconnectAttempts","reconnectBaseDelay","reconnectMaxDelay","pingInterval","isConnected","lastFrameAt","heartbeatTimeoutMs","heartbeatCheckIntervalMs","heartbeatInterval","_listeners","_onOpen","_onMessage","_onClose","_onError","connect","_intentionallyClosed","_emit","_startMockResponses","wsProtocol","protocol","wsURL","encodeURIComponent","WebSocket","onopen","onmessage","onclose","onerror","_scheduleReconnect","disconnect","clearInterval","_stopHeartbeat","_mockInterval","_startHeartbeat","setInterval","Set","delete","send","readyState","OPEN","code","min","conversation_id","user_name","is_agent","simulateMessage","applyliveChatCustomStyles","styleElement","getElementById","head","adjustColor","percent","alpha","normalized","num","max","g","b","padStart","NotificationSound","soundUrl","volume","_soundUrl","_volume","_enabled","_audioCtx","_audioBuffer","_loadPromise","_loadAudioFile","setEnabled","Boolean","setVolume","play","_playFile","_playSynthetic","_getAudioContext","AudioContext","webkitAudioContext","ctx","resume","currentTime","vol","freq","start","end","osc","createOscillator","gain","createGain","frequency","setValueAtTime","linearRampToValueAtTime","destination","stop","arrayBuffer","decodeAudioData","createBufferSource","buffer","LiveChatState","currentView","unreadCount","activeConversationId","conversations","helpArticles","helpSearchQuery","homeChangelogItems","changelogItems","teamName","teamAvatars","greetingMessage","welcomeMessage","startButtonText","showAvatars","isIdentified","pendingMessage","enableHelp","enableChangelog","homeModuleEnabled","messagesModuleEnabled","requireEmailBeforeChat","allowAttachments","allowEmoji","showReplyTime","agentsOnline","onlineCount","onlineMessage","responseTime","businessHoursState","nextOpenAt","holidayName","typingUsers","isLoadingMessages","urls","roadmap","subscribe","_notify","changeType","cb","setView","view","previousView","setOpen","setActiveConversation","previousConversationId","setIdentified","setConversations","_updateUnreadCount","addConversation","conversation","setMessages","_getMessageAttachmentsSignature","att","_findOptimisticMatchIndex","incomingMessage","matchWindowMs","incomingTimestamp","timestamp","incomingSignature","candidate","isOptimistic","isOwn","candidateTimestamp","isNaN","abs","_updateConversationFromMessage","countUnread","conv","lastMessage","lastMessageTime","upsertMessage","reconcileOwnOptimistic","optimisticMatchWindowMs","existingIndex","findIndex","msg","optimisticIndex","storedMessage","addMessage","updateConversation","updates","markAsRead","setHelpArticles","articles","setHelpSearchQuery","setHomeChangelogItems","items","setChangelogItems","getActiveConversation","getActiveMessages","setTeamAvatarsFromAgents","agents","agent","getFilteredHelpArticles","article","reset","LiveChatLauncher","_unsubscribe","render","_updateContent","_updateIcon","_updateBadge","badgeHtml","btn","chatIcon","closeIcon","existingBadge","NavigationTabs","_updateActiveTab","_getTabs","tabs","tabsHtml","tab","isActive","closest","tabId","LiveChatPanel","navigationTabs","currentViewComponent","viewRegistry","_expanded","registerView","ViewClass","onToggleExpand","_toggleExpand","isExpanded","_renderCurrentView","menuIcon","menuLabel","setAttribute","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","_menuOutsideHandler","banner","connected","_hideTypingIndicator","_appendMessage","_showTypingIndicator","userName","isNewConversation","isClosed","messagesHtml","_renderGroupedMessages","defaultPlaceholder","composePlaceholder","logoUrl","headerAvatarHtml","_escapeHtml","expandIcon","expandLabel","_scrollToBottom","_renderAttachmentPreviews","_setupScrollPill","_renderMessageAttachments","_renderMessage","isLastInGroup","isSystem","_renderSystemMessage","messageClass","timeStr","_formatMessageTime","attachmentsHtml","contentHtml","_formatMessageContent","bubbleHtml","_renderSenderAvatar","sender","rawName","w","charAt","toUpperCase","slice","logoHtml","rawAction","action","avatarHtml","avatarUrl","_renderTeamAvatars","avatars","toLocaleTimeString","hour","minute","hour12","messagesContainer","emptyState","messageHtml","tempDiv","firstElementChild","scrollHeight","scrollTop","pill","isLast","nextMsg","nextTime","senderKey","nextSenderKey","_updateSendButtonState","sendBtn","preview","idx","currentTarget","menuBtn","dropdown","contains","ev","expandWindowBtn","_startTyping","shiftKey","_sendMessage","emojiBtn","_toggleEmojiPicker","attachBtn","fileInput","click","files","from","reader","FileReader","onload","readAsDataURL","fileLink","_downloadFile","img","src","blob","blobUrl","URL","createObjectURL","a","download","revokeObjectURL","hasAttachments","_stopTyping","attachmentsToSend","onStartConversation","onSendMessage","_loadEmojiPicker","reject","script","existing","picker","compose","insertBefore","_insertEmoji","detail","unicode","emoji","selectionStart","selectionEnd","dispatchEvent","Event","onTyping","ConversationsView","avatarColors","_getAvatarColor","charCode","charCodeAt","conversationsHtml","_renderConversationItem","unreadClass","closedClass","timeAgo","_formatTimeAgo","avatarsHtml","_renderConversationAvatars","participants","_truncateMessage","p","initial","_renderAvatarStack","diffMs","diffMins","diffHours","diffDays","closeBtn","convId","onSelectConversation","newMsgBtn","_startNewConversation","openConversation","onStartNewConversation","HelpView","_updateCollectionsList","searchQuery","collections","filtered","_renderCollectionItem","_attachCollectionEvents","_avatarColors","bg","hash","acc","char","_getInitials","_renderAuthorAvatar","collection","author","initials","_resolveCollectionIcon","trimStart","_defaultCollectionIcon","searchTimeout","collectionId","onArticleClick","HomeView","isUnavailable","recentChangelogHtml","_renderRecentChangelog","availabilityHtml","_renderAvailabilityStatus","_renderMessageButton","_renderFeaturedCard","businessState","offlineText","opens","round","weekday","buttonLabel","buttonSubtext","_renderRecentMessageCard","hasUnread","featuredContent","coverText","recentCard","msgBtn","feedbackBtn","seeAllBtn","featuredBtn","FeedbackFormView","_isSubmitting","_selectedRating","_renderForm","_renderThankYou","_submit","onSubmitFeedback","PreChatFormView","_handleSubmit","emailInput","nameInput","errorEl","onIdentifyContact","LiveChatWidget","_explicitOptions","resolvedTheme","hasExplicitTextColor","prototype","call","hasExplicitBackgroundColor","defaultTextColor","defaultBackgroundColor","resolvedEnableChangelog","enableNews","liveChatOptions","autoLoadData","initialView","previewData","feedbackBoardName","feedbackUrl","changelogUrl","helpUrl","roadmapUrl","onFeedbackClick","sdkMetadata","launcher","wsService","_wsUnsubscribers","_feedbackWidget","notificationSoundOption","notificationSound","_notificationSound","notificationVolume","_handleOpenChange","_handleWebSocketMessage","_handleTypingStarted","_handleTypingStopped","_handleConversationClosed","_createInternalFeedbackWidget","createWidget","zIndex","horizontalPadding","verticalPadding","_widgetContainer","_handleSendMessage","_handleStartConversation","_handleSelectConversation","_handleNewConversationClick","_handleIdentifyContact","_stateUnsubscribe","_handleActiveConversationChange","messageContent","pendingAttachments","startNewConversation","fetchMessages","contactData","markAsIdentified","applyIdentity","_initWebSocket","_handleUploadFile","_uploadPendingAttachments","uploaded","cdnUrl","err","uploadedAttachments","serverData","localMessage","wsHasConnectedBefore","isReconnect","catch","navigateTo","setUnreadCount","getState","_applyPreviewData","availability","is_online","loadInitialData","_fetchConversations","_fetchHelpArticles","homeItems","_fetchChangelog","snippet","helpBase","sort","order","article_count","url_slug","newConversation","initialMessages","_fetchAndApplySettings","s","stylesChanged","_hasExplicitOption","logo_url","welcome_message","team_avatars","primary_color","background_color","text_color","launcher_position","parts","horizontal_padding","vertical_padding","home_module_enabled","messages_module_enabled","show_avatars","start_button_text","require_email_before_chat","allow_attachments","allow_emoji","show_reply_time","feedback_url","help_url","changelog_url","roadmap_url","next_open_at","holiday_name","checkAgentAvailability","publishedAt","mappedItems","_availabilityInterval","unsub","removeliveChatCustomStyles","SurveyWidget","surveyOptions","surveyType","lowLabel","highLabel","ratingScale","showFeedbackInput","showSubmitButton","autoSubmitOnSelect","showTitle","showDescription","customQuestions","thankYouConfig","thank_you_config","onSubmit","onDismiss","surveyState","score","customAnswers","pageAnswers","currentPageIndex","isVisible","removeDanglingElements","el","_renderSurvey","_closeSurvey","_getSurveyConfig","isMultiPage","_isMultiPageSurvey","isLastPage","_isLastPage","_shouldShowFeedbackInput","showActions","_shouldShowActions","_shouldShowTitle","_shouldShowDescription","progressPercent","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","pageId","ratingConfig","ratingType","currentRating","rating","labelDefaults","number","star","defaultLow","defaultHigh","emojis","emojiScale","starScale","numScale","multipleChoiceConfig","allowMultiple","allow_multiple","multiple","pageAnswer","selectedValues","option","_renderQuestionInput","question","opt","backBtn","_handleBack","_attachTypeSpecificEvents","_attachCurrentPageEvents","_selectNPS","_selectCSAT","_selectCES","_selectFrequency","select","isStarRating","_setPageAnswer","starScore","hoverScore","existingValues","nextValues","v","btnScore","_maybeAutoSubmit","_setSubmitLoading","loading","_validateCurrentPage","nextPageIndex","_getNextPageIndex","_normalizePageAnswersForSubmit","_showThankYouScreen","pageType","answer","fallbackNext","navigation","afterThisPage","condition","_evaluateCondition","_resolvePageTarget","go_to","operator","answerValue","v1","v2","normalizedId","_getSubmissionRating","page_id","output","clicked","apiMetadata","localMetadata","prepend","onAfterClose","currentPage","pageConfig","surveyConfig","rawUrl","button_url","buttonUrl","resetState","immediate","surveyEl","backdropEl","pos","TabWidget","textElement","WidgetFactory","register","WidgetClass","create","availableTypes","getAvailableTypes","isTypeRegistered","unregister","getWidgetClass","Product7$1","Product7","_validateAndMergeConfig","initialized","siteId","debug","_injectStyles","designTokens","alreadyInitialized","serverConfig","web_chat","identifyResult","_syncConfiguredMetadataAfterInit","requestedType","normalizedType","_normalizeWidgetType","widgetConfig","_getWidgetTypeConfig","explicitOptions","_omitUndefined","_normalizeWidgetOptions","widgetEnabled","_isWidgetEnabled","widgetOptions","internalType","createFeedbackWidget","createLiveChatWidget","createChangelogWidget","createSurveyWidget","getWidget","surveys","_normalizeSurveyConfig","includeIneligible","_isSurveyEligible","showSurveyById","displayOptions","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","linkConfig","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","_LiveChatWidget","_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","_setupLiveChatAttributeTriggers","openLiveChat","closeLiveChat","destroyLiveChat","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","_liveChatListenerAttached","_postMessageListenerAttached","queue","helpers","existingQueue"],"mappings":"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"}