@product7/feedback-sdk 1.5.9 → 1.6.0

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,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FeedbackSDK={})}(this,function(e){"use strict";const t=[{id:"changelog_1",title:"Feature prioritization, multiple roadmaps, and feature request analytics.",excerpt:"We are super excited to bring you the long-waited feature prioritization together with many quality updates!",description:"We are super excited to bring you the long-waited feature prioritization together with many quality updates!",cover_image:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=",slug:"feature-prioritization-roadmaps-analytics",published_at:"2025-03-15T10:00:00Z",labels:[{name:"New Feature",color:"#10B981"},{name:"Analytics",color:"#6366F1"}],status:"published"},{id:"changelog_2",title:"Dark mode support and UI improvements",excerpt:"You asked for it, we delivered! Dark mode is now available across all pages.",description:"You asked for it, we delivered! Dark mode is now available across all pages.",cover_image:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+",slug:"dark-mode-ui-improvements",published_at:"2025-03-01T10:00:00Z",labels:[{name:"Enhancement",color:"#8B5CF6"}],status:"published"},{id:"changelog_3",title:"Performance improvements and bug fixes",excerpt:"This release includes major performance improvements and several bug fixes.",description:"This release includes major performance improvements and several bug fixes.",slug:"performance-improvements-bug-fixes",published_at:"2025-02-15T10:00:00Z",labels:[{name:"Bug Fix",color:"#EF4444"},{name:"Performance",color:"#F59E0B"}],status:"published"}],n=[{id:"conv_1",subject:"Question about pricing",status:"open",last_message_at:new Date(Date.now()-294e4).toISOString(),created_at:new Date(Date.now()-1728e5).toISOString(),unread:1,assigned_user:{id:"user_1",name:"Sarah",avatar:null}},{id:"conv_2",subject:"Feature request",status:"open",last_message_at:new Date(Date.now()-5184e5).toISOString(),created_at:new Date(Date.now()-864e6).toISOString(),unread:0,assigned_user:{id:"user_2",name:"Tom",avatar:null}}],s={conv_1:[{id:"msg_1",content:"Hi there! 👋 I'm Sarah. How can I help you today?",sender_type:"agent",sender_name:"Sarah",sender_avatar:null,created_at:new Date(Date.now()-3e6).toISOString()},{id:"msg_2",content:"Hi! I have a question about your enterprise pricing.",sender_type:"customer",created_at:new Date(Date.now()-294e4).toISOString()}],conv_2:[{id:"msg_3",content:"Hello! I'm Tom from the product team.",sender_type:"agent",sender_name:"Tom",sender_avatar:null,created_at:new Date(Date.now()-6048e5).toISOString()},{id:"msg_4",content:"I would love to see a dark mode feature!",sender_type:"customer",created_at:new Date(Date.now()-5184e5-18e5).toISOString()},{id:"msg_5",content:"Great suggestion! That feature will be available next week. I'll let you know when it's ready.",sender_type:"agent",sender_name:"Tom",sender_avatar:null,created_at:new Date(Date.now()-5184e5).toISOString()}]},i=[{id:"collection_1",title:"Product Overview",description:"See how your AI-first customer service solution works.",articleCount:24,icon:"ph-book-open",url:"#"},{id:"collection_2",title:"Getting Started",description:"Everything you need to know to get started with Product7.",articleCount:30,icon:"ph-rocket",url:"#"},{id:"collection_3",title:"AI Agent",description:"Resolving customer questions instantly and accurately—from live chat to email.",articleCount:82,icon:"ph-robot",url:"#"},{id:"collection_4",title:"Channels",description:"Enabling the channels you use to communicate with customers, all from the Inbox.",articleCount:45,icon:"ph-chat-circle",url:"#"},{id:"collection_5",title:"Billing & Payments",description:"Manage your subscription, invoices, and payment methods.",articleCount:12,icon:"ph-credit-card",url:"#"}],a=[{id:"mock_nps_survey",type:"nps",title:"How likely are you to recommend us?",description:"Your feedback helps us improve",low_label:"Not likely",high_label:"Very likely",trigger:"manual",status:"active"},{id:"mock_csat_survey",type:"csat",title:"How satisfied are you?",description:"Rate your experience with our product",trigger:"manual",status:"active"},{id:"mock_ces_survey",type:"ces",title:"How easy was it?",description:"Rate the ease of completing your task",low_label:"Very difficult",high_label:"Very easy",trigger:"manual",status:"active"}],r=e=>new Promise(t=>setTimeout(t,e));function o(){if("undefined"==typeof navigator)return{device:null,browser:null,os:null};const e=navigator.userAgent;let t="desktop";/Mobi|Android/i.test(e)&&(t=/Tablet|iPad/i.test(e)?"tablet":"mobile");let n="unknown";e.includes("Firefox")?n="firefox":e.includes("Edg")?n="edge":e.includes("Chrome")?n="chrome":e.includes("Safari")?n="safari":(e.includes("Opera")||e.includes("OPR"))&&(n="opera");let s="unknown";return e.includes("Windows")?s="windows":e.includes("Mac")?s="macos":e.includes("Linux")?s="linux":e.includes("Android")?s="android":(e.includes("iPhone")||e.includes("iPad"))&&(s="ios"),{device:t,browser:n,os:s}}class l{constructor(e){this.api=e}async getChangelogs(e={}){return await this.api._ensureSession(),this.api.mock?(await r(300),{success:!0,data:t}):this.api._handleAuthRetry(async()=>{const t=this.api._getEndpointWithParams("/widget/changelogs",e);return await this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}}class c{constructor(e){this.api=e}async submitFeedback(e){if(await this.api._ensureSession(),this.api.mock)return await r(500),{success:!0,data:{id:"mock_post_"+Date.now(),title:e.title,content:e.content},message:"Feedback submitted successfully!"};const t={board:e.board_id||e.board||e.boardId,title:e.title,content:e.content,attachments:e.attachments||[]};return this.api._handleAuthRetry(async()=>await this.api._makeRequest("/widget/feedback",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}}class d{constructor(e){this.api=e}async getHelpCollections(e={}){if(await this.api._ensureSession(),this.api.mock)return await r(200),{status:!0,data:i};const t=this.api._getEndpointWithParams("/widget/help/collections",e);return this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async searchHelpArticles(e,t={}){if(await this.api._ensureSession(),this.api.mock){await r(200);return{status:!0,data:i.filter(t=>t.title.toLowerCase().includes(e.toLowerCase())||t.description.toLowerCase().includes(e.toLowerCase()))}}const n={q:e,...t},s=this.api._getEndpointWithParams("/widget/help/search",n);return this.api._makeRequest(s,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}}class h{constructor(e){this.api=e}async getMessengerSettings(){return await this.api._ensureSession(),this.api.mock?{status:!0,data:{enabled:!0,greeting_message:"Hi there! How can we help?",team_name:"Support Team",response_time:"Usually replies within a few minutes"}}:this.api._makeRequest("/widget/messenger/settings",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async checkAgentsOnline(){return await this.api._ensureSession(),this.api.mock?{status:!0,data:{agents_online:!0,online_count:2,response_time:"Usually replies within a few minutes"}}:this.api._makeRequest("/widget/messenger/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversations(e={}){if(await this.api._ensureSession(),this.api.mock)return await r(300),{status:!0,data:n,meta:{total:n.length,page:1,limit:20}};const t=this.api._getEndpointWithParams("/widget/messenger/conversations",e);return this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversation(e){if(await this.api._ensureSession(),this.api.mock){await r(200);return{status:!0,data:{...n.find(t=>t.id===e),messages:s[e]||[]}}}return this.api._makeRequest(`/widget/messenger/conversations/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async startConversation(e){if(await this.api._ensureSession(),this.api.mock){await r(300);const t={id:"conv_"+Date.now(),subject:e.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:e.message,sender_type:"customer",created_at:(new Date).toISOString(),attachments:e.attachments||[]}]};return n.unshift(t),s[t.id]=t.messages,{status:!0,data:t}}return this.api._makeRequest("/widget/messenger/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({message:e.message,subject:e.subject||"",attachments:e.attachments||[]})})}async sendMessage(e,t){if(await this.api._ensureSession(),this.api.mock){await r(200);const n={id:"msg_"+Date.now(),content:t.content,sender_type:"customer",created_at:(new Date).toISOString(),attachments:t.attachments||[]};return s[e]||(s[e]=[]),s[e].push(n),{status:!0,data:n}}return this.api._makeRequest(`/widget/messenger/conversations/${e}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({content:t.content,attachments:t.attachments||[]})})}async getUnreadCount(){if(await this.api._ensureSession(),this.api.mock){const e=n.reduce((e,t)=>e+(t.unread||0),0);return{status:!0,data:{unread_count:e,unread_conversations:e>0?1:0}}}return this.api._makeRequest("/widget/messenger/unread",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async markConversationAsRead(e){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/messenger/conversations/${e}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getMessages(e,t={}){if(await this.api._ensureSession(),this.api.mock)return await r(200),{status:!0,data:s[e]||[],meta:{total:0,page:1,limit:50}};const n={...t},i=this.api._getEndpointWithParams(`/widget/messenger/conversations/${e}/messages`,n);return this.api._makeRequest(i,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async identifyContact(e){return await this.api._ensureSession(),this.api.mock?(await r(300),{status:!0,data:{contact_id:"mock_contact_"+Date.now(),email:e.email,name:e.name||"",is_new:!0}}):this.api._makeRequest("/widget/messenger/identify",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({email:e.email,name:e.name||"",phone:e.phone||"",company:e.company||"",avatar_url:e.avatar_url||"",metadata:e.metadata||{}})})}async sendTypingIndicator(e,t){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/messenger/conversations/${e}/typing`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({is_typing:t})})}}class g extends Error{constructor(e,t){super(e),this.name="SDKError",this.cause=t,Error.captureStackTrace&&Error.captureStackTrace(this,g)}}let p=class e extends Error{constructor(t,n,s){super(n),this.name="APIError",this.status=t,this.response=s,Error.captureStackTrace&&Error.captureStackTrace(this,e)}isNetworkError(){return 0===this.status}isClientError(){return this.status>=400&&this.status<500}isServerError(){return this.status>=500&&this.status<600}};class u extends Error{constructor(e,t,n){super(e),this.name="WidgetError",this.widgetType=t,this.widgetId=n,Error.captureStackTrace&&Error.captureStackTrace(this,u)}}class m extends Error{constructor(e,t){super(e),this.name="ConfigError",this.configKey=t,Error.captureStackTrace&&Error.captureStackTrace(this,m)}}class v extends Error{constructor(e,t,n){super(e),this.name="ValidationError",this.field=t,this.value=n,Error.captureStackTrace&&Error.captureStackTrace(this,v)}}class b{constructor(e){this.api=e}async getActiveSurveys(e={}){if(await this.api._ensureSession(),this.api.mock)return await r(200),{success:!0,data:a};const t=this._getRespondentContext(e),n={url:e.url||("undefined"!=typeof window?window.location.href:""),...o(),...t.respondent_id&&{respondent_id:t.respondent_id},...t.email&&{email:t.email},...void 0!==e.includeEligibility&&{include_eligibility:e.includeEligibility},...e.userProperties&&{user_properties:e.userProperties}};return this.api._handleAuthRetry(async()=>{const e=this.api._getEndpointWithParams("/widget/surveys/active",n);return await this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}_getRespondentContext(e={}){const t="function"==typeof this.api.getUserContext&&this.api.getUserContext()||{};return{respondent_id:e.respondentId||e.userId||t.user_id||null,email:e.email||t.email||null}}async submitSurveyResponse(e,t){if(!e)throw new p(400,"Survey ID is required");if(await this.api._ensureSession(),this.api.mock)return await r(300),{success:!0,data:{id:"mock_response_"+Date.now(),survey_id:e,...t},message:"Survey response submitted successfully!"};const n=this._getRespondentContext(t),s={rating:t.rating,feedback:t.feedback||"",answers:t.answers||{},...n.respondent_id&&{respondent_id:n.respondent_id},...n.email&&{email:n.email}};return this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${e}/responses`,{method:"POST",body:JSON.stringify(s),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}async dismissSurvey(e){if(!e)throw new p(400,"Survey ID is required");return await this.api._ensureSession(),this.api.mock?(await r(100),{success:!0,message:"Survey dismissed successfully"}):this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${e}/dismiss`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}}))}}class f{constructor(e={}){this.workspace=e.workspace,this.sessionToken=null,this.sessionExpiry=null,this.userContext=e.userContext||null,this.mock=e.mock||!1,this.env=e.env||"production",this.baseURL=this._getBaseURL(e),this._loadStoredSession()}_getBaseURL(e){if(e.apiUrl)return e.apiUrl;const t={production:{base:"https://api.product7.io/api/v1",withWorkspace:e=>`https://${e}.api.product7.io/api/v1`},staging:{base:"https://staging.api.product7.io/api/v1",withWorkspace:e=>`https://${e}.staging.api.product7.io/api/v1`},localstack:{base:"http://localhost:1323/api/v1",withWorkspace:e=>`http://${e}.localhost:1323/api/v1`}},n=t[this.env]||t.production;return this.workspace?n.withWorkspace(this.workspace):n.base}async init(e=null){if(e&&(this.userContext=e),this.isSessionValid())return{sessionToken:this.sessionToken};if(!this.workspace||!this.userContext)throw new p(400,`Missing ${this.workspace?"user context":"workspace"} for initialization`);return this.mock?this._initMockSession():this._initRealSession()}async _initMockSession(){return this.sessionToken="mock_session_"+Date.now(),this.sessionExpiry=new Date(Date.now()+36e5),this._storeSession(),{sessionToken:this.sessionToken,config:{primaryColor:"#21244A",backgroundColor:"#ffffff",textColor:"#1F2937",boardId:"feature-requests",size:"medium",displayMode:"modal"},expiresIn:3600}}async _initRealSession(){const e={workspace:this.workspace,user:this.userContext};try{const t=await this._makeRequest("/widget/init",{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}});return this.sessionToken=t.session_token,this.sessionExpiry=new Date(Date.now()+1e3*t.expires_in),this._storeSession(),{sessionToken:this.sessionToken,config:t.config||{},expiresIn:t.expires_in}}catch(e){throw new p(e.status||500,`Failed to initialize widget: ${e.message}`,e.response)}}async _ensureSession(){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new p(401,"No valid session token available")}async _handleAuthRetry(e,...t){try{return await e.apply(this,t)}catch(n){if(401===n.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),await e.apply(this,t);throw n}}isSessionValid(){return this.sessionToken&&this.sessionExpiry&&new Date<this.sessionExpiry}setUserContext(e){this.userContext=e,this._storeData("feedbackSDK_userContext",e)}getUserContext(){return this.userContext}clearSession(){this.sessionToken=null,this.sessionExpiry=null,this._removeData("feedbackSDK_session"),this._removeData("feedbackSDK_userContext")}_storeSession(){if("undefined"!=typeof localStorage)try{const e={token:this.sessionToken,expiry:this.sessionExpiry.toISOString(),workspace:this.workspace};this._storeData("feedbackSDK_session",e)}catch(e){}}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const e=localStorage.getItem("feedbackSDK_session");if(!e)return!1;const t=JSON.parse(e);return this.sessionToken=t.token,this.sessionExpiry=new Date(t.expiry),this.isSessionValid()}catch(e){return!1}}_storeData(e,t){"undefined"!=typeof localStorage&&localStorage.setItem(e,JSON.stringify(t))}_removeData(e){"undefined"!=typeof localStorage&&localStorage.removeItem(e)}async _makeRequest(e,t={}){const n=`${this.baseURL}${e}`;try{const e=await fetch(n,t);if(!e.ok){let t=`HTTP ${e.status}`,n=null;try{n=await e.json(),t=n.message||n.error||t}catch(n){t=await e.text()||t}throw new p(e.status,t,n)}const s=e.headers.get("content-type");return s&&s.includes("application/json")?await e.json():await e.text()}catch(e){if(e instanceof p)throw e;throw new p(0,e.message,null)}}_buildQueryParams(e){const t=new URLSearchParams;return Object.entries(e).forEach(([e,n])=>{null!=n&&t.append(e,"object"==typeof n?JSON.stringify(n):n)}),t.toString()}_getEndpointWithParams(e,t){const n=this._buildQueryParams(t);return`${e}${n?"?"+n:""}`}}class y extends f{constructor(e={}){super(e),this.feedback=new c(this),this.survey=new b(this),this.messenger=new h(this),this.help=new d(this),this.changelog=new l(this)}async submitFeedback(e){return this.feedback.submitFeedback(e)}async getActiveSurveys(e){return this.survey.getActiveSurveys(e)}async submitSurveyResponse(e,t){return this.survey.submitSurveyResponse(e,t)}async dismissSurvey(e){return this.survey.dismissSurvey(e)}async getMessengerSettings(){return this.messenger.getMessengerSettings()}async checkAgentsOnline(){return this.isSessionValid()||await this.init(),this.mock?{status:!0,data:{agents_online:!0,online_count:2,response_time:"Usually replies within a few minutes",available_agents:[{full_name:"Sarah",picture:""},{full_name:"Tom",picture:""}]}}:this._makeRequest("/widget/messenger/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getConversations(e){return this.messenger.getConversations(e)}async getConversation(e){return this.messenger.getConversation(e)}async getMessages(e,t){return this.messenger.getMessages(e,t)}async startConversation(e){if(!this.isSessionValid()){console.log("[APIService] startConversation: session invalid, calling init...");try{await this.init(),console.log("[APIService] startConversation: init result, token:",this.sessionToken?"set":"null")}catch(e){throw console.error("[APIService] startConversation: init failed:",e.message),e}}if(!this.sessionToken)throw console.error("[APIService] startConversation: no session token after init"),new APIError(401,"No valid session token available");if(console.log("[APIService] startConversation: sending to",`${this.baseURL}/widget/messenger/conversations`,"mock:",this.mock),this.mock){await new Promise(e=>setTimeout(e,300));const t={id:"conv_"+Date.now(),subject:e.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:e.message,sender_type:"customer",created_at:(new Date).toISOString()}]};return MOCK_CONVERSATIONS.unshift(t),MOCK_MESSAGES[t.id]=t.messages,{status:!0,data:t}}return this._makeRequest("/widget/messenger/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({message:e.message,subject:e.subject||""})})}async sendMessage(e,t){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));const n={id:"msg_"+Date.now(),content:t.content,attachments:t.attachments||[],sender_type:"customer",created_at:(new Date).toISOString()};return MOCK_MESSAGES[e]||(MOCK_MESSAGES[e]=[]),MOCK_MESSAGES[e].push(n),{status:!0,data:n}}const n={content:t.content};return t.attachments&&t.attachments.length>0&&(n.attachments=t.attachments),this._makeRequest(`/widget/messenger/conversations/${e}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify(n)})}async uploadFile(e,t){return this.isSessionValid()||await this.init(),this.mock?(await new Promise(e=>setTimeout(e,300)),{status:!0,url:`https://mock-cdn.example.com/${t}`}):this._makeRequest("/widget/messenger/upload",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({file:e,filename:t})})}async sendTypingIndicator(e,t){return this.messenger.sendTypingIndicator(e,t)}async markConversationAsRead(e){return this.messenger.markConversationAsRead(e)}async getUnreadCount(){return this.messenger.getUnreadCount()}async submitRating(e,t){return this.messenger.submitRating(e,t)}async identifyContact(e){return this.messenger.identifyContact(e)}async getHelpCollections(e){return this.help.getHelpCollections(e)}async searchHelpArticles(e,t){return this.help.searchHelpArticles(e,t)}async getChangelogs(e){return this.changelog.getChangelogs(e)}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const e=localStorage.getItem("feedbackSDK_session");if(!e)return!1;const t=JSON.parse(e);return(t.token&&t.token.startsWith("mock_"))!==this.mock?(localStorage.removeItem("feedbackSDK_session"),!1):(this.sessionToken=t.token,this.sessionExpiry=new Date(t.expiry),this.isSessionValid())}catch(e){return!1}}async _makeRequest(e,t={}){const n=`${this.baseURL}${e}`;try{const e=await fetch(n,t);if(!e.ok){let t=`HTTP ${e.status}`,n=null;try{n=await e.json(),t=n.message||n.error||t}catch(n){t=await e.text()||t}throw new APIError(e.status,t,n)}const s=e.headers.get("content-type");return s&&s.includes("application/json")?await e.json():await e.text()}catch(e){if(e instanceof APIError)throw e;throw new APIError(0,e.message,null)}}}class w{constructor(){this.events=new Map}on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(n){const e=n.indexOf(t);e>-1&&n.splice(e,1)}}emit(e,t){const n=this.events.get(e);n&&n.forEach(e=>{try{e(t)}catch(e){console.error("[FeedbackSDK] Event callback error:",e)}})}once(e,t){const n=this.on(e,e=>{t(e),n()});return n}clear(){this.events.clear()}getListenerCount(e){const t=this.events.get(e);return t?t.length:0}}function k(e="feedback"){return`${e}_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}function x(e,t){const n={...e};for(const s in t)t.hasOwnProperty(s)&&(t[s]&&"object"==typeof t[s]&&!Array.isArray(t[s])?n[s]=x(e[s]||{},t[s]):n[s]=t[s]);return n}function _(){return"undefined"!=typeof window&&"undefined"!=typeof document}var S=Object.freeze({__proto__:null,debounce:function(e,t){let n;return function(...s){clearTimeout(n),n=setTimeout(()=>{clearTimeout(n),e(...s)},t)}},deepMerge:x,delay:function(e){return new Promise(t=>setTimeout(t,e))},escapeRegex:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},formatFileSize:function(e){if(0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["Bytes","KB","MB","GB"][t]},generateId:k,getBrowserInfo:function(){return{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language||navigator.userLanguage,cookieEnabled:navigator.cookieEnabled,screenResolution:`${screen.width}x${screen.height}`,windowSize:`${window.innerWidth}x${window.innerHeight}`,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}},getCSSProperty:function(e,t,n=""){if(!e||!t)return n;try{return window.getComputedStyle(e).getPropertyValue(t)||n}catch(e){return n}},getCurrentTimestamp:function(){return(new Date).toISOString()},getNestedProperty:function(e,t,n=void 0){if(!e||!t)return n;const s=t.split(".");let i=e;for(const e of s){if(null==i||!(e in i))return n;i=i[e]}return i},isBrowser:_,isInViewport:function(e){if(!e)return!1;const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)},isMobile:function(){return!!_()&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<=768)},isValidEmail:function(e){return!(!e||"string"!=typeof e)&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.trim())},safeJsonParse:function(e,t=null){try{return JSON.parse(e)}catch(e){return t}},sanitizeHTML:function(e){if(!e||"string"!=typeof e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML},scrollToElement:function(e,t={}){if(!e)return;e.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest",...t})},setNestedProperty:function(e,t,n){if(!e||!t)return e;const s=t.split("."),i=s.pop();let a=e;for(const e of s)e in a&&"object"==typeof a[e]||(a[e]={}),a=a[e];return a[i]=n,e},throttle:function(e,t){let n,s;return function(...i){s?(clearTimeout(n),n=setTimeout(()=>{Date.now()-s>=t&&(e(...i),s=Date.now())},t-(Date.now()-s))):(e(...i),s=Date.now())}},validateConfig:function(e,t=[]){const n=[];for(const s of t)e[s]||n.push(s);if(n.length>0)throw new Error(`Missing required configuration: ${n.join(", ")}`);return!0}});class C{static STORAGE_KEY="feedback_submitted";static DEFAULT_COOLDOWN_DAYS=30;constructor(e={}){this.id=e.id,this.sdk=e.sdk,this.apiService=e.apiService,this.type=e.type||"base",this.options={container:null,position:this.sdk.config.position,boardId:this.sdk.config.boardId,displayMode:e.displayMode||"panel",size:e.size||"medium",primaryColor:e.primaryColor||"#155EEF",backgroundColor:e.backgroundColor||"#ffffff",textColor:e.textColor||"#1F2937",autoShow:!1,showBackdrop:!1,customStyles:{},suppressAfterSubmission:!0,suppressionDays:C.DEFAULT_COOLDOWN_DAYS,...e},this.element=null,this.panelElement=null,this.backdropElement=null,this.mounted=!1,this.destroyed=!1,this.state={isOpen:!1,isLoading:!1,isSubmitting:!1,title:"",content:"",email:"",attachments:[],errors:{}},this._bindMethods()}mount(e){return this.mounted||this.destroyed?this:this.options.suppressAfterSubmission&&this._hasRecentlySubmitted()?(this.sdk.eventBus.emit("widget:suppressed",{widget:this,reason:"recently_submitted"}),this):("string"==typeof e&&(e=document.querySelector(e)),e||(e=document.body),this.container=e,this.element=this._render(),this.container.appendChild(this.element),this.mounted=!0,this._attachEvents(),this.onMount(),this.options.autoShow&&this.show(),this.sdk.eventBus.emit("widget:mounted",{widget:this}),this)}show(){return this.element&&(this.element.style.display="block"),this}hide(){return this.element&&(this.element.style.display="none"),this}openPanel(){this.state.isOpen=!0,"modal"===this.options.displayMode?(this._showLoadingModal(),setTimeout(()=>{this._hideLoadingModal(),this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")})},600)):(this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}_showLoadingModal(){this.state.isLoading=!0,this.backdropElement=document.createElement("div"),this.backdropElement.className="sdk-modal-backdrop",document.body.appendChild(this.backdropElement),this.loadingElement=document.createElement("div"),this.loadingElement.className="feedback-loading-modal",this.loadingElement.innerHTML='\n\t\t\t<div class="sdk-spinner"></div>\n\t\t',document.body.appendChild(this.loadingElement),requestAnimationFrame(()=>{this.backdropElement.classList.add("show"),this.loadingElement.classList.add("show")})}_hideLoadingModal(){this.state.isLoading=!1,this.loadingElement&&(this.loadingElement.remove(),this.loadingElement=null)}closePanel(){this.panelElement&&this.panelElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.panelElement&&this.panelElement.parentNode&&(this.panelElement.parentNode.removeChild(this.panelElement),this.panelElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null),this._resetForm()},300)}async submitFeedback(){if(!this.state.isSubmitting){this._hideError();try{this.state.isSubmitting=!0,this._updateSubmitButton();const e={title:this.state.title||"Feedback",content:this.state.content,email:this.state.email,board_id:this.options.boardId,attachments:this.state.attachments};if(!this.state.content.trim())return void this._showError("Please enter your feedback message.");const t=await this.apiService.submitFeedback(e);this._trackSubmission(),this._showSuccessMessage(),this.closePanel(),this.sdk.eventBus.emit("feedback:submitted",{widget:this,feedback:t})}catch(e){this._showError("Failed to submit feedback. Please try again."),this.sdk.eventBus.emit("feedback:error",{widget:this,error:e})}finally{this.state.isSubmitting=!1,this._updateSubmitButton()}}}handleConfigUpdate(e){this.options.theme=e.theme,this.element&&this._updateTheme()}destroy(){this.destroyed||(this.onDestroy(),this.closePanel(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.destroyed=!0,this.mounted=!1,this.sdk.eventBus.emit("widget:destroyed",{widget:this}))}onMount(){}onDestroy(){}_trackSubmission(){try{const e=this.sdk.config.workspace,t=`${C.STORAGE_KEY}_${e}`,n={submittedAt:Date.now(),boardId:this.options.boardId};localStorage.setItem(t,JSON.stringify(n))}catch(e){console.warn("Failed to track feedback submission:",e)}}_hasRecentlySubmitted(){const e=24*this.options.suppressionDays*60*60*1e3,t=Date.now();if(this.sdk.config.last_feedback_at)try{if(t-new Date(this.sdk.config.last_feedback_at).getTime()<e)return!0}catch(e){}try{const n=this.sdk.config.workspace,s=`${C.STORAGE_KEY}_${n}`,i=localStorage.getItem(s);if(!i)return!1;const a=JSON.parse(i);return t-a.submittedAt<e}catch(e){return!1}}clearSubmissionTracking(){try{const e=this.sdk.config.workspace,t=`${C.STORAGE_KEY}_${e}`;localStorage.removeItem(t)}catch(e){console.warn("Failed to clear submission tracking:",e)}}shouldShow(){return!this.options.suppressAfterSubmission||!this._hasRecentlySubmitted()}_render(){throw new Error("_render() must be implemented by concrete widget")}_attachEvents(){}_bindMethods(){this.openPanel=this.openPanel.bind(this),this.closePanel=this.closePanel.bind(this),this.submitFeedback=this.submitFeedback.bind(this)}_renderPanel(){if(this.panelElement)return;this.options.showBackdrop&&!this.backdropElement&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="sdk-modal-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",this.closePanel));const e="modal"===this.options.displayMode?"feedback-modal":"feedback-panel",t=`size-${this.options.size}`;this.panelElement=document.createElement("div"),this.panelElement.className=`${e} ${t}`,this.panelElement.style.setProperty("--primary-color",this.options.primaryColor),this.panelElement.style.setProperty("--bg-color",this.options.backgroundColor),this.panelElement.style.setProperty("--text-color",this.options.textColor),this.panelElement.innerHTML=this._getPanelHTML(),document.body.appendChild(this.panelElement),this._attachPanelEvents();const n=this.panelElement.querySelector("input, textarea");n&&setTimeout(()=>n.focus(),350)}_getPanelHTML(){return`\n <div class="feedback-panel-content">\n<div class="feedback-panel-header">\n <h3>Send Feedback</h3>\n <button class="sdk-close-btn" type="button" aria-label="Close">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="18" height="18">\n <rect width="256" height="256" fill="none"/>\n <line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n </button>\n</div>\n <div class="feedback-panel-body">\n <form class="feedback-form">\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-title-${this.id}">Title (optional)</label>\n <input \n type="text" \n id="feedback-title-${this.id}" \n name="title" \n class="sdk-input"\n placeholder="Brief description of your feedback"\n value="${this.state.title}"\n />\n </div>\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-content-${this.id}">Message *</label>\n <textarea \n id="feedback-content-${this.id}" \n name="content" \n class="sdk-textarea"\n placeholder="Tell us what you think..."\n required\n >${this.state.content}</textarea>\n </div>\n <div class="feedback-error" role="alert"></div>\n <div class="feedback-form-actions">\n <button type="submit" class="sdk-btn-primary sdk-btn-block">\n ${this.state.isSubmitting?"Sending...":"Send Feedback"}\n </button>\n </div>\n </form>\n </div>\n </div>\n `}_attachPanelEvents(){const e=this.panelElement;e.querySelector(".sdk-close-btn").addEventListener("click",this.closePanel);e.querySelector(".feedback-form").addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value});const t=e=>{"Escape"===e.key&&(this.closePanel(),document.removeEventListener("keydown",t))};document.addEventListener("keydown",t)}_updateSubmitButton(){if(this.panelElement){const e=this.panelElement.querySelector(".sdk-btn-primary");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}}_showError(e){if(this.panelElement){const t=this.panelElement.querySelector(".feedback-error");t&&(t.textContent=e,t.classList.add("show"))}}_hideError(){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-error");e&&e.classList.remove("show")}}_showSuccessMessage(){const e=document.createElement("div");e.className="sdk-notification sdk-notification-success",e.innerHTML='\n <div class="sdk-notification-content">\n <div class="sdk-notification-icon">✓</div>\n <span class="sdk-notification-text">Feedback submitted successfully!</span>\n <button class="sdk-close-btn" aria-label="Close">&times;</button>\n </div>\n ',document.body.appendChild(e);const t=()=>{e.parentNode&&(e.style.opacity="0",setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},300))};e.querySelector(".sdk-close-btn").addEventListener("click",t),setTimeout(t,4e3)}_resetForm(){this.state.title="",this.state.content="",this.state.email="",this.state.errors={}}_updateTheme(){}openModal(){this.openPanel()}closeModal(){this.closePanel()}}class E extends C{constructor(e){super({...e,type:"button"}),this.isMinimized=!1,this._hiddenForOpenPanel=!1}_render(){const e=document.createElement("div");return e.className=`feedback-widget-button position-${this.options.position}`,e.innerHTML='\n <button class="feedback-trigger-btn" type="button">\n <svg class="feedback-icon" width="20" height="20" viewBox="0 0 256 256" fill="currentColor">\n <path d="M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z"/>\n </svg>\n <span class="feedback-text">Feedback</span>\n \n <div class="feedback-minimize-icon">\n <svg viewBox="0 0 256 256">\n <path d="M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z"/>\n </svg>\n </div>\n \n <div class="feedback-expand-icon">\n <svg viewBox="0 0 256 256">\n <path d="M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z"/>\n </svg>\n </div>\n </button>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-trigger-btn"),t=this.element.querySelector(".feedback-minimize-icon"),n=this.element.querySelector(".feedback-expand-icon"),s=e=>{(e=>e instanceof Element&&Boolean(e.closest(".feedback-minimize-icon")||e.closest(".feedback-expand-icon")))(e)||this.isMinimized||this.openPanel()};t.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.minimize()}),n.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.restore()}),e.addEventListener("click",e=>{s(e.target)}),e.addEventListener("pointerup",e=>{"mouse"!==e.pointerType&&s(e.target)})}minimize(){this.isMinimized=!0,this.element.classList.add("minimized")}restore(){this.isMinimized=!1,this.element.classList.remove("minimized")}openPanel(){this.state.isOpen||(this._hiddenForOpenPanel=!0,this.hide()),super.openPanel()}closePanel(){const e=this._hiddenForOpenPanel;super.closePanel(),e&&setTimeout(()=>{this.destroyed||this.show(),this._hiddenForOpenPanel=!1},320)}mount(e){super.mount(e)}updateText(e){const t=this.element?.querySelector(".feedback-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class I extends C{constructor(e){super({...e,type:"changelog"}),this.changelogs=[],this.isLoading=!1,this.modalElement=null,this.sidebarElement=null,this.currentIndex=0}_render(){const e=document.createElement("div");return e.className=`changelog-widget position-${this.options.position}`,e.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`,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){this.element.querySelector(".changelog-trigger-btn").addEventListener("click",()=>{this.openSidebar()})}async openModal(){this.modalElement||(this.state.isOpen=!0,this._createModal(),0===this.changelogs.length&&await this._loadChangelogs(),this.currentIndex=0,this._renderCurrentChangelog(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.modalElement&&this.modalElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}closeModal(){document.body.style.overflow="",this.modalElement&&this.modalElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.modalElement&&this.modalElement.parentNode&&(this.modalElement.parentNode.removeChild(this.modalElement),this.modalElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null)},300)}_createModal(){this.backdropElement=document.createElement("div"),this.backdropElement.className="changelog-modal-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this.closeModal()),this.modalElement=document.createElement("div"),this.modalElement.className="changelog-modal",this.modalElement.innerHTML='\n\t\t\t<div class="changelog-modal-container">\n\t\t\t\t<button class="changelog-modal-close" type="button" aria-label="Close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></svg></button>\n\t\t\t\t<div class="changelog-modal-content">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',document.body.appendChild(this.modalElement),this.modalElement.querySelector(".changelog-modal-container").addEventListener("click",e=>e.stopPropagation()),this.modalElement.querySelector(".changelog-modal-close").addEventListener("click",()=>this.closeModal()),this._escapeHandler=e=>{"Escape"===e.key&&this.closeModal()},document.addEventListener("keydown",this._escapeHandler)}async openSidebar(){this.listModalElement||(this.modalElement&&(this.closeModal(),await new Promise(e=>setTimeout(e,350))),this.state.isOpen=!0,this._createListModal(),0===this.changelogs.length&&await this._loadChangelogs(),this._renderChangelogList(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.listModalElement&&(this.listModalElement.classList.add("open"),this._showConfetti()),this.listModalBackdropElement&&this.listModalBackdropElement.classList.add("show")}))}_showConfetti(){const e=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA"],t=document.createElement("div");t.className="changelog-confetti-container",document.body.appendChild(t);for(let n=0;n<50;n++){const n=document.createElement("div");n.className="changelog-confetti",n.style.left=100*Math.random()+"%",n.style.backgroundColor=e[Math.floor(Math.random()*e.length)],n.style.animationDelay=.5*Math.random()+"s",n.style.animationDuration=1*Math.random()+1.5+"s";const s=["circle","square","rectangle"],i=s[Math.floor(Math.random()*s.length)];"circle"===i?(n.style.borderRadius="50%",n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width):"rectangle"===i?(n.style.width=4*Math.random()+3+"px",n.style.height=10*Math.random()+8+"px"):(n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width),t.appendChild(n)}setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},2500)}closeSidebar(){document.body.style.overflow="",this.listModalElement&&this.listModalElement.classList.remove("open"),this.listModalBackdropElement&&this.listModalBackdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.listModalElement&&this.listModalElement.parentNode&&(this.listModalElement.parentNode.removeChild(this.listModalElement),this.listModalElement=null),this.listModalBackdropElement&&this.listModalBackdropElement.parentNode&&(this.listModalBackdropElement.parentNode.removeChild(this.listModalBackdropElement),this.listModalBackdropElement=null),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler)},300)}_createListModal(){this.listModalBackdropElement=document.createElement("div"),this.listModalBackdropElement.className="changelog-list-modal-backdrop",document.body.appendChild(this.listModalBackdropElement),this.listModalBackdropElement.addEventListener("click",()=>this.closeSidebar()),this.listModalElement=document.createElement("div"),this.listModalElement.className="changelog-list-modal",this.listModalElement.innerHTML=`\n\t\t\t<div class="changelog-list-modal-container">\n\t\t\t\t<div class="changelog-list-modal-header">\n\t\t\t\t\t<h2>${this.options.title||"What's New"} 🎉</h2>\n\t\t\t\t<button class="changelog-list-modal-close" type="button" aria-label="Close">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="18" height="18">\n <rect width="256" height="256" fill="none"/>\n <line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n</button></div>\n\t\t\t\t<div class="changelog-list-modal-body">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,document.body.appendChild(this.listModalElement),this.listModalElement.querySelector(".changelog-list-modal-container").addEventListener("click",e=>e.stopPropagation()),this.listModalElement.querySelector(".changelog-list-modal-close").addEventListener("click",()=>this.closeSidebar()),this._listModalEscapeHandler=e=>{"Escape"===e.key&&this.closeSidebar()},document.addEventListener("keydown",this._listModalEscapeHandler)}_renderChangelogList(){const e=this.listModalElement.querySelector(".changelog-list-modal-body");this.isLoading||(0!==this.changelogs.length?(e.innerHTML=`\n\t\t\t<div class="changelog-list">\n\t\t\t\t${this.changelogs.map((e,t)=>this._renderChangelogListItem(e,t)).join("")}\n\t\t\t</div>\n\t\t`,e.querySelectorAll(".changelog-list-item").forEach((e,t)=>{e.addEventListener("click",()=>{this._handleViewUpdate(this.changelogs[t])})})):e.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')}_renderChangelogListItem(e,t){const n=e.cover_image||e.image,s=e.cover_image||e.image,i=e.published_at?this._formatDate(e.published_at):"",a=this._truncateDescription(e.excerpt||e.description,120);return`\n\t\t\t<div class="changelog-list-item" data-index="${t}">\n\t\t\t\t<div class="changelog-list-item-main">\n\t\t\t\t\t${n?`\n\t\t\t\t\t\t<div class="changelog-list-item-image">\n\t\t\t\t\t\t\t<img src="${s}" alt="${e.title}" loading="lazy" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<div class="changelog-list-item-content">\n\t\t\t\t\t\t${i?`<span class="changelog-list-item-date">${i}</span>`:""}\n\t\t\t\t\t\t${e.labels&&e.labels.length>0?`\n\t\t\t\t\t\t\t<div class="changelog-list-item-labels">\n\t\t\t\t\t\t\t\t${e.labels.map(e=>`\n\t\t\t\t\t\t\t\t\t<span class="changelog-label" style="background-color: ${e.color||"#E5E7EB"}; color: ${this._getContrastColor(e.color||"#E5E7EB")}">${e.name}</span>\n\t\t\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`:""}\n\t\t\t\t\t\t<h3 class="changelog-list-item-title">${e.title}</h3>\n\t\t\t\t\t\t${a?`<p class="changelog-list-item-description">${a}</p>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}async _loadChangelogs(){this.isLoading=!0;try{const e=await this.apiService.getChangelogs();this.changelogs=e.data||[],this.sdk.eventBus.emit("changelog:loaded",{changelogs:this.changelogs})}catch(e){this.changelogs=[],this.sdk.eventBus.emit("changelog:error",{error:e})}finally{this.isLoading=!1}}_renderCurrentChangelog(){const e=this.modalElement.querySelector(".changelog-modal-content");if(this.isLoading)return;if(0===this.changelogs.length)return void(e.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');const t=this.changelogs[this.currentIndex],n=t.cover_image||t.image,s=t.cover_image||t.image,i=this.changelogs.length>1,a=this._truncateDescription(t.excerpt||t.description,160);e.innerHTML=`\n\t\t\t<div class="changelog-popup-item">\n\t\t\t\t${n?`\n\t\t\t\t\t<div class="changelog-popup-image">\n\t\t\t\t\t\t<img src="${s}" alt="${t.title}" loading="lazy" />\n\t\t\t\t\t</div>\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">${t.title}</h2>\n\t\t\t\t\t${a?`<p class="changelog-popup-description">${a}</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${i?`\n\t\t\t\t\t\t<div class="changelog-popup-dots">\n\t\t\t\t\t\t\t${this.changelogs.map((e,t)=>`\n\t\t\t\t\t\t\t\t<span class="changelog-dot ${t===this.currentIndex?"active":""}" data-index="${t}"></span>\n\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<button class="changelog-view-all-btn" type="button">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n\t\t\t\t\t\t\t<path d="M5 12h14M12 5l7 7-7 7"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,e.querySelector(".changelog-popup-btn").addEventListener("click",()=>{this._handleViewUpdate(t)}),e.querySelector(".changelog-view-all-btn").addEventListener("click",()=>{this.closeModal(),setTimeout(()=>this.openSidebar(),350)}),i&&e.querySelectorAll(".changelog-dot").forEach(e=>{e.addEventListener("click",e=>{this.currentIndex=parseInt(e.target.dataset.index,10),this._renderCurrentChangelog()})})}_handleViewUpdate(e){this.sdk.eventBus.emit("changelog:view",{changelog:e});const t=(this.options.changelogBaseUrl||"").replace(/\/$/,""),n=e.url||(e.slug&&t?`${t}/${e.slug}`:null)||t||null;n&&(!1!==this.options.openInNewTab?window.open(n,"_blank","noopener,noreferrer"):window.location.href=n),"function"==typeof this.options.onViewUpdate&&this.options.onViewUpdate(e)}_stripHtml(e){const t=document.createElement("div");return t.innerHTML=e,(t.textContent||t.innerText||"").trim()}_truncateDescription(e,t=120){if(!e)return"";const n=this._stripHtml(e);return n.length<=t?n:n.substring(0,t).trimEnd()+"..."}_formatDate(e){return new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}_getContrastColor(e){const t=e.replace("#","");return(.299*parseInt(t.substr(0,2),16)+.587*parseInt(t.substr(2,2),16)+.114*parseInt(t.substr(4,2),16))/255>.5?"#1F2937":"#FFFFFF"}hideBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="none")}showBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="block")}nextChangelog(){this.currentIndex<this.changelogs.length-1&&(this.currentIndex++,this._renderCurrentChangelog())}prevChangelog(){this.currentIndex>0&&(this.currentIndex--,this._renderCurrentChangelog())}async refresh(){this.changelogs=[],await this._loadChangelogs(),this.modalElement&&(this.currentIndex=0,this._renderCurrentChangelog()),this.listModalElement&&this._renderChangelogList()}mount(e){super.mount(e)}destroy(){this._escapeHandler&&document.removeEventListener("keydown",this._escapeHandler),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler),this.closeModal(),this.closeSidebar(),super.destroy()}}class A extends C{constructor(e){super({...e,type:"inline"})}_render(){const e=document.createElement("div");return e.className="feedback-widget feedback-widget-inline",e.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 `,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-inline-form");e.addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value}),e.querySelector('input[name="email"]').addEventListener("input",e=>{this.state.email=e.target.value})}openModal(){const e=this.element.querySelector('textarea[name="content"]');e&&e.focus()}closeModal(){}_showSuccessMessage(){const e=this.element.querySelector(".feedback-inline-content"),t=e.innerHTML;e.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 ';e.querySelector(".sdk-btn-primary").addEventListener("click",()=>{e.innerHTML=t,this._attachEvents(),this._resetForm()})}_showError(e){const t=this.element.querySelector(".feedback-error");t&&(t.textContent=e,t.classList.add("show"),setTimeout(()=>{t&&t.classList.remove("show")},5e3))}_updateSubmitButton(){const e=this.element.querySelector(".sdk-btn-primary");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}updateTitle(e){const t=this.element?.querySelector("h3");t&&(t.textContent=e)}setPlaceholder(e,t){const n=this.element?.querySelector(`[name="${e}"]`);n&&(n.placeholder=t)}}class M{constructor(e={}){this.baseURL=e.baseURL||"",this.workspace=e.workspace||"",this.sessionToken=e.sessionToken||null,this.mock=e.mock||!1,this.ws=null,this.reconnectAttempts=0,this.maxReconnectAttempts=5,this.reconnectDelay=1e3,this.pingInterval=null,this.isConnected=!1,this._listeners=new Map,this._onOpen=this._onOpen.bind(this),this._onMessage=this._onMessage.bind(this),this._onClose=this._onClose.bind(this),this._onError=this._onError.bind(this)}connect(e=null){if(e&&(this.sessionToken=e),!this.sessionToken)return void console.warn("[WebSocket] No session token provided");if(this.mock)return this.isConnected=!0,this._emit("connected",{}),void this._startMockResponses();const t="https:"===window.location.protocol?"wss:":"ws:";let n=this.baseURL.replace(/^https?:/,t);n=n.replace("/api/v1",""),n=`${n}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;try{this.ws=new WebSocket(n),this.ws.onopen=this._onOpen,this.ws.onmessage=this._onMessage,this.ws.onclose=this._onClose,this.ws.onerror=this._onError}catch(e){console.error("[WebSocket] Connection error:",e),this._scheduleReconnect()}}disconnect(){this.isConnected=!1,this.reconnectAttempts=this.maxReconnectAttempts,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this.ws&&(this.ws.close(),this.ws=null),this._mockInterval&&(clearInterval(this._mockInterval),this._mockInterval=null)}on(e,t){return this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(t),()=>this._listeners.get(e).delete(t)}off(e,t){this._listeners.has(e)&&this._listeners.get(e).delete(t)}send(e,t={}){this.isConnected?this.mock?console.log("[WebSocket Mock] Sending:",e,t):this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:e,payload:t})):console.warn("[WebSocket] Not connected, cannot send message")}_onOpen(){console.log("[WebSocket] Connected"),this.isConnected=!0,this.reconnectAttempts=0,this._emit("connected",{}),this.pingInterval=setInterval(()=>{this.send("ping",{})},3e4)}_onMessage(e){try{const t=JSON.parse(e.data),{type:n,payload:s}=t;switch(n){case"message:new":this._emit("message",s);break;case"typing:started":this._emit("typing_started",s);break;case"typing:stopped":this._emit("typing_stopped",s);break;case"conversation:updated":this._emit("conversation_updated",s);break;case"conversation:closed":this._emit("conversation_closed",s);break;case"availability:changed":this._emit("availability_changed",s);break;case"pong":break;default:console.log("[WebSocket] Unknown event:",n,s)}}catch(e){console.error("[WebSocket] Failed to parse message:",e)}}_onClose(e){console.log("[WebSocket] Disconnected:",e.code,e.reason),this.isConnected=!1,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._emit("disconnected",{code:e.code,reason:e.reason}),this._scheduleReconnect()}_onError(e){console.error("[WebSocket] Error:",e),this._emit("error",{error:e})}_scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts)return console.log("[WebSocket] Max reconnect attempts reached"),void this._emit("reconnect_failed",{});this.reconnectAttempts++;const e=this.reconnectDelay*Math.pow(2,this.reconnectAttempts-1);console.log(`[WebSocket] Reconnecting in ${e}ms (attempt ${this.reconnectAttempts})`),setTimeout(()=>{this.connect()},e)}_emit(e,t){this._listeners.has(e)&&this._listeners.get(e).forEach(n=>{try{n(t)}catch(t){console.error(`[WebSocket] Error in ${e} handler:`,t)}})}_startMockResponses(){this._mockInterval=setInterval(()=>{Math.random()<.1&&(this._emit("typing_started",{conversation_id:"conv_1",user_id:"agent_1",user_name:"Sarah",is_agent:!0}),setTimeout(()=>{this._emit("typing_stopped",{conversation_id:"conv_1",user_id:"agent_1"})},2e3))},1e4)}simulateMessage(e,t){this.mock&&this._emit("message",{conversation_id:e,message:{id:"msg_"+Date.now(),content:t.content,sender_type:t.sender_type||"agent",sender_name:t.sender_name||"Support",sender_avatar:t.sender_avatar||null,created_at:(new Date).toISOString()}})}}class T{constructor(e={}){this.currentView="home",this.isOpen=!1,this.unreadCount=0,this.activeConversationId=null,this.conversations=[],this.messages={},this.helpArticles=[],this.helpSearchQuery="",this.homeChangelogItems=[],this.changelogItems=[],this.teamName=e.teamName||"Support",this.teamAvatars=e.teamAvatars||[],this.welcomeMessage=e.welcomeMessage||"How can we help?",this.userContext=e.userContext||null,this.isIdentified=!1,this.pendingMessage=null,this.enableHelp=!1!==e.enableHelp,this.enableChangelog=!1!==e.enableChangelog,this.agentsOnline=!1,this.onlineCount=0,this.responseTime="Usually replies within a few minutes",this.typingUsers={},this.isLoading=!1,this.isLoadingMessages=!1,this.urls=e.urls||{feedback:null,changelog:null,help:null,roadmap:null},this._listeners=new Set}subscribe(e){return this._listeners.add(e),()=>this._listeners.delete(e)}_notify(e,t){this._listeners.forEach(n=>n(e,t,this))}setView(e){const t=this.currentView;this.currentView=e,this._notify("viewChange",{previousView:t,currentView:e})}setOpen(e){this.isOpen=e,this._notify("openChange",{isOpen:e})}setActiveConversation(e){const t=this.activeConversationId;this.activeConversationId=e,this._notify("conversationChange",{conversationId:e,previousConversationId:t})}setIdentified(e,t=null){this.isIdentified=e,t&&(this.userContext={...this.userContext,...t}),this._notify("identificationChange",{isIdentified:e,userContext:t})}setConversations(e){this.conversations=e,this._updateUnreadCount(),this._notify("conversationsUpdate",{conversations:e})}addConversation(e){this.conversations.unshift(e),this._updateUnreadCount(),this._notify("conversationAdded",{conversation:e})}setMessages(e,t){this.messages[e]=t,this._notify("messagesUpdate",{conversationId:e,messages:t})}_getMessageAttachmentsSignature(e){return Array.isArray(e?.attachments)&&0!==e.attachments.length?e.attachments.map(e=>`${e?.type||""}:${e?.name||""}`).join("|"):""}_findOptimisticMatchIndex(e,t,n){const s=this.messages[e]||[],i=Date.parse(t.timestamp),a=this._getMessageAttachmentsSignature(t);for(let e=s.length-1;e>=0;e--){const r=s[e];if(!r?.isOptimistic||!r?.isOwn)continue;if((r.content||"")!==(t.content||""))continue;if(this._getMessageAttachmentsSignature(r)!==a)continue;const o=Date.parse(r.timestamp);if(Number.isNaN(i)||Number.isNaN(o)||Math.abs(i-o)<=n)return e}return-1}_updateConversationFromMessage(e,t,n){const s=this.conversations.find(t=>t.id===e);s&&(s.lastMessage=t.content,s.lastMessageTime=t.timestamp,n&&!t.isOwn&&(s.unread=(s.unread||0)+1,this._updateUnreadCount()))}upsertMessage(e,t,n={}){this.messages[e]||(this.messages[e]=[]);const s=!0===n.reconcileOwnOptimistic,i=n.optimisticMatchWindowMs||3e4,a=this.messages[e],r=null!=t?.id?a.findIndex(e=>e?.id===t.id):-1;if(-1!==r)return a[r]={...a[r],...t,isOptimistic:!1},this._updateConversationFromMessage(e,a[r],!1),this._notify("messagesUpdate",{conversationId:e,messages:[...a]}),a[r];if(s&&t?.isOwn){const n=this._findOptimisticMatchIndex(e,t,i);if(-1!==n)return a[n]={...a[n],...t,isOptimistic:!1},this._updateConversationFromMessage(e,a[n],!1),this._notify("messagesUpdate",{conversationId:e,messages:[...a]}),a[n]}const o={...t,isOptimistic:Boolean(t?.isOptimistic)};return a.push(o),this._updateConversationFromMessage(e,o,!0),this._notify("messageAdded",{conversationId:e,message:o}),o}addMessage(e,t){return this.upsertMessage(e,t)}updateConversation(e,t){const n=this.conversations.find(t=>t.id===e);return n?(Object.assign(n,t),this._notify("conversationUpdated",{conversationId:e,conversation:n}),n):null}markAsRead(e){const t=this.conversations.find(t=>t.id===e);t&&t.unread>0&&(t.unread=0,this._updateUnreadCount(),this._notify("conversationRead",{conversationId:e}))}_updateUnreadCount(){this.unreadCount=this.conversations.reduce((e,t)=>e+(t.unread||0),0),this._notify("unreadCountChange",{count:this.unreadCount})}setHelpArticles(e){this.helpArticles=e,this._notify("helpArticlesUpdate",{articles:e})}setHelpSearchQuery(e){this.helpSearchQuery=e,this._notify("helpSearchChange",{query:e})}setHomeChangelogItems(e){this.homeChangelogItems=e,this._notify("homeChangelogUpdate",{items:e})}setChangelogItems(e){this.changelogItems=e,this._notify("changelogUpdate",{items:e})}getActiveConversation(){return this.conversations.find(e=>e.id===this.activeConversationId)}getActiveMessages(){return this.messages[this.activeConversationId]||[]}setTeamAvatarsFromAgents(e){e&&0!==e.length&&(this.teamAvatars=e.map(e=>e.picture?e.picture:e.full_name||"?"),this._notify("teamAvatarsUpdate",{teamAvatars:this.teamAvatars}))}getFilteredHelpArticles(){if(!this.helpSearchQuery)return this.helpArticles;const e=this.helpSearchQuery.toLowerCase();return this.helpArticles.filter(t=>t.title.toLowerCase().includes(e)||t.description&&t.description.toLowerCase().includes(e))}reset(){this.currentView="home",this.activeConversationId=null,this.helpSearchQuery="",this._notify("reset",{})}}class z{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",primaryColor:t.primaryColor||"#155EEF",...t},this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className=`messenger-launcher messenger-launcher-${this.options.position}`,this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe((e,t)=>{"openChange"===e&&this._updateIcon(),"unreadCountChange"===e&&this._updateBadge()}),this.element}_updateContent(){const e=this.state.unreadCount>0?`<span class="messenger-launcher-badge">${this.state.unreadCount>9?"9+":this.state.unreadCount}</span>`:"";this.element.innerHTML=`\n <button class="messenger-launcher-btn" aria-label="Open messenger">\n <span class="messenger-launcher-icon messenger-launcher-icon-chat">\n <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 256 256">\n <path d="M144,140a12,12,0,1,1-12-12A12,12,0,0,1,144,140Zm44-12a12,12,0,1,0,12,12A12,12,0,0,0,188,128Zm51.34,83.47a16,16,0,0,1-19.87,19.87l-24.71-7.27A80,80,0,0,1,86.43,183.42a79,79,0,0,1-25.19-7.35l-24.71,7.27a16,16,0,0,1-19.87-19.87l7.27-24.71A80,80,0,1,1,169.58,72.59a80,80,0,0,1,62.49,114.17ZM81.3,166.3a79.94,79.94,0,0,1,70.38-93.87A64,64,0,0,0,39.55,134.19a8,8,0,0,1,.63,6L32,168l27.76-8.17a8,8,0,0,1,6,.63A63.45,63.45,0,0,0,81.3,166.3Zm135.15,15.89a64,64,0,1,0-26.26,26.26,8,8,0,0,1,6-.63L224,216l-8.17-27.76A8,8,0,0,1,216.45,182.19Z"></path>\n </svg>\n </span>\n <span class="messenger-launcher-icon messenger-launcher-icon-close" style="display: none;">\n <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 256 256">\n <path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n </svg>\n </span>\n ${e}\n </button>\n `;const t=this.element.querySelector(".messenger-launcher-btn");t&&this.options.primaryColor&&t.style.setProperty("background",this.options.primaryColor,"important")}_attachEvents(){this.element.querySelector(".messenger-launcher-btn").addEventListener("click",()=>{this.state.setOpen(!this.state.isOpen)})}_updateIcon(){const e=this.element.querySelector(".messenger-launcher-icon-chat"),t=this.element.querySelector(".messenger-launcher-icon-close");this.state.isOpen?(e.style.display="none",t.style.display="flex",this.element.classList.add("messenger-launcher-open")):(e.style.display="flex",t.style.display="none",this.element.classList.remove("messenger-launcher-open"))}_updateBadge(){const e=this.element.querySelector(".messenger-launcher-badge");if(e&&e.remove(),this.state.unreadCount>0&&!this.state.isOpen){const e=document.createElement("span");e.className="messenger-launcher-badge",e.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,this.element.querySelector(".messenger-launcher-btn").appendChild(e)}}show(){this.element&&(this.element.style.display="block")}hide(){this.element&&(this.element.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class ${constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-panel-nav",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"!==e&&"unreadCountChange"!==e||this._updateActiveTab()}),this.element}_getTabs(){const e=[{id:"home",label:"Home",icon:this._getHomeIcon()},{id:"messages",label:"Messages",icon:this._getMessagesIcon(),badge:this.state.unreadCount}];return this.state.enableHelp&&e.push({id:"help",label:"Help",icon:this._getHelpIcon()}),this.state.enableChangelog&&e.push({id:"changelog",label:"Changelog",icon:this._getChangelogIcon()}),e}_updateContent(){const e=this._getTabs().map(e=>{const t=this.state.currentView===e.id,n=e.badge&&e.badge>0?`<span class="messenger-nav-badge">${e.badge>9?"9+":e.badge}</span>`:"";return`\n\t\t\t\t<button class="messenger-nav-tab ${t?"active":""}" data-tab="${e.id}">\n\t\t\t\t\t<span class="messenger-nav-icon">${e.icon}</span>\n\t\t\t\t\t<span class="messenger-nav-label">${e.label}</span>\n\t\t\t\t\t${n}\n\t\t\t\t</button>\n\t\t\t`}).join("");this.element.innerHTML=`\n\t\t\t<div class="messenger-nav-tabs">\n\t\t\t\t${e}\n\t\t\t</div>\n\t\t\t<div class="messenger-nav-footer">\n\t\t\t\t<a href="https://product7.io" target="_blank" rel="noopener noreferrer" class="messenger-powered-by">\n\t\t\t\t\t<svg width="12" height="14" viewBox="0 0 28 32" fill="none" xmlns="http://www.w3.org/2000/svg">\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.0615 5.28044C8.5161 4.42949 3.30825 11.1456 5.89967 17.6588C6.9321 20.2538 9.06268 22.2644 11.8777 23.1968C16.2682 24.6507 18.4038 22.3222 19.0483 23.9691C19.4055 24.8894 18.7282 25.3209 17.988 25.4938C10.9146 27.15 5.15304 22.7566 3.5869 17.5531C1.52205 10.6941 5.98684 4.6667 11.3483 3.41065C17.8801 1.88094 24.0325 6.19355 24.3926 12.7175C24.7448 19.0921 18.6217 24.5978 11.927 22.2036C10.8789 21.8285 8.8419 20.6682 8.46823 19.858C8.06026 18.9727 8.80261 18.1725 9.68285 18.3576C10.2223 18.4726 10.3116 18.8706 11.3161 19.5372C14.4549 21.6213 19.1276 20.6132 21.2046 17.0972C23.991 12.3817 21.0481 6.05351 15.06 5.27758L15.0615 5.28044Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.2492 2.19833C11.944 1.71463 8.88819 3.07214 6.91479 4.49682C2.27067 7.85488 0.76169 14.5038 3.49672 19.8731C4.08535 21.0096 4.84379 22.0497 5.7459 22.9576L7.16343 24.2515C7.67214 24.9131 7.27203 25.7176 6.64115 25.9269C5.13502 26.4271 2.0499 21.8172 1.42044 20.5383C0.0872204 17.8297 -0.312889 14.9047 0.242977 11.503C1.66908 2.77063 11.221 -2.51652 19.7197 1.21021C27.7548 4.73331 30.2733 15.4555 23.9351 22.0773C23.3107 22.7296 21.6352 24.4823 20.6278 23.8907C20.0076 23.5263 19.8933 22.6446 20.5192 22.1238C21.0301 21.6986 21.4759 21.435 21.9896 20.9734C23.6665 19.4688 25.2562 16.8752 25.3477 13.5636C25.4427 10.2055 24.1266 7.5848 22.3904 5.74859C20.6392 3.89665 18.6751 2.69919 15.2456 2.19691L15.2492 2.19833Z" fill="#F69F06"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M8.48332 27.2217C7.93817 26.265 8.89987 25.3776 10.1352 25.8641C15.5653 27.9926 18.3081 25.5269 19.0255 27.0823C19.2655 27.6039 19.0448 28.1619 18.7354 28.3863C17.9895 28.9257 14.82 28.9343 13.9262 28.8714C12.9071 28.8053 11.897 28.6377 10.9111 28.3713C10.0888 28.1348 8.88057 27.9247 8.48189 27.2281L8.48332 27.2217Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.8722 31.0607C15.7765 32.1381 14.579 32.0331 13.5766 31.9545C12.5742 31.8759 11.5203 31.8502 11.601 30.7013C11.6789 29.5882 12.8035 29.7532 13.8274 29.8332C14.4425 29.8811 15.9951 29.681 15.8722 31.0607Z" fill="#21244A"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\tPowered by <strong>Product7</strong>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`}_attachEvents(){this.element.addEventListener("click",e=>{const t=e.target.closest(".messenger-nav-tab");if(t){const e=t.dataset.tab;this.state.setView(e)}})}_updateActiveTab(){this.element.querySelectorAll(".messenger-nav-tab").forEach(e=>{const t=e.dataset.tab===this.state.currentView;if(e.classList.toggle("active",t),"messages"===e.dataset.tab){const t=e.querySelector(".messenger-nav-badge");if(t&&t.remove(),this.state.unreadCount>0){const t=document.createElement("span");t.className="messenger-nav-badge",t.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,e.appendChild(t)}}})}_getHomeIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">\n\t\t\t<path d="M40,216H216V120a8,8,0,0,0-2.34-5.66l-80-80a8,8,0,0,0-11.32,0l-80,80A8,8,0,0,0,40,120Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t</svg>'}_getMessagesIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M71.58,144,32,176V48a8,8,0,0,1,8-8H168a8,8,0,0,1,8,8v88a8,8,0,0,1-8,8Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M80,144v40a8,8,0,0,0,8,8h96.42L224,224V96a8,8,0,0,0-8-8H176" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></svg>'}_getHelpIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">\n\t\t\t<circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t<circle cx="128" cy="180" r="12"/>\n\t\t\t<path d="M128,144v-8a28,28,0,1,0-28-28" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t</svg>'}_getChangelogIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">\n\t\t\t<path d="M160,80V200.67a8,8,0,0,0,3.56,6.65l11,7.33a8,8,0,0,0,12.2-4.72L200,160" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t<path d="M40,200a8,8,0,0,0,13.15,6.12C105.55,162.16,160,160,160,160h40a40,40,0,0,0,0-80H160S105.55,77.84,53.15,33.89A8,8,0,0,0,40,40Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t</svg>'}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class L{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",...t},this.element=null,this.navigationTabs=null,this.currentViewComponent=null,this.viewRegistry={},this._unsubscribe=null}registerView(e,t){this.viewRegistry[e]=t}render(){this.element=document.createElement("div"),this.element.className=`messenger-panel messenger-panel-${this.options.position}`,this.element.innerHTML='\n\t\t\t<div class="messenger-panel-content">\n\t\t\t\t<div class="messenger-panel-views"></div>\n\t\t\t\t<div class="messenger-panel-nav"></div>\n\t\t\t</div>\n\t\t',this.navigationTabs=new $(this.state,this.options);return this.element.querySelector(".messenger-panel-nav").appendChild(this.navigationTabs.render()),this._renderCurrentView(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"===e&&this._renderCurrentView()}),this.element}_renderCurrentView(){const e=this.element.querySelector(".messenger-panel-views");this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),e.innerHTML="";const t=this.viewRegistry[this.state.currentView];t?(this.currentViewComponent=new t(this.state,this.options),e.appendChild(this.currentViewComponent.render())):e.innerHTML=`<div class="messenger-empty-state">\n\t\t\t\t<p>View not found: ${this.state.currentView}</p>\n\t\t\t</div>`}show(){this.element&&(this.element.style.display="block",requestAnimationFrame(()=>{this.element.classList.add("open")}))}hide(){this.element&&(this.element.classList.remove("open"),setTimeout(()=>{this.element&&(this.element.style.display="none")},300))}setHeader(e){const t=this.element.querySelector(".messenger-panel-header");t&&(t.innerHTML=e)}destroy(){this._unsubscribe&&this._unsubscribe(),this.navigationTabs&&this.navigationTabs.destroy(),this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class O{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-changelog-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"changelogUpdate"===e&&this._updateChangelogList()}),this.element}_updateContent(){this.element.innerHTML='\n\t\t\t<div class="messenger-changelog-header">\n\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-changelog-body">\n\t\t\t\t<div class="messenger-changelog-list"></div>\n\t\t\t</div>\n\t\t',this._updateChangelogList(),this._attachEvents()}_updateChangelogList(){const e=this.element.querySelector(".messenger-changelog-list"),t=this.state.changelogItems;0!==t.length?(e.innerHTML=t.map(e=>this._renderChangelogCard(e)).join(""),this._attachChangelogEvents()):e.innerHTML=this._renderEmptyState()}_renderChangelogCard(e){const t=e.tags&&e.tags.length>0?`<div class="messenger-changelog-tags">\n\t\t\t\t${e.tags.map(e=>`<span class="sdk-badge sdk-badge-primary messenger-changelog-tag">${e}</span>`).join("")}\n\t\t\t</div>`:"",n=this._formatDate(e.publishedAt||e.date);return`\n\t\t\t<div class="messenger-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-changelog-content">\n\t\t\t\t\t${t}\n\t\t\t\t\t<h3 class="messenger-changelog-title">${e.title}</h3>\n\t\t\t\t\t${e.description?`<p class="messenger-changelog-description">${this._truncateText(e.description,100)}</p>`:""}\n\t\t\t\t\t<div class="messenger-changelog-meta">\n\t\t\t\t\t\t<span class="messenger-changelog-date">${n}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack messenger-avatar-stack-tiny">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm">S</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack messenger-avatar-stack-tiny">${e.slice(0,2).map(e=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-sm"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-sm">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderEmptyState(){return'\n\t\t\t<div class="messenger-empty-state">\n\t\t\t\t<div class="messenger-empty-state-icon">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z"></path>\n\t\t\t\t\t</svg>\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'}_formatDate(e){if(!e)return"";return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}_truncateText(e,t){return e?e.length<=t?e:e.substring(0,t).trim()+"...":""}_attachEvents(){this._attachChangelogEvents()}_attachChangelogEvents(){this.element.querySelectorAll(".messenger-changelog-card").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.changelogId,n=this.state.changelogItems.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onChangelogClick&&this.options.onChangelogClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class D{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null,this._typingTimeout=null,this._isTyping=!1,this._typingIndicator=null,this._isConversationClosed=!1,this._pendingAttachments=[]}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-chat-view",this._updateContent(),this._unsubscribe=this.state.subscribe((e,t)=>{"messageAdded"===e&&t.conversationId===this.state.activeConversationId?(this._hideTypingIndicator(),this._appendMessage(t.message),this._scrollToBottom()):"typingStarted"===e&&t.conversationId===this.state.activeConversationId?this._showTypingIndicator(t.userName):"typingStopped"===e&&t.conversationId===this.state.activeConversationId?this._hideTypingIndicator():("conversationUpdated"===e&&t.conversationId===this.state.activeConversationId||"messagesUpdate"===e&&t.conversationId===this.state.activeConversationId)&&this._updateContent()}),this.element}_updateContent(){const e=this.state.getActiveConversation(),t=this.state.getActiveMessages(),n=!this.state.activeConversationId,s=!n&&"closed"===e?.status;this._isConversationClosed=s;const i=0===t.length?this._renderEmptyState(n):t.map(e=>this._renderMessage(e)).join(""),a=n?"New conversation":e?.title||"Chat with team",r=n?"Start typing your message...":s?"Conversation closed":"Write a message...";this.element.innerHTML=`\n\t\t\t<div class="messenger-chat-header">\n\t\t\t\t<button class="sdk-btn-icon messenger-back-btn" aria-label="Back">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div class="messenger-chat-header-info">\n\t\t\t\t\t<span class="messenger-chat-title">${a}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class="sdk-close-btn" aria-label="Close">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-chat-messages">\n\t\t\t\t${i}\n\t\t\t\t${s?'\n\t\t\t\t<div class="messenger-closed-banner">\n\t\t\t\t\t<i class="ph ph-check-circle"></i>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t':""}\n\t\t\t\t<div class="messenger-typing-indicator">\n\t\t\t\t\t<div class="messenger-typing-dots">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class="messenger-typing-text"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${s?"":`\n\t\t\t<div class="messenger-compose-attachments-preview"></div>\n\n\t\t\t<div class="messenger-chat-compose">\n<button class="sdk-btn-icon messenger-compose-attach" aria-label="Attach file">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="20" height="20">\n <rect width="256" height="256" fill="none"/>\n <path d="M160,80,76.69,164.69a16,16,0,0,0,22.63,22.62L198.63,86.63a32,32,0,0,0-45.26-45.26L54.06,142.06a48,48,0,0,0,67.88,67.88L204,128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n</button>\t\t\t\t<div class="messenger-compose-input-wrapper">\n\t\t\t\t\t<textarea class="messenger-compose-input" placeholder="${r}" rows="1"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class="messenger-compose-send" aria-label="Send" disabled>\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14L118.42,148.9l47.24-47.25a8,8,0,0,0-11.31-11.31L107.1,137.58,24,98.22l.14,0L216,40Z"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<input type="file" class="messenger-compose-file-input" multiple accept="image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip" />\n\t\t\t</div>\n\t\t\t`}\n\t\t`,this._typingIndicator=this.element.querySelector(".messenger-typing-indicator"),this._attachEvents(),this._scrollToBottom(),this._renderAttachmentPreviews()}_renderEmptyState(e=!1){const t=this._renderTeamAvatars(),n=this.state.responseTime||"We typically reply within a few minutes",s=this.state.agentsOnline;return`\n\t\t\t<div class="messenger-chat-empty">\n\t\t\t\t<div class="messenger-chat-empty-avatars">${t}</div>\n\t\t\t\t<h3>${e?"Start a new conversation":"Start the conversation"}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class="messenger-chat-availability">\n\t\t\t\t\t<span class="messenger-availability-dot ${s?"messenger-availability-online":"messenger-availability-away"}"></span>\n\t\t\t\t\t<span>${s?"We're online now":n}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderMessageAttachments(e){return e&&0!==e.length?e.map(e=>"image"===e.type?`<img class="messenger-message-image" src="${this._escapeHtml(e.url)}" alt="${this._escapeHtml(e.name||"image")}" data-url="${this._escapeHtml(e.url)}" />`:`<a class="messenger-message-file" href="${this._escapeHtml(e.url)}" data-url="${this._escapeHtml(e.url)}" data-name="${this._escapeHtml(e.name||"file")}">\n\t\t\t\t<i class="ph ph-file"></i>\n\t\t\t\t<span>${this._escapeHtml(e.name||"file")}</span>\n\t\t\t\t<i class="ph ph-download-simple messenger-file-download-icon"></i>\n\t\t\t</a>`).join(""):""}_renderMessage(e){const t=e.isOwn,n=t?"messenger-message-own":"messenger-message-received",s=this._formatMessageTime(e.timestamp),i=this._renderMessageAttachments(e.attachments),a=e.content?`<div class="messenger-message-content">${this._formatMessageContent(e.content)}</div>`:"",r=a?`<div class="messenger-message-bubble">${a}</div>`:"";if(t)return`\n\t\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t\t${r}\n\t\t\t\t\t${i}\n\t\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t\t</div>\n\t\t\t`;const o=this._renderSenderAvatar(e.sender);return`\n\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t<div class="messenger-message-sender">${e.sender?.name||"Support"}</div>\n\t\t\t\t<div class="messenger-message-row">\n\t\t\t\t\t<div class="messenger-message-avatar">${o}</div>\n\t\t\t\t\t<div class="messenger-message-wrapper">\n\t\t\t\t\t\t${r}\n\t\t\t\t\t\t${i}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t</div>\n\t\t`}_renderSenderAvatar(e){if(e?.avatarUrl)return`<div class="sdk-avatar sdk-avatar-sm"><img src="${e.avatarUrl}" alt="${e.name}" /></div>`;return`<div class="sdk-avatar sdk-avatar-sm">${(e?.name||"S").charAt(0).toUpperCase()}</div>`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack">${e.slice(0,3).map(e=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-md"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-md">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_formatMessageTime(e){if(!e)return"";return new Date(e).toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}_formatMessageContent(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br>"):""}_appendMessage(e){const t=this.element.querySelector(".messenger-chat-messages"),n=t.querySelector(".messenger-chat-empty");n&&n.remove();const s=this._renderMessage(e),i=document.createElement("div");i.innerHTML=s,t.appendChild(i.firstElementChild)}_scrollToBottom(){const e=this.element.querySelector(".messenger-chat-messages");e&&setTimeout(()=>{e.scrollTop=e.scrollHeight},50)}_updateSendButtonState(){const e=this.element.querySelector(".messenger-compose-input"),t=this.element.querySelector(".messenger-compose-send");e&&t&&(t.disabled=!e.value.trim()&&0===this._pendingAttachments.length)}_renderAttachmentPreviews(){const e=this.element.querySelector(".messenger-compose-attachments-preview");if(e){if(0===this._pendingAttachments.length)return e.innerHTML="",void(e.style.display="none");e.style.display="flex",e.innerHTML=this._pendingAttachments.map((e,t)=>`\n\t\t\t\t<div class="messenger-attachment-preview" data-index="${t}">\n\t\t\t\t\t${e.type.startsWith("image")?`<img class="messenger-attachment-thumb" src="${e.preview}" alt="${this._escapeHtml(e.file.name)}" />`:'<div class="messenger-attachment-thumb messenger-attachment-file-icon"><i class="ph ph-file"></i></div>'}\n\t\t\t\t\t<button class="messenger-attachment-remove" data-index="${t}" aria-label="Remove">&times;</button>\n\t\t\t\t</div>\n\t\t\t`).join(""),e.querySelectorAll(".messenger-attachment-remove").forEach(e=>{e.addEventListener("click",e=>{const t=parseInt(e.currentTarget.dataset.index,10);this._pendingAttachments.splice(t,1),this._renderAttachmentPreviews(),this._updateSendButtonState()})})}}_attachEvents(){this.element.querySelector(".messenger-back-btn").addEventListener("click",()=>{this.state.setView("messages")}),this.element.querySelector(".sdk-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".messenger-compose-input"),t=this.element.querySelector(".messenger-compose-send");e&&t&&(e.addEventListener("input",()=>{e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px",this._updateSendButtonState(),e.value.trim()&&this._startTyping()}),e.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this._sendMessage())}),t.addEventListener("click",()=>{this._sendMessage()}));const n=this.element.querySelector(".messenger-compose-attach"),s=this.element.querySelector(".messenger-compose-file-input");n&&s&&(n.addEventListener("click",()=>{s.click()}),s.addEventListener("change",e=>{const t=e.target.files;t&&(Array.from(t).forEach(e=>{const t=new FileReader;t.onload=t=>{this._pendingAttachments.push({file:e,preview:t.target.result,type:e.type}),this._renderAttachmentPreviews(),this._updateSendButtonState()},t.readAsDataURL(e)}),s.value="")}));const i=this.element.querySelector(".messenger-chat-messages");i&&i.addEventListener("click",e=>{const t=e.target.closest(".messenger-message-file");if(t){e.preventDefault();const n=t.dataset.url,s=t.dataset.name;return void this._downloadFile(n,s)}const n=e.target.closest(".messenger-message-image");if(n){const e=n.dataset.url||n.src;window.open(e,"_blank")}})}async _downloadFile(e,t){try{const n=await fetch(e),s=await n.blob(),i=URL.createObjectURL(s),a=document.createElement("a");a.href=i,a.download=t||"download",a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}catch{window.open(e,"_blank")}}_escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}async _sendMessage(){if(this._isConversationClosed)return;const e=this.element.querySelector(".messenger-compose-input"),t=e.value.trim(),n=this._pendingAttachments.length>0;if(!t&&!n)return;this._stopTyping();const s=[...this._pendingAttachments];if(!this.state.activeConversationId)this.options.onStartConversation&&this.options.onStartConversation(t,s);else{const e={id:"msg_"+Date.now(),content:t,isOwn:!0,isOptimistic:!0,timestamp:(new Date).toISOString(),attachments:s.map(e=>({url:e.preview,type:e.type.startsWith("image")?"image":"file",name:e.file.name}))};this.state.addMessage(this.state.activeConversationId,e),this.options.onSendMessage&&this.options.onSendMessage(this.state.activeConversationId,e,s)}e.value="",e.style.height="auto",this._pendingAttachments=[],this._renderAttachmentPreviews(),this._updateSendButtonState()}_startTyping(){this._isConversationClosed||(!this._isTyping&&this.state.activeConversationId&&(this._isTyping=!0,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!0)),this._typingTimeout&&clearTimeout(this._typingTimeout),this._typingTimeout=setTimeout(()=>{this._stopTyping()},3e3))}_stopTyping(){this._isTyping&&this.state.activeConversationId&&(this._isTyping=!1,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!1)),this._typingTimeout&&(clearTimeout(this._typingTimeout),this._typingTimeout=null)}_showTypingIndicator(e){if(this._typingIndicator){this._typingIndicator.style.display="flex";const t=this._typingIndicator.querySelector(".messenger-typing-text");t&&(t.textContent=`${e||"Support"} is typing...`),this._scrollToBottom()}}_hideTypingIndicator(){this._typingIndicator&&(this._typingIndicator.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this._typingTimeout&&clearTimeout(this._typingTimeout),this._stopTyping(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class P{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null,this.avatarColors=["#155EEF","#8b5cf6","#10b981","#f59e0b","#ef4444","#ec4899","#06b6d4"]}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-conversations-view",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"conversationsUpdate"!==e&&"conversationAdded"!==e&&"conversationRead"!==e&&"conversationUpdated"!==e||this._updateContent()}),this.element}_getAvatarColor(e){const t=(e||"S").charCodeAt(0);return this.avatarColors[t%this.avatarColors.length]}_updateContent(){const e=this.state.conversations;let t;t=0===e.length?'\n <div class="messenger-empty-state">\n <div class="messenger-empty-state-icon">\n <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n <path d="M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z"></path>\n </svg>\n </div>\n <h3>No conversations yet</h3>\n <p>Start a new conversation with our team</p>\n </div>\n ':`\n <div class="messenger-conversations-list">\n ${e.map(e=>this._renderConversationItem(e)).join("")}\n </div>\n `,this.element.innerHTML=`\n <div class="messenger-conversations-header">\n <h2>Messages</h2>\n <button class="sdk-close-btn" aria-label="Close">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="18" height="18">\n <rect width="256" height="256" fill="none"/>\n <line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n</button>\n </div>\n\n <div class="messenger-conversations-body">\n ${t}\n </div>\n\n <div class="messenger-conversations-footer">\n <button class="messenger-new-message-btn">\n <span>Send us a message</span>\n <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256" style="flex-shrink: 0;">\n <rect width="256" height="256" fill="none"/>\n <line x1="144" y1="128" x2="80" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <path d="M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n </button>\n </div>\n `,this._attachEvents()}_renderConversationItem(e){const t=e.unread>0?"unread":"",n=this._formatTimeAgo(e.lastMessageTime),s=this._renderConversationAvatars(e.participants);return`\n\t\t\t<div class="messenger-conversation-item ${t}" data-conversation-id="${e.id}">\n\t\t\t\t<div class="messenger-conversation-avatars">\n\t\t\t\t\t${s}\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-conversation-content">\n\t\t\t\t\t<div class="messenger-conversation-header">\n\t\t\t\t\t\t<span class="messenger-conversation-title">${e.title||"Chat with team"}</span>\n\t\t\t\t\t\t<span class="messenger-conversation-time">${n}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-conversation-preview">\n\t\t\t\t\t\t${e.unread>0?'<span class="messenger-unread-dot"></span>':""}\n\t\t\t\t\t\t<span class="messenger-conversation-message">${this._truncateMessage(e.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderConversationAvatars(e){if(!e||0===e.length){return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor("S")};">S</div>`}const t=e[0];if(t.avatarUrl)return`<div class="sdk-avatar sdk-avatar-md"><img src="${t.avatarUrl}" alt="${t.name}" /></div>`;const n=(t.name||"S").charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor(t.name)};">${n}</div>`}_renderAvatarStack(){const e=this.state.teamAvatars;if(!e||0===e.length){return`\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor("S")};">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor("T")};">T</div>\n\t\t\t\t</div>\n\t\t\t`}return`<div class="messenger-avatar-stack">${e.slice(0,2).map((e,t)=>{if("string"==typeof e&&e.startsWith("http"))return`<div class="sdk-avatar sdk-avatar-sm"><img src="${e}" alt="Team member" /></div>`;const n=e.charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor(e)};">${n}</div>`}).join("")}</div>`}_formatTimeAgo(e){if(!e)return"";const t=new Date(e),n=new Date-t,s=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return s<1?"now":s<60?`${s}m`:i<24?`${i}h`:a<7?`${a}d`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_truncateMessage(e){if(!e)return"No messages yet";return e.length<=50?e:e.substring(0,50)+"..."}_attachEvents(){const e=this.element.querySelector(".sdk-close-btn");e&&e.addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelectorAll(".messenger-conversation-item").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.conversationId;this.state.setActiveConversation(t),this.state.markAsRead(t),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t)})});const t=this.element.querySelector(".messenger-new-message-btn");t&&t.addEventListener("click",()=>{this._startNewConversation()})}_startNewConversation(){const e=this.state.conversations.find(e=>"open"===e.status);e?(this.state.setActiveConversation(e.id),this.state.markAsRead(e.id),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(e.id)):(this.state.setActiveConversation(null),this.options.onStartNewConversation?this.options.onStartNewConversation():this.state.setView("chat"))}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class N{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-help-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"helpArticlesUpdate"!==e&&"helpSearchChange"!==e||this._updateCollectionsList()}),this.element}_updateContent(){const e=this.state.helpSearchQuery||"";this.element.innerHTML=`\n\t\t\t<div class="messenger-help-header">\n\t\t\t\t<div class="messenger-help-header-top">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class="sdk-close-btn" aria-label="Close">\n\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t\t<path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\ttype="text"\n\t\t\t\t\tclass="messenger-help-search-input"\n\t\t\t\t\tplaceholder="Search for help..."\n\t\t\t\t\tvalue="${e}"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-help-body">\n\t\t\t\t<div class="messenger-help-collections"></div>\n\t\t\t</div>\n\t\t`,this._updateCollectionsList(),this._attachEvents()}_updateCollectionsList(){const e=this.element.querySelector(".messenger-help-collections"),t=this.state.helpArticles||[],n=(this.state.helpSearchQuery||"").toLowerCase(),s=n?t.filter(e=>e.title.toLowerCase().includes(n)||e.description&&e.description.toLowerCase().includes(n)):t,i=this.element.querySelector(".messenger-help-collections-header");i&&(i.textContent=`${s.length} collections`),0!==s.length?(e.innerHTML=s.map(e=>this._renderCollectionItem(e)).join(""),this._attachCollectionEvents()):e.innerHTML=this._renderEmptyState()}_renderCollectionItem(e){const t=e.articleCount||0;return`\n\t\t\t<div class="messenger-help-collection" data-collection-id="${e.id}">\n\t\t\t\t<div class="messenger-help-collection-content">\n\t\t\t\t\t<h3 class="messenger-help-collection-title">${e.title}</h3>\n\t\t\t\t\t<p class="messenger-help-collection-desc">${e.description||""}</p>\n\t\t\t\t\t<span class="messenger-help-collection-count">${t} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#000000" viewBox="0 0 256 256" class="messenger-help-collection-arrow">\n\t\t\t\t\t<path d="M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z"></path>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t`}_renderEmptyState(){return this.state.helpSearchQuery?'\n\t\t\t\t<div class="messenger-empty-state">\n\t\t\t\t\t<div class="messenger-empty-state-icon">\n\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t\t<path d="M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"></path>\n\t\t\t\t\t\t</svg>\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\t<div class="messenger-empty-state">\n\t\t\t\t<div class="messenger-empty-state-icon">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"></path>\n\t\t\t\t\t</svg>\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'}_attachEvents(){this.element.querySelector(".sdk-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});let e;this.element.querySelector(".messenger-help-search-input").addEventListener("input",t=>{clearTimeout(e),e=setTimeout(()=>{this.state.setHelpSearchQuery(t.target.value)},300)}),this._attachCollectionEvents()}_attachCollectionEvents(){this.element.querySelectorAll(".messenger-help-collection").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.collectionId,n=this.state.helpArticles.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onArticleClick&&this.options.onArticleClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class B{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-home-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"homeChangelogUpdate"!==e&&"conversationsUpdate"!==e&&"availabilityUpdate"!==e||this._updateContent()}),this.element}_updateContent(){const e=this._renderAvatarStack(),t=this._renderRecentChangelog();this.element.innerHTML=`\n\t\t\t<div class="messenger-home-scroll">\n\t\t\t\t<div class="messenger-home-header">\n\t\t\t\t\t<div class="messenger-home-header-top">\n\t\t\t\t\t\t<div class="messenger-home-logo">\n\t\t\t\t\t\t\t${this.options.logoUrl?`<img src="${this.options.logoUrl}" alt="${this.state.teamName}" />`:""}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="messenger-home-avatars">${e}</div>\n\t\t\t\t\t\t<button class="sdk-close-btn" aria-label="Close">\n\t\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#000000" viewBox="0 0 256 256">\n\t\t\t\t\t\t\t\t<path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-home-welcome">\n\t\t\t\t\t\t<span class="messenger-home-greeting">Hi there 👋</span>\n\t\t\t\t\t\t<span class="messenger-home-question">${this.state.welcomeMessage}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="messenger-home-body">\n\t\t\t\t\t${this._renderMessageButton()}\n\t\t\t\t\t${this._renderFeaturedCard()}\n\t\t\t\t\t${t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderAvatarStack(){const e=this.state.teamAvatars,t=["#5856d6","#007aff","#34c759","#ff9500"];if(!e||0===e.length)return`\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-lg" style="background: ${t[0]};">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-lg" style="background: ${t[1]};">T</div>\n\t\t\t\t</div>\n\t\t\t`;return`<div class="messenger-avatar-stack">${e.slice(0,4).map((e,n)=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-lg"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-lg" style="background: ${t[n%t.length]};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderAvailabilityStatus(){const e=this.state.agentsOnline,t=this.state.responseTime||"We typically reply within a few minutes";return e?'\n\t\t\t\t<div class="messenger-home-availability">\n\t\t\t\t\t<span class="messenger-availability-dot messenger-availability-online"></span>\n\t\t\t\t\t<span class="messenger-availability-text">We\'re online now</span>\n\t\t\t\t</div>\n\t\t\t':`\n\t\t\t<div class="messenger-home-availability">\n\t\t\t\t<span class="messenger-availability-dot messenger-availability-away"></span>\n\t\t\t\t<span class="messenger-availability-text">${t}</span>\n\t\t\t</div>\n\t\t`}_renderMessageButton(){const e=this.state.conversations.find(e=>"open"===e.status),t='\n\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256" style="flex-shrink: 0;">\n\t\t\t\t<rect width="256" height="256" fill="none"/>\n\t\t\t\t<line x1="144" y1="128" x2="80" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t\t<path d="M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t</svg>\n\t\t',n='\n\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256" style="flex-shrink: 0;">\n\t\t\t\t<rect width="256" height="256" fill="none"/>\n\t\t\t\t<polyline points="96 48 176 128 96 208" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t</svg>\n\t\t';return e?`\n\t\t\t\t<button class="messenger-home-message-btn messenger-home-continue-btn" data-conversation-id="${e.id}">\n\t\t\t\t\t<div class="messenger-home-continue-info">\n\t\t\t\t\t\t<span class="messenger-home-continue-label">Continue conversation</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t${t}\n\t\t\t\t</button>\n\t\t\t\t<button class="messenger-home-message-btn messenger-feedback-btn" data-action="feedback">\n\t\t\t\t\t<span class="messenger-home-continue-label">Leave us feedback</span>\n\t\t\t\t\t${n}\n\t\t\t\t</button>\n\t\t\t`:`\n\t\t\t<button class="messenger-home-message-btn">\n\t\t\t\t<span>Start a conversation</span>\n\t\t\t\t${t}\n\t\t\t</button>\n\t\t\t<button class="messenger-home-message-btn messenger-feedback-btn" data-action="feedback">\n\t\t\t\t<span>Leave us feedback</span>\n\t\t\t\t${n}\n\t\t\t</button>\n\t\t`}_renderFeaturedCard(){if(!this.options.featuredContent)return"";const{title:e,description:t,imageUrl:n,action:s}=this.options.featuredContent;return`\n\t\t\t<div class="messenger-home-featured">\n\t\t\t\t${n?`<img src="${n}" alt="${e}" class="messenger-home-featured-image" onerror="this.style.display='none';" />`:""}\n\t\t\t\t<div class="messenger-home-featured-content">\n\t\t\t\t\t<h3>${e}</h3>\n\t\t\t\t\t<p>${t}</p>\n\t\t\t\t</div>\n\t\t\t\t${s?`<button class="sdk-btn sdk-btn-primary messenger-home-featured-btn" data-action="${s.type}" data-value="${s.value}">${s.label}</button>`:""}\n\t\t\t</div>\n\t\t`}_renderRecentChangelog(){const e=this.state.homeChangelogItems;if(0===e.length)return"";return`\n\t\t\t<div class="messenger-home-changelog-section">\n\t\t\t\t${e.map(e=>`\n\t\t\t<div class="messenger-home-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-home-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t\t${e.coverText?`<span class="messenger-home-changelog-cover-text">${e.coverText}</span>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-home-changelog-card-content">\n\t\t\t\t\t<h4 class="messenger-home-changelog-card-title">${e.title}</h4>\n\t\t\t\t\t<p class="messenger-home-changelog-card-desc">${e.description||""}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`).join("")}\n\t\t\t</div>\n\t\t`}_formatDate(e){if(!e)return"";const t=new Date(e),n=new Date,s=Math.floor((n-t)/864e5);return 0===s?"Today":1===s?"Yesterday":s<7?`${s}d ago`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_attachEvents(){this.element.querySelector(".sdk-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".messenger-home-message-btn:not(.messenger-feedback-btn)");e&&e.addEventListener("click",()=>{const t=e.dataset.conversationId;t?(this.state.setActiveConversation(t),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t)):(this.state.setActiveConversation(null),this.state.setView("chat"))});const t=this.element.querySelector(".messenger-feedback-btn");t&&t.addEventListener("click",()=>{const e=this.state.urls?.feedback;this.options.onFeedbackClick?this.options.onFeedbackClick():e?window.open(e,"_blank"):console.warn("[Messenger] No feedback destination configured. Set `feedbackUrl` in MessengerWidget options.")}),this.element.querySelectorAll(".messenger-home-changelog-card").forEach(e=>{e.addEventListener("click",()=>{const t=this.state.homeChangelogItems.find(t=>t.id===e.dataset.changelogId);t?.url?window.open(t.url,"_blank"):this.state.setView("changelog")})});const n=this.element.querySelector(".messenger-home-changelog-all");n&&n.addEventListener("click",()=>{this.state.setView("changelog")});const s=this.element.querySelector(".messenger-home-featured-btn");s&&s.addEventListener("click",()=>{const e=s.dataset.action,t=s.dataset.value;"url"===e?window.open(t,"_blank"):"view"===e&&this.state.setView(t)})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class F{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._isSubmitting=!1}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-prechat-view",this._updateContent(),this.element}_updateContent(){const e=this.state.userContext?.name||"",t=this.state.userContext?.email||"";this.element.innerHTML=`\n\t\t\t<div class="messenger-prechat-overlay">\n\t\t\t\t<div class="messenger-prechat-card">\n\t\t\t\t\t<h4 class="messenger-prechat-title">Get notified when we reply</h4>\n\t\t\t\t\t<form class="sdk-form-group" novalidate>\n\t\t\t\t\t\t<div class="sdk-form-group">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\t\tid="messenger-prechat-name"\n\t\t\t\t\t\t\t\tname="name"\n\t\t\t\t\t\t\t\tplaceholder="Name (optional)"\n\t\t\t\t\t\t\t\tvalue="${this._escapeHtml(e)}"\n\t\t\t\t\t\t\t\tautocomplete="name"\n\t\t\t\t\t\t\t\tclass="sdk-input"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="sdk-form-group">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="email"\n\t\t\t\t\t\t\t\tid="messenger-prechat-email"\n\t\t\t\t\t\t\t\tname="email"\n\t\t\t\t\t\t\t\tplaceholder="Email address"\n\t\t\t\t\t\t\t\tvalue="${this._escapeHtml(t)}"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tautocomplete="email"\n\t\t\t\t\t\t\t\tclass="sdk-input"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class="messenger-prechat-error" id="messenger-email-error"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="messenger-prechat-actions">\n\t\t\t\t\t\t\t<button type="button" class="sdk-btn sdk-btn-secondary messenger-prechat-skip">Skip</button>\n\t\t\t\t\t\t\t<button type="submit" class="sdk-btn sdk-btn-primary sdk-btn-block messenger-prechat-submit" disabled>\n\t\t\t\t\t\t\t\t<span class="messenger-prechat-submit-text">Continue</span>\n\t\t\t\t\t\t\t\t<span class="messenger-prechat-submit-loading">\n\t\t\t\t\t\t\t\t\t<i class="ph ph-spinner"></i>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack">${e.slice(0,3).map(e=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-md"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-md">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}_attachEvents(){const e=this.element.querySelector("form"),t=this.element.querySelector("#messenger-prechat-email"),n=this.element.querySelector(".messenger-prechat-submit"),s=this.element.querySelector(".messenger-prechat-skip"),i=()=>{const e=t.value.trim(),s=this._isValidEmail(e);return n.disabled=!s,s};t.addEventListener("input",()=>{this._clearError("messenger-email-error"),i()}),t.addEventListener("blur",()=>{const e=t.value.trim();e&&!this._isValidEmail(e)&&this._showError("messenger-email-error","Please enter a valid email")}),s.addEventListener("click",()=>{this.state.setView("chat")}),e.addEventListener("submit",async e=>{e.preventDefault(),this._isSubmitting||(i()?await this._handleSubmit():this._showError("messenger-email-error","Please enter a valid email"))}),i(),setTimeout(()=>t.focus(),100)}_isValidEmail(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}_showError(e,t){const n=this.element.querySelector(`#${e}`);n&&(n.textContent=t,n.style.display="block")}_clearError(e){const t=this.element.querySelector(`#${e}`);t&&(t.textContent="",t.style.display="none")}async _handleSubmit(){const e=this.element.querySelector("#messenger-prechat-name"),t=this.element.querySelector("#messenger-prechat-email"),n=this.element.querySelector(".messenger-prechat-submit"),s=n.querySelector(".messenger-prechat-submit-text"),i=n.querySelector(".messenger-prechat-submit-loading"),a=e.value.trim(),r=t.value.trim();this._isSubmitting=!0,n.disabled=!0,s.style.display="none",i.style.display="inline-flex";try{this.options.onIdentifyContact&&await this.options.onIdentifyContact({name:a,email:r}),this.state.setIdentified(!0,{name:a,email:r}),this._isSubmitting=!1;const e=this.state.pendingMessage;e&&this.options.onStartConversation?(this.state.pendingMessage=null,this.state.setView("chat"),await this.options.onStartConversation(e.content,e.attachments)):this.state.setView("chat")}catch(e){console.error("[PreChatFormView] Error submitting form:",e),this._showError("messenger-email-error","Something went wrong. Please try again."),this._isSubmitting=!1,n.disabled=!1,s.style.display="inline",i.style.display="none"}}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class j extends C{constructor(e){super({...e,type:"messenger"}),this.messengerOptions={position:e.position||"bottom-right",theme:e.theme||"light",primaryColor:e.primaryColor||"#155EEF",textColor:e.textColor||"#1d1d1f",backgroundColor:e.backgroundColor||"#ffffff",logoUrl:e.logoUrl||"https://product7.io/p7logo.svg",teamName:e.teamName||"Support",teamAvatars:e.teamAvatars||[],welcomeMessage:e.welcomeMessage||"How can we help?",enableHelp:!1!==e.enableHelp,enableChangelog:!1!==e.enableChangelog,featuredContent:e.featuredContent||null,feedbackUrl:e.feedbackUrl||null,changelogUrl:e.changelogUrl||null,helpUrl:e.helpUrl||null,roadmapUrl:e.roadmapUrl||null,onSendMessage:e.onSendMessage||null,onFeedbackClick:e.onFeedbackClick||null,onArticleClick:e.onArticleClick||null,onChangelogClick:e.onChangelogClick||null},this.messengerState=new T({teamName:this.messengerOptions.teamName,teamAvatars:this.messengerOptions.teamAvatars,welcomeMessage:this.messengerOptions.welcomeMessage,enableHelp:this.messengerOptions.enableHelp,enableChangelog:this.messengerOptions.enableChangelog,userContext:this.sdk?.apiService?.getUserContext()||null,urls:{feedback:this.messengerOptions.feedbackUrl,changelog:this.messengerOptions.changelogUrl,help:this.messengerOptions.helpUrl,roadmap:this.messengerOptions.roadmapUrl}}),this.launcher=null,this.panel=null,this.wsService=null,this._wsUnsubscribers=[],this._handleOpenChange=this._handleOpenChange.bind(this),this._handleWebSocketMessage=this._handleWebSocketMessage.bind(this),this._handleTypingStarted=this._handleTypingStarted.bind(this),this._handleTypingStopped=this._handleTypingStopped.bind(this),this._handleConversationClosed=this._handleConversationClosed.bind(this)}_render(){const e=document.createElement("div");return e.className=`messenger-widget theme-${this.messengerOptions.theme}`,e.style.zIndex="999999",function(e={}){const{primaryColor:t="#155EEF",textColor:n="#1d1d1f",backgroundColor:s="#ffffff",theme:i="light"}=e;let a=document.getElementById("product7-messenger-custom-styles");a||(a=document.createElement("style"),a.id="product7-messenger-custom-styles",document.head.appendChild(a));const r=(e,t,n=1)=>{const s=parseInt(e.replace("#",""),16),i=Math.max(0,Math.min(255,(s>>16)+t)),a=Math.max(0,Math.min(255,(s>>8&255)+t)),r=Math.max(0,Math.min(255,(255&s)+t));return n<1?`rgba(${i}, ${a}, ${r}, ${n})`:"#"+(i<<16|a<<8|r).toString(16).padStart(6,"0")};a.textContent=`\n\t\t#product7-messenger-widget {\n\t\t\t--color-primary: ${t} !important;\n\t\t\t--color-primary-hover: ${r(t,-10)} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn {\n\t\t\tbackground: ${t} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn:hover {\n\t\t\tbox-shadow: 0 8px 24px ${r(t,0,.3)} !important;\n\t\t}\n\n\t\t.sdk-btn-primary {\n\t\t\tbackground: ${t} !important;\n\t\t\tborder-color: ${t} !important;\n\t\t}\n\n\t\t.sdk-btn-primary:hover {\n\t\t\tbackground: ${r(t,-10)} !important;\n\t\t\tborder-color: ${r(t,-10)} !important;\n\t\t}\n\n\t\t.messenger-compose-send {\n\t\t\tbackground: ${t} !important;\n\t\t}\n\n\t\t.messenger-compose-send:hover:not(:disabled) {\n\t\t\tbackground: ${r(t,-10)} !important;\n\t\t}\n\n\t\t.messenger-nav-tab.active .messenger-nav-icon,\n\t\t.messenger-nav-tab.active .messenger-nav-label {\n\t\t\tcolor: ${t} !important;\n\t\t}\n\n\t\t.messenger-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${r(t,0,.08)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t${"#ffffff"!==s?`\n\t\t.messenger-panel-content {\n\t\t\tbackground: ${s} !important;\n\t\t}\n\t\t`:""}\n\n\t\t${"#1d1d1f"!==n?`\n\t\t.messenger-panel-content,\n\t\t.messenger-view {\n\t\t\tcolor: ${n} !important;\n\t\t}\n\t\t`:""}\n\t`,console.log("✅ Custom messenger styles applied:",{primaryColor:t,theme:i})}({primaryColor:this.messengerOptions.primaryColor,textColor:this.messengerOptions.textColor,backgroundColor:this.messengerOptions.backgroundColor,theme:this.messengerOptions.theme}),this.launcher=new z(this.messengerState,{position:this.messengerOptions.position,primaryColor:this.messengerOptions.primaryColor}),e.appendChild(this.launcher.render()),this.panel=new L(this.messengerState,{position:this.messengerOptions.position,theme:this.messengerOptions.theme,primaryColor:this.messengerOptions.primaryColor,logoUrl:this.messengerOptions.logoUrl,featuredContent:this.messengerOptions.featuredContent,onSendMessage:this.messengerOptions.onSendMessage||this._handleSendMessage.bind(this),onStartConversation:this._handleStartConversation.bind(this),onTyping:this.sendTypingIndicator.bind(this),onSelectConversation:this._handleSelectConversation.bind(this),onStartNewConversation:this._handleNewConversationClick.bind(this),onIdentifyContact:this._handleIdentifyContact.bind(this),onFeedbackClick:this.messengerOptions.onFeedbackClick,onArticleClick:this.messengerOptions.onArticleClick,onChangelogClick:this.messengerOptions.onChangelogClick}),this.panel.registerView("home",B),this.panel.registerView("messages",P),this.panel.registerView("chat",D),this.panel.registerView("prechat",F),this.panel.registerView("help",N),this.panel.registerView("changelog",O),e.appendChild(this.panel.render()),this.panel.hide(),e}_attachEvents(){this._stateUnsubscribe=this.messengerState.subscribe((e,t)=>{"openChange"===e&&this._handleOpenChange(t.isOpen),"conversationChange"===e&&this._handleActiveConversationChange(t.conversationId,t.previousConversationId)})}_handleOpenChange(e){e?(this.panel.show(),this.sdk.eventBus.emit("messenger:opened",{widget:this})):(this.panel.hide(),this.messengerState.reset(),this.sdk.eventBus.emit("messenger:closed",{widget:this}))}_handleActiveConversationChange(e,t){t&&this.wsService&&this.wsService.send("conversation:unsubscribe",{conversation_id:t}),e&&this.wsService&&this.wsService.send("conversation:subscribe",{conversation_id:e})}async _handleStartConversation(e,t){try{if(!this.messengerState.isIdentified)return this.messengerState.pendingMessage={content:e,attachments:t},this.messengerState.setView("prechat"),null;const n=this.messengerState.conversations.find(e=>"open"===e.status);return n?(this.messengerState.setActiveConversation(n.id),await this._handleSendMessage(n.id,{content:e},t),n):await this.startNewConversation(e,"",t)}catch(e){return console.error("[MessengerWidget] Failed to start conversation:",e),null}}async _handleSelectConversation(e){try{await this.fetchMessages(e)}catch(e){console.error("[MessengerWidget] Failed to fetch messages:",e)}}_handleNewConversationClick(){const e=this.messengerState.conversations.find(e=>"open"===e.status);e?(this.messengerState.setActiveConversation(e.id),this.messengerState.setView("chat"),this._handleSelectConversation(e.id)):(this.messengerState.setActiveConversation(null),this.messengerState.setView("chat"))}async _handleIdentifyContact(e){try{const t=await this.apiService.identifyContact({name:e.name,email:e.email});return t.status&&(console.log("[MessengerWidget] Contact identified:",t.data.contact_id),this.messengerState.setIdentified(!0,{name:e.name,email:e.email})),t}catch(e){throw console.error("[MessengerWidget] Failed to identify contact:",e),e}}markAsIdentified(e,t){this.messengerState.setIdentified(!0,{name:e,email:t}),console.log("[MessengerWidget] Marked as identified:",t)}async _handleUploadFile(e,t){try{const n=await this.apiService.uploadFile(e,t);if(n.status&&n.url)return n.url;throw new Error("Upload failed")}catch(e){throw console.error("[MessengerWidget] Failed to upload file:",e),e}}async _uploadPendingAttachments(e){if(!e||0===e.length)return[];const t=[];for(const n of e)try{const e=await this._handleUploadFile(n.preview,n.file.name);t.push({url:e,type:n.type.startsWith("image")?"image":"file",name:n.file.name})}catch(e){console.error("[MessengerWidget] Skipping failed attachment upload:",n.file.name,e)}return t}async _handleSendMessage(e,t,n){this.sdk.eventBus.emit("messenger:messageSent",{widget:this,conversationId:e,message:t});try{const s=await this._uploadPendingAttachments(n),i=await this.apiService.sendMessage(e,{content:t.content,attachments:s});i.status&&i.data&&console.log("[MessengerWidget] Message sent:",i.data.id),this.apiService?.mock&&setTimeout(()=>{const t={id:"msg_"+Date.now(),content:"Thanks for your message! We'll get back to you soon.",isOwn:!1,timestamp:(new Date).toISOString(),sender:{name:"Support Team",avatarUrl:null}};this.messengerState.addMessage(e,t)},1500)}catch(e){console.error("[MessengerWidget] Failed to send message:",e)}}_handleWebSocketMessage(e){const{conversation_id:t,message:n}=e;let s=[];if(n.attachments)try{s="string"==typeof n.attachments?JSON.parse(n.attachments):n.attachments}catch(e){}const i={id:n.id,content:n.content,isOwn:"customer"===n.sender_type,timestamp:n.created_at,attachments:s.length>0?s:void 0,sender:{name:n.sender_name||"Support",avatarUrl:n.sender_avatar||null}};this.messengerState.upsertMessage(t,i,{reconcileOwnOptimistic:!0,optimisticMatchWindowMs:3e4}),this.messengerState.isOpen&&this.messengerState.activeConversationId===t||this._updateUnreadCount()}_handleTypingStarted(e){e.is_agent&&this.messengerState._notify("typingStarted",{conversationId:e.conversation_id,userName:e.user_name})}_handleTypingStopped(e){this.messengerState._notify("typingStopped",{conversationId:e.conversation_id})}_handleConversationClosed(e){const t=e?.conversation_id||e?.id||e?.conversation?.id;t&&this.messengerState.updateConversation(t,{status:"closed"})}async _updateUnreadCount(){try{const e=await this.apiService.getUnreadCount();e.status&&e.data&&(this.messengerState.unreadCount=e.data.unread_count||0,this.messengerState._notify("unreadCountChange",{count:this.messengerState.unreadCount}))}catch(e){console.error("[MessengerWidget] Failed to get unread count:",e)}}_initWebSocket(){this.wsService&&this.wsService.disconnect(),this.wsService=new M({baseURL:this.apiService.baseURL,workspace:this.apiService.workspace,sessionToken:this.apiService.sessionToken,mock:this.apiService.mock}),this._wsUnsubscribers.push(this.wsService.on("message",this._handleWebSocketMessage)),this._wsUnsubscribers.push(this.wsService.on("typing_started",this._handleTypingStarted)),this._wsUnsubscribers.push(this.wsService.on("typing_stopped",this._handleTypingStopped)),this._wsUnsubscribers.push(this.wsService.on("conversation_closed",this._handleConversationClosed)),this._wsUnsubscribers.push(this.wsService.on("connected",()=>{console.log("[MessengerWidget] WebSocket connected"),this.messengerState.activeConversationId&&this.wsService.send("conversation:subscribe",{conversation_id:this.messengerState.activeConversationId})})),this._wsUnsubscribers.push(this.wsService.on("disconnected",()=>{console.log("[MessengerWidget] WebSocket disconnected")})),this.wsService.connect()}open(){this.messengerState.setOpen(!0)}close(){this.messengerState.setOpen(!1)}toggle(){this.messengerState.setOpen(!this.messengerState.isOpen)}navigateTo(e){this.messengerState.setView(e),this.messengerState.isOpen||this.open()}setConversations(e){this.messengerState.setConversations(e)}addMessage(e,t){this.messengerState.addMessage(e,t)}setHelpArticles(e){this.messengerState.setHelpArticles(e)}setHomeChangelogItems(e){this.messengerState.setHomeChangelogItems(e)}setChangelogItems(e){this.messengerState.setChangelogItems(e)}setUnreadCount(e){this.messengerState.unreadCount=e,this.messengerState._notify("unreadCountChange",{count:e})}getState(){return{isOpen:this.messengerState.isOpen,currentView:this.messengerState.currentView,unreadCount:this.messengerState.unreadCount,conversations:this.messengerState.conversations}}async loadInitialData(){try{const e=await this._fetchConversations();this.messengerState.setConversations(e)}catch(e){console.error("[MessengerWidget] Failed to load conversations:",e)}if(this.messengerOptions.enableHelp)try{const e=await this._fetchHelpArticles();this.messengerState.setHelpArticles(e)}catch(e){console.error("[MessengerWidget] Failed to load help articles:",e)}if(this.messengerOptions.enableChangelog)try{const{homeItems:e,changelogItems:t}=await this._fetchChangelog();this.messengerState.setHomeChangelogItems(e),this.messengerState.setChangelogItems(t)}catch(e){console.error("[MessengerWidget] Failed to load changelog:",e)}}async _fetchConversations(){try{const e=await this.apiService.getConversations();return e.status&&e.data?e.data.map(e=>({id:e.id,title:e.subject||`Chat with ${e.assigned_user?.name||"Support"}`,participants:e.assigned_user?[{name:e.assigned_user.name,avatarUrl:e.assigned_user.avatar}]:[{name:"Support",avatarUrl:null}],lastMessage:e.preview||e.snippet||"",lastMessageTime:e.last_message_at,unread:e.unread||0,status:e.status})):[]}catch(e){return console.error("[MessengerWidget] Failed to fetch conversations:",e),[]}}async _fetchHelpArticles(){try{const e=await this.apiService.getHelpCollections();if(e.success&&e.data){const t=e.data.collections||e.data,n=(this.messengerOptions.helpUrl||"").replace(/\/$/,"");return t.map(e=>({id:e.id,title:e.title,description:e.description||"",articleCount:e.article_count||0,url:e.url_slug&&n?`${n}/collections/${e.url_slug}`:n||null}))}return[]}catch(e){return console.error("[MessengerWidget] Failed to fetch help articles:",e),[]}}async fetchMessages(e){try{const t=await this.apiService.getConversation(e);if(t.status&&t.data){const n=(t.data.messages||[]).map(e=>{let t;if(e.attachments)try{t="string"==typeof e.attachments?JSON.parse(e.attachments):e.attachments}catch(e){}return{id:e.id,content:e.content,isOwn:"customer"===e.sender_type,timestamp:e.created_at,attachments:t&&t.length>0?t:void 0,sender:{name:e.sender_name||("customer"===e.sender_type?"You":"Support"),avatarUrl:e.sender_avatar||null}}});return this.messengerState.setMessages(e,n),await this.apiService.markConversationAsRead(e),this.messengerState.markAsRead(e),n}return[]}catch(e){return console.error("[MessengerWidget] Failed to fetch messages:",e),[]}}async startNewConversation(e,t="",n=[]){try{const s=await this._uploadPendingAttachments(n),i=await this.apiService.startConversation({message:e,subject:t,attachments:s});if(i.status&&i.data){const t=i.data,n={id:t.id,title:t.subject||"New conversation",participants:[{name:"Support",avatarUrl:null}],lastMessage:e,lastMessageTime:t.created_at||(new Date).toISOString(),unread:0,status:"open"};return this.messengerState.addConversation(n),this.messengerState.setMessages(t.id,[{id:"msg_"+Date.now(),content:e,isOwn:!0,timestamp:(new Date).toISOString()}]),this.messengerState.setActiveConversation(t.id),this.messengerState.setView("chat"),t}return null}catch(e){return console.error("[MessengerWidget] Failed to start conversation:",e),null}}async sendTypingIndicator(e,t){try{await this.apiService.sendTypingIndicator(e,t)}catch(e){}}async checkAgentAvailability(){try{const e=await this.apiService.checkAgentsOnline();return e.status&&e.data?(this.messengerState.agentsOnline=e.data.agents_online,this.messengerState.onlineCount=e.data.online_count||0,this.messengerState.responseTime=e.data.response_time||"",e.data.available_agents&&this.messengerState.setTeamAvatarsFromAgents(e.data.available_agents),this.messengerState._notify("availabilityUpdate",e.data),e.data):{agents_online:!1,online_count:0}}catch(e){return console.error("[MessengerWidget] Failed to check availability:",e),{agents_online:!1,online_count:0}}}async _fetchChangelog(){if(this.apiService?.mock)return{homeItems:[{id:"changelog_5",title:"New integrations available",description:"Connect with more tools you love and streamline your workflow.",tags:["Integration"],coverImage:"https://images.unsplash.com/photo-1674027444485-cec3da58eef4?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-12096e5).toISOString(),url:"#"},{id:"changelog_2",title:"A new era of Insights has arrived",description:"We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.",tags:["New feature","AI"],coverImage:"https://images.unsplash.com/photo-1666875753105-c63a6f3bdc86?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-432e6).toISOString(),url:"#"},{id:"changelog_1",title:"The 2025 Customer Service Transformation Report",description:"Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.",tags:["Report"],coverImage:"https://images.unsplash.com/photo-1762330467475-a565d04e1808?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-1728e5).toISOString(),url:"#"}],changelogItems:[{id:"changelog_4",title:"Enhanced conversation analytics",description:"Get deeper insights into your customer conversations with our new analytics dashboard.",tags:["Analytics"],coverImage:"https://images.unsplash.com/photo-1523961131990-5ea7c61b2107?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-864e6).toISOString(),url:"#"},{id:"changelog_3",title:"Escalation guidance for complex issues",description:"New AI-powered escalation guidance helps your team handle complex customer issues more effectively.",tags:["New feature","AI"],coverImage:"https://images.unsplash.com/photo-1764773516703-b246ac2ad5ef?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-6048e5).toISOString(),url:"#"}]};try{const e=await this.apiService.getChangelogs({limit:20});if(e.success&&e.data){const t=Array.isArray(e.data)?e.data:[],n=(this.messengerOptions.changelogUrl||"").replace(/\/$/,""),s=t.map(e=>({id:e.id,title:e.title,description:e.excerpt||e.description||"",tags:e.labels?e.labels.map(e=>e.name):[],coverImage:e.cover_image||null,publishedAt:e.published_at,url:e.slug&&n?`${n}/${e.slug}`:n||null}));return{homeItems:s.slice(0,3),changelogItems:s}}return{homeItems:[],changelogItems:[]}}catch(e){return console.error("[MessengerWidget] Failed to fetch changelog:",e),{homeItems:[],changelogItems:[]}}}async onMount(){this.loadInitialData(),this.apiService?.sessionToken&&this._initWebSocket(),this.checkAgentAvailability(),this._availabilityInterval=setInterval(()=>{this.checkAgentAvailability()},6e4)}onDestroy(){this._stateUnsubscribe&&this._stateUnsubscribe(),this.wsService&&this.wsService.disconnect(),this._wsUnsubscribers.forEach(e=>e()),this._wsUnsubscribers=[],this._availabilityInterval&&clearInterval(this._availabilityInterval)}destroy(){!function(){const e=document.getElementById("product7-messenger-custom-styles");e&&e.parentNode&&e.parentNode.removeChild(e)}(),this.launcher&&this.launcher.destroy(),this.panel&&this.panel.destroy(),this.onDestroy(),super.destroy()}}class q extends C{constructor(e){super({...e,type:"survey"}),this.surveyOptions={surveyId:e.surveyId||null,surveyType:e.surveyType||"nps",position:e.position||"bottom-right",title:e.title||null,description:e.description||null,lowLabel:e.lowLabel||null,highLabel:e.highLabel||null,ratingScale:e.ratingScale||e.scale||null,showFeedbackInput:"boolean"==typeof e.showFeedbackInput?e.showFeedbackInput:null,showSubmitButton:"boolean"==typeof e.showSubmitButton?e.showSubmitButton:null,autoSubmitOnSelect:"boolean"==typeof e.autoSubmitOnSelect?e.autoSubmitOnSelect:null,showTitle:"boolean"==typeof e.showTitle?e.showTitle:null,showDescription:"boolean"==typeof e.showDescription?e.showDescription:null,customQuestions:e.customQuestions||[],pages:Array.isArray(e.pages)?e.pages:[],respondentId:e.respondentId||null,email:e.email||null,onSubmit:e.onSubmit||null,onDismiss:e.onDismiss||null},this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1}}_render(){const e=document.createElement("div");return e.className="feedback-survey-container",e}_attachEvents(){}show(){return this._renderSurvey(),this.surveyState.isVisible=!0,this.sdk.eventBus.emit("survey:shown",{widget:this,type:this.surveyOptions.surveyType}),this}hide(){return this._closeSurvey(),this}_renderSurvey(){this._closeSurvey(!1);const e=this._getSurveyConfig(),t=this._isMultiPageSurvey(),n=this._isLastPage(),s=this._shouldShowFeedbackInput(),i=this._shouldShowActions(),a=this._shouldShowTitle(e),r=this._shouldShowDescription(e),o=t?`Page ${this.surveyState.currentPageIndex+1} of ${this.surveyOptions.pages.length}`:"",l=t&&!n?"Next":"Submit",c=t&&this.surveyState.currentPageIndex>0?'<button class="feedback-survey-back">Back</button>':"";"center"===this.surveyOptions.position&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-survey-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this._handleDismiss())),this.surveyElement=document.createElement("div"),this.surveyElement.className=`feedback-survey feedback-survey-${this.surveyOptions.position}${r&&!a?" feedback-survey-description-primary":""}`,this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></svg></button>\n\t\t\t${a?`<h3 class="feedback-survey-title">${e.title}</h3>`:""}\n\t\t\t${r?`<p class="feedback-survey-description">${e.description}</p>`:""}\n\t\t\t${t?`<div class="feedback-survey-progress">${o}</div>`:""}\n\t\t\t<div class="feedback-survey-content">${e.html}</div>\n\t\t\t${s?`<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${i?`<div class="feedback-survey-actions">\n\t\t\t\t${c}\n\t\t\t\t<button class="feedback-survey-submit">${l}</button>\n\t\t\t</div>`:""}\n\t\t`,document.body.appendChild(this.surveyElement),this._attachSurveyEvents(),requestAnimationFrame(()=>{this.surveyElement.style.opacity="1",this.surveyElement.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(1)":"translateY(0)"})}_getSurveyConfig(){if(this._isMultiPageSurvey())return this._getCurrentPageConfig();const e=this._getNPSScale(),t=e.values.length<=7,n=t?"feedback-survey-ces feedback-survey-rating-scale":"feedback-survey-nps",s=t?"feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn":"feedback-survey-nps-btn",i=this.surveyOptions.lowLabel||(0===e.start?"Not likely":"Strongly Disagree"),a=this.surveyOptions.highLabel||(0===e.start?"Very likely":"Strongly Agree"),r=this.surveyOptions.description||this.surveyOptions.title||"How likely are you to recommend us?",o=this.surveyOptions.description||this.surveyOptions.title||"How satisfied are you?",l=this.surveyOptions.description||this.surveyOptions.title||"How easy was it?",c={nps:{title:this.surveyOptions.title||"",description:r,html:`\n\t\t\t\t\t<div class="${n}">\n\t\t\t\t\t\t${e.values.map(e=>`\n\t\t\t\t\t\t\t<button class="${s}" data-score="${e}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t${this._renderScaleLabels(i,a)}\n\t\t\t\t`},csat:{title:this.surveyOptions.title||"",description:o,html:`\n\t\t\t\t\t<div class="feedback-survey-csat">\n\t\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-csat-btn" data-score="${t+1}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t${this._renderScaleLabels(this.surveyOptions.lowLabel||"Very dissatisfied",this.surveyOptions.highLabel||"Very satisfied")}\n\t\t\t\t`},ces:{title:this.surveyOptions.title||"",description:l,html:`\n\t\t\t\t\t<div class="feedback-survey-ces">\n\t\t\t\t\t\t${["Very Difficult","Difficult","Neutral","Easy","Very Easy"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-ces-btn" data-score="${t+1}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t`},custom:{title:this.surveyOptions.title||"Quick Feedback",description:this.surveyOptions.description||"Help us improve by answering a few questions.",html:this._renderCustomQuestions()}};return c[this.surveyOptions.surveyType]||c.nps}_getNPSScale(){const e=Number(this.surveyOptions.ratingScale),t=Number.isFinite(e)&&e>=2?e:5,n=11===t?0:1;return{scale:t,start:n,values:Array.from({length:t},(e,t)=>n+t)}}_renderScaleLabels(e,t){const n=e||"",s=t||"";return n||s?`\n\t\t\t<div class="feedback-survey-labels">\n\t\t\t\t<span>${n}</span>\n\t\t\t\t<span>${s}</span>\n\t\t\t</div>\n\t\t`:""}_isRatingSurveyType(e=this.surveyOptions.surveyType){return"nps"===e||"csat"===e||"ces"===e}_shouldShowTitle(e){return!(!e||!e.title)&&("boolean"==typeof this.surveyOptions.showTitle?this.surveyOptions.showTitle:!(!this._isMultiPageSurvey()&&this._isRatingSurveyType())||!e.description)}_shouldShowDescription(e){return"boolean"==typeof this.surveyOptions.showDescription?this.surveyOptions.showDescription:!this._isMultiPageSurvey()&&this._isRatingSurveyType()?Boolean(e&&(e.description||e.title)):Boolean(e&&e.description)}_shouldShowFeedbackInput(){return!this._isMultiPageSurvey()&&("boolean"==typeof this.surveyOptions.showFeedbackInput&&this.surveyOptions.showFeedbackInput)}_shouldAutoSubmitOnSelect(){return"boolean"==typeof this.surveyOptions.autoSubmitOnSelect?this.surveyOptions.autoSubmitOnSelect:!this._isMultiPageSurvey()&&(!0!==this.surveyOptions.showSubmitButton&&(this._isRatingSurveyType()&&!this._shouldShowFeedbackInput()))}_shouldShowActions(){return!!this._isMultiPageSurvey()||("boolean"==typeof this.surveyOptions.showSubmitButton?this.surveyOptions.showSubmitButton:!this._shouldAutoSubmitOnSelect())}_isMultiPageSurvey(){return Array.isArray(this.surveyOptions.pages)&&this.surveyOptions.pages.length>0}_getCurrentPage(){return this._isMultiPageSurvey()&&this.surveyOptions.pages[this.surveyState.currentPageIndex]||null}_isLastPage(){return!this._isMultiPageSurvey()||this.surveyState.currentPageIndex>=this.surveyOptions.pages.length-1}_getCurrentPageConfig(){const e=this._getCurrentPage();return e?{title:e.title||this.surveyOptions.title||"Quick Feedback",description:e.description||this.surveyOptions.description||"",html:this._renderSurveyPage(e)}:this._getFallbackSurveyConfig()}_getFallbackSurveyConfig(){return{title:this.surveyOptions.title||"Quick Feedback",description:this.surveyOptions.description||"",html:this._renderCustomQuestions()}}_renderSurveyPage(e){switch(e.type){case"rating":return this._renderRatingPage(e);case"multiple_choice":return this._renderMultipleChoicePage(e);default:return this._renderTextPage(e)}}_renderRatingPage(e){const t=e.id||`page_${this.surveyState.currentPageIndex}`,n=e.ratingConfig||e.rating_config||{},s=Number(n.scale)||5,i=n.survey_type||this.surveyOptions.surveyType||"csat",a=(this.surveyState.pageAnswers[t]||{}).rating,r="nps"===i?11===s?"Not likely":"Strongly Disagree":"",o="nps"===i?11===s?"Very likely":"Strongly Agree":"",l=n.low_label||this.surveyOptions.lowLabel||r,c=n.high_label||this.surveyOptions.highLabel||o,d=this._renderScaleLabels(l,c);if("nps"===i){const e=Number.isFinite(s)&&s>=2?s:5,n=11===e?0:1,i=Array.from({length:e},(e,t)=>n+t),r=i.length<=7,o=r?"feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn":"feedback-survey-page-rating-btn feedback-survey-nps-btn";return`\n\t\t\t\t<div class="${r?"feedback-survey-ces feedback-survey-rating-scale":"feedback-survey-nps"}" data-page-id="${t}">\n\t\t\t\t\t${i.map(e=>`<button class="${o}${a===e?" selected":""}" data-page-id="${t}" data-score="${e}">${e}</button>`).join("")}\n\t\t\t\t</div>\n\t\t\t\t${d}\n\t\t\t`}if("emoji"===i&&5===s){return`\n\t\t\t\t<div class="feedback-survey-csat" data-page-id="${t}">\n\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((e,n)=>{const s=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-csat-btn${a===s?" selected":""}" data-page-id="${t}" data-score="${s}">${e}</button>`}).join("")}\n\t\t\t\t</div>\n\t\t\t\t${d}\n\t\t\t`}return`\n\t\t\t<div class="feedback-survey-ces feedback-survey-rating-scale" data-page-id="${t}">\n\t\t\t\t${[...Array(s).keys()].map(e=>{const n=e+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn${a===n?" selected":""}" data-page-id="${t}" data-score="${n}">${n}</button>`}).join("")}\n\t\t\t</div>\n\t\t\t${d}\n\t\t`}_renderMultipleChoicePage(e){const t=e.id||`page_${this.surveyState.currentPageIndex}`,n=e.multipleChoiceConfig||e.multiple_choice_config||{},s=Array.isArray(n.options)?n.options:[],i=!0===n.allow_multiple||!0===n.multiple,a=this.surveyState.pageAnswers[t]||{},r=Array.isArray(a.values)?a.values:a.value?[a.value]:[];return`\n\t\t\t<div class="feedback-survey-multiple-choice" data-page-id="${t}" data-multiple="${i}">\n\t\t\t\t${s.map((e,n)=>{const s=e.value||e.id||e.key||`option_${n}`,i=e.label||e.text||String(s);return`<button class="feedback-survey-page-choice-btn${r.includes(s)?" selected":""}" data-page-id="${t}" data-value="${s}">${i}</button>`}).join("")}\n\t\t\t</div>\n\t\t`}_renderTextPage(e){const t=e.id||`page_${this.surveyState.currentPageIndex}`;return`\n\t\t\t<div class="feedback-survey-text-page" data-page-id="${t}">\n\t\t\t\t<textarea class="feedback-survey-page-textarea" data-page-id="${t}" placeholder="Type your answer...">${(this.surveyState.pageAnswers[t]||{}).text||""}</textarea>\n\t\t\t</div>\n\t\t`}_renderCustomQuestions(){return this.surveyOptions.customQuestions&&0!==this.surveyOptions.customQuestions.length?this.surveyOptions.customQuestions.map((e,t)=>`\n\t\t\t<div class="sdk-form-group">\n\t\t\t\t<label class="sdk-label">${e.label}</label>\n\t\t\t\t${this._renderQuestionInput(e,t)}\n\t\t\t</div>\n\t\t`).join(""):`\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"].map(e=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-freq-btn" data-freq="${e}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`}_renderQuestionInput(e,t){switch(e.type){case"select":return`\n\t\t\t\t\t<select class="feedback-survey-select" data-question="${e.id||t}">\n\t\t\t\t\t\t<option value="">${e.placeholder||"Select an option"}</option>\n\t\t\t\t\t\t${e.options.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}\n\t\t\t\t\t</select>\n\t\t\t\t`;case"text":return`\n\t\t\t\t\t<input type="text" class="feedback-survey-input" data-question="${e.id||t}" placeholder="${e.placeholder||""}">\n\t\t\t\t`;default:return""}}_attachSurveyEvents(){if(!this.surveyElement)return;this.surveyElement.querySelector(".feedback-survey-close").addEventListener("click",()=>this._handleDismiss());const e=this.surveyElement.querySelector(".feedback-survey-submit");e&&e.addEventListener("click",()=>this._handleSubmit());const t=this.surveyElement.querySelector(".feedback-survey-back");t&&t.addEventListener("click",()=>this._handleBack());const n=this.surveyElement.querySelector(".feedback-survey-textarea");n&&n.addEventListener("input",e=>{this.surveyState.feedback=e.target.value}),this._attachTypeSpecificEvents(),this._escapeHandler=e=>{"Escape"===e.key&&this._handleDismiss()},document.addEventListener("keydown",this._escapeHandler)}_attachTypeSpecificEvents(){if(this._isMultiPageSurvey())return void this._attachCurrentPageEvents();const e=this.surveyOptions.surveyType;"nps"===e&&this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(e=>{e.addEventListener("click",()=>this._selectNPS(parseInt(e.dataset.score)))}),"csat"===e&&this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCSAT(parseInt(e.dataset.score)))}),"ces"===e&&this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCES(parseInt(e.dataset.score)))}),"custom"===e&&(this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(e=>{e.addEventListener("click",()=>this._selectFrequency(e.dataset.freq))}),this.surveyElement.querySelectorAll(".feedback-survey-select").forEach(e=>{e.addEventListener("change",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}),this.surveyElement.querySelectorAll(".feedback-survey-input").forEach(e=>{e.addEventListener("input",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}))}_attachCurrentPageEvents(){const e=this._getCurrentPage();if(!e||!this.surveyElement)return;const t=e.id||`page_${this.surveyState.currentPageIndex}`;if("rating"===e.type&&this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(e=>{e.addEventListener("click",()=>{const n=parseInt(e.dataset.score);Number.isNaN(n)||(this._setPageAnswer(t,{rating:n}),this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(e=>e.classList.remove("selected")),e.classList.add("selected"))})}),"multiple_choice"===e.type){const e=this.surveyElement.querySelector(".feedback-survey-multiple-choice"),n=!!e&&"true"===e.dataset.multiple;this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(e=>{e.addEventListener("click",()=>{const s=e.dataset.value;if(!s)return;const i=this.surveyState.pageAnswers[t]||{},a=Array.isArray(i.values)?i.values:i.value?[i.value]:[];let r=[];if(n){r=a.includes(s)?a.filter(e=>e!==s):[...a,s]}else r=[s];this._setPageAnswer(t,{value:r[0]||null,values:r}),n||this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(e=>e.classList.remove("selected")),e.classList.toggle("selected",r.includes(s))})})}if("text"===e.type){const e=this.surveyElement.querySelector(".feedback-survey-page-textarea");e&&e.addEventListener("input",e=>{this._setPageAnswer(t,{text:e.target.value})})}}_selectNPS(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(t=>{parseInt(t.dataset.score)===e?t.classList.add("selected"):t.classList.remove("selected")}),this._maybeAutoSubmit()}_selectCSAT(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(t=>{parseInt(t.dataset.score)===e?t.classList.add("selected"):t.classList.remove("selected")}),this._maybeAutoSubmit()}_selectCES(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(t=>{parseInt(t.dataset.score)===e?t.classList.add("selected"):t.classList.remove("selected")}),this._maybeAutoSubmit()}_maybeAutoSubmit(){this._shouldAutoSubmitOnSelect()&&this._handleSubmit()}_selectFrequency(e){this.surveyState.customAnswers.frequency=e,this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(t=>{t.dataset.freq===e?t.classList.add("selected"):t.classList.remove("selected")})}async _handleSubmit(){const e=this.surveyOptions.surveyType;if(this.surveyState.isSubmitting)return;if(this._isMultiPageSurvey()){if(!this._validateCurrentPage())return;const e=this._getNextPageIndex();if(-1!==e&&e!==this.surveyState.currentPageIndex)return this.surveyState.currentPageIndex=e,void this._renderSurvey()}if(!this._isMultiPageSurvey()&&("nps"===e||"csat"===e||"ces"===e)&&null===this.surveyState.score)return void this._showError("Please select a rating");this.surveyState.isSubmitting=!0;const t=this._getRespondentContext(),n=this._normalizePageAnswersForSubmit(),s={...this.surveyState.customAnswers,...Object.keys(n).length>0&&{page_answers:n}},i={rating:this._getSubmissionRating(),feedback:this.surveyState.feedback,answers:s,...t.respondentId&&{respondentId:t.respondentId},...t.email&&{email:t.email}},a={type:e,score:this._getSubmissionRating(),feedback:this.surveyState.feedback,customAnswers:s,pageAnswers:n,timestamp:(new Date).toISOString()};try{this.surveyOptions.onSubmit&&this.surveyOptions.onSubmit(a);const t=this.surveyOptions.surveyId||`local_${e}_${Date.now()}`;await this.apiService.submitSurveyResponse(t,i)}catch(e){console.error("[SurveyWidget] Failed to submit survey:",e)}finally{this.surveyState.isSubmitting=!1}this.sdk.eventBus.emit("survey:submitted",{widget:this,response:a}),this._closeSurvey(),this._showSuccessNotification()}_handleBack(){this._isMultiPageSurvey()&&(this.surveyState.currentPageIndex<=0||(this.surveyState.currentPageIndex-=1,this._renderSurvey()))}_setPageAnswer(e,t){e&&(this.surveyState.pageAnswers[e]={...this.surveyState.pageAnswers[e]||{},...t})}_validateCurrentPage(){const e=this._getCurrentPage();if(!e||!1===e.required)return!0;const t=e.id||`page_${this.surveyState.currentPageIndex}`,n=this.surveyState.pageAnswers[t]||{};if("rating"===e.type&&"number"!=typeof n.rating)return this._showError("Please select a rating"),!1;if("multiple_choice"===e.type){const e=Boolean(n.value),t=Array.isArray(n.values)&&n.values.length>0;if(!e&&!t)return this._showError("Please select an option"),!1}return!!("text"!==e.type||n.text&&String(n.text).trim())||(this._showError("Please enter an answer"),!1)}_getNextPageIndex(){if(!this._isMultiPageSurvey())return-1;const e=this._getCurrentPage(),t=this.surveyOptions.pages.length,n=this.surveyState.currentPageIndex,s=n+1<t?n+1:-1,i=e?e.afterThisPage||e.after_this_page:null;if(!i)return s;const a=i.default;if(!a)return s;if("end_survey"===a)return-1;if("next_page"===a||"next"===a)return s;if("number"==typeof a)return a>=0&&a<t?a:s;if("string"==typeof a){const e=a.replace(/^page:/,""),t=this.surveyOptions.pages.findIndex(t=>t.id===e);return t>=0?t:s}return s}_getSubmissionRating(){if("number"==typeof this.surveyState.score)return this.surveyState.score;if(!this._isMultiPageSurvey())return null;for(const e of this.surveyOptions.pages){const t=e.id||`page_${this.surveyOptions.pages.indexOf(e)}`,n=this.surveyState.pageAnswers[t];if(n&&"number"==typeof n.rating)return n.rating}return null}_normalizePageAnswersForSubmit(){const e={};for(const[t,n]of Object.entries(this.surveyState.pageAnswers))null!=n&&(Array.isArray(n.values)&&n.values.length>0?e[t]=n.values:null==n.value||""===n.value?"number"!=typeof n.rating?"string"==typeof n.text&&n.text.trim()&&(e[t]=n.text.trim()):e[t]=n.rating:e[t]=n.value);return e}_getRespondentContext(){const e="function"==typeof this.sdk.getUserContext&&this.sdk.getUserContext()||{},t=this.apiService&&"function"==typeof this.apiService.getUserContext&&this.apiService.getUserContext()||{},n=this.options.userContext||{};return{respondentId:this.surveyOptions.respondentId||n.user_id||e.user_id||t.user_id||null,email:this.surveyOptions.email||n.email||e.email||t.email||null}}async _handleDismiss(){if(this.surveyOptions.surveyId)try{await this.apiService.dismissSurvey(this.surveyOptions.surveyId)}catch(e){console.error("[SurveyWidget] Failed to dismiss survey:",e)}this.surveyOptions.onDismiss&&this.surveyOptions.onDismiss(),this.sdk.eventBus.emit("survey:dismissed",{widget:this}),this._closeSurvey()}_showError(e){const t=this.surveyElement.querySelector(".feedback-survey-error");t&&t.remove();const n=document.createElement("div");n.className="feedback-survey-error",n.textContent=e;const s=this.surveyElement.querySelector(".feedback-survey-submit"),i=this.surveyElement.querySelector(".feedback-survey-actions"),a=s||i;a&&a.parentNode?a.parentNode.insertBefore(n,a):this.surveyElement.appendChild(n),setTimeout(()=>n.remove(),3e3)}_showSuccessNotification(){const e=document.createElement("div");e.className="feedback-survey-success",e.innerHTML='\n\t\t\t<div>\n\t\t\t\t<span style="font-size: 18px;">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t',document.body.appendChild(e),setTimeout(()=>{e.style.opacity="0",e.style.transition="opacity 0.3s ease",setTimeout(()=>e.remove(),300)},3e3)}_closeSurvey(e=!0){this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null);const t=this.surveyElement,n=this.backdropElement;t&&(t.style.opacity="0",t.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(0.95)":"translateY(20px)",setTimeout(()=>{t&&t.parentNode&&t.parentNode.removeChild(t)},300),this.surveyElement=null),n&&(n.style.opacity="0",setTimeout(()=>{n&&n.parentNode&&n.parentNode.removeChild(n)},300),this.backdropElement=null),e&&(this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1})}destroy(){this._closeSurvey(),super.destroy()}}class H extends C{constructor(e){super({...e,type:"tab"})}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-tab position-${this.options.position}`,e.innerHTML='\n <div class="feedback-tab-trigger">\n <span class="feedback-tab-text">Feedback</span>\n </div>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){this.element.querySelector(".feedback-tab-trigger").addEventListener("click",this.openModal)}updateText(e){const t=this.element?.querySelector(".feedback-tab-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class U{static widgets=new Map([["button",E],["tab",H],["inline",A],["survey",q],["messenger",j],["changelog",I]]);static register(e,t){if("string"!=typeof e||!e.trim())throw new g("Widget type must be a non-empty string");if("function"!=typeof t)throw new g("Widget class must be a constructor function");this.widgets.set(e,t)}static create(e,t={}){const n=this.widgets.get(e);if(!n){const t=Array.from(this.widgets.keys()).join(", ");throw new g(`Unknown widget type: ${e}. Available types: ${t}`)}try{return new n(t)}catch(t){throw new g(`Failed to create widget of type '${e}': ${t.message}`,t)}}static getAvailableTypes(){return Array.from(this.widgets.keys())}static isTypeRegistered(e){return this.widgets.has(e)}static unregister(e){return this.widgets.delete(e)}static clear(){this.widgets.clear()}static getWidgetClass(e){return this.widgets.get(e)}}class R{constructor(e={}){this.config=this._validateAndMergeConfig(e),this.initialized=!1,this.widgets=new Map,this.eventBus=new w,this.apiService=new y({apiUrl:this.config.apiUrl,workspace:this.config.workspace,siteId:this.config.siteId,sessionToken:this.config.sessionToken,userContext:this.config.userContext,mock:this.config.mock,debug:this.config.debug,env:this.config.env}),this._bindMethods()}async init(){if(this.initialized)return{alreadyInitialized:!0};try{const e=await this.apiService.init(this.config.userContext);return e.config&&(this.config=x(e.config,this.config)),this.initialized=!0,this.eventBus.emit("sdk:initialized",{config:this.config,sessionToken:e.sessionToken}),{initialized:!0,config:e.config||{},sessionToken:e.sessionToken,expiresIn:e.expiresIn}}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new g(`Failed to initialize SDK: ${e.message}`,e)}}createWidget(e="button",t={}){if(!this.initialized)throw new g("SDK must be initialized before creating widgets. Call init() first.");const n=k("widget"),s={id:n,sdk:this,apiService:this.apiService,...this.config,...t};try{const t=U.create(e,s);return this.widgets.set(n,t),this.eventBus.emit("widget:created",{widget:t,type:e}),t}catch(e){throw new g(`Failed to create widget: ${e.message}`,e)}}getWidget(e){return this.widgets.get(e)}async getActiveSurveys(e={}){if(!this.initialized)throw new g("SDK must be initialized before fetching surveys. Call init() first.");try{const t=((await this.apiService.getActiveSurveys(e)).data||[]).map(e=>this._normalizeSurveyConfig(e));return e.includeIneligible?t:t.filter(e=>this._isSurveyEligible(e))}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new g(`Failed to fetch active surveys: ${e.message}`,e)}}async showSurveyById(e,t={}){if(!this.initialized)throw new g("SDK must be initialized before showing surveys. Call init() first.");const{context:n={},...s}=t,i=(await this.getActiveSurveys({...n,includeEligibility:!0,includeIneligible:!0})).find(t=>t.id===e);if(!i)throw new g(`Survey with ID '${e}' not found or not active`);return this._isSurveyEligible(i)?this.showSurvey({surveyId:i.id,surveyType:i.surveyType||i.type,title:i.title,description:i.description,lowLabel:i.lowLabel||i.low_label,highLabel:i.highLabel||i.high_label,ratingScale:i.ratingScale??i.rating_scale,showFeedbackInput:i.showFeedbackInput??i.show_feedback_input,showSubmitButton:i.showSubmitButton??i.show_submit_button,autoSubmitOnSelect:i.autoSubmitOnSelect??i.auto_submit_on_select,showTitle:i.showTitle??i.show_title,showDescription:i.showDescription??i.show_description,customQuestions:i.customQuestions||i.questions,pages:i.pages,...s}):(this.eventBus.emit("survey:suppressed",{surveyId:e,reason:this._getSurveyIneligibilityReason(i),survey:i}),null)}showSurvey(e={}){if(!this.initialized)throw new g("SDK must be initialized before showing surveys. Call init() first.");if(!this._isSurveyEligible(e))return this.eventBus.emit("survey:suppressed",{surveyId:e.surveyId||e.id||null,reason:this._getSurveyIneligibilityReason(e),survey:e}),null;const t=this._normalizeSurveyConfig(e),n=this.createWidget("survey",{surveyId:t.surveyId,surveyType:t.surveyType||t.type||"nps",position:t.position||"bottom-right",theme:t.theme||this.config.theme||"light",title:t.title,description:t.description,lowLabel:t.lowLabel,highLabel:t.highLabel,ratingScale:t.ratingScale??t.scale,showFeedbackInput:t.showFeedbackInput,showSubmitButton:t.showSubmitButton,autoSubmitOnSelect:t.autoSubmitOnSelect,showTitle:t.showTitle,showDescription:t.showDescription,customQuestions:t.customQuestions,pages:t.pages,respondentId:t.respondentId,email:t.email,onSubmit:t.onSubmit,onDismiss:t.onDismiss});return n.mount(),n.show(),n}_isSurveyEligible(e={}){const t=this._getSurveyField(e,["shouldShow","should_show"]);if("boolean"==typeof t)return t;const n=this._getSurveyField(e.eligibility||{},["shouldShow","should_show"]);if("boolean"==typeof n)return n;const s=this._getSurveyField(e,["eligible","isEligible","is_eligible"]);if("boolean"==typeof s)return s;const i=this._getSurveyField(e,["isAnswered","is_answered"]);if("boolean"==typeof i)return!i;const a=this._getSurveyField(e.eligibility||{},["isAnswered","is_answered"]);return"boolean"!=typeof a||!a}_getSurveyIneligibilityReason(e={}){const t=this._getSurveyField(e,["reason","suppressionReason","suppression_reason"]);if(t)return t;const n=this._getSurveyField(e.eligibility||{},["reason","suppressionReason","suppression_reason"]);if(n)return n;return!0===this._getSurveyField(e,["isAnswered","is_answered"])?"already_answered":"ineligible"}_normalizeSurveyConfig(e={}){const t=Array.isArray(e.pages)&&e.pages.length>0?e.pages[0]:null,n=t&&(t.rating_config||t.ratingConfig)||{},s=e.type||this._inferSurveyTypeFromPage(t)||"nps";return{...e,surveyId:e.surveyId||e.id||null,surveyType:e.surveyType||s,type:e.type||s,should_show:e.should_show??(e.eligibility?e.eligibility.should_show:void 0),reason:e.reason||(e.eligibility?e.eligibility.reason:void 0),title:e.title||e.name||(t?t.title:null),description:e.description||(t?t.description:null),lowLabel:e.lowLabel||e.low_label||n.low_label||null,highLabel:e.highLabel||e.high_label||n.high_label||null,ratingScale:e.ratingScale??e.rating_scale??n.scale??null,showFeedbackInput:e.showFeedbackInput??e.show_feedback_input??null,showSubmitButton:e.showSubmitButton??e.show_submit_button??null,autoSubmitOnSelect:e.autoSubmitOnSelect??e.auto_submit_on_select??null,showTitle:e.showTitle??e.show_title??null,showDescription:e.showDescription??e.show_description??null,customQuestions:e.customQuestions||e.questions||[],pages:this._normalizeSurveyPages(e.pages||[])}}_normalizeSurveyPages(e=[]){return Array.isArray(e)?e.map((e,t)=>({id:e.id||`page_${t}`,type:e.type||"rating",title:e.title||"",description:e.description||"",required:!1!==e.required,position:e.position??t,ratingConfig:e.ratingConfig||e.rating_config||null,multipleChoiceConfig:e.multipleChoiceConfig||e.multiple_choice_config||null,linkConfig:e.linkConfig||e.link_config||null,afterThisPage:e.afterThisPage||e.after_this_page||null})).sort((e,t)=>e.position-t.position):[]}_inferSurveyTypeFromPage(e){if(!e)return null;const t=e.rating_config||e.ratingConfig||{},n=t.scale,s=t.survey_type,i=(e.title||"").toLowerCase();return 11===n||"nps"===s?"nps":"emoji"===s||i.includes("effort")||i.includes("easy")?"ces":"csat"}_getSurveyField(e,t){for(const n of t)if(void 0!==e[n]&&null!==e[n])return e[n];return null}showChangelog(e={}){if(!this.initialized)throw new g("SDK must be initialized before showing changelog. Call init() first.");const t=this.createWidget("changelog",{position:e.position||"bottom-right",theme:e.theme||this.config.theme||"light",title:e.title||"What's New",triggerText:e.triggerText||"What's New",showBadge:!1!==e.showBadge,viewButtonText:e.viewButtonText||"View Update",changelogBaseUrl:e.changelogBaseUrl,openInNewTab:e.openInNewTab,onViewUpdate:e.onViewUpdate});return t.mount(),t.show(),t}async getChangelogs(e={}){if(!this.initialized)throw new g("SDK must be initialized before fetching changelogs. Call init() first.");try{return(await this.apiService.getChangelogs(e)).data||[]}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new g(`Failed to fetch changelogs: ${e.message}`,e)}}getAllWidgets(){return Array.from(this.widgets.values())}destroyWidget(e){const t=this.widgets.get(e);return!!t&&(t.destroy(),this.widgets.delete(e),this.eventBus.emit("widget:removed",{widgetId:e}),!0)}destroyAllWidgets(){for(const e of this.widgets.values())e.destroy();this.widgets.clear(),this.eventBus.emit("widgets:cleared")}updateConfig(e){const t={...this.config};this.config=this._validateAndMergeConfig(e,this.config);for(const e of this.widgets.values())e.handleConfigUpdate(this.config);this.eventBus.emit("config:updated",{oldConfig:t,newConfig:this.config})}setUserContext(e){this.config.userContext=e,this.apiService&&this.apiService.setUserContext(e),this.eventBus.emit("user:updated",{userContext:e})}getUserContext(){return this.config.userContext||(this.apiService?this.apiService.getUserContext():null)}async reinitialize(e=null){return this.apiService.clearSession(),this.initialized=!1,e&&this.setUserContext(e),this.init()}on(e,t){return this.eventBus.on(e,t),this}off(e,t){return this.eventBus.off(e,t),this}once(e,t){return this.eventBus.once(e,t),this}emit(e,t){return this.eventBus.emit(e,t),this}destroy(){this.destroyAllWidgets(),this.eventBus.removeAllListeners(),this.apiService.clearSession(),this.initialized=!1,this.eventBus.emit("sdk:destroyed")}hasFeedbackBeenSubmitted(e=30){const t=24*e*60*60*1e3,n=Date.now();if(this.config.last_feedback_at)try{if(n-new Date(this.config.last_feedback_at).getTime()<t)return!0}catch(e){}try{const e=`feedback_submitted_${this.config.workspace}`,s=localStorage.getItem(e);if(!s)return!1;return n-JSON.parse(s).submittedAt<t}catch(e){return!1}}clearFeedbackSubmissionTracking(){try{const e=`feedback_submitted_${this.config.workspace}`;localStorage.removeItem(e),this.eventBus.emit("feedback:trackingCleared")}catch(e){console.warn("Failed to clear feedback tracking:",e)}}_detectEnvironment(){if("undefined"==typeof window)return"production";const e=window.location.hostname.toLowerCase();return e.includes("staging")||e.includes("localhost")||e.includes("127.0.0.1")||e.includes(".local")?"staging":"production"}_validateAndMergeConfig(e,t={}){const n=x(x({apiUrl:null,workspace:null,userContext:null,position:"bottom-right",theme:"light",boardId:"general",autoShow:!0,debug:!1,mock:!1,env:this._detectEnvironment()},t),e);if(e.env||t.env||(n.env=this._detectEnvironment()),!n.workspace)throw new m("Missing required configuration: workspace");return n.userContext&&this._validateUserContext(n.userContext),n}_validateUserContext(e){if(!e.user_id&&!e.email)throw new m("User context must include at least user_id or email");const t={user_id:"string",email:"string",name:"string",custom_fields:"object",company:"object"};for(const[n,s]of Object.entries(t))if(e[n]&&typeof e[n]!==s)throw new m(`User context field '${n}' must be of type '${s}'`)}_bindMethods(){this.createWidget=this.createWidget.bind(this),this.destroyWidget=this.destroyWidget.bind(this),this.updateConfig=this.updateConfig.bind(this)}static create(e){return new R(e)}static async createAndInit(e){const t=new R(e);return await t.init(),t}static extractUserContextFromAuth(e){return e?{user_id:e.sub||e.id||e.user_id,email:e.email,name:e.name||e.display_name||e.full_name,custom_fields:{role:e.role,plan:e.plan||e.subscription?.plan,...e.custom_fields||{}},company:e.company||e.organization?{id:e.company?.id||e.organization?.id,name:e.company?.name||e.organization?.name,monthly_spend:e.company?.monthly_spend}:void 0}:null}}function W(){if("undefined"!=typeof document&&!document.querySelector("#feedback-sdk-styles")){const e=document.createElement("style");e.id="feedback-sdk-styles",e.textContent="\n:root {\n --color-primary: #155EEF;\n --color-primary-hover: #1249CA;\n --color-primary-active: #0D3A9F;\n --color-primary-light: rgba(21, 94, 239, 0.1);\n --color-primary-border: rgba(21, 94, 239, 0.3);\n \n --color-success: #10B981;\n --color-success-hover: #059669;\n --color-success-light: #D1FAE5;\n --color-success-dark: #065F46;\n \n --color-error: #EF4444;\n --color-error-hover: #DC2626;\n --color-error-light: #FEE2E2;\n --color-error-dark: #991B1B;\n --color-error-border: #FECACA;\n \n --color-warning: #F59E0B;\n --color-warning-light: #FEF3C7;\n \n --color-neutral-50: #F9FAFB;\n --color-neutral-100: #F3F4F6;\n --color-neutral-200: #E5E7EB;\n --color-neutral-300: #D1D5DB;\n --color-neutral-400: #9CA3AF;\n --color-neutral-500: #6B7280;\n --color-neutral-600: #4B5563;\n --color-neutral-700: #374151;\n --color-neutral-800: #1F2937;\n --color-neutral-900: #111827;\n \n --color-white: #FFFFFF;\n --color-black: #000000;\n \n --color-background: #FFFFFF;\n --color-surface: #F9FAFB;\n --color-border: #E5E7EB;\n --color-text-primary: #111827;\n --color-text-secondary: #4B5563;\n --color-text-tertiary: #6B7280;\n \n --spacing-1: 4px;\n --spacing-2: 8px;\n --spacing-3: 12px;\n --spacing-4: 16px;\n --spacing-5: 20px;\n --spacing-6: 24px;\n --spacing-7: 28px;\n --spacing-8: 32px;\n --spacing-10: 40px;\n --spacing-12: 48px;\n \n --font-size-xs: 11px;\n --font-size-sm: 12px;\n --font-size-base: 14px;\n --font-size-md: 15px;\n --font-size-lg: 16px;\n --font-size-xl: 18px;\n --font-size-2xl: 20px;\n --font-size-3xl: 24px;\n \n --font-weight-normal: 450;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n \n --line-height-tight: 1.25;\n --line-height-snug: 1.3;\n --line-height-normal: 1.4;\n --line-height-relaxed: 1.5;\n --line-height-loose: 1.6;\n \n --radius-sm: 6px;\n --radius-md: 8px;\n --radius-lg: 10px;\n --radius-xl: 12px;\n --radius-2xl: 16px;\n --radius-3xl: 20px;\n --radius-4xl: 24px;\n --radius-full: 9999px;\n \n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n \n --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n --transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);\n --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);\n \n --z-dropdown: 1000;\n --z-sticky: 1020;\n --z-fixed: 1030;\n --z-modal-backdrop: 999998;\n --z-modal: 999999;\n --z-popover: 1000000;\n --z-tooltip: 1000001;\n --z-notification: 1000002;\n}\n\n.feedback-widget,\n.messenger-widget,\n.changelog-widget,\n.feedback-survey {\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n}\n\n.feedback-widget *,\n.feedback-widget *::before,\n.feedback-widget *::after,\n.messenger-widget *,\n.messenger-widget *::before,\n.messenger-widget *::after,\n.changelog-widget *,\n.changelog-widget *::before,\n.changelog-widget *::after,\n.feedback-survey *,\n.feedback-survey *::before,\n.feedback-survey *::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .feedback-widget *,\n .messenger-widget *,\n .changelog-widget *,\n .feedback-survey * {\n transition: none !important;\n animation: none !important;\n }\n}\n\n@media print {\n .feedback-widget,\n .feedback-panel,\n .sdk-modal-backdrop,\n .sdk-notification,\n .changelog-widget,\n .changelog-modal,\n .messenger-widget,\n .messenger-launcher,\n .messenger-panel,\n .feedback-survey,\n .feedback-survey-backdrop {\n display: none !important;\n }\n}\n\n.sdk-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n border-radius: 8px;\n border: none;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-base);\n outline: none;\n}\n\n.sdk-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sdk-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.sdk-btn-primary {\n background: var(--color-primary);\n color: var(--color-white);\n border: 1px solid var(--color-primary);\n border-radius: 8px;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n height: 44px;\n padding: 10px 18px;\n}\n\n.sdk-btn-primary:hover:not(:disabled) {\n background: var(--color-primary-hover);\n}\n\n.sdk-btn-primary:active:not(:disabled) {\n background: var(--color-primary-active);\n}\n\n.sdk-btn-secondary {\n background: transparent;\n color: var(--color-neutral-600);\n border: 1px solid var(--color-border);\n height: 44px;\n padding: 10px 18px;\n}\n\n.sdk-btn-secondary:hover:not(:disabled) {\n background: var(--color-neutral-50);\n border-color: var(--color-neutral-400);\n color: var(--color-neutral-700);\n}\n\n.sdk-btn-ghost {\n background: transparent;\n color: var(--color-neutral-600);\n}\n\n.sdk-btn-ghost:hover:not(:disabled) {\n background: var(--color-neutral-100);\n color: var(--color-neutral-700);\n}\n\n.sdk-btn-sm {\n height: 36px;\n padding: 8px 14px;\n font-size: var(--font-size-base);\n}\n\n.sdk-btn-lg {\n height: 48px;\n padding: 12px 20px;\n font-size: var(--font-size-lg);\n}\n\n.sdk-btn-pill {\n border-radius: var(--radius-full);\n}\n\n.sdk-btn-block {\n width: 100%;\n}\n\n.sdk-btn-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: none;\n border-radius: 8px;\n cursor: pointer;\n color: var(--color-text-secondary);\n transition: all var(--transition-base);\n padding: 0;\n}\n\n.sdk-btn-icon:hover {\n background: var(--color-neutral-100);\n color: var(--color-text-primary);\n}\n\n.sdk-input {\n width: 100%;\n height: 44px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 10px 14px;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-normal);\n line-height: var(--line-height-relaxed);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: all var(--transition-base);\n background: var(--color-white);\n}\n\n.sdk-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.sdk-input:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.sdk-input:disabled {\n background: var(--color-neutral-50);\n cursor: not-allowed;\n}\n\n.sdk-textarea {\n width: 100%;\n min-height: 120px;\n resize: vertical;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 10px 14px;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-normal);\n line-height: var(--line-height-relaxed);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: all var(--transition-base);\n background: var(--color-white);\n}\n\n.sdk-textarea::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.sdk-textarea:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.sdk-select {\n width: 100%;\n height: 44px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 10px 14px;\n font-size: var(--font-size-md);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: all var(--transition-base);\n background: var(--color-white);\n cursor: pointer;\n}\n\n.sdk-select:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.sdk-label {\n display: block;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-tight);\n color: var(--color-neutral-700);\n margin-bottom: var(--spacing-2);\n}\n\n.sdk-form-group {\n display: flex;\n flex-direction: column;\n margin-bottom: var(--spacing-5);\n}\n\n.sdk-form-group:last-child {\n margin-bottom: 0;\n}\n\n.sdk-card {\n background: var(--color-white);\n border-radius: 10px;\n box-shadow: var(--shadow-base);\n overflow: hidden;\n}\n\n.sdk-card-header {\n padding: var(--spacing-6);\n border-bottom: 1px solid var(--color-border);\n}\n\n.sdk-card-body {\n padding: var(--spacing-6);\n}\n\n.sdk-card-footer {\n padding: var(--spacing-6);\n border-top: 1px solid var(--color-border);\n}\n\n.sdk-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity var(--transition-slow);\n pointer-events: none;\n z-index: var(--z-modal-backdrop);\n}\n\n.sdk-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.sdk-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n pointer-events: none;\n}\n\n.sdk-modal.open {\n pointer-events: auto;\n}\n\n.sdk-modal-container {\n position: relative;\n width: 100%;\n max-width: 580px;\n max-height: 90vh;\n background: var(--color-white);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: var(--shadow-2xl);\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n transition: all var(--transition-slow);\n}\n\n.sdk-modal.open .sdk-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.sdk-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-6);\n border-bottom: 1px solid var(--color-border);\n}\n\n.sdk-modal-title {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.sdk-modal-body {\n overflow-y: auto;\n max-height: calc(90vh - 120px);\n}\n\n.sdk-close-btn {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n color: var(--color-neutral-500);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 8px;\n transition: all var(--transition-base);\n line-height: 1;\n flex-shrink: 0;\n}\n\n.sdk-close-btn:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.sdk-close-btn svg {\n width: 18px;\n height: 18px;\n}\n\n.sdk-avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-primary);\n color: var(--color-white);\n font-weight: var(--font-weight-semibold);\n border-radius: var(--radius-full);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.sdk-avatar-sm {\n width: 24px;\n height: 24px;\n font-size: var(--font-size-xs);\n}\n\n.sdk-avatar-md {\n width: 32px;\n height: 32px;\n font-size: var(--font-size-sm);\n}\n\n.sdk-avatar-lg {\n width: 40px;\n height: 40px;\n font-size: var(--font-size-base);\n}\n\n.sdk-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.sdk-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 2px var(--spacing-2);\n border-radius: var(--radius-full);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n line-height: 1;\n}\n\n.sdk-badge-primary {\n background: var(--color-primary-light);\n color: var(--color-primary);\n}\n\n.sdk-badge-success {\n background: var(--color-success-light);\n color: var(--color-success-dark);\n}\n\n.sdk-badge-error {\n background: var(--color-error-light);\n color: var(--color-error-dark);\n}\n\n.sdk-badge-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n position: absolute;\n top: -2px;\n right: -2px;\n}\n\n.sdk-badge-dot.primary {\n background: var(--color-primary);\n}\n\n.sdk-badge-dot.error {\n background: var(--color-error);\n border: 2px solid var(--color-white);\n}\n\n.sdk-notification {\n position: fixed;\n top: var(--spacing-6);\n right: var(--spacing-6);\n z-index: var(--z-notification);\n background: var(--color-white);\n border-radius: 10px;\n box-shadow: var(--shadow-lg);\n min-width: 320px;\n animation: slideInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.sdk-notification-content {\n display: flex;\n align-items: center;\n padding: var(--spacing-4) var(--spacing-5);\n gap: var(--spacing-3);\n}\n\n.sdk-notification-success {\n border: 1px solid var(--color-success-light);\n}\n\n.sdk-notification-success .sdk-notification-icon {\n width: 20px;\n height: 20px;\n border-radius: var(--radius-full);\n background: var(--color-success);\n color: var(--color-white);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n flex-shrink: 0;\n}\n\n.sdk-notification-text {\n color: var(--color-success-dark);\n font-weight: var(--font-weight-medium);\n font-size: var(--font-size-base);\n flex: 1;\n}\n\n.sdk-notification .sdk-close-btn {\n flex-shrink: 0;\n}\n\n.sdk-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid var(--color-neutral-200);\n border-top-color: var(--color-primary);\n border-radius: var(--radius-full);\n animation: spin 0.8s linear infinite;\n}\n\n.sdk-spinner-sm {\n width: 20px;\n height: 20px;\n border-width: 2px;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes slideInRight {\n from {\n transform: translateX(400px);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (max-width: 768px) {\n .sdk-modal {\n padding: var(--spacing-4);\n }\n \n .sdk-modal-container {\n max-width: 100%;\n border-radius: 10px;\n }\n \n .sdk-notification {\n top: var(--spacing-4);\n right: var(--spacing-4);\n left: var(--spacing-4);\n min-width: auto;\n }\n}\n\n.feedback-widget-button {\n position: fixed;\n z-index: var(--z-notification);\n}\n\n.feedback-widget-button.position-bottom-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.feedback-widget-button.position-bottom-left {\n bottom: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.feedback-widget-button.position-top-right {\n top: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.feedback-widget-button.position-top-left {\n top: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.feedback-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n height: 48px;\n border-radius: var(--radius-full);\n border: none;\n padding: var(--spacing-3) var(--spacing-5);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-slow);\n color: var(--color-white);\n background: var(--color-primary);\n box-shadow: var(--shadow-md);\n width: fit-content;\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n}\n\n.feedback-trigger-btn:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.feedback-trigger-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.feedback-trigger-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.feedback-icon {\n flex-shrink: 0;\n}\n\n.feedback-minimize-icon,\n.feedback-expand-icon {\n position: absolute;\n top: -6px;\n right: -6px;\n width: 24px;\n height: 24px;\n padding: var(--spacing-1);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-white);\n border-radius: var(--radius-full);\n opacity: 0;\n transition: opacity var(--transition-base);\n box-shadow: var(--shadow-sm);\n cursor: pointer;\n pointer-events: none;\n}\n\n.feedback-minimize-icon svg,\n.feedback-expand-icon svg {\n width: 16px;\n height: 16px;\n display: block;\n fill: var(--color-primary);\n}\n\n.feedback-widget-button:not(.minimized) .feedback-trigger-btn:hover .feedback-minimize-icon {\n opacity: 1;\n pointer-events: auto;\n}\n\n.feedback-widget-button.minimized .feedback-trigger-btn {\n padding: var(--spacing-3);\n width: 48px;\n height: 48px;\n justify-content: center;\n}\n\n.feedback-widget-button.minimized .feedback-text {\n display: none;\n}\n\n.feedback-widget-button.minimized .feedback-minimize-icon {\n display: none;\n}\n\n.feedback-widget-button.minimized .feedback-trigger-btn:hover .feedback-expand-icon {\n opacity: 1;\n pointer-events: auto;\n}\n\n.feedback-panel {\n position: fixed;\n bottom: 80px;\n right: var(--spacing-6);\n width: 420px;\n max-height: 500px;\n z-index: var(--z-popover);\n transform: translateX(calc(100% + 24px));\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n font-family: inherit;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n}\n\n.feedback-panel.open {\n transform: translateX(0);\n}\n\n.feedback-panel-content {\n background: var(--color-white);\n height: 100%;\n display: flex;\n flex-direction: column;\n border-radius: 10px;\n}\n\n.feedback-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-6);\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n\n.feedback-panel-header h3 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.feedback-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: var(--spacing-6);\n}\n\n.feedback-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.feedback-form-actions {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n margin-top: auto;\n padding-top: var(--spacing-6);\n}\n\n.feedback-error {\n color: var(--color-error-dark);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n margin-top: var(--spacing-2);\n padding: var(--spacing-3);\n background: var(--color-error-light);\n border: 1px solid var(--color-error-border);\n border-radius: var(--radius-md);\n display: none;\n}\n\n.feedback-error.show {\n display: block;\n}\n\n@media (max-width: 768px) {\n .feedback-widget-button {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n \n .feedback-widget-button.position-bottom-left {\n left: var(--spacing-4);\n }\n \n .feedback-minimize-icon,\n .feedback-expand-icon {\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n }\n \n .feedback-minimize-icon svg,\n .feedback-expand-icon svg {\n width: 14px;\n height: 14px;\n }\n\n .feedback-panel {\n width: min(420px, calc(100vw - (var(--spacing-4) * 2)));\n max-height: min(500px, calc(100vh - 88px));\n top: auto;\n bottom: 72px;\n right: var(--spacing-4);\n left: auto;\n transform: translateX(calc(100% + 24px));\n border-radius: var(--radius-2xl);\n }\n \n .feedback-panel.open {\n transform: translateX(0);\n }\n \n .feedback-panel-header {\n padding: var(--spacing-4) var(--spacing-6);\n }\n \n .feedback-panel-body {\n padding: var(--spacing-6);\n }\n \n .feedback-form-group textarea {\n min-height: 120px;\n }\n}\n\n.changelog-widget {\n position: fixed;\n z-index: var(--z-modal);\n}\n\n.changelog-widget.position-bottom-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.changelog-widget.position-bottom-left {\n bottom: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.changelog-widget.position-top-right {\n top: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.changelog-widget.position-top-left {\n top: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.changelog-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n height: 48px;\n border-radius: var(--radius-full);\n border: none;\n padding: var(--spacing-3) var(--spacing-5);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-slow);\n color: var(--color-white);\n background: var(--color-primary);\n box-shadow: var(--shadow-md);\n width: fit-content;\n}\n\n.changelog-trigger-btn:hover {\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.changelog-trigger-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.changelog-icon {\n flex-shrink: 0;\n}\n\n.changelog-confetti-emoji {\n font-size: var(--font-size-base);\n margin-left: 2px;\n}\n\n.changelog-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 12px;\n height: 12px;\n background: var(--color-error);\n border-radius: var(--radius-full);\n border: 2px solid var(--color-white);\n}\n\n/* ========================================\n CONFETTI\n ======================================== */\n\n.changelog-confetti-container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: var(--z-notification);\n overflow: hidden;\n}\n\n.changelog-confetti {\n position: absolute;\n top: -20px;\n opacity: 0;\n animation: confettiFall 2s ease-out forwards;\n}\n\n@keyframes confettiFall {\n 0% {\n opacity: 1;\n transform: translateY(0) rotate(0deg) scale(1);\n }\n 10% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n transform: translateY(100vh) rotate(720deg) scale(0.5);\n }\n}\n\n/* ========================================\n POPUP MODAL\n ======================================== */\n\n.changelog-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n pointer-events: none;\n font-family: inherit;\n}\n\n.changelog-modal.open {\n pointer-events: auto;\n}\n\n.changelog-modal-container {\n position: relative;\n width: 100%;\n max-width: 580px;\n max-height: 90vh;\n background: var(--color-primary-light);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n transition: all var(--transition-slow);\n}\n\n.changelog-modal.open .changelog-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.changelog-modal-close {\n position: absolute;\n top: var(--spacing-4);\n right: var(--spacing-4);\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-neutral-500);\n padding: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n transition: all var(--transition-base);\n line-height: 1;\n z-index: 10;\n}\n\n.changelog-modal-close:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.changelog-modal-close svg {\n width: 18px;\n height: 18px;\n}\n\n.changelog-modal-content {\n overflow-y: auto;\n max-height: 90vh;\n}\n\n.changelog-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px var(--spacing-5);\n}\n\n.changelog-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px var(--spacing-5);\n text-align: center;\n color: var(--color-text-tertiary);\n}\n\n.changelog-empty svg {\n margin-bottom: var(--spacing-4);\n stroke: var(--color-neutral-300);\n}\n\n.changelog-empty p {\n margin: 0;\n font-size: var(--font-size-md);\n}\n\n/* ========================================\n POPUP ITEM\n ======================================== */\n\n.changelog-popup-item {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-popup-image {\n width: 100%;\n padding: var(--spacing-6) var(--spacing-6) 0;\n}\n\n.changelog-popup-image img {\n width: 100%;\n height: auto;\n display: block;\n object-fit: cover;\n border-radius: 8px;\n border: 2px solid var(--color-primary);\n box-shadow: 0 4px 20px rgba(21, 94, 239, 0.2);\n}\n\n.changelog-popup-body {\n padding: var(--spacing-6) var(--spacing-8) var(--spacing-8);\n text-align: center;\n}\n\n.changelog-popup-title {\n margin: 0 0 var(--spacing-3);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n color: var(--color-neutral-900);\n}\n\n.changelog-popup-description {\n margin: 0 0 var(--spacing-6);\n font-size: var(--font-size-md);\n line-height: var(--line-height-loose);\n color: var(--color-neutral-600);\n}\n\n.changelog-popup-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-3) var(--spacing-8);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n color: var(--color-white);\n background: var(--color-primary);\n border: 1px solid var(--color-primary);\n border-radius: 8px;\n cursor: pointer;\n transition: all var(--transition-base);\n font-family: inherit;\n}\n\n.changelog-popup-btn:hover {\n background: var(--color-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(21, 94, 239, 0.3);\n}\n\n.changelog-popup-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n/* ========================================\n POPUP FOOTER / DOTS\n ======================================== */\n\n.changelog-popup-footer {\n padding: 0 var(--spacing-8) var(--spacing-6);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--spacing-4);\n}\n\n.changelog-popup-dots {\n display: flex;\n gap: var(--spacing-2);\n}\n\n.changelog-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--color-primary-border);\n cursor: pointer;\n transition: all var(--transition-base);\n}\n\n.changelog-dot:hover {\n background: rgba(21, 94, 239, 0.5);\n}\n\n.changelog-dot.active {\n background: var(--color-primary);\n transform: scale(1.2);\n}\n\n.changelog-view-all-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n color: var(--color-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: 8px;\n transition: all var(--transition-base);\n font-family: inherit;\n}\n\n.changelog-view-all-btn:hover {\n background: var(--color-primary-light);\n}\n\n.changelog-view-all-btn svg {\n transition: transform var(--transition-base);\n}\n\n.changelog-view-all-btn:hover svg {\n transform: translateX(3px);\n}\n\n/* ========================================\n LIST MODAL\n ======================================== */\n\n.changelog-list-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n pointer-events: none;\n font-family: inherit;\n}\n\n.changelog-list-modal.open {\n pointer-events: auto;\n}\n\n.changelog-list-modal-container {\n position: relative;\n width: 100%;\n max-width: 460px;\n max-height: 85vh;\n background: var(--color-white);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n transition: all var(--transition-slow);\n display: flex;\n flex-direction: column;\n}\n\n.changelog-list-modal.open .changelog-list-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.changelog-list-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n background: var(--color-white);\n}\n\n.changelog-list-modal-header h2 {\n margin: 0;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.changelog-list-modal-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-neutral-500);\n padding: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n transition: all var(--transition-base);\n}\n\n.changelog-list-modal-close svg {\n width: 18px;\n height: 18px;\n}\n\n.changelog-list-modal-close:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.changelog-list-modal-body {\n flex: 1;\n overflow-y: auto;\n}\n\n/* ========================================\n LIST ITEMS\n ======================================== */\n\n.changelog-list {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-list-item {\n display: flex;\n align-items: center;\n padding: var(--spacing-3) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n cursor: pointer;\n transition: background var(--transition-base);\n}\n\n.changelog-list-item:hover {\n background: var(--color-neutral-50);\n}\n\n.changelog-list-item:last-child {\n border-bottom: none;\n}\n\n.changelog-list-item-image {\n width: 100%;\n margin-bottom: var(--spacing-2);\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid var(--color-border);\n}\n\n.changelog-list-item-image img {\n width: 100%;\n height: 100px;\n display: block;\n object-fit: cover;\n}\n\n.changelog-list-item-main {\n flex: 1;\n min-width: 0;\n}\n\n.changelog-list-item-content {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.changelog-list-item-date {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n font-weight: var(--font-weight-medium);\n}\n\n.changelog-list-item-labels {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-1);\n margin-bottom: 1px;\n}\n\n.changelog-list-item-title {\n margin: 0;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n color: var(--color-text-primary);\n}\n\n.changelog-list-item-description {\n margin: 0;\n font-size: var(--font-size-sm);\n line-height: var(--line-height-normal);\n color: var(--color-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.changelog-list-item-arrow {\n flex-shrink: 0;\n margin-left: var(--spacing-3);\n color: var(--color-text-tertiary);\n transition: all var(--transition-base);\n}\n\n.changelog-list-item:hover .changelog-list-item-arrow {\n color: var(--color-primary);\n transform: translateX(3px);\n}\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n\n@media (max-width: 768px) {\n .changelog-widget {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n\n .changelog-widget.position-bottom-left {\n left: var(--spacing-4);\n }\n\n .changelog-modal {\n padding: var(--spacing-4);\n }\n\n .changelog-modal-container {\n max-width: 100%;\n border-radius: 10px;\n }\n\n .changelog-popup-image {\n padding: var(--spacing-5) var(--spacing-5) 0;\n }\n\n .changelog-popup-body {\n padding: var(--spacing-5) var(--spacing-6) var(--spacing-6);\n }\n\n .changelog-popup-title {\n font-size: var(--font-size-lg);\n }\n\n .changelog-popup-description {\n font-size: var(--font-size-base);\n }\n\n .changelog-popup-btn {\n padding: var(--spacing-3) var(--spacing-7);\n font-size: var(--font-size-base);\n width: 100%;\n }\n\n .changelog-popup-footer {\n padding: 0 var(--spacing-6) var(--spacing-5);\n }\n\n .changelog-list-modal {\n padding: var(--spacing-4);\n }\n\n .changelog-list-modal-container {\n max-width: 100%;\n max-height: 90vh;\n border-radius: 10px;\n }\n\n .changelog-list-item {\n padding: var(--spacing-3) var(--spacing-4);\n }\n\n .changelog-list-item-image img {\n height: 80px;\n }\n}\n\n.feedback-survey-container {\n display: none;\n}\n\n.feedback-survey-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: var(--z-modal-backdrop);\n animation: fadeIn var(--transition-slow);\n}\n\n/* ========================================\n SURVEY CARD\n ======================================== */\n\n.feedback-survey {\n position: fixed;\n z-index: var(--z-modal);\n background: var(--color-neutral-50);\n border: 1px solid var(--color-neutral-300);\n border-radius: 10px;\n box-shadow: var(--shadow-lg);\n padding: var(--spacing-8);\n min-width: 320px;\n max-width: 400px;\n font-family: inherit;\n}\n\n.feedback-survey-bottom-right {\n bottom: var(--spacing-6);\n right: var(--spacing-6);\n}\n\n.feedback-survey-bottom-left {\n bottom: var(--spacing-6);\n left: var(--spacing-6);\n}\n\n.feedback-survey-center {\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: min(680px, calc(100vw - 24px));\n max-width: 680px;\n}\n\n.feedback-survey-bottom {\n bottom: 0;\n left: 0;\n right: 0;\n border-radius: 10px 10px 0 0;\n max-width: none;\n}\n\n.feedback-survey-close {\n position: absolute;\n top: var(--spacing-4);\n right: var(--spacing-4);\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-neutral-500);\n padding: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-close svg {\n width: 18px;\n height: 18px;\n}\n\n.feedback-survey-close:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.feedback-survey-close:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-title {\n margin: 0 0 var(--spacing-2) 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n padding-right: var(--spacing-12);\n color: var(--color-text-primary);\n}\n\n.feedback-survey-description {\n color: var(--color-text-secondary);\n margin: 0 0 var(--spacing-4) 0;\n font-size: var(--font-size-md);\n line-height: var(--line-height-relaxed);\n}\n\n.feedback-survey-description-primary .feedback-survey-description {\n color: var(--color-text-primary);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n padding-right: var(--spacing-12);\n}\n\n.feedback-survey-content {\n margin-bottom: var(--spacing-3);\n}\n\n/* ========================================\n NPS\n ======================================== */\n\n.feedback-survey-nps {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-1);\n}\n\n.feedback-survey-nps-btn {\n width: 28px;\n height: 36px;\n border: 1px solid var(--color-border);\n border-radius: 8px;\n background: var(--color-surface);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-primary);\n transition: all var(--transition-fast);\n font-family: inherit;\n}\n\n.feedback-survey-nps-btn:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-border);\n}\n\n.feedback-survey-nps-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n/* ========================================\n CSAT\n ======================================== */\n\n.feedback-survey-csat {\n display: flex;\n justify-content: center;\n gap: var(--spacing-4);\n}\n\n.feedback-survey-csat-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n transition: transform var(--transition-fast);\n padding: var(--spacing-2);\n}\n\n.feedback-survey-csat-btn:hover {\n transform: scale(1.1);\n}\n\n.feedback-survey-csat-btn.selected {\n transform: scale(1.2);\n}\n\n/* ========================================\n CES\n ======================================== */\n\n.feedback-survey-ces {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-ces-btn {\n flex: 1;\n padding: var(--spacing-3) var(--spacing-2);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n cursor: pointer;\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-primary);\n transition: all var(--transition-fast);\n font-family: inherit;\n text-align: center;\n}\n\n.feedback-survey-ces-btn:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-border);\n}\n\n.feedback-survey-ces-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n.feedback-survey-rating-scale {\n display: flex;\n gap: 0;\n border: 1px solid var(--color-neutral-300);\n border-radius: 8px;\n overflow: hidden;\n background: var(--color-white);\n}\n\n.feedback-survey-rating-scale-btn {\n flex: 1;\n width: auto;\n height: auto;\n min-height: 64px;\n padding: 0;\n border: 0;\n border-right: 1px solid var(--color-neutral-300);\n border-radius: 0;\n background: var(--color-white);\n cursor: pointer;\n font-size: clamp(16px, 3vw, 22px);\n font-weight: var(--font-weight-medium);\n color: var(--color-black);\n transition:\n background var(--transition-fast),\n color var(--transition-fast),\n box-shadow var(--transition-fast);\n position: relative;\n}\n\n.feedback-survey-rating-scale-btn:last-child {\n border-right: none;\n}\n\n.feedback-survey-rating-scale-btn:hover {\n background: var(--color-neutral-100);\n}\n\n.feedback-survey-rating-scale-btn:focus-visible {\n outline: none;\n z-index: 1;\n box-shadow: inset 0 0 0 3px var(--color-primary);\n}\n\n.feedback-survey-rating-scale-btn.selected {\n background: var(--color-primary-light);\n color: var(--color-primary-active);\n box-shadow: inset 0 0 0 2px var(--color-primary);\n}\n\n.feedback-survey-labels {\n display: flex;\n justify-content: space-between;\n margin-top: var(--spacing-2);\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n}\n\n.feedback-survey-rating-scale + .feedback-survey-labels {\n margin-top: var(--spacing-3);\n padding: 0 var(--spacing-1);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-normal);\n color: var(--color-text-tertiary);\n}\n\n/* ========================================\n FREQUENCY\n ======================================== */\n\n.feedback-survey-frequency {\n display: flex;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-freq-btn {\n flex: 1;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-primary);\n transition: all var(--transition-fast);\n font-family: inherit;\n}\n\n.feedback-survey-freq-btn:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-border);\n}\n\n.feedback-survey-freq-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n/* ========================================\n FORM INPUTS\n ======================================== */\n\n.feedback-survey-feedback {\n margin-top: var(--spacing-4);\n}\n\n.feedback-survey-textarea {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n resize: none;\n height: 80px;\n background: var(--color-white);\n color: var(--color-text-primary);\n font-family: inherit;\n box-sizing: border-box;\n transition: border-color var(--transition-base);\n outline: none;\n}\n\n.feedback-survey-textarea::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.feedback-survey-textarea:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-select {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n background: var(--color-white);\n color: var(--color-text-primary);\n font-family: inherit;\n cursor: pointer;\n transition: border-color var(--transition-base);\n outline: none;\n}\n\n.feedback-survey-select:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-input {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n background: var(--color-white);\n color: var(--color-text-primary);\n font-family: inherit;\n box-sizing: border-box;\n transition: border-color var(--transition-base);\n outline: none;\n}\n\n.feedback-survey-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.feedback-survey-input:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-progress {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n margin-bottom: var(--spacing-3);\n}\n\n.feedback-survey-actions {\n display: flex;\n gap: var(--spacing-2);\n margin-top: var(--spacing-3);\n}\n\n.feedback-survey-back {\n padding: var(--spacing-3) var(--spacing-4);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n color: var(--color-text-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n}\n\n.feedback-survey-page-choice-btn {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n color: var(--color-text-primary);\n text-align: left;\n font-size: var(--font-size-base);\n cursor: pointer;\n margin-bottom: var(--spacing-2);\n font-family: inherit;\n}\n\n.feedback-survey-page-choice-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n.feedback-survey-page-textarea {\n width: 100%;\n min-height: 96px;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n font-family: inherit;\n box-sizing: border-box;\n outline: none;\n}\n\n.feedback-survey-page-textarea:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n/* ========================================\n SUBMIT & FEEDBACK\n ======================================== */\n\n.feedback-survey-submit {\n width: 100%;\n padding: var(--spacing-3);\n background: var(--color-primary);\n color: var(--color-white);\n border: 1px solid var(--color-primary);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-submit:hover {\n background: var(--color-primary-hover);\n border-color: var(--color-primary-hover);\n}\n\n.feedback-survey-error {\n color: var(--color-error);\n font-size: var(--font-size-sm);\n margin-top: var(--spacing-2);\n text-align: center;\n}\n\n.feedback-survey-success {\n position: fixed;\n top: var(--spacing-6);\n right: var(--spacing-6);\n background: var(--color-success);\n color: var(--color-white);\n padding: var(--spacing-3) var(--spacing-5);\n border-radius: var(--radius-xl);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n z-index: var(--z-notification);\n box-shadow: var(--shadow-lg);\n font-family: inherit;\n}\n\n.feedback-survey-success > div {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n\n@media (max-width: 768px) {\n .feedback-survey {\n min-width: 300px;\n padding: var(--spacing-6);\n }\n\n .feedback-survey-bottom {\n padding: var(--spacing-5);\n }\n\n .feedback-survey-nps-btn {\n width: 24px;\n height: 32px;\n font-size: var(--font-size-xs);\n }\n\n .feedback-survey-csat-btn {\n font-size: 24px;\n }\n\n .feedback-survey-title {\n font-size: var(--font-size-lg);\n }\n\n .feedback-survey-description-primary .feedback-survey-description {\n font-size: var(--font-size-md);\n }\n\n .feedback-survey-rating-scale-btn {\n min-height: 52px;\n font-size: clamp(14px, 6vw, 18px);\n }\n\n .feedback-survey-rating-scale + .feedback-survey-labels {\n font-size: var(--font-size-xs);\n }\n}\n\n\n.messenger-launcher {\n position: fixed;\n z-index: var(--z-modal);\n}\n\n.messenger-launcher-bottom-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.messenger-launcher-bottom-left {\n bottom: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.messenger-launcher-btn {\n width: 60px;\n height: 60px;\n border-radius: var(--radius-full);\n border: none;\n background: var(--color-primary);\n color: var(--color-white);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: var(--shadow-lg);\n transition: all var(--transition-slow);\n position: relative;\n}\n\n.messenger-launcher-btn:hover {\n transform: translateY(-2px);\n box-shadow: var(--shadow-xl);\n}\n\n.messenger-launcher-btn:active {\n transform: scale(0.95);\n}\n\n.messenger-launcher-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n background: var(--color-error);\n color: var(--color-white);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n border-radius: var(--radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n border: 2px solid var(--color-white);\n}\n\n.messenger-panel {\n position: fixed;\n z-index: var(--z-popover);\n width: 440px;\n height: 720px;\n max-height: calc(100vh - 100px);\n display: none;\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n transition: all var(--transition-slow);\n}\n\n.messenger-panel.open {\n display: block;\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.messenger-panel-bottom-right {\n bottom: 90px;\n right: var(--spacing-5);\n}\n\n.messenger-panel-bottom-left {\n bottom: 90px;\n left: var(--spacing-5);\n}\n\n.messenger-panel-content {\n background: var(--color-white);\n height: 100%;\n border-radius: var(--radius-2xl);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n border: 1px solid var(--color-border);\n}\n\n.messenger-panel-views {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.messenger-view {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.messenger-avatar-stack {\n display: flex;\n align-items: center;\n}\n\n.messenger-avatar-stack .sdk-avatar {\n margin-left: -8px;\n}\n\n.messenger-avatar-stack .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n.messenger-avatar-stack-tiny .sdk-avatar {\n margin-left: -6px;\n}\n\n.messenger-avatar-stack-tiny .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n@media (max-width: 480px) {\n .messenger-panel {\n width: 100%;\n height: 100%;\n max-height: 100%;\n bottom: 0;\n right: 0;\n left: 0;\n border-radius: 0;\n }\n\n .messenger-panel-content {\n border-radius: 0;\n }\n\n .messenger-launcher {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n\n .messenger-launcher-bottom-left {\n left: var(--spacing-4);\n }\n}\n\n\n/* ========================================\n HOME VIEW\n ======================================== */\n\n.messenger-home-view {\n background: linear-gradient(180deg, #f0f4ff 0%, #FFFFFF 50%);\n position: relative;\n overflow: hidden;\n}\n\n.messenger-home-view::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 600px;\n height: 600px;\n background: radial-gradient(circle, rgba(21, 94, 239, 0.08) 0%, transparent 70%);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.messenger-home-view::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 500px;\n height: 500px;\n background: radial-gradient(circle, rgba(139, 92, 246, 0.05) 0%, transparent 70%);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.messenger-home-scroll {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.messenger-home-header {\n padding: var(--spacing-6) var(--spacing-5);\n position: relative;\n z-index: 2;\n flex-shrink: 0;\n}\n\n.messenger-home-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-8);\n position: relative;\n z-index: 2;\n}\n\n.messenger-home-logo {\n width: 48px;\n height: 48px;\n border-radius: var(--radius-lg);\n overflow: visible;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.messenger-home-logo img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n border-radius: var(--radius-lg);\n}\n\n.messenger-home-avatars {\n flex: 1;\n display: flex;\n justify-content: flex-end;\n margin-right: var(--spacing-4);\n margin-left: var(--spacing-4);\n}\n\n.messenger-home-welcome {\n display: flex;\n flex-direction: column;\n text-align: left;\n position: relative;\n z-index: 2;\n}\n\n.messenger-home-greeting {\n font-size: 28px;\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-tight);\n}\n\n.messenger-home-question {\n font-size: 28px;\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-tight);\n}\n\n.messenger-home-body {\n flex: 1;\n padding: 0 var(--spacing-5) var(--spacing-5);\n position: relative;\n z-index: 2;\n}\n\n.messenger-home-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-5);\n background: var(--color-white);\n border: none;\n border-radius: 8px;\n color: var(--color-text-primary);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-base);\n margin-bottom: var(--spacing-5);\n font-family: inherit;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-home-message-btn:hover {\n background: var(--color-neutral-50);\n transform: translateX(4px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-home-continue-btn {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-3);\n}\n\n.messenger-home-continue-btn > svg {\n flex-shrink: 0;\n}\n\n.messenger-home-continue-info {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-1);\n text-align: left;\n flex: 1;\n}\n\n.messenger-home-continue-label {\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n}\n\n.messenger-home-continue-preview {\n font-size: var(--font-size-sm);\n opacity: 0.6;\n font-weight: var(--font-weight-normal);\n}\n\n.messenger-home-featured {\n background: var(--color-neutral-50);\n border-radius: var(--radius-xl);\n overflow: hidden;\n margin-bottom: var(--spacing-5);\n border: 1px solid var(--color-border);\n}\n\n.messenger-home-featured-image {\n width: 100%;\n height: 120px;\n object-fit: cover;\n}\n\n.messenger-home-featured-content {\n padding: var(--spacing-4);\n}\n\n.messenger-home-featured-content h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-home-featured-content p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n}\n\n.messenger-home-featured-btn {\n margin-top: var(--spacing-3);\n}\n\n.messenger-home-changelog-section {\n margin-top: var(--spacing-5);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n}\n\n.messenger-home-changelog-card {\n background: var(--color-white);\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: all var(--transition-base);\n border: none;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-home-changelog-card:hover {\n background: var(--color-neutral-50);\n transform: translateY(-2px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-home-changelog-cover {\n width: 100%;\n height: 140px;\n overflow: hidden;\n position: relative;\n}\n\n.messenger-home-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.messenger-home-changelog-cover-text {\n position: absolute;\n bottom: var(--spacing-3);\n left: var(--spacing-3);\n right: var(--spacing-3);\n color: var(--color-white);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n line-height: var(--line-height-snug);\n}\n\n.messenger-home-changelog-card-content {\n padding: var(--spacing-4);\n border-top: 1px solid var(--color-border);\n}\n\n.messenger-home-changelog-card-title {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-home-changelog-card-desc {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.messenger-home-availability,\n.messenger-chat-availability {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n margin-top: var(--spacing-2);\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n\n.messenger-availability-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.messenger-availability-online {\n background: var(--color-success);\n box-shadow: 0 0 0 2px var(--color-success-light);\n}\n\n.messenger-availability-away {\n background: var(--color-neutral-400);\n}\n\n.messenger-availability-text {\n opacity: 0.9;\n}\n\n/* ========================================\n CONVERSATIONS VIEW\n ======================================== */\n\n.messenger-conversations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n}\n\n.messenger-conversations-header h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-conversations-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-conversations-list {\n display: flex;\n flex-direction: column;\n}\n\n.messenger-conversation-item + .messenger-conversation-item {\n border-top: 1px solid var(--color-border);\n}\n\n.messenger-conversation-item {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-3);\n padding: 10px var(--spacing-4);\n cursor: pointer;\n transition: background var(--transition-base);\n}\n\n.messenger-conversation-item:hover {\n background: var(--color-neutral-50);\n}\n\n.messenger-conversation-avatars {\n flex-shrink: 0;\n}\n\n.messenger-conversation-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-conversation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-1);\n gap: var(--spacing-3);\n}\n\n.messenger-conversation-title {\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-conversation-time {\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n flex-shrink: 0;\n}\n\n.messenger-conversation-preview {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.messenger-conversation-message {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n color: var(--color-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: var(--line-height-normal);\n}\n\n.messenger-conversation-item.unread .messenger-conversation-message {\n color: var(--color-text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n.messenger-unread-dot {\n width: 8px;\n height: 8px;\n background: var(--color-primary);\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.messenger-conversations-footer {\n padding: var(--spacing-4);\n border-top: none;\n}\n\n.messenger-new-message-btn {\n max-width: 220px;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n background: var(--color-white);\n border: none;\n border-radius: var(--radius-xl);\n color: var(--color-text-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-base);\n font-family: inherit;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-new-message-btn:hover {\n background: var(--color-neutral-50);\n transform: translateX(4px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-new-message-btn span {\n flex: 1;\n text-align: left;\n}\n\n/* ========================================\n HELP VIEW\n ======================================== */\n\n.messenger-help-header {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n padding: var(--spacing-4) var(--spacing-5) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-help-header-top {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.messenger-help-header-top h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-help-header-top .sdk-close-btn {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.messenger-help-search-input {\n width: 100%;\n background: var(--color-neutral-50);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: var(--spacing-2) var(--spacing-3);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: border-color var(--transition-base);\n}\n\n.messenger-help-search-input:focus {\n border-color: var(--color-primary);\n background: var(--color-white);\n}\n\n.messenger-help-search-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.messenger-help-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-help-collections-header {\n display: none;\n}\n\n.messenger-help-collections {\n padding: 0;\n}\n\n.messenger-help-collection {\n display: flex;\n align-items: center;\n padding: var(--spacing-4) var(--spacing-5);\n cursor: pointer;\n transition: background var(--transition-base);\n border-bottom: 1px solid var(--color-border);\n}\n\n.messenger-help-collection:hover {\n background: var(--color-neutral-50);\n}\n\n.messenger-help-collection-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-help-collection-title {\n margin: 0 0 var(--spacing-1);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-help-collection-desc {\n margin: 0 0 var(--spacing-1);\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n line-height: var(--line-height-normal);\n}\n\n.messenger-help-collection-count {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n\n.messenger-help-collection-arrow {\n color: var(--color-text-tertiary);\n flex-shrink: 0;\n margin-left: var(--spacing-3);\n}\n\n.messenger-help-footer {\n padding: var(--spacing-4) var(--spacing-5);\n border-top: 1px solid var(--color-border);\n text-align: center;\n}\n\n.messenger-help-footer-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-2);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--transition-base);\n}\n\n.messenger-help-footer-link:hover {\n color: var(--color-primary);\n}\n\n/* ========================================\n CHANGELOG VIEW\n ======================================== */\n\n.messenger-changelog-header {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-3) var(--spacing-5);\n}\n\n.messenger-changelog-header h2 {\n margin: 0;\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-changelog-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-changelog-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n padding: var(--spacing-4);\n}\n\n.messenger-changelog-card {\n background: var(--color-white);\n border-radius: var(--radius-xl);\n overflow: hidden;\n cursor: pointer;\n transition: all var(--transition-base);\n border: none;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-changelog-card:hover {\n transform: translateY(-2px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 4px 8px -2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-changelog-cover {\n width: 100%;\n height: 160px;\n overflow: hidden;\n}\n\n.messenger-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.messenger-changelog-content {\n padding: var(--spacing-4);\n}\n\n.messenger-changelog-tags {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-2);\n margin-bottom: var(--spacing-2);\n}\n\n.messenger-changelog-title {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-changelog-description {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.messenger-changelog-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: var(--spacing-3);\n}\n\n.messenger-changelog-date {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n\n.messenger-changelog-arrow {\n color: var(--color-text-tertiary);\n}\n\n\n/* ========================================\n MESSAGES\n ======================================== */\n\n.messenger-message {\n display: flex;\n gap: var(--spacing-2);\n max-width: 85%;\n}\n\n.messenger-message-own {\n align-self: flex-end;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.messenger-message-received {\n align-self: flex-start;\n flex-direction: column;\n}\n\n.messenger-message-row {\n display: flex;\n align-items: flex-end;\n gap: var(--spacing-2);\n}\n\n.messenger-message-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.messenger-message-avatar {\n flex-shrink: 0;\n}\n\n.messenger-message-sender {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-secondary);\n margin-bottom: 2px;\n margin-left: 0;\n}\n\n.messenger-message-bubble {\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-2xl);\n word-wrap: break-word;\n}\n\n.messenger-message-own .messenger-message-bubble {\n background: var(--color-primary);\n color: var(--color-white);\n border-bottom-right-radius: var(--spacing-1);\n}\n\n.messenger-message-received .messenger-message-bubble {\n background: var(--color-neutral-100);\n color: var(--color-text-primary);\n border-bottom-left-radius: var(--spacing-1);\n}\n\n.messenger-message-content {\n font-size: var(--font-size-base);\n line-height: var(--line-height-relaxed);\n}\n\n.messenger-message-time {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n margin-top: 2px;\n padding: 0 var(--spacing-1);\n}\n\n.messenger-message-image {\n max-width: 220px;\n max-height: 200px;\n width: auto;\n height: auto;\n border-radius: var(--radius-lg);\n margin-top: var(--spacing-1);\n cursor: pointer;\n object-fit: contain;\n display: block;\n}\n\n.messenger-message-file {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-2);\n margin-top: var(--spacing-1);\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-lg);\n background: var(--color-neutral-100);\n color: var(--color-primary);\n text-decoration: none;\n font-size: var(--font-size-sm);\n transition: background var(--transition-base);\n max-width: 100%;\n word-break: break-all;\n cursor: pointer;\n}\n\n.messenger-message-file:hover {\n background: var(--color-neutral-200);\n}\n\n.messenger-file-download-icon {\n margin-left: auto;\n opacity: 0.5;\n flex-shrink: 0;\n}\n\n.messenger-message-file:hover .messenger-file-download-icon {\n opacity: 1;\n}\n\n.messenger-closed-banner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n margin: var(--spacing-4);\n background: var(--color-success-light);\n color: var(--color-success-dark);\n border-radius: var(--radius-xl);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n}\n\n/* ========================================\n CHAT HEADER\n ======================================== */\n\n.messenger-chat-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: var(--spacing-4) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n}\n\n.messenger-chat-header-info {\n flex: 1;\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.messenger-chat-title {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: var(--spacing-4);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n}\n\n.messenger-chat-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: var(--spacing-10);\n}\n\n.messenger-chat-empty-avatars {\n margin-bottom: var(--spacing-4);\n}\n\n.messenger-chat-empty h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-chat-empty p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n max-width: 240px;\n}\n\n/* ========================================\n COMPOSE AREA\n ======================================== */\n\n.messenger-chat-compose {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n border-top: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-compose-input-wrapper {\n flex: 1;\n background: var(--color-neutral-100);\n border-radius: var(--radius-lg);\n padding: var(--spacing-2) var(--spacing-4);\n}\n\n.messenger-compose-input {\n width: 100%;\n background: transparent;\n border: none;\n outline: none;\n color: var(--color-text-primary);\n font-size: var(--font-size-md);\n line-height: var(--line-height-normal);\n resize: none;\n max-height: 120px;\n font-family: inherit;\n}\n\n.messenger-compose-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.messenger-compose-send {\n width: 40px;\n height: 40px;\n background: var(--color-primary);\n border: none;\n border-radius: var(--radius-full);\n color: var(--color-white);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--transition-base);\n flex-shrink: 0;\n}\n\n.messenger-compose-send:hover:not(:disabled) {\n background: var(--color-primary-hover);\n transform: scale(1.05);\n}\n\n.messenger-compose-send:disabled {\n background: var(--color-neutral-300);\n cursor: not-allowed;\n}\n\n.messenger-compose-file-input {\n display: none;\n}\n\n.messenger-compose-attach {\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n}\n\n.messenger-compose-attach svg {\n width: 20px;\n height: 20px;\n}\n\n/* ========================================\n TYPING INDICATOR\n ======================================== */\n\n.messenger-typing-indicator {\n display: none;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-3);\n margin: var(--spacing-1) 0;\n}\n\n.messenger-typing-dots {\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--color-neutral-100);\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-2xl);\n}\n\n.messenger-typing-dots span {\n width: 6px;\n height: 6px;\n background: var(--color-neutral-400);\n border-radius: var(--radius-full);\n animation: messenger-typing-bounce 1.4s infinite ease-in-out;\n}\n\n.messenger-typing-dots span:nth-child(1) { animation-delay: -0.32s; }\n.messenger-typing-dots span:nth-child(2) { animation-delay: -0.16s; }\n.messenger-typing-dots span:nth-child(3) { animation-delay: 0s; }\n\n.messenger-typing-text {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n}\n\n/* ========================================\n NAVIGATION TABS\n ======================================== */\n\n.messenger-panel-nav {\n border-top: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-nav-tabs {\n display: flex;\n padding: var(--spacing-1) var(--spacing-2) 0;\n gap: var(--spacing-1);\n}\n\n.messenger-nav-footer {\n padding: 2px var(--spacing-2) var(--spacing-2);\n text-align: center;\n}\n\n.messenger-powered-by {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n color: var(--color-text-tertiary);\n text-decoration: none;\n transition: color var(--transition-base);\n}\n\n.messenger-powered-by:hover {\n color: var(--color-text-secondary);\n}\n\n.messenger-powered-by svg {\n width: 12px;\n height: 14px;\n}\n\n.messenger-powered-by strong {\n font-weight: var(--font-weight-semibold);\n}\n\n.messenger-nav-tab {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n padding: var(--spacing-1) var(--spacing-1);\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 8px;\n transition: all var(--transition-base);\n position: relative;\n}\n\n.messenger-nav-tab:hover {\n background: var(--color-neutral-50);\n}\n\n.messenger-nav-icon {\n color: var(--color-text-secondary);\n transition: color var(--transition-base);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n}\n\n.messenger-nav-icon svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.messenger-nav-label {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-secondary);\n transition: color var(--transition-base);\n}\n\n.messenger-nav-tab.active .messenger-nav-icon,\n.messenger-nav-tab.active .messenger-nav-label {\n color: var(--color-primary);\n}\n\n.messenger-nav-badge {\n position: absolute;\n top: var(--spacing-1);\n right: calc(50% - 16px);\n min-width: 16px;\n height: 16px;\n background: var(--color-error);\n color: var(--color-white);\n font-size: 10px;\n font-weight: var(--font-weight-semibold);\n border-radius: var(--radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 var(--spacing-1);\n}\n\n/* ========================================\n PRECHAT\n ======================================== */\n\n.messenger-prechat-view {\n position: relative;\n}\n\n.messenger-prechat-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n z-index: var(--z-popover);\n}\n\n.messenger-prechat-card {\n background: var(--color-white);\n border-radius: 10px;\n padding: var(--spacing-6);\n width: 100%;\n max-width: 360px;\n box-shadow: var(--shadow-xl);\n}\n\n.messenger-prechat-title {\n margin: 0 0 var(--spacing-5);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n text-align: center;\n}\n\n.messenger-prechat-error {\n display: none;\n font-size: var(--font-size-sm);\n color: var(--color-error);\n margin-top: calc(var(--spacing-1) * -1);\n}\n\n.messenger-prechat-actions {\n display: flex;\n gap: var(--spacing-3);\n margin-top: var(--spacing-2);\n}\n\n.messenger-prechat-skip {\n flex: 1;\n}\n\n.messenger-prechat-submit {\n flex: 2;\n}\n\n.messenger-prechat-submit-loading {\n display: none;\n align-items: center;\n justify-content: center;\n}\n\n.messenger-prechat-submit-loading i {\n animation: spin 0.8s linear infinite;\n}\n\n/* ========================================\n ATTACHMENTS\n ======================================== */\n.messenger-compose-attachments-preview {\n display: none;\n flex-wrap: wrap;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-4);\n border-top: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-attachment-preview {\n position: relative;\n width: 56px;\n height: 56px;\n border-radius: var(--radius-lg);\n overflow: hidden;\n border: 1px solid var(--color-border);\n}\n\n.messenger-attachment-thumb {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.messenger-attachment-file-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-neutral-100);\n color: var(--color-text-secondary);\n}\n\n.messenger-attachment-remove {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 18px;\n height: 18px;\n background: rgba(0, 0, 0, 0.7);\n border: none;\n border-radius: var(--radius-full);\n color: var(--color-white);\n font-size: var(--font-size-xs);\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n transition: background var(--transition-base);\n}\n\n.messenger-attachment-remove:hover {\n background: var(--color-error);\n}\n\n/* ========================================\n EMAIL OVERLAY\n ======================================== */\n.messenger-email-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n top: 0;\n display: none;\n align-items: flex-end;\n z-index: 20;\n background: rgba(0, 0, 0, 0.5);\n pointer-events: auto;\n}\n\n.messenger-email-card {\n width: 100%;\n animation: messenger-slide-up 0.25s ease;\n}\n\n.messenger-email-actions {\n display: flex;\n gap: var(--spacing-2);\n margin-top: var(--spacing-1);\n}\n\n/* ========================================\n EMPTY STATE\n ======================================== */\n.messenger-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: var(--spacing-10);\n}\n\n.messenger-empty-state-icon {\n color: var(--color-neutral-300);\n margin-bottom: var(--spacing-4);\n}\n\n.messenger-empty-state h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-empty-state p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n}\n\n/* ========================================\n ANIMATIONS\n ======================================== */\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes messenger-typing-bounce {\n 0%, 80%, 100% {\n transform: scale(0);\n }\n 40% {\n transform: scale(1);\n }\n}\n\n@keyframes messenger-slide-up {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n@keyframes messenger-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n@media (max-width: 480px) {\n .messenger-prechat-overlay {\n padding: var(--spacing-4);\n }\n .messenger-prechat-card {\n max-width: 100%;\n }\n}\n",document.head.appendChild(e)}}function V(){if("undefined"!=typeof window&&window.FeedbackSDKConfig){W();const e={...window.FeedbackSDKConfig},t=new R(e);t.init().then(n=>{if(window.FeedbackSDK.instance=t,window.FeedbackSDKConfig.autoCreate){(Array.isArray(window.FeedbackSDKConfig.autoCreate)?window.FeedbackSDKConfig.autoCreate:[window.FeedbackSDKConfig.autoCreate]).forEach(e=>{try{t.createWidget(e.type||"button",e).mount(e.container)}catch(e){console.error("[FeedbackSDK] Failed to create widget:",e)}})}if("undefined"!=typeof CustomEvent){const s=new CustomEvent("FeedbackSDKReady",{detail:{sdk:t,config:e,initData:n}});window.dispatchEvent(s)}}).catch(t=>{if(console.error("[FeedbackSDK] Auto-initialization failed:",t),"undefined"!=typeof CustomEvent){const n=new CustomEvent("FeedbackSDKError",{detail:{error:t,config:e,phase:"initialization"}});window.dispatchEvent(n)}})}}const Z={FeedbackSDK:R,BaseWidget:C,ButtonWidget:E,ChangelogWidget:I,TabWidget:H,InlineWidget:A,SurveyWidget:q,MessengerWidget:j,WidgetFactory:U,EventBus:w,APIService:y,SDKError:g,APIError:p,WidgetError:u,ConfigError:m,ValidationError:v,helpers:S,create:e=>(W(),new R(e)),version:"1.0.0",instance:null,isReady:()=>Boolean(Z.instance),getInstance:()=>Z.instance,setUserContext:e=>{Z.instance?Z.instance.setUserContext(e):"undefined"!=typeof window&&(window.FeedbackSDKUserContext=e)},initWithUser:async(e,t)=>{W();const n={...e,userContext:t},s=new R(n);return await s.init(),"undefined"!=typeof window&&(window.FeedbackSDK.instance=s),s},onReady:e=>{"undefined"!=typeof window&&(Z.isReady()?e(Z.instance):window.addEventListener("FeedbackSDKReady",t=>{e(t.detail.sdk,t.detail)},{once:!0}))},onError:e=>{"undefined"!=typeof window&&window.addEventListener("FeedbackSDKError",t=>{e(t.detail.error,t.detail)})},extractUserContext:R.extractUserContextFromAuth};"undefined"!=typeof window&&(window.FeedbackSDK=Z,"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",V):setTimeout(V,0))),e.APIError=p,e.APIService=y,e.BaseWidget=C,e.ButtonWidget=E,e.ChangelogWidget=I,e.ConfigError=m,e.EventBus=w,e.FeedbackSDK=R,e.InlineWidget=A,e.MessengerWidget=j,e.SDKError=g,e.SurveyWidget=q,e.TabWidget=H,e.ValidationError=v,e.WidgetError=u,e.WidgetFactory=U,e.default=Z,e.helpers=S,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FeedbackSDK={})}(this,function(e){"use strict";const t=[{id:"changelog_1",title:"Feature prioritization, multiple roadmaps, and feature request analytics.",excerpt:"We are super excited to bring you the long-waited feature prioritization together with many quality updates!",description:"We are super excited to bring you the long-waited feature prioritization together with many quality updates!",cover_image:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiNEQkVBRkUiLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzE1NUVFRiIgc3Ryb2tlLXdpZHRoPSIyIi8+PHJlY3QgeD0iMzAiIHk9IjQwIiB3aWR0aD0iODAiIGhlaWdodD0iOCIgcng9IjQiIGZpbGw9IiNFNUU3RUIiLz48cmVjdCB4PSIzMCIgeT0iNjAiIHdpZHRoPSIxNDAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHRleHQgeD0iNDAiIHk9Ijg1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjE2IiBmb250LXdlaWdodD0iNjAwIiBmaWxsPSIjMUYyOTM3Ij4yMDA8L3RleHQ+PHRleHQgeD0iNDAiIHk9Ijk1IiBmb250LWZhbWlseT0ic3lzdGVtLXVpIiBmb250LXNpemU9IjgiIGZpbGw9IiM2QjcyODAiPlBvc3RzPC90ZXh0PjxyZWN0IHg9IjE4MCIgeT0iNjAiIHdpZHRoPSI4MCIgaGVpZ2h0PSI0MCIgcng9IjQiIGZpbGw9IiNGM0Y0RjYiLz48cmVjdCB4PSIyNzAiIHk9IjYwIiB3aWR0aD0iODAiIGhlaWdodD0iNDAiIHJ4PSI0IiBmaWxsPSIjRjNGNEY2Ii8+PHBhdGggZD0iTTMwIDEzMEgzNzBNMzAgMTUwSDM3ME0zMCAxNzBIMzcwTTMwIDE5MEgzNzAiIHN0cm9rZT0iI0U1RTdFQiIgc3Ryb2tlLXdpZHRoPSIxIi8+PHBhdGggZD0iTTUwIDE2MEwxMDAgMTQwTDE1MCAxNTBMMjAwIDEzMEwyNTAgMTM1TDMwMCAxMjBMMzUwIDEyNSIgc3Ryb2tlPSIjMTU1RUVGIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiLz48L3N2Zz4=",slug:"feature-prioritization-roadmaps-analytics",published_at:"2025-03-15T10:00:00Z",labels:[{name:"New Feature",color:"#10B981"},{name:"Analytics",color:"#6366F1"}],status:"published"},{id:"changelog_2",title:"Dark mode support and UI improvements",excerpt:"You asked for it, we delivered! Dark mode is now available across all pages.",description:"You asked for it, we delivered! Dark mode is now available across all pages.",cover_image:"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAwIiBoZWlnaHQ9IjI1MCIgdmlld0JveD0iMCAwIDQwMCAyNTAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHJlY3Qgd2lkdGg9IjQwMCIgaGVpZ2h0PSIyNTAiIGZpbGw9IiMxRjI5MzciLz48cmVjdCB4PSIyMCIgeT0iMjAiIHdpZHRoPSIzNjAiIGhlaWdodD0iMjEwIiByeD0iOCIgZmlsbD0iIzM3NDE1MSIgc3Ryb2tlPSIjNEI1NTYzIiBzdHJva2Utd2lkdGg9IjEiLz48Y2lyY2xlIGN4PSIyMDAiIGN5PSIxMjUiIHI9IjQwIiBmaWxsPSIjRkJCRjI0Ii8+PHBhdGggZD0iTTIyMCAxMjVDMjIwIDEzNiAyMTEgMTQ1IDIwMCAxNDVDMTg5IDE0NSAxODAgMTM2IDE4MCAxMjVDMTgwIDExNCAxODkgMTA1IDIwMCAxMDVDMjExIDEwNSAyMjAgMTE0IDIyMCAxMjVaIiBmaWxsPSIjMUYyOTM3Ii8+PC9zdmc+",slug:"dark-mode-ui-improvements",published_at:"2025-03-01T10:00:00Z",labels:[{name:"Enhancement",color:"#8B5CF6"}],status:"published"},{id:"changelog_3",title:"Performance improvements and bug fixes",excerpt:"This release includes major performance improvements and several bug fixes.",description:"This release includes major performance improvements and several bug fixes.",slug:"performance-improvements-bug-fixes",published_at:"2025-02-15T10:00:00Z",labels:[{name:"Bug Fix",color:"#EF4444"},{name:"Performance",color:"#F59E0B"}],status:"published"}],n=[{id:"conv_1",subject:"Question about pricing",status:"open",last_message_at:new Date(Date.now()-294e4).toISOString(),created_at:new Date(Date.now()-1728e5).toISOString(),unread:1,assigned_user:{id:"user_1",name:"Sarah",avatar:null}},{id:"conv_2",subject:"Feature request",status:"open",last_message_at:new Date(Date.now()-5184e5).toISOString(),created_at:new Date(Date.now()-864e6).toISOString(),unread:0,assigned_user:{id:"user_2",name:"Tom",avatar:null}}],s={conv_1:[{id:"msg_1",content:"Hi there! 👋 I'm Sarah. How can I help you today?",sender_type:"agent",sender_name:"Sarah",sender_avatar:null,created_at:new Date(Date.now()-3e6).toISOString()},{id:"msg_2",content:"Hi! I have a question about your enterprise pricing.",sender_type:"customer",created_at:new Date(Date.now()-294e4).toISOString()}],conv_2:[{id:"msg_3",content:"Hello! I'm Tom from the product team.",sender_type:"agent",sender_name:"Tom",sender_avatar:null,created_at:new Date(Date.now()-6048e5).toISOString()},{id:"msg_4",content:"I would love to see a dark mode feature!",sender_type:"customer",created_at:new Date(Date.now()-5184e5-18e5).toISOString()},{id:"msg_5",content:"Great suggestion! That feature will be available next week. I'll let you know when it's ready.",sender_type:"agent",sender_name:"Tom",sender_avatar:null,created_at:new Date(Date.now()-5184e5).toISOString()}]},i=[{id:"collection_1",title:"Product Overview",description:"See how your AI-first customer service solution works.",articleCount:24,icon:"ph-book-open",url:"#"},{id:"collection_2",title:"Getting Started",description:"Everything you need to know to get started with Product7.",articleCount:30,icon:"ph-rocket",url:"#"},{id:"collection_3",title:"AI Agent",description:"Resolving customer questions instantly and accurately—from live chat to email.",articleCount:82,icon:"ph-robot",url:"#"},{id:"collection_4",title:"Channels",description:"Enabling the channels you use to communicate with customers, all from the Inbox.",articleCount:45,icon:"ph-chat-circle",url:"#"},{id:"collection_5",title:"Billing & Payments",description:"Manage your subscription, invoices, and payment methods.",articleCount:12,icon:"ph-credit-card",url:"#"}],a=[{id:"mock_nps_survey",type:"nps",title:"How likely are you to recommend us?",description:"Your feedback helps us improve",low_label:"Not likely",high_label:"Very likely",trigger:"manual",status:"active"},{id:"mock_csat_survey",type:"csat",title:"How satisfied are you?",description:"Rate your experience with our product",trigger:"manual",status:"active"},{id:"mock_ces_survey",type:"ces",title:"How easy was it?",description:"Rate the ease of completing your task",low_label:"Very difficult",high_label:"Very easy",trigger:"manual",status:"active"}],r=e=>new Promise(t=>setTimeout(t,e));function o(){if("undefined"==typeof navigator)return{device:null,browser:null,os:null};const e=navigator.userAgent;let t="desktop";/Mobi|Android/i.test(e)&&(t=/Tablet|iPad/i.test(e)?"tablet":"mobile");let n="unknown";e.includes("Firefox")?n="firefox":e.includes("Edg")?n="edge":e.includes("Chrome")?n="chrome":e.includes("Safari")?n="safari":(e.includes("Opera")||e.includes("OPR"))&&(n="opera");let s="unknown";return e.includes("Windows")?s="windows":e.includes("Mac")?s="macos":e.includes("Linux")?s="linux":e.includes("Android")?s="android":(e.includes("iPhone")||e.includes("iPad"))&&(s="ios"),{device:t,browser:n,os:s}}class l{constructor(e){this.api=e}async getChangelogs(e={}){return await this.api._ensureSession(),this.api.mock?(await r(300),{success:!0,data:t}):this.api._handleAuthRetry(async()=>{const t=this.api._getEndpointWithParams("/widget/changelogs",e);return await this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}}class c{constructor(e){this.api=e}async submitFeedback(e){if(await this.api._ensureSession(),this.api.mock)return await r(500),{success:!0,data:{id:"mock_post_"+Date.now(),title:e.title,content:e.content},message:"Feedback submitted successfully!"};const t={board:e.board_id||e.board||e.boardId,title:e.title,content:e.content,attachments:e.attachments||[]};return this.api._handleAuthRetry(async()=>await this.api._makeRequest("/widget/feedback",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}}class d{constructor(e){this.api=e}async getHelpCollections(e={}){if(await this.api._ensureSession(),this.api.mock)return await r(200),{status:!0,data:i};const t=this.api._getEndpointWithParams("/widget/help/collections",e);return this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async searchHelpArticles(e,t={}){if(await this.api._ensureSession(),this.api.mock){await r(200);return{status:!0,data:i.filter(t=>t.title.toLowerCase().includes(e.toLowerCase())||t.description.toLowerCase().includes(e.toLowerCase()))}}const n={q:e,...t},s=this.api._getEndpointWithParams("/widget/help/search",n);return this.api._makeRequest(s,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}}class h{constructor(e){this.api=e}async getMessengerSettings(){return await this.api._ensureSession(),this.api.mock?{status:!0,data:{enabled:!0,greeting_message:"Hi there! How can we help?",team_name:"Support Team",response_time:"Usually replies within a few minutes"}}:this.api._makeRequest("/widget/messenger/settings",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async checkAgentsOnline(){return await this.api._ensureSession(),this.api.mock?{status:!0,data:{agents_online:!0,online_count:2,response_time:"Usually replies within a few minutes"}}:this.api._makeRequest("/widget/messenger/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversations(e={}){if(await this.api._ensureSession(),this.api.mock)return await r(300),{status:!0,data:n,meta:{total:n.length,page:1,limit:20}};const t=this.api._getEndpointWithParams("/widget/messenger/conversations",e);return this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversation(e){if(await this.api._ensureSession(),this.api.mock){await r(200);return{status:!0,data:{...n.find(t=>t.id===e),messages:s[e]||[]}}}return this.api._makeRequest(`/widget/messenger/conversations/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async startConversation(e){if(await this.api._ensureSession(),this.api.mock){await r(300);const t={id:"conv_"+Date.now(),subject:e.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:e.message,sender_type:"customer",created_at:(new Date).toISOString(),attachments:e.attachments||[]}]};return n.unshift(t),s[t.id]=t.messages,{status:!0,data:t}}return this.api._makeRequest("/widget/messenger/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({message:e.message,subject:e.subject||"",attachments:e.attachments||[]})})}async sendMessage(e,t){if(await this.api._ensureSession(),this.api.mock){await r(200);const n={id:"msg_"+Date.now(),content:t.content,sender_type:"customer",created_at:(new Date).toISOString(),attachments:t.attachments||[]};return s[e]||(s[e]=[]),s[e].push(n),{status:!0,data:n}}return this.api._makeRequest(`/widget/messenger/conversations/${e}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({content:t.content,attachments:t.attachments||[]})})}async getUnreadCount(){if(await this.api._ensureSession(),this.api.mock){const e=n.reduce((e,t)=>e+(t.unread||0),0);return{status:!0,data:{unread_count:e,unread_conversations:e>0?1:0}}}return this.api._makeRequest("/widget/messenger/unread",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async markConversationAsRead(e){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/messenger/conversations/${e}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getMessages(e,t={}){if(await this.api._ensureSession(),this.api.mock)return await r(200),{status:!0,data:s[e]||[],meta:{total:0,page:1,limit:50}};const n={...t},i=this.api._getEndpointWithParams(`/widget/messenger/conversations/${e}/messages`,n);return this.api._makeRequest(i,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async identifyContact(e){return await this.api._ensureSession(),this.api.mock?(await r(300),{status:!0,data:{contact_id:"mock_contact_"+Date.now(),email:e.email,name:e.name||"",is_new:!0}}):this.api._makeRequest("/widget/messenger/identify",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({email:e.email,name:e.name||"",phone:e.phone||"",company:e.company||"",avatar_url:e.avatar_url||"",metadata:e.metadata||{}})})}async sendTypingIndicator(e,t){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/messenger/conversations/${e}/typing`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({is_typing:t})})}}class g extends Error{constructor(e,t){super(e),this.name="SDKError",this.cause=t,Error.captureStackTrace&&Error.captureStackTrace(this,g)}}let p=class e extends Error{constructor(t,n,s){super(n),this.name="APIError",this.status=t,this.response=s,Error.captureStackTrace&&Error.captureStackTrace(this,e)}isNetworkError(){return 0===this.status}isClientError(){return this.status>=400&&this.status<500}isServerError(){return this.status>=500&&this.status<600}};class u extends Error{constructor(e,t,n){super(e),this.name="WidgetError",this.widgetType=t,this.widgetId=n,Error.captureStackTrace&&Error.captureStackTrace(this,u)}}class m extends Error{constructor(e,t){super(e),this.name="ConfigError",this.configKey=t,Error.captureStackTrace&&Error.captureStackTrace(this,m)}}class v extends Error{constructor(e,t,n){super(e),this.name="ValidationError",this.field=t,this.value=n,Error.captureStackTrace&&Error.captureStackTrace(this,v)}}class b{constructor(e){this.api=e}async getActiveSurveys(e={}){if(await this.api._ensureSession(),this.api.mock)return await r(200),{success:!0,data:a};const t=this._getRespondentContext(e),n={url:e.url||("undefined"!=typeof window?window.location.href:""),...o(),...t.respondent_id&&{respondent_id:t.respondent_id},...t.email&&{email:t.email},...void 0!==e.includeEligibility&&{include_eligibility:e.includeEligibility},...e.userProperties&&{user_properties:e.userProperties}};return this.api._handleAuthRetry(async()=>{const e=this.api._getEndpointWithParams("/widget/surveys/active",n);return await this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}_getRespondentContext(e={}){const t="function"==typeof this.api.getUserContext&&this.api.getUserContext()||{};return{respondent_id:e.respondentId||e.userId||t.user_id||null,email:e.email||t.email||null}}async submitSurveyResponse(e,t){if(!e)throw new p(400,"Survey ID is required");if(await this.api._ensureSession(),this.api.mock)return await r(300),{success:!0,data:{id:"mock_response_"+Date.now(),survey_id:e,...t},message:"Survey response submitted successfully!"};const n=this._getRespondentContext(t),s={rating:t.rating,feedback:t.feedback||"",answers:t.answers||{},...n.respondent_id&&{respondent_id:n.respondent_id},...n.email&&{email:n.email}};return this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${e}/responses`,{method:"POST",body:JSON.stringify(s),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}async dismissSurvey(e){if(!e)throw new p(400,"Survey ID is required");return await this.api._ensureSession(),this.api.mock?(await r(100),{success:!0,message:"Survey dismissed successfully"}):this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${e}/dismiss`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}}))}}class f{constructor(e={}){this.workspace=e.workspace,this.sessionToken=null,this.sessionExpiry=null,this.userContext=e.userContext||null,this.mock=e.mock||!1,this.env=e.env||"production",this.baseURL=this._getBaseURL(e),this._loadStoredSession()}_getBaseURL(e){if(e.apiUrl)return e.apiUrl;const t={production:{base:"https://api.product7.io/api/v1",withWorkspace:e=>`https://${e}.api.product7.io/api/v1`},staging:{base:"https://staging.api.product7.io/api/v1",withWorkspace:e=>`https://${e}.staging.api.product7.io/api/v1`},localstack:{base:"http://localhost:1323/api/v1",withWorkspace:e=>`http://${e}.localhost:1323/api/v1`}},n=t[this.env]||t.production;return this.workspace?n.withWorkspace(this.workspace):n.base}async init(e=null){if(e&&(this.userContext=e),this.isSessionValid())return{sessionToken:this.sessionToken};if(!this.workspace||!this.userContext)throw new p(400,`Missing ${this.workspace?"user context":"workspace"} for initialization`);return this.mock?this._initMockSession():this._initRealSession()}async _initMockSession(){return this.sessionToken="mock_session_"+Date.now(),this.sessionExpiry=new Date(Date.now()+36e5),this._storeSession(),{sessionToken:this.sessionToken,config:{primaryColor:"#21244A",backgroundColor:"#ffffff",textColor:"#1F2937",boardId:"feature-requests",size:"medium",displayMode:"modal"},expiresIn:3600}}async _initRealSession(){const e={workspace:this.workspace,user:this.userContext};try{const t=await this._makeRequest("/widget/init",{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json"}});return this.sessionToken=t.session_token,this.sessionExpiry=new Date(Date.now()+1e3*t.expires_in),this._storeSession(),{sessionToken:this.sessionToken,config:t.config||{},expiresIn:t.expires_in}}catch(e){throw new p(e.status||500,`Failed to initialize widget: ${e.message}`,e.response)}}async _ensureSession(){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new p(401,"No valid session token available")}async _handleAuthRetry(e,...t){try{return await e.apply(this,t)}catch(n){if(401===n.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),await e.apply(this,t);throw n}}isSessionValid(){return this.sessionToken&&this.sessionExpiry&&new Date<this.sessionExpiry}setUserContext(e){this.userContext=e,this._storeData("feedbackSDK_userContext",e)}getUserContext(){return this.userContext}clearSession(){this.sessionToken=null,this.sessionExpiry=null,this._removeData("feedbackSDK_session"),this._removeData("feedbackSDK_userContext")}_storeSession(){if("undefined"!=typeof localStorage)try{const e={token:this.sessionToken,expiry:this.sessionExpiry.toISOString(),workspace:this.workspace};this._storeData("feedbackSDK_session",e)}catch(e){}}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const e=localStorage.getItem("feedbackSDK_session");if(!e)return!1;const t=JSON.parse(e);return this.sessionToken=t.token,this.sessionExpiry=new Date(t.expiry),this.isSessionValid()}catch(e){return!1}}_storeData(e,t){"undefined"!=typeof localStorage&&localStorage.setItem(e,JSON.stringify(t))}_removeData(e){"undefined"!=typeof localStorage&&localStorage.removeItem(e)}async _makeRequest(e,t={}){const n=`${this.baseURL}${e}`;try{const e=await fetch(n,t);if(!e.ok){let t=`HTTP ${e.status}`,n=null;try{n=await e.json(),t=n.message||n.error||t}catch(n){t=await e.text()||t}throw new p(e.status,t,n)}const s=e.headers.get("content-type");return s&&s.includes("application/json")?await e.json():await e.text()}catch(e){if(e instanceof p)throw e;throw new p(0,e.message,null)}}_buildQueryParams(e){const t=new URLSearchParams;return Object.entries(e).forEach(([e,n])=>{null!=n&&t.append(e,"object"==typeof n?JSON.stringify(n):n)}),t.toString()}_getEndpointWithParams(e,t){const n=this._buildQueryParams(t);return`${e}${n?"?"+n:""}`}}class y extends f{constructor(e={}){super(e),this.feedback=new c(this),this.survey=new b(this),this.messenger=new h(this),this.help=new d(this),this.changelog=new l(this)}async submitFeedback(e){return this.feedback.submitFeedback(e)}async getActiveSurveys(e){return this.survey.getActiveSurveys(e)}async submitSurveyResponse(e,t){return this.survey.submitSurveyResponse(e,t)}async dismissSurvey(e){return this.survey.dismissSurvey(e)}async getMessengerSettings(){return this.messenger.getMessengerSettings()}async checkAgentsOnline(){return this.isSessionValid()||await this.init(),this.mock?{status:!0,data:{agents_online:!0,online_count:2,response_time:"Usually replies within a few minutes",available_agents:[{full_name:"Sarah",picture:""},{full_name:"Tom",picture:""}]}}:this._makeRequest("/widget/messenger/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getConversations(e){return this.messenger.getConversations(e)}async getConversation(e){return this.messenger.getConversation(e)}async getMessages(e,t){return this.messenger.getMessages(e,t)}async startConversation(e){if(!this.isSessionValid()){console.log("[APIService] startConversation: session invalid, calling init...");try{await this.init(),console.log("[APIService] startConversation: init result, token:",this.sessionToken?"set":"null")}catch(e){throw console.error("[APIService] startConversation: init failed:",e.message),e}}if(!this.sessionToken)throw console.error("[APIService] startConversation: no session token after init"),new APIError(401,"No valid session token available");if(console.log("[APIService] startConversation: sending to",`${this.baseURL}/widget/messenger/conversations`,"mock:",this.mock),this.mock){await new Promise(e=>setTimeout(e,300));const t={id:"conv_"+Date.now(),subject:e.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:e.message,sender_type:"customer",created_at:(new Date).toISOString()}]};return MOCK_CONVERSATIONS.unshift(t),MOCK_MESSAGES[t.id]=t.messages,{status:!0,data:t}}return this._makeRequest("/widget/messenger/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({message:e.message,subject:e.subject||""})})}async sendMessage(e,t){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));const n={id:"msg_"+Date.now(),content:t.content,attachments:t.attachments||[],sender_type:"customer",created_at:(new Date).toISOString()};return MOCK_MESSAGES[e]||(MOCK_MESSAGES[e]=[]),MOCK_MESSAGES[e].push(n),{status:!0,data:n}}const n={content:t.content};return t.attachments&&t.attachments.length>0&&(n.attachments=t.attachments),this._makeRequest(`/widget/messenger/conversations/${e}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify(n)})}async uploadFile(e,t){return this.isSessionValid()||await this.init(),this.mock?(await new Promise(e=>setTimeout(e,300)),{status:!0,url:`https://mock-cdn.example.com/${t}`}):this._makeRequest("/widget/messenger/upload",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({file:e,filename:t})})}async sendTypingIndicator(e,t){return this.messenger.sendTypingIndicator(e,t)}async markConversationAsRead(e){return this.messenger.markConversationAsRead(e)}async getUnreadCount(){return this.messenger.getUnreadCount()}async submitRating(e,t){return this.messenger.submitRating(e,t)}async identifyContact(e){return this.messenger.identifyContact(e)}async getHelpCollections(e){return this.help.getHelpCollections(e)}async searchHelpArticles(e,t){return this.help.searchHelpArticles(e,t)}async getChangelogs(e){return this.changelog.getChangelogs(e)}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const e=localStorage.getItem("feedbackSDK_session");if(!e)return!1;const t=JSON.parse(e);return(t.token&&t.token.startsWith("mock_"))!==this.mock?(localStorage.removeItem("feedbackSDK_session"),!1):(this.sessionToken=t.token,this.sessionExpiry=new Date(t.expiry),this.isSessionValid())}catch(e){return!1}}async _makeRequest(e,t={}){const n=`${this.baseURL}${e}`;try{const e=await fetch(n,t);if(!e.ok){let t=`HTTP ${e.status}`,n=null;try{n=await e.json(),t=n.message||n.error||t}catch(n){t=await e.text()||t}throw new APIError(e.status,t,n)}const s=e.headers.get("content-type");return s&&s.includes("application/json")?await e.json():await e.text()}catch(e){if(e instanceof APIError)throw e;throw new APIError(0,e.message,null)}}}class w{constructor(){this.events=new Map}on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(n){const e=n.indexOf(t);e>-1&&n.splice(e,1)}}emit(e,t){const n=this.events.get(e);n&&n.forEach(e=>{try{e(t)}catch(e){console.error("[FeedbackSDK] Event callback error:",e)}})}once(e,t){const n=this.on(e,e=>{t(e),n()});return n}clear(){this.events.clear()}getListenerCount(e){const t=this.events.get(e);return t?t.length:0}}function k(e="feedback"){return`${e}_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}function x(e,t){const n={...e};for(const s in t)t.hasOwnProperty(s)&&(t[s]&&"object"==typeof t[s]&&!Array.isArray(t[s])?n[s]=x(e[s]||{},t[s]):n[s]=t[s]);return n}function _(){return"undefined"!=typeof window&&"undefined"!=typeof document}var S=Object.freeze({__proto__:null,debounce:function(e,t){let n;return function(...s){clearTimeout(n),n=setTimeout(()=>{clearTimeout(n),e(...s)},t)}},deepMerge:x,delay:function(e){return new Promise(t=>setTimeout(t,e))},escapeRegex:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},formatFileSize:function(e){if(0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["Bytes","KB","MB","GB"][t]},generateId:k,getBrowserInfo:function(){return{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language||navigator.userLanguage,cookieEnabled:navigator.cookieEnabled,screenResolution:`${screen.width}x${screen.height}`,windowSize:`${window.innerWidth}x${window.innerHeight}`,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}},getCSSProperty:function(e,t,n=""){if(!e||!t)return n;try{return window.getComputedStyle(e).getPropertyValue(t)||n}catch(e){return n}},getCurrentTimestamp:function(){return(new Date).toISOString()},getNestedProperty:function(e,t,n=void 0){if(!e||!t)return n;const s=t.split(".");let i=e;for(const e of s){if(null==i||!(e in i))return n;i=i[e]}return i},isBrowser:_,isInViewport:function(e){if(!e)return!1;const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)},isMobile:function(){return!!_()&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<=768)},isValidEmail:function(e){return!(!e||"string"!=typeof e)&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.trim())},safeJsonParse:function(e,t=null){try{return JSON.parse(e)}catch(e){return t}},sanitizeHTML:function(e){if(!e||"string"!=typeof e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML},scrollToElement:function(e,t={}){if(!e)return;e.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest",...t})},setNestedProperty:function(e,t,n){if(!e||!t)return e;const s=t.split("."),i=s.pop();let a=e;for(const e of s)e in a&&"object"==typeof a[e]||(a[e]={}),a=a[e];return a[i]=n,e},throttle:function(e,t){let n,s;return function(...i){s?(clearTimeout(n),n=setTimeout(()=>{Date.now()-s>=t&&(e(...i),s=Date.now())},t-(Date.now()-s))):(e(...i),s=Date.now())}},validateConfig:function(e,t=[]){const n=[];for(const s of t)e[s]||n.push(s);if(n.length>0)throw new Error(`Missing required configuration: ${n.join(", ")}`);return!0}});class C{static STORAGE_KEY="feedback_submitted";static DEFAULT_COOLDOWN_DAYS=30;constructor(e={}){this.id=e.id,this.sdk=e.sdk,this.apiService=e.apiService,this.type=e.type||"base",this.options={container:null,position:this.sdk.config.position,boardId:this.sdk.config.boardId,displayMode:e.displayMode||"panel",size:e.size||"medium",primaryColor:e.primaryColor||"#155EEF",backgroundColor:e.backgroundColor||"#ffffff",textColor:e.textColor||"#1F2937",autoShow:!1,showBackdrop:!1,customStyles:{},suppressAfterSubmission:!0,suppressionDays:C.DEFAULT_COOLDOWN_DAYS,...e},this.element=null,this.panelElement=null,this.backdropElement=null,this.mounted=!1,this.destroyed=!1,this.state={isOpen:!1,isLoading:!1,isSubmitting:!1,title:"",content:"",email:"",attachments:[],errors:{}},this._bindMethods()}mount(e){return this.mounted||this.destroyed?this:this.options.suppressAfterSubmission&&this._hasRecentlySubmitted()?(this.sdk.eventBus.emit("widget:suppressed",{widget:this,reason:"recently_submitted"}),this):("string"==typeof e&&(e=document.querySelector(e)),e||(e=document.body),this.container=e,this.element=this._render(),this.container.appendChild(this.element),this.mounted=!0,this._attachEvents(),this.onMount(),this.options.autoShow&&this.show(),this.sdk.eventBus.emit("widget:mounted",{widget:this}),this)}show(){return this.element&&(this.element.style.display="block"),this}hide(){return this.element&&(this.element.style.display="none"),this}openPanel(){this.state.isOpen=!0,"modal"===this.options.displayMode?(this._showLoadingModal(),setTimeout(()=>{this._hideLoadingModal(),this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")})},600)):(this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}_showLoadingModal(){this.state.isLoading=!0,this.backdropElement=document.createElement("div"),this.backdropElement.className="sdk-modal-backdrop",document.body.appendChild(this.backdropElement),this.loadingElement=document.createElement("div"),this.loadingElement.className="feedback-loading-modal",this.loadingElement.innerHTML='\n\t\t\t<div class="sdk-spinner"></div>\n\t\t',document.body.appendChild(this.loadingElement),requestAnimationFrame(()=>{this.backdropElement.classList.add("show"),this.loadingElement.classList.add("show")})}_hideLoadingModal(){this.state.isLoading=!1,this.loadingElement&&(this.loadingElement.remove(),this.loadingElement=null)}closePanel(){this.panelElement&&this.panelElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.panelElement&&this.panelElement.parentNode&&(this.panelElement.parentNode.removeChild(this.panelElement),this.panelElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null),this._resetForm()},300)}async submitFeedback(){if(!this.state.isSubmitting){this._hideError();try{this.state.isSubmitting=!0,this._updateSubmitButton();const e={title:this.state.title||"Feedback",content:this.state.content,email:this.state.email,board_id:this.options.boardId,attachments:this.state.attachments};if(!this.state.content.trim())return void this._showError("Please enter your feedback message.");const t=await this.apiService.submitFeedback(e);this._trackSubmission(),this._showSuccessMessage(),this.closePanel(),this.sdk.eventBus.emit("feedback:submitted",{widget:this,feedback:t})}catch(e){this._showError("Failed to submit feedback. Please try again."),this.sdk.eventBus.emit("feedback:error",{widget:this,error:e})}finally{this.state.isSubmitting=!1,this._updateSubmitButton()}}}handleConfigUpdate(e){this.options.theme=e.theme,this.element&&this._updateTheme()}destroy(){this.destroyed||(this.onDestroy(),this.closePanel(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.destroyed=!0,this.mounted=!1,this.sdk.eventBus.emit("widget:destroyed",{widget:this}))}onMount(){}onDestroy(){}_trackSubmission(){try{const e=this.sdk.config.workspace,t=`${C.STORAGE_KEY}_${e}`,n={submittedAt:Date.now(),boardId:this.options.boardId};localStorage.setItem(t,JSON.stringify(n))}catch(e){console.warn("Failed to track feedback submission:",e)}}_hasRecentlySubmitted(){const e=24*this.options.suppressionDays*60*60*1e3,t=Date.now();if(this.sdk.config.last_feedback_at)try{if(t-new Date(this.sdk.config.last_feedback_at).getTime()<e)return!0}catch(e){}try{const n=this.sdk.config.workspace,s=`${C.STORAGE_KEY}_${n}`,i=localStorage.getItem(s);if(!i)return!1;const a=JSON.parse(i);return t-a.submittedAt<e}catch(e){return!1}}clearSubmissionTracking(){try{const e=this.sdk.config.workspace,t=`${C.STORAGE_KEY}_${e}`;localStorage.removeItem(t)}catch(e){console.warn("Failed to clear submission tracking:",e)}}shouldShow(){return!this.options.suppressAfterSubmission||!this._hasRecentlySubmitted()}_render(){throw new Error("_render() must be implemented by concrete widget")}_attachEvents(){}_bindMethods(){this.openPanel=this.openPanel.bind(this),this.closePanel=this.closePanel.bind(this),this.submitFeedback=this.submitFeedback.bind(this)}_renderPanel(){if(this.panelElement)return;this.options.showBackdrop&&!this.backdropElement&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="sdk-modal-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",this.closePanel));const e="modal"===this.options.displayMode?"feedback-modal":"feedback-panel",t=`size-${this.options.size}`;this.panelElement=document.createElement("div"),this.panelElement.className=`${e} ${t}`,this.panelElement.style.setProperty("--primary-color",this.options.primaryColor),this.panelElement.style.setProperty("--bg-color",this.options.backgroundColor),this.panelElement.style.setProperty("--text-color",this.options.textColor),this.panelElement.innerHTML=this._getPanelHTML(),document.body.appendChild(this.panelElement),this._attachPanelEvents();const n=this.panelElement.querySelector("input, textarea");n&&setTimeout(()=>n.focus(),350)}_getPanelHTML(){return`\n <div class="feedback-panel-content">\n<div class="feedback-panel-header">\n <h3>Send Feedback</h3>\n <button class="sdk-close-btn" type="button" aria-label="Close">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="18" height="18">\n <rect width="256" height="256" fill="none"/>\n <line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n </button>\n</div>\n <div class="feedback-panel-body">\n <form class="feedback-form">\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-title-${this.id}">Title (optional)</label>\n <input \n type="text" \n id="feedback-title-${this.id}" \n name="title" \n class="sdk-input"\n placeholder="Brief description of your feedback"\n value="${this.state.title}"\n />\n </div>\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-content-${this.id}">Message *</label>\n <textarea \n id="feedback-content-${this.id}" \n name="content" \n class="sdk-textarea"\n placeholder="Tell us what you think..."\n required\n >${this.state.content}</textarea>\n </div>\n <div class="feedback-error" role="alert"></div>\n <div class="feedback-form-actions">\n <button type="submit" class="sdk-btn-primary sdk-btn-block">\n ${this.state.isSubmitting?"Sending...":"Send Feedback"}\n </button>\n </div>\n </form>\n </div>\n </div>\n `}_attachPanelEvents(){const e=this.panelElement;e.querySelector(".sdk-close-btn").addEventListener("click",this.closePanel);e.querySelector(".feedback-form").addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value});const t=e=>{"Escape"===e.key&&(this.closePanel(),document.removeEventListener("keydown",t))};document.addEventListener("keydown",t)}_updateSubmitButton(){if(this.panelElement){const e=this.panelElement.querySelector(".sdk-btn-primary");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}}_showError(e){if(this.panelElement){const t=this.panelElement.querySelector(".feedback-error");t&&(t.textContent=e,t.classList.add("show"))}}_hideError(){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-error");e&&e.classList.remove("show")}}_showSuccessMessage(){const e=document.createElement("div");e.className="sdk-notification sdk-notification-success",e.innerHTML='\n <div class="sdk-notification-content">\n <div class="sdk-notification-icon">✓</div>\n <span class="sdk-notification-text">Feedback submitted successfully!</span>\n <button class="sdk-close-btn" aria-label="Close">&times;</button>\n </div>\n ',document.body.appendChild(e);const t=()=>{e.parentNode&&(e.style.opacity="0",setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},300))};e.querySelector(".sdk-close-btn").addEventListener("click",t),setTimeout(t,4e3)}_resetForm(){this.state.title="",this.state.content="",this.state.email="",this.state.errors={}}_updateTheme(){}openModal(){this.openPanel()}closeModal(){this.closePanel()}}class E extends C{constructor(e){super({...e,type:"button"}),this.isMinimized=!1,this._hiddenForOpenPanel=!1}_render(){const e=document.createElement("div");return e.className=`feedback-widget-button position-${this.options.position}`,e.innerHTML='\n <button class="feedback-trigger-btn" type="button">\n <svg class="feedback-icon" width="20" height="20" viewBox="0 0 256 256" fill="currentColor">\n <path d="M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z"/>\n </svg>\n <span class="feedback-text">Feedback</span>\n \n <div class="feedback-minimize-icon">\n <svg viewBox="0 0 256 256">\n <path d="M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z"/>\n </svg>\n </div>\n \n <div class="feedback-expand-icon">\n <svg viewBox="0 0 256 256">\n <path d="M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z"/>\n </svg>\n </div>\n </button>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-trigger-btn"),t=this.element.querySelector(".feedback-minimize-icon"),n=this.element.querySelector(".feedback-expand-icon"),s=e=>{(e=>e instanceof Element&&Boolean(e.closest(".feedback-minimize-icon")||e.closest(".feedback-expand-icon")))(e)||this.isMinimized||this.openPanel()};t.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.minimize()}),n.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.restore()}),e.addEventListener("click",e=>{s(e.target)}),e.addEventListener("pointerup",e=>{"mouse"!==e.pointerType&&s(e.target)})}minimize(){this.isMinimized=!0,this.element.classList.add("minimized")}restore(){this.isMinimized=!1,this.element.classList.remove("minimized")}openPanel(){this.state.isOpen||(this._hiddenForOpenPanel=!0,this.hide()),super.openPanel()}closePanel(){const e=this._hiddenForOpenPanel;super.closePanel(),e&&setTimeout(()=>{this.destroyed||this.show(),this._hiddenForOpenPanel=!1},320)}mount(e){super.mount(e)}updateText(e){const t=this.element?.querySelector(".feedback-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class I extends C{constructor(e){super({...e,type:"changelog"}),this.changelogs=[],this.isLoading=!1,this.modalElement=null,this.sidebarElement=null,this.currentIndex=0}_render(){const e=document.createElement("div");return e.className=`changelog-widget position-${this.options.position}`,e.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`,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){this.element.querySelector(".changelog-trigger-btn").addEventListener("click",()=>{this.openSidebar()})}async openModal(){this.modalElement||(this.state.isOpen=!0,this._createModal(),0===this.changelogs.length&&await this._loadChangelogs(),this.currentIndex=0,this._renderCurrentChangelog(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.modalElement&&this.modalElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}closeModal(){document.body.style.overflow="",this.modalElement&&this.modalElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.modalElement&&this.modalElement.parentNode&&(this.modalElement.parentNode.removeChild(this.modalElement),this.modalElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null)},300)}_createModal(){this.backdropElement=document.createElement("div"),this.backdropElement.className="changelog-modal-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this.closeModal()),this.modalElement=document.createElement("div"),this.modalElement.className="changelog-modal",this.modalElement.innerHTML='\n\t\t\t<div class="changelog-modal-container">\n\t\t\t\t<button class="changelog-modal-close" type="button" aria-label="Close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></svg></button>\n\t\t\t\t<div class="changelog-modal-content">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',document.body.appendChild(this.modalElement),this.modalElement.querySelector(".changelog-modal-container").addEventListener("click",e=>e.stopPropagation()),this.modalElement.querySelector(".changelog-modal-close").addEventListener("click",()=>this.closeModal()),this._escapeHandler=e=>{"Escape"===e.key&&this.closeModal()},document.addEventListener("keydown",this._escapeHandler)}async openSidebar(){this.listModalElement||(this.modalElement&&(this.closeModal(),await new Promise(e=>setTimeout(e,350))),this.state.isOpen=!0,this._createListModal(),0===this.changelogs.length&&await this._loadChangelogs(),this._renderChangelogList(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.listModalElement&&(this.listModalElement.classList.add("open"),this._showConfetti()),this.listModalBackdropElement&&this.listModalBackdropElement.classList.add("show")}))}_showConfetti(){const e=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA"],t=document.createElement("div");t.className="changelog-confetti-container",document.body.appendChild(t);for(let n=0;n<50;n++){const n=document.createElement("div");n.className="changelog-confetti",n.style.left=100*Math.random()+"%",n.style.backgroundColor=e[Math.floor(Math.random()*e.length)],n.style.animationDelay=.5*Math.random()+"s",n.style.animationDuration=1*Math.random()+1.5+"s";const s=["circle","square","rectangle"],i=s[Math.floor(Math.random()*s.length)];"circle"===i?(n.style.borderRadius="50%",n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width):"rectangle"===i?(n.style.width=4*Math.random()+3+"px",n.style.height=10*Math.random()+8+"px"):(n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width),t.appendChild(n)}setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},2500)}closeSidebar(){document.body.style.overflow="",this.listModalElement&&this.listModalElement.classList.remove("open"),this.listModalBackdropElement&&this.listModalBackdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.listModalElement&&this.listModalElement.parentNode&&(this.listModalElement.parentNode.removeChild(this.listModalElement),this.listModalElement=null),this.listModalBackdropElement&&this.listModalBackdropElement.parentNode&&(this.listModalBackdropElement.parentNode.removeChild(this.listModalBackdropElement),this.listModalBackdropElement=null),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler)},300)}_createListModal(){this.listModalBackdropElement=document.createElement("div"),this.listModalBackdropElement.className="changelog-list-modal-backdrop",document.body.appendChild(this.listModalBackdropElement),this.listModalBackdropElement.addEventListener("click",()=>this.closeSidebar()),this.listModalElement=document.createElement("div"),this.listModalElement.className="changelog-list-modal",this.listModalElement.innerHTML=`\n\t\t\t<div class="changelog-list-modal-container">\n\t\t\t\t<div class="changelog-list-modal-header">\n\t\t\t\t\t<h2>${this.options.title||"What's New"} 🎉</h2>\n\t\t\t\t<button class="changelog-list-modal-close" type="button" aria-label="Close">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="18" height="18">\n <rect width="256" height="256" fill="none"/>\n <line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n</button></div>\n\t\t\t\t<div class="changelog-list-modal-body">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,document.body.appendChild(this.listModalElement),this.listModalElement.querySelector(".changelog-list-modal-container").addEventListener("click",e=>e.stopPropagation()),this.listModalElement.querySelector(".changelog-list-modal-close").addEventListener("click",()=>this.closeSidebar()),this._listModalEscapeHandler=e=>{"Escape"===e.key&&this.closeSidebar()},document.addEventListener("keydown",this._listModalEscapeHandler)}_renderChangelogList(){const e=this.listModalElement.querySelector(".changelog-list-modal-body");this.isLoading||(0!==this.changelogs.length?(e.innerHTML=`\n\t\t\t<div class="changelog-list">\n\t\t\t\t${this.changelogs.map((e,t)=>this._renderChangelogListItem(e,t)).join("")}\n\t\t\t</div>\n\t\t`,e.querySelectorAll(".changelog-list-item").forEach((e,t)=>{e.addEventListener("click",()=>{this._handleViewUpdate(this.changelogs[t])})})):e.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')}_renderChangelogListItem(e,t){const n=e.cover_image||e.image,s=e.cover_image||e.image,i=e.published_at?this._formatDate(e.published_at):"",a=this._truncateDescription(e.excerpt||e.description,120);return`\n\t\t\t<div class="changelog-list-item" data-index="${t}">\n\t\t\t\t<div class="changelog-list-item-main">\n\t\t\t\t\t${n?`\n\t\t\t\t\t\t<div class="changelog-list-item-image">\n\t\t\t\t\t\t\t<img src="${s}" alt="${e.title}" loading="lazy" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<div class="changelog-list-item-content">\n\t\t\t\t\t\t${i?`<span class="changelog-list-item-date">${i}</span>`:""}\n\t\t\t\t\t\t${e.labels&&e.labels.length>0?`\n\t\t\t\t\t\t\t<div class="changelog-list-item-labels">\n\t\t\t\t\t\t\t\t${e.labels.map(e=>`\n\t\t\t\t\t\t\t\t\t<span class="changelog-label" style="background-color: ${e.color||"#E5E7EB"}; color: ${this._getContrastColor(e.color||"#E5E7EB")}">${e.name}</span>\n\t\t\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`:""}\n\t\t\t\t\t\t<h3 class="changelog-list-item-title">${e.title}</h3>\n\t\t\t\t\t\t${a?`<p class="changelog-list-item-description">${a}</p>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}async _loadChangelogs(){this.isLoading=!0;try{const e=await this.apiService.getChangelogs();this.changelogs=e.data||[],this.sdk.eventBus.emit("changelog:loaded",{changelogs:this.changelogs})}catch(e){this.changelogs=[],this.sdk.eventBus.emit("changelog:error",{error:e})}finally{this.isLoading=!1}}_renderCurrentChangelog(){const e=this.modalElement.querySelector(".changelog-modal-content");if(this.isLoading)return;if(0===this.changelogs.length)return void(e.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');const t=this.changelogs[this.currentIndex],n=t.cover_image||t.image,s=t.cover_image||t.image,i=this.changelogs.length>1,a=this._truncateDescription(t.excerpt||t.description,160);e.innerHTML=`\n\t\t\t<div class="changelog-popup-item">\n\t\t\t\t${n?`\n\t\t\t\t\t<div class="changelog-popup-image">\n\t\t\t\t\t\t<img src="${s}" alt="${t.title}" loading="lazy" />\n\t\t\t\t\t</div>\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">${t.title}</h2>\n\t\t\t\t\t${a?`<p class="changelog-popup-description">${a}</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${i?`\n\t\t\t\t\t\t<div class="changelog-popup-dots">\n\t\t\t\t\t\t\t${this.changelogs.map((e,t)=>`\n\t\t\t\t\t\t\t\t<span class="changelog-dot ${t===this.currentIndex?"active":""}" data-index="${t}"></span>\n\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<button class="changelog-view-all-btn" type="button">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n\t\t\t\t\t\t\t<path d="M5 12h14M12 5l7 7-7 7"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,e.querySelector(".changelog-popup-btn").addEventListener("click",()=>{this._handleViewUpdate(t)}),e.querySelector(".changelog-view-all-btn").addEventListener("click",()=>{this.closeModal(),setTimeout(()=>this.openSidebar(),350)}),i&&e.querySelectorAll(".changelog-dot").forEach(e=>{e.addEventListener("click",e=>{this.currentIndex=parseInt(e.target.dataset.index,10),this._renderCurrentChangelog()})})}_handleViewUpdate(e){this.sdk.eventBus.emit("changelog:view",{changelog:e});const t=(this.options.changelogBaseUrl||"").replace(/\/$/,""),n=e.url||(e.slug&&t?`${t}/${e.slug}`:null)||t||null;n&&(!1!==this.options.openInNewTab?window.open(n,"_blank","noopener,noreferrer"):window.location.href=n),"function"==typeof this.options.onViewUpdate&&this.options.onViewUpdate(e)}_stripHtml(e){const t=document.createElement("div");return t.innerHTML=e,(t.textContent||t.innerText||"").trim()}_truncateDescription(e,t=120){if(!e)return"";const n=this._stripHtml(e);return n.length<=t?n:n.substring(0,t).trimEnd()+"..."}_formatDate(e){return new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}_getContrastColor(e){const t=e.replace("#","");return(.299*parseInt(t.substr(0,2),16)+.587*parseInt(t.substr(2,2),16)+.114*parseInt(t.substr(4,2),16))/255>.5?"#1F2937":"#FFFFFF"}hideBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="none")}showBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="block")}nextChangelog(){this.currentIndex<this.changelogs.length-1&&(this.currentIndex++,this._renderCurrentChangelog())}prevChangelog(){this.currentIndex>0&&(this.currentIndex--,this._renderCurrentChangelog())}async refresh(){this.changelogs=[],await this._loadChangelogs(),this.modalElement&&(this.currentIndex=0,this._renderCurrentChangelog()),this.listModalElement&&this._renderChangelogList()}mount(e){super.mount(e)}destroy(){this._escapeHandler&&document.removeEventListener("keydown",this._escapeHandler),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler),this.closeModal(),this.closeSidebar(),super.destroy()}}class A extends C{constructor(e){super({...e,type:"inline"})}_render(){const e=document.createElement("div");return e.className="feedback-widget feedback-widget-inline",e.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 `,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-inline-form");e.addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value}),e.querySelector('input[name="email"]').addEventListener("input",e=>{this.state.email=e.target.value})}openModal(){const e=this.element.querySelector('textarea[name="content"]');e&&e.focus()}closeModal(){}_showSuccessMessage(){const e=this.element.querySelector(".feedback-inline-content"),t=e.innerHTML;e.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 ';e.querySelector(".sdk-btn-primary").addEventListener("click",()=>{e.innerHTML=t,this._attachEvents(),this._resetForm()})}_showError(e){const t=this.element.querySelector(".feedback-error");t&&(t.textContent=e,t.classList.add("show"),setTimeout(()=>{t&&t.classList.remove("show")},5e3))}_updateSubmitButton(){const e=this.element.querySelector(".sdk-btn-primary");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}updateTitle(e){const t=this.element?.querySelector("h3");t&&(t.textContent=e)}setPlaceholder(e,t){const n=this.element?.querySelector(`[name="${e}"]`);n&&(n.placeholder=t)}}class M{constructor(e={}){this.baseURL=e.baseURL||"",this.workspace=e.workspace||"",this.sessionToken=e.sessionToken||null,this.mock=e.mock||!1,this.ws=null,this.reconnectAttempts=0,this.maxReconnectAttempts=5,this.reconnectDelay=1e3,this.pingInterval=null,this.isConnected=!1,this._listeners=new Map,this._onOpen=this._onOpen.bind(this),this._onMessage=this._onMessage.bind(this),this._onClose=this._onClose.bind(this),this._onError=this._onError.bind(this)}connect(e=null){if(e&&(this.sessionToken=e),!this.sessionToken)return void console.warn("[WebSocket] No session token provided");if(this.mock)return this.isConnected=!0,this._emit("connected",{}),void this._startMockResponses();const t="https:"===window.location.protocol?"wss:":"ws:";let n=this.baseURL.replace(/^https?:/,t);n=n.replace("/api/v1",""),n=`${n}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;try{this.ws=new WebSocket(n),this.ws.onopen=this._onOpen,this.ws.onmessage=this._onMessage,this.ws.onclose=this._onClose,this.ws.onerror=this._onError}catch(e){console.error("[WebSocket] Connection error:",e),this._scheduleReconnect()}}disconnect(){this.isConnected=!1,this.reconnectAttempts=this.maxReconnectAttempts,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this.ws&&(this.ws.close(),this.ws=null),this._mockInterval&&(clearInterval(this._mockInterval),this._mockInterval=null)}on(e,t){return this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(t),()=>this._listeners.get(e).delete(t)}off(e,t){this._listeners.has(e)&&this._listeners.get(e).delete(t)}send(e,t={}){this.isConnected?this.mock?console.log("[WebSocket Mock] Sending:",e,t):this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:e,payload:t})):console.warn("[WebSocket] Not connected, cannot send message")}_onOpen(){console.log("[WebSocket] Connected"),this.isConnected=!0,this.reconnectAttempts=0,this._emit("connected",{}),this.pingInterval=setInterval(()=>{this.send("ping",{})},3e4)}_onMessage(e){try{const t=JSON.parse(e.data),{type:n,payload:s}=t;switch(n){case"message:new":this._emit("message",s);break;case"typing:started":this._emit("typing_started",s);break;case"typing:stopped":this._emit("typing_stopped",s);break;case"conversation:updated":this._emit("conversation_updated",s);break;case"conversation:closed":this._emit("conversation_closed",s);break;case"availability:changed":this._emit("availability_changed",s);break;case"pong":break;default:console.log("[WebSocket] Unknown event:",n,s)}}catch(e){console.error("[WebSocket] Failed to parse message:",e)}}_onClose(e){console.log("[WebSocket] Disconnected:",e.code,e.reason),this.isConnected=!1,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._emit("disconnected",{code:e.code,reason:e.reason}),this._scheduleReconnect()}_onError(e){console.error("[WebSocket] Error:",e),this._emit("error",{error:e})}_scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts)return console.log("[WebSocket] Max reconnect attempts reached"),void this._emit("reconnect_failed",{});this.reconnectAttempts++;const e=this.reconnectDelay*Math.pow(2,this.reconnectAttempts-1);console.log(`[WebSocket] Reconnecting in ${e}ms (attempt ${this.reconnectAttempts})`),setTimeout(()=>{this.connect()},e)}_emit(e,t){this._listeners.has(e)&&this._listeners.get(e).forEach(n=>{try{n(t)}catch(t){console.error(`[WebSocket] Error in ${e} handler:`,t)}})}_startMockResponses(){this._mockInterval=setInterval(()=>{Math.random()<.1&&(this._emit("typing_started",{conversation_id:"conv_1",user_id:"agent_1",user_name:"Sarah",is_agent:!0}),setTimeout(()=>{this._emit("typing_stopped",{conversation_id:"conv_1",user_id:"agent_1"})},2e3))},1e4)}simulateMessage(e,t){this.mock&&this._emit("message",{conversation_id:e,message:{id:"msg_"+Date.now(),content:t.content,sender_type:t.sender_type||"agent",sender_name:t.sender_name||"Support",sender_avatar:t.sender_avatar||null,created_at:(new Date).toISOString()}})}}class T{constructor(e={}){this.currentView="home",this.isOpen=!1,this.unreadCount=0,this.activeConversationId=null,this.conversations=[],this.messages={},this.helpArticles=[],this.helpSearchQuery="",this.homeChangelogItems=[],this.changelogItems=[],this.teamName=e.teamName||"Support",this.teamAvatars=e.teamAvatars||[],this.welcomeMessage=e.welcomeMessage||"How can we help?",this.userContext=e.userContext||null,this.isIdentified=!1,this.pendingMessage=null,this.enableHelp=!1!==e.enableHelp,this.enableChangelog=!1!==e.enableChangelog,this.agentsOnline=!1,this.onlineCount=0,this.responseTime="Usually replies within a few minutes",this.typingUsers={},this.isLoading=!1,this.isLoadingMessages=!1,this.urls=e.urls||{feedback:null,changelog:null,help:null,roadmap:null},this._listeners=new Set}subscribe(e){return this._listeners.add(e),()=>this._listeners.delete(e)}_notify(e,t){this._listeners.forEach(n=>n(e,t,this))}setView(e){const t=this.currentView;this.currentView=e,this._notify("viewChange",{previousView:t,currentView:e})}setOpen(e){this.isOpen=e,this._notify("openChange",{isOpen:e})}setActiveConversation(e){const t=this.activeConversationId;this.activeConversationId=e,this._notify("conversationChange",{conversationId:e,previousConversationId:t})}setIdentified(e,t=null){this.isIdentified=e,t&&(this.userContext={...this.userContext,...t}),this._notify("identificationChange",{isIdentified:e,userContext:t})}setConversations(e){this.conversations=e,this._updateUnreadCount(),this._notify("conversationsUpdate",{conversations:e})}addConversation(e){this.conversations.unshift(e),this._updateUnreadCount(),this._notify("conversationAdded",{conversation:e})}setMessages(e,t){this.messages[e]=t,this._notify("messagesUpdate",{conversationId:e,messages:t})}_getMessageAttachmentsSignature(e){return Array.isArray(e?.attachments)&&0!==e.attachments.length?e.attachments.map(e=>`${e?.type||""}:${e?.name||""}`).join("|"):""}_findOptimisticMatchIndex(e,t,n){const s=this.messages[e]||[],i=Date.parse(t.timestamp),a=this._getMessageAttachmentsSignature(t);for(let e=s.length-1;e>=0;e--){const r=s[e];if(!r?.isOptimistic||!r?.isOwn)continue;if((r.content||"")!==(t.content||""))continue;if(this._getMessageAttachmentsSignature(r)!==a)continue;const o=Date.parse(r.timestamp);if(Number.isNaN(i)||Number.isNaN(o)||Math.abs(i-o)<=n)return e}return-1}_updateConversationFromMessage(e,t,n){const s=this.conversations.find(t=>t.id===e);s&&(s.lastMessage=t.content,s.lastMessageTime=t.timestamp,n&&!t.isOwn&&(s.unread=(s.unread||0)+1,this._updateUnreadCount()))}upsertMessage(e,t,n={}){this.messages[e]||(this.messages[e]=[]);const s=!0===n.reconcileOwnOptimistic,i=n.optimisticMatchWindowMs||3e4,a=this.messages[e],r=null!=t?.id?a.findIndex(e=>e?.id===t.id):-1;if(-1!==r)return a[r]={...a[r],...t,isOptimistic:!1},this._updateConversationFromMessage(e,a[r],!1),this._notify("messagesUpdate",{conversationId:e,messages:[...a]}),a[r];if(s&&t?.isOwn){const n=this._findOptimisticMatchIndex(e,t,i);if(-1!==n)return a[n]={...a[n],...t,isOptimistic:!1},this._updateConversationFromMessage(e,a[n],!1),this._notify("messagesUpdate",{conversationId:e,messages:[...a]}),a[n]}const o={...t,isOptimistic:Boolean(t?.isOptimistic)};return a.push(o),this._updateConversationFromMessage(e,o,!0),this._notify("messageAdded",{conversationId:e,message:o}),o}addMessage(e,t){return this.upsertMessage(e,t)}updateConversation(e,t){const n=this.conversations.find(t=>t.id===e);return n?(Object.assign(n,t),this._notify("conversationUpdated",{conversationId:e,conversation:n}),n):null}markAsRead(e){const t=this.conversations.find(t=>t.id===e);t&&t.unread>0&&(t.unread=0,this._updateUnreadCount(),this._notify("conversationRead",{conversationId:e}))}_updateUnreadCount(){this.unreadCount=this.conversations.reduce((e,t)=>e+(t.unread||0),0),this._notify("unreadCountChange",{count:this.unreadCount})}setHelpArticles(e){this.helpArticles=e,this._notify("helpArticlesUpdate",{articles:e})}setHelpSearchQuery(e){this.helpSearchQuery=e,this._notify("helpSearchChange",{query:e})}setHomeChangelogItems(e){this.homeChangelogItems=e,this._notify("homeChangelogUpdate",{items:e})}setChangelogItems(e){this.changelogItems=e,this._notify("changelogUpdate",{items:e})}getActiveConversation(){return this.conversations.find(e=>e.id===this.activeConversationId)}getActiveMessages(){return this.messages[this.activeConversationId]||[]}setTeamAvatarsFromAgents(e){e&&0!==e.length&&(this.teamAvatars=e.map(e=>e.picture?e.picture:e.full_name||"?"),this._notify("teamAvatarsUpdate",{teamAvatars:this.teamAvatars}))}getFilteredHelpArticles(){if(!this.helpSearchQuery)return this.helpArticles;const e=this.helpSearchQuery.toLowerCase();return this.helpArticles.filter(t=>t.title.toLowerCase().includes(e)||t.description&&t.description.toLowerCase().includes(e))}reset(){this.currentView="home",this.activeConversationId=null,this.helpSearchQuery="",this._notify("reset",{})}}class z{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",primaryColor:t.primaryColor||"#155EEF",...t},this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className=`messenger-launcher messenger-launcher-${this.options.position}`,this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe((e,t)=>{"openChange"===e&&this._updateIcon(),"unreadCountChange"===e&&this._updateBadge()}),this.element}_updateContent(){const e=this.state.unreadCount>0?`<span class="messenger-launcher-badge">${this.state.unreadCount>9?"9+":this.state.unreadCount}</span>`:"";this.element.innerHTML=`\n <button class="messenger-launcher-btn" aria-label="Open messenger">\n <span class="messenger-launcher-icon messenger-launcher-icon-chat">\n <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 256 256">\n <path d="M144,140a12,12,0,1,1-12-12A12,12,0,0,1,144,140Zm44-12a12,12,0,1,0,12,12A12,12,0,0,0,188,128Zm51.34,83.47a16,16,0,0,1-19.87,19.87l-24.71-7.27A80,80,0,0,1,86.43,183.42a79,79,0,0,1-25.19-7.35l-24.71,7.27a16,16,0,0,1-19.87-19.87l7.27-24.71A80,80,0,1,1,169.58,72.59a80,80,0,0,1,62.49,114.17ZM81.3,166.3a79.94,79.94,0,0,1,70.38-93.87A64,64,0,0,0,39.55,134.19a8,8,0,0,1,.63,6L32,168l27.76-8.17a8,8,0,0,1,6,.63A63.45,63.45,0,0,0,81.3,166.3Zm135.15,15.89a64,64,0,1,0-26.26,26.26,8,8,0,0,1,6-.63L224,216l-8.17-27.76A8,8,0,0,1,216.45,182.19Z"></path>\n </svg>\n </span>\n <span class="messenger-launcher-icon messenger-launcher-icon-close" style="display: none;">\n <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 256 256">\n <path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n </svg>\n </span>\n ${e}\n </button>\n `;const t=this.element.querySelector(".messenger-launcher-btn");t&&this.options.primaryColor&&t.style.setProperty("background",this.options.primaryColor,"important")}_attachEvents(){this.element.querySelector(".messenger-launcher-btn").addEventListener("click",()=>{this.state.setOpen(!this.state.isOpen)})}_updateIcon(){const e=this.element.querySelector(".messenger-launcher-icon-chat"),t=this.element.querySelector(".messenger-launcher-icon-close");this.state.isOpen?(e.style.display="none",t.style.display="flex",this.element.classList.add("messenger-launcher-open")):(e.style.display="flex",t.style.display="none",this.element.classList.remove("messenger-launcher-open"))}_updateBadge(){const e=this.element.querySelector(".messenger-launcher-badge");if(e&&e.remove(),this.state.unreadCount>0&&!this.state.isOpen){const e=document.createElement("span");e.className="messenger-launcher-badge",e.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,this.element.querySelector(".messenger-launcher-btn").appendChild(e)}}show(){this.element&&(this.element.style.display="block")}hide(){this.element&&(this.element.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class ${constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-panel-nav",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"!==e&&"unreadCountChange"!==e||this._updateActiveTab()}),this.element}_getTabs(){const e=[{id:"home",label:"Home",icon:this._getHomeIcon()},{id:"messages",label:"Messages",icon:this._getMessagesIcon(),badge:this.state.unreadCount}];return this.state.enableHelp&&e.push({id:"help",label:"Help",icon:this._getHelpIcon()}),this.state.enableChangelog&&e.push({id:"changelog",label:"Changelog",icon:this._getChangelogIcon()}),e}_updateContent(){const e=this._getTabs().map(e=>{const t=this.state.currentView===e.id,n=e.badge&&e.badge>0?`<span class="messenger-nav-badge">${e.badge>9?"9+":e.badge}</span>`:"";return`\n\t\t\t\t<button class="messenger-nav-tab ${t?"active":""}" data-tab="${e.id}">\n\t\t\t\t\t<span class="messenger-nav-icon">${e.icon}</span>\n\t\t\t\t\t<span class="messenger-nav-label">${e.label}</span>\n\t\t\t\t\t${n}\n\t\t\t\t</button>\n\t\t\t`}).join("");this.element.innerHTML=`\n\t\t\t<div class="messenger-nav-tabs">\n\t\t\t\t${e}\n\t\t\t</div>\n\t\t\t<div class="messenger-nav-footer">\n\t\t\t\t<a href="https://product7.io" target="_blank" rel="noopener noreferrer" class="messenger-powered-by">\n\t\t\t\t\t<svg width="12" height="14" viewBox="0 0 28 32" fill="none" xmlns="http://www.w3.org/2000/svg">\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.0615 5.28044C8.5161 4.42949 3.30825 11.1456 5.89967 17.6588C6.9321 20.2538 9.06268 22.2644 11.8777 23.1968C16.2682 24.6507 18.4038 22.3222 19.0483 23.9691C19.4055 24.8894 18.7282 25.3209 17.988 25.4938C10.9146 27.15 5.15304 22.7566 3.5869 17.5531C1.52205 10.6941 5.98684 4.6667 11.3483 3.41065C17.8801 1.88094 24.0325 6.19355 24.3926 12.7175C24.7448 19.0921 18.6217 24.5978 11.927 22.2036C10.8789 21.8285 8.8419 20.6682 8.46823 19.858C8.06026 18.9727 8.80261 18.1725 9.68285 18.3576C10.2223 18.4726 10.3116 18.8706 11.3161 19.5372C14.4549 21.6213 19.1276 20.6132 21.2046 17.0972C23.991 12.3817 21.0481 6.05351 15.06 5.27758L15.0615 5.28044Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.2492 2.19833C11.944 1.71463 8.88819 3.07214 6.91479 4.49682C2.27067 7.85488 0.76169 14.5038 3.49672 19.8731C4.08535 21.0096 4.84379 22.0497 5.7459 22.9576L7.16343 24.2515C7.67214 24.9131 7.27203 25.7176 6.64115 25.9269C5.13502 26.4271 2.0499 21.8172 1.42044 20.5383C0.0872204 17.8297 -0.312889 14.9047 0.242977 11.503C1.66908 2.77063 11.221 -2.51652 19.7197 1.21021C27.7548 4.73331 30.2733 15.4555 23.9351 22.0773C23.3107 22.7296 21.6352 24.4823 20.6278 23.8907C20.0076 23.5263 19.8933 22.6446 20.5192 22.1238C21.0301 21.6986 21.4759 21.435 21.9896 20.9734C23.6665 19.4688 25.2562 16.8752 25.3477 13.5636C25.4427 10.2055 24.1266 7.5848 22.3904 5.74859C20.6392 3.89665 18.6751 2.69919 15.2456 2.19691L15.2492 2.19833Z" fill="#F69F06"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M8.48332 27.2217C7.93817 26.265 8.89987 25.3776 10.1352 25.8641C15.5653 27.9926 18.3081 25.5269 19.0255 27.0823C19.2655 27.6039 19.0448 28.1619 18.7354 28.3863C17.9895 28.9257 14.82 28.9343 13.9262 28.8714C12.9071 28.8053 11.897 28.6377 10.9111 28.3713C10.0888 28.1348 8.88057 27.9247 8.48189 27.2281L8.48332 27.2217Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.8722 31.0607C15.7765 32.1381 14.579 32.0331 13.5766 31.9545C12.5742 31.8759 11.5203 31.8502 11.601 30.7013C11.6789 29.5882 12.8035 29.7532 13.8274 29.8332C14.4425 29.8811 15.9951 29.681 15.8722 31.0607Z" fill="#21244A"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\tPowered by <strong>Product7</strong>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`}_attachEvents(){this.element.addEventListener("click",e=>{const t=e.target.closest(".messenger-nav-tab");if(t){const e=t.dataset.tab;this.state.setView(e)}})}_updateActiveTab(){this.element.querySelectorAll(".messenger-nav-tab").forEach(e=>{const t=e.dataset.tab===this.state.currentView;if(e.classList.toggle("active",t),"messages"===e.dataset.tab){const t=e.querySelector(".messenger-nav-badge");if(t&&t.remove(),this.state.unreadCount>0){const t=document.createElement("span");t.className="messenger-nav-badge",t.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,e.appendChild(t)}}})}_getHomeIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">\n\t\t\t<path d="M40,216H216V120a8,8,0,0,0-2.34-5.66l-80-80a8,8,0,0,0-11.32,0l-80,80A8,8,0,0,0,40,120Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t</svg>'}_getMessagesIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><path d="M71.58,144,32,176V48a8,8,0,0,1,8-8H168a8,8,0,0,1,8,8v88a8,8,0,0,1-8,8Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><path d="M80,144v40a8,8,0,0,0,8,8h96.42L224,224V96a8,8,0,0,0-8-8H176" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></svg>'}_getHelpIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">\n\t\t\t<circle cx="128" cy="128" r="96" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t<circle cx="128" cy="180" r="12"/>\n\t\t\t<path d="M128,144v-8a28,28,0,1,0-28-28" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t</svg>'}_getChangelogIcon(){return'<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 256 256">\n\t\t\t<path d="M160,80V200.67a8,8,0,0,0,3.56,6.65l11,7.33a8,8,0,0,0,12.2-4.72L200,160" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t<path d="M40,200a8,8,0,0,0,13.15,6.12C105.55,162.16,160,160,160,160h40a40,40,0,0,0,0-80H160S105.55,77.84,53.15,33.89A8,8,0,0,0,40,40Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t</svg>'}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class L{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",...t},this.element=null,this.navigationTabs=null,this.currentViewComponent=null,this.viewRegistry={},this._unsubscribe=null}registerView(e,t){this.viewRegistry[e]=t}render(){this.element=document.createElement("div"),this.element.className=`messenger-panel messenger-panel-${this.options.position}`,this.element.innerHTML='\n\t\t\t<div class="messenger-panel-content">\n\t\t\t\t<div class="messenger-panel-views"></div>\n\t\t\t\t<div class="messenger-panel-nav"></div>\n\t\t\t</div>\n\t\t',this.navigationTabs=new $(this.state,this.options);return this.element.querySelector(".messenger-panel-nav").appendChild(this.navigationTabs.render()),this._renderCurrentView(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"===e&&this._renderCurrentView()}),this.element}_renderCurrentView(){const e=this.element.querySelector(".messenger-panel-views");this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),e.innerHTML="";const t=this.viewRegistry[this.state.currentView];t?(this.currentViewComponent=new t(this.state,this.options),e.appendChild(this.currentViewComponent.render())):e.innerHTML=`<div class="messenger-empty-state">\n\t\t\t\t<p>View not found: ${this.state.currentView}</p>\n\t\t\t</div>`}show(){this.element&&(this.element.style.display="block",requestAnimationFrame(()=>{this.element.classList.add("open")}))}hide(){this.element&&(this.element.classList.remove("open"),setTimeout(()=>{this.element&&(this.element.style.display="none")},300))}setHeader(e){const t=this.element.querySelector(".messenger-panel-header");t&&(t.innerHTML=e)}destroy(){this._unsubscribe&&this._unsubscribe(),this.navigationTabs&&this.navigationTabs.destroy(),this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class O{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-changelog-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"changelogUpdate"===e&&this._updateChangelogList()}),this.element}_updateContent(){this.element.innerHTML='\n\t\t\t<div class="messenger-changelog-header">\n\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-changelog-body">\n\t\t\t\t<div class="messenger-changelog-list"></div>\n\t\t\t</div>\n\t\t',this._updateChangelogList(),this._attachEvents()}_updateChangelogList(){const e=this.element.querySelector(".messenger-changelog-list"),t=this.state.changelogItems;0!==t.length?(e.innerHTML=t.map(e=>this._renderChangelogCard(e)).join(""),this._attachChangelogEvents()):e.innerHTML=this._renderEmptyState()}_renderChangelogCard(e){const t=e.tags&&e.tags.length>0?`<div class="messenger-changelog-tags">\n\t\t\t\t${e.tags.map(e=>`<span class="sdk-badge sdk-badge-primary messenger-changelog-tag">${e}</span>`).join("")}\n\t\t\t</div>`:"",n=this._formatDate(e.publishedAt||e.date);return`\n\t\t\t<div class="messenger-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-changelog-content">\n\t\t\t\t\t${t}\n\t\t\t\t\t<h3 class="messenger-changelog-title">${e.title}</h3>\n\t\t\t\t\t${e.description?`<p class="messenger-changelog-description">${this._truncateText(e.description,100)}</p>`:""}\n\t\t\t\t\t<div class="messenger-changelog-meta">\n\t\t\t\t\t\t<span class="messenger-changelog-date">${n}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack messenger-avatar-stack-tiny">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm">S</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack messenger-avatar-stack-tiny">${e.slice(0,2).map(e=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-sm"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-sm">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderEmptyState(){return'\n\t\t\t<div class="messenger-empty-state">\n\t\t\t\t<div class="messenger-empty-state-icon">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M228.54,86.66l-26.46,23.07A40,40,0,0,0,168,72.13L120.89,46.5a40,40,0,0,0-75.44-4l-22-19.2a8,8,0,0,0-10.5,12L35.44,54.77a40,40,0,0,0,50,61.07l47.1,25.64a40,40,0,0,0,75.41,4.07l26.46-23.07a8,8,0,0,0-10.5-12ZM56,96A24,24,0,1,1,77.25,82.75,24,24,0,0,1,56,96Zm144,64a24,24,0,1,1,24-24A24,24,0,0,1,200,160Z"></path>\n\t\t\t\t\t</svg>\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'}_formatDate(e){if(!e)return"";return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}_truncateText(e,t){return e?e.length<=t?e:e.substring(0,t).trim()+"...":""}_attachEvents(){this._attachChangelogEvents()}_attachChangelogEvents(){this.element.querySelectorAll(".messenger-changelog-card").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.changelogId,n=this.state.changelogItems.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onChangelogClick&&this.options.onChangelogClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class D{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null,this._typingTimeout=null,this._isTyping=!1,this._typingIndicator=null,this._isConversationClosed=!1,this._pendingAttachments=[]}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-chat-view",this._updateContent(),this._unsubscribe=this.state.subscribe((e,t)=>{"messageAdded"===e&&t.conversationId===this.state.activeConversationId?(this._hideTypingIndicator(),this._appendMessage(t.message),this._scrollToBottom()):"typingStarted"===e&&t.conversationId===this.state.activeConversationId?this._showTypingIndicator(t.userName):"typingStopped"===e&&t.conversationId===this.state.activeConversationId?this._hideTypingIndicator():("conversationUpdated"===e&&t.conversationId===this.state.activeConversationId||"messagesUpdate"===e&&t.conversationId===this.state.activeConversationId)&&this._updateContent()}),this.element}_updateContent(){const e=this.state.getActiveConversation(),t=this.state.getActiveMessages(),n=!this.state.activeConversationId,s=!n&&"closed"===e?.status;this._isConversationClosed=s;const i=0===t.length?this._renderEmptyState(n):t.map(e=>this._renderMessage(e)).join(""),a=n?"New conversation":e?.title||"Chat with team",r=n?"Start typing your message...":s?"Conversation closed":"Write a message...";this.element.innerHTML=`\n\t\t\t<div class="messenger-chat-header">\n\t\t\t\t<button class="sdk-btn-icon messenger-back-btn" aria-label="Back">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M165.66,202.34a8,8,0,0,1-11.32,11.32l-80-80a8,8,0,0,1,0-11.32l80-80a8,8,0,0,1,11.32,11.32L91.31,128Z"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<div class="messenger-chat-header-info">\n\t\t\t\t\t<span class="messenger-chat-title">${a}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class="sdk-close-btn" aria-label="Close">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-chat-messages">\n\t\t\t\t${i}\n\t\t\t\t${s?'\n\t\t\t\t<div class="messenger-closed-banner">\n\t\t\t\t\t<i class="ph ph-check-circle"></i>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t':""}\n\t\t\t\t<div class="messenger-typing-indicator">\n\t\t\t\t\t<div class="messenger-typing-dots">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class="messenger-typing-text"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t${s?"":`\n\t\t\t<div class="messenger-compose-attachments-preview"></div>\n\n\t\t\t<div class="messenger-chat-compose">\n<button class="sdk-btn-icon messenger-compose-attach" aria-label="Attach file">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="20" height="20">\n <rect width="256" height="256" fill="none"/>\n <path d="M160,80,76.69,164.69a16,16,0,0,0,22.63,22.62L198.63,86.63a32,32,0,0,0-45.26-45.26L54.06,142.06a48,48,0,0,0,67.88,67.88L204,128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n</button>\t\t\t\t<div class="messenger-compose-input-wrapper">\n\t\t\t\t\t<textarea class="messenger-compose-input" placeholder="${r}" rows="1"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class="messenger-compose-send" aria-label="Send" disabled>\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M227.32,28.68a16,16,0,0,0-15.66-4.08l-.15,0L19.57,82.84a16,16,0,0,0-2.49,29.8L102,154l41.3,84.87A15.86,15.86,0,0,0,157.74,248q.69,0,1.38-.06a15.88,15.88,0,0,0,14-11.51l58.2-191.94c0-.05,0-.1,0-.15A16,16,0,0,0,227.32,28.68ZM157.83,231.85l-.05.14L118.42,148.9l47.24-47.25a8,8,0,0,0-11.31-11.31L107.1,137.58,24,98.22l.14,0L216,40Z"></path>\n\t\t\t\t\t</svg>\n\t\t\t\t</button>\n\t\t\t\t<input type="file" class="messenger-compose-file-input" multiple accept="image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip" />\n\t\t\t</div>\n\t\t\t`}\n\t\t`,this._typingIndicator=this.element.querySelector(".messenger-typing-indicator"),this._attachEvents(),this._scrollToBottom(),this._renderAttachmentPreviews()}_renderEmptyState(e=!1){const t=this._renderTeamAvatars(),n=this.state.responseTime||"We typically reply within a few minutes",s=this.state.agentsOnline;return`\n\t\t\t<div class="messenger-chat-empty">\n\t\t\t\t<div class="messenger-chat-empty-avatars">${t}</div>\n\t\t\t\t<h3>${e?"Start a new conversation":"Start the conversation"}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class="messenger-chat-availability">\n\t\t\t\t\t<span class="messenger-availability-dot ${s?"messenger-availability-online":"messenger-availability-away"}"></span>\n\t\t\t\t\t<span>${s?"We're online now":n}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderMessageAttachments(e){return e&&0!==e.length?e.map(e=>"image"===e.type?`<img class="messenger-message-image" src="${this._escapeHtml(e.url)}" alt="${this._escapeHtml(e.name||"image")}" data-url="${this._escapeHtml(e.url)}" />`:`<a class="messenger-message-file" href="${this._escapeHtml(e.url)}" data-url="${this._escapeHtml(e.url)}" data-name="${this._escapeHtml(e.name||"file")}">\n\t\t\t\t<i class="ph ph-file"></i>\n\t\t\t\t<span>${this._escapeHtml(e.name||"file")}</span>\n\t\t\t\t<i class="ph ph-download-simple messenger-file-download-icon"></i>\n\t\t\t</a>`).join(""):""}_renderMessage(e){const t=e.isOwn,n=t?"messenger-message-own":"messenger-message-received",s=this._formatMessageTime(e.timestamp),i=this._renderMessageAttachments(e.attachments),a=e.content?`<div class="messenger-message-content">${this._formatMessageContent(e.content)}</div>`:"",r=a?`<div class="messenger-message-bubble">${a}</div>`:"";if(t)return`\n\t\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t\t${r}\n\t\t\t\t\t${i}\n\t\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t\t</div>\n\t\t\t`;const o=this._renderSenderAvatar(e.sender);return`\n\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t<div class="messenger-message-sender">${e.sender?.name||"Support"}</div>\n\t\t\t\t<div class="messenger-message-row">\n\t\t\t\t\t<div class="messenger-message-avatar">${o}</div>\n\t\t\t\t\t<div class="messenger-message-wrapper">\n\t\t\t\t\t\t${r}\n\t\t\t\t\t\t${i}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t</div>\n\t\t`}_renderSenderAvatar(e){if(e?.avatarUrl)return`<div class="sdk-avatar sdk-avatar-sm"><img src="${e.avatarUrl}" alt="${e.name}" /></div>`;return`<div class="sdk-avatar sdk-avatar-sm">${(e?.name||"S").charAt(0).toUpperCase()}</div>`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack">${e.slice(0,3).map(e=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-md"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-md">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_formatMessageTime(e){if(!e)return"";return new Date(e).toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}_formatMessageContent(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br>"):""}_appendMessage(e){const t=this.element.querySelector(".messenger-chat-messages"),n=t.querySelector(".messenger-chat-empty");n&&n.remove();const s=this._renderMessage(e),i=document.createElement("div");i.innerHTML=s,t.appendChild(i.firstElementChild)}_scrollToBottom(){const e=this.element.querySelector(".messenger-chat-messages");e&&setTimeout(()=>{e.scrollTop=e.scrollHeight},50)}_updateSendButtonState(){const e=this.element.querySelector(".messenger-compose-input"),t=this.element.querySelector(".messenger-compose-send");e&&t&&(t.disabled=!e.value.trim()&&0===this._pendingAttachments.length)}_renderAttachmentPreviews(){const e=this.element.querySelector(".messenger-compose-attachments-preview");if(e){if(0===this._pendingAttachments.length)return e.innerHTML="",void(e.style.display="none");e.style.display="flex",e.innerHTML=this._pendingAttachments.map((e,t)=>`\n\t\t\t\t<div class="messenger-attachment-preview" data-index="${t}">\n\t\t\t\t\t${e.type.startsWith("image")?`<img class="messenger-attachment-thumb" src="${e.preview}" alt="${this._escapeHtml(e.file.name)}" />`:'<div class="messenger-attachment-thumb messenger-attachment-file-icon"><i class="ph ph-file"></i></div>'}\n\t\t\t\t\t<button class="messenger-attachment-remove" data-index="${t}" aria-label="Remove">&times;</button>\n\t\t\t\t</div>\n\t\t\t`).join(""),e.querySelectorAll(".messenger-attachment-remove").forEach(e=>{e.addEventListener("click",e=>{const t=parseInt(e.currentTarget.dataset.index,10);this._pendingAttachments.splice(t,1),this._renderAttachmentPreviews(),this._updateSendButtonState()})})}}_attachEvents(){this.element.querySelector(".messenger-back-btn").addEventListener("click",()=>{this.state.setView("messages")}),this.element.querySelector(".sdk-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".messenger-compose-input"),t=this.element.querySelector(".messenger-compose-send");e&&t&&(e.addEventListener("input",()=>{e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px",this._updateSendButtonState(),e.value.trim()&&this._startTyping()}),e.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this._sendMessage())}),t.addEventListener("click",()=>{this._sendMessage()}));const n=this.element.querySelector(".messenger-compose-attach"),s=this.element.querySelector(".messenger-compose-file-input");n&&s&&(n.addEventListener("click",()=>{s.click()}),s.addEventListener("change",e=>{const t=e.target.files;t&&(Array.from(t).forEach(e=>{const t=new FileReader;t.onload=t=>{this._pendingAttachments.push({file:e,preview:t.target.result,type:e.type}),this._renderAttachmentPreviews(),this._updateSendButtonState()},t.readAsDataURL(e)}),s.value="")}));const i=this.element.querySelector(".messenger-chat-messages");i&&i.addEventListener("click",e=>{const t=e.target.closest(".messenger-message-file");if(t){e.preventDefault();const n=t.dataset.url,s=t.dataset.name;return void this._downloadFile(n,s)}const n=e.target.closest(".messenger-message-image");if(n){const e=n.dataset.url||n.src;window.open(e,"_blank")}})}async _downloadFile(e,t){try{const n=await fetch(e),s=await n.blob(),i=URL.createObjectURL(s),a=document.createElement("a");a.href=i,a.download=t||"download",a.style.display="none",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(i)}catch{window.open(e,"_blank")}}_escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}async _sendMessage(){if(this._isConversationClosed)return;const e=this.element.querySelector(".messenger-compose-input"),t=e.value.trim(),n=this._pendingAttachments.length>0;if(!t&&!n)return;this._stopTyping();const s=[...this._pendingAttachments];if(!this.state.activeConversationId)this.options.onStartConversation&&this.options.onStartConversation(t,s);else{const e={id:"msg_"+Date.now(),content:t,isOwn:!0,isOptimistic:!0,timestamp:(new Date).toISOString(),attachments:s.map(e=>({url:e.preview,type:e.type.startsWith("image")?"image":"file",name:e.file.name}))};this.state.addMessage(this.state.activeConversationId,e),this.options.onSendMessage&&this.options.onSendMessage(this.state.activeConversationId,e,s)}e.value="",e.style.height="auto",this._pendingAttachments=[],this._renderAttachmentPreviews(),this._updateSendButtonState()}_startTyping(){this._isConversationClosed||(!this._isTyping&&this.state.activeConversationId&&(this._isTyping=!0,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!0)),this._typingTimeout&&clearTimeout(this._typingTimeout),this._typingTimeout=setTimeout(()=>{this._stopTyping()},3e3))}_stopTyping(){this._isTyping&&this.state.activeConversationId&&(this._isTyping=!1,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!1)),this._typingTimeout&&(clearTimeout(this._typingTimeout),this._typingTimeout=null)}_showTypingIndicator(e){if(this._typingIndicator){this._typingIndicator.style.display="flex";const t=this._typingIndicator.querySelector(".messenger-typing-text");t&&(t.textContent=`${e||"Support"} is typing...`),this._scrollToBottom()}}_hideTypingIndicator(){this._typingIndicator&&(this._typingIndicator.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this._typingTimeout&&clearTimeout(this._typingTimeout),this._stopTyping(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class P{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null,this.avatarColors=["#155EEF","#8b5cf6","#10b981","#f59e0b","#ef4444","#ec4899","#06b6d4"]}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-conversations-view",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"conversationsUpdate"!==e&&"conversationAdded"!==e&&"conversationRead"!==e&&"conversationUpdated"!==e||this._updateContent()}),this.element}_getAvatarColor(e){const t=(e||"S").charCodeAt(0);return this.avatarColors[t%this.avatarColors.length]}_updateContent(){const e=this.state.conversations;let t;t=0===e.length?'\n <div class="messenger-empty-state">\n <div class="messenger-empty-state-icon">\n <svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n <path d="M216,48H40A16,16,0,0,0,24,64V224a15.85,15.85,0,0,0,9.24,14.5A16.13,16.13,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78.69.69,0,0,0,.13-.11L82.5,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H82.5a16,16,0,0,0-10.3,3.75l-.12.11L40,224V64H216Z"></path>\n </svg>\n </div>\n <h3>No conversations yet</h3>\n <p>Start a new conversation with our team</p>\n </div>\n ':`\n <div class="messenger-conversations-list">\n ${e.map(e=>this._renderConversationItem(e)).join("")}\n </div>\n `,this.element.innerHTML=`\n <div class="messenger-conversations-header">\n <h2>Messages</h2>\n <button class="sdk-close-btn" aria-label="Close">\n <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" width="18" height="18">\n <rect width="256" height="256" fill="none"/>\n <line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n</button>\n </div>\n\n <div class="messenger-conversations-body">\n ${t}\n </div>\n\n <div class="messenger-conversations-footer">\n <button class="messenger-new-message-btn">\n <span>Send us a message</span>\n <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256" style="flex-shrink: 0;">\n <rect width="256" height="256" fill="none"/>\n <line x1="144" y1="128" x2="80" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n <path d="M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n </svg>\n </button>\n </div>\n `,this._attachEvents()}_renderConversationItem(e){const t=e.unread>0?"unread":"",n=this._formatTimeAgo(e.lastMessageTime),s=this._renderConversationAvatars(e.participants);return`\n\t\t\t<div class="messenger-conversation-item ${t}" data-conversation-id="${e.id}">\n\t\t\t\t<div class="messenger-conversation-avatars">\n\t\t\t\t\t${s}\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-conversation-content">\n\t\t\t\t\t<div class="messenger-conversation-header">\n\t\t\t\t\t\t<span class="messenger-conversation-title">${e.title||"Chat with team"}</span>\n\t\t\t\t\t\t<span class="messenger-conversation-time">${n}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-conversation-preview">\n\t\t\t\t\t\t${e.unread>0?'<span class="messenger-unread-dot"></span>':""}\n\t\t\t\t\t\t<span class="messenger-conversation-message">${this._truncateMessage(e.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderConversationAvatars(e){if(!e||0===e.length){return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor("S")};">S</div>`}const t=e[0];if(t.avatarUrl)return`<div class="sdk-avatar sdk-avatar-md"><img src="${t.avatarUrl}" alt="${t.name}" /></div>`;const n=(t.name||"S").charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor(t.name)};">${n}</div>`}_renderAvatarStack(){const e=this.state.teamAvatars;if(!e||0===e.length){return`\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor("S")};">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor("T")};">T</div>\n\t\t\t\t</div>\n\t\t\t`}return`<div class="messenger-avatar-stack">${e.slice(0,2).map((e,t)=>{if("string"==typeof e&&e.startsWith("http"))return`<div class="sdk-avatar sdk-avatar-sm"><img src="${e}" alt="Team member" /></div>`;const n=e.charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor(e)};">${n}</div>`}).join("")}</div>`}_formatTimeAgo(e){if(!e)return"";const t=new Date(e),n=new Date-t,s=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return s<1?"now":s<60?`${s}m`:i<24?`${i}h`:a<7?`${a}d`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_truncateMessage(e){if(!e)return"No messages yet";return e.length<=50?e:e.substring(0,50)+"..."}_attachEvents(){const e=this.element.querySelector(".sdk-close-btn");e&&e.addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelectorAll(".messenger-conversation-item").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.conversationId;this.state.setActiveConversation(t),this.state.markAsRead(t),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t)})});const t=this.element.querySelector(".messenger-new-message-btn");t&&t.addEventListener("click",()=>{this._startNewConversation()})}_startNewConversation(){const e=this.state.conversations.find(e=>"open"===e.status);e?(this.state.setActiveConversation(e.id),this.state.markAsRead(e.id),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(e.id)):(this.state.setActiveConversation(null),this.options.onStartNewConversation?this.options.onStartNewConversation():this.state.setView("chat"))}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class N{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-help-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"helpArticlesUpdate"!==e&&"helpSearchChange"!==e||this._updateCollectionsList()}),this.element}_updateContent(){const e=this.state.helpSearchQuery||"";this.element.innerHTML=`\n\t\t\t<div class="messenger-help-header">\n\t\t\t\t<div class="messenger-help-header-top">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class="sdk-close-btn" aria-label="Close">\n\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t\t<path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<input\n\t\t\t\t\ttype="text"\n\t\t\t\t\tclass="messenger-help-search-input"\n\t\t\t\t\tplaceholder="Search for help..."\n\t\t\t\t\tvalue="${e}"\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-help-body">\n\t\t\t\t<div class="messenger-help-collections"></div>\n\t\t\t</div>\n\t\t`,this._updateCollectionsList(),this._attachEvents()}_updateCollectionsList(){const e=this.element.querySelector(".messenger-help-collections"),t=this.state.helpArticles||[],n=(this.state.helpSearchQuery||"").toLowerCase(),s=n?t.filter(e=>e.title.toLowerCase().includes(n)||e.description&&e.description.toLowerCase().includes(n)):t,i=this.element.querySelector(".messenger-help-collections-header");i&&(i.textContent=`${s.length} collections`),0!==s.length?(e.innerHTML=s.map(e=>this._renderCollectionItem(e)).join(""),this._attachCollectionEvents()):e.innerHTML=this._renderEmptyState()}_renderCollectionItem(e){const t=e.articleCount||0;return`\n\t\t\t<div class="messenger-help-collection" data-collection-id="${e.id}">\n\t\t\t\t<div class="messenger-help-collection-content">\n\t\t\t\t\t<h3 class="messenger-help-collection-title">${e.title}</h3>\n\t\t\t\t\t<p class="messenger-help-collection-desc">${e.description||""}</p>\n\t\t\t\t\t<span class="messenger-help-collection-count">${t} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#000000" viewBox="0 0 256 256" class="messenger-help-collection-arrow">\n\t\t\t\t\t<path d="M181.66,133.66l-80,80a8,8,0,0,1-11.32-11.32L164.69,128,90.34,53.66a8,8,0,0,1,11.32-11.32l80,80A8,8,0,0,1,181.66,133.66Z"></path>\n\t\t\t\t</svg>\n\t\t\t</div>\n\t\t`}_renderEmptyState(){return this.state.helpSearchQuery?'\n\t\t\t\t<div class="messenger-empty-state">\n\t\t\t\t\t<div class="messenger-empty-state-icon">\n\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t\t<path d="M229.66,218.34l-50.07-50.06a88.11,88.11,0,1,0-11.31,11.31l50.06,50.07a8,8,0,0,0,11.32-11.32ZM40,112a72,72,0,1,1,72,72A72.08,72.08,0,0,1,40,112Z"></path>\n\t\t\t\t\t\t</svg>\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\t<div class="messenger-empty-state">\n\t\t\t\t<div class="messenger-empty-state-icon">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" fill="currentColor" viewBox="0 0 256 256">\n\t\t\t\t\t\t<path d="M128,24A104,104,0,1,0,232,128,104.11,104.11,0,0,0,128,24Zm0,192a88,88,0,1,1,88-88A88.1,88.1,0,0,1,128,216Zm16-40a8,8,0,0,1-8,8,16,16,0,0,1-16-16V128a8,8,0,0,1,0-16,16,16,0,0,1,16,16v40A8,8,0,0,1,144,176ZM112,84a12,12,0,1,1,12,12A12,12,0,0,1,112,84Z"></path>\n\t\t\t\t\t</svg>\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'}_attachEvents(){this.element.querySelector(".sdk-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});let e;this.element.querySelector(".messenger-help-search-input").addEventListener("input",t=>{clearTimeout(e),e=setTimeout(()=>{this.state.setHelpSearchQuery(t.target.value)},300)}),this._attachCollectionEvents()}_attachCollectionEvents(){this.element.querySelectorAll(".messenger-help-collection").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.collectionId,n=this.state.helpArticles.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onArticleClick&&this.options.onArticleClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class B{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-home-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"homeChangelogUpdate"!==e&&"conversationsUpdate"!==e&&"availabilityUpdate"!==e||this._updateContent()}),this.element}_updateContent(){const e=this._renderAvatarStack(),t=this._renderRecentChangelog();this.element.innerHTML=`\n\t\t\t<div class="messenger-home-scroll">\n\t\t\t\t<div class="messenger-home-header">\n\t\t\t\t\t<div class="messenger-home-header-top">\n\t\t\t\t\t\t<div class="messenger-home-logo">\n\t\t\t\t\t\t\t${this.options.logoUrl?`<img src="${this.options.logoUrl}" alt="${this.state.teamName}" />`:""}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="messenger-home-avatars">${e}</div>\n\t\t\t\t\t\t<button class="sdk-close-btn" aria-label="Close">\n\t\t\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#000000" viewBox="0 0 256 256">\n\t\t\t\t\t\t\t\t<path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path>\n\t\t\t\t\t\t\t</svg>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-home-welcome">\n\t\t\t\t\t\t<span class="messenger-home-greeting">Hi there 👋</span>\n\t\t\t\t\t\t<span class="messenger-home-question">${this.state.welcomeMessage}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="messenger-home-body">\n\t\t\t\t\t${this._renderMessageButton()}\n\t\t\t\t\t${this._renderFeaturedCard()}\n\t\t\t\t\t${t}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderAvatarStack(){const e=this.state.teamAvatars,t=["#5856d6","#007aff","#34c759","#ff9500"];if(!e||0===e.length)return`\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-lg" style="background: ${t[0]};">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-lg" style="background: ${t[1]};">T</div>\n\t\t\t\t</div>\n\t\t\t`;return`<div class="messenger-avatar-stack">${e.slice(0,4).map((e,n)=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-lg"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-lg" style="background: ${t[n%t.length]};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderAvailabilityStatus(){const e=this.state.agentsOnline,t=this.state.responseTime||"We typically reply within a few minutes";return e?'\n\t\t\t\t<div class="messenger-home-availability">\n\t\t\t\t\t<span class="messenger-availability-dot messenger-availability-online"></span>\n\t\t\t\t\t<span class="messenger-availability-text">We\'re online now</span>\n\t\t\t\t</div>\n\t\t\t':`\n\t\t\t<div class="messenger-home-availability">\n\t\t\t\t<span class="messenger-availability-dot messenger-availability-away"></span>\n\t\t\t\t<span class="messenger-availability-text">${t}</span>\n\t\t\t</div>\n\t\t`}_renderMessageButton(){const e=this.state.conversations.find(e=>"open"===e.status),t='\n\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256" style="flex-shrink: 0;">\n\t\t\t\t<rect width="256" height="256" fill="none"/>\n\t\t\t\t<line x1="144" y1="128" x2="80" y2="128" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t\t<path d="M48.49,221.28A8,8,0,0,0,59.93,231l168-96.09a8,8,0,0,0,0-14l-168-95.85a8,8,0,0,0-11.44,9.67L80,128Z" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t</svg>\n\t\t',n='\n\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 256 256" style="flex-shrink: 0;">\n\t\t\t\t<rect width="256" height="256" fill="none"/>\n\t\t\t\t<polyline points="96 48 176 128 96 208" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/>\n\t\t\t</svg>\n\t\t';return e?`\n\t\t\t\t<button class="messenger-home-message-btn messenger-home-continue-btn" data-conversation-id="${e.id}">\n\t\t\t\t\t<div class="messenger-home-continue-info">\n\t\t\t\t\t\t<span class="messenger-home-continue-label">Continue conversation</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t${t}\n\t\t\t\t</button>\n\t\t\t\t<button class="messenger-home-message-btn messenger-feedback-btn" data-action="feedback">\n\t\t\t\t\t<span class="messenger-home-continue-label">Leave us feedback</span>\n\t\t\t\t\t${n}\n\t\t\t\t</button>\n\t\t\t`:`\n\t\t\t<button class="messenger-home-message-btn">\n\t\t\t\t<span>Start a conversation</span>\n\t\t\t\t${t}\n\t\t\t</button>\n\t\t\t<button class="messenger-home-message-btn messenger-feedback-btn" data-action="feedback">\n\t\t\t\t<span>Leave us feedback</span>\n\t\t\t\t${n}\n\t\t\t</button>\n\t\t`}_renderFeaturedCard(){if(!this.options.featuredContent)return"";const{title:e,description:t,imageUrl:n,action:s}=this.options.featuredContent;return`\n\t\t\t<div class="messenger-home-featured">\n\t\t\t\t${n?`<img src="${n}" alt="${e}" class="messenger-home-featured-image" onerror="this.style.display='none';" />`:""}\n\t\t\t\t<div class="messenger-home-featured-content">\n\t\t\t\t\t<h3>${e}</h3>\n\t\t\t\t\t<p>${t}</p>\n\t\t\t\t</div>\n\t\t\t\t${s?`<button class="sdk-btn sdk-btn-primary messenger-home-featured-btn" data-action="${s.type}" data-value="${s.value}">${s.label}</button>`:""}\n\t\t\t</div>\n\t\t`}_renderRecentChangelog(){const e=this.state.homeChangelogItems;if(0===e.length)return"";return`\n\t\t\t<div class="messenger-home-changelog-section">\n\t\t\t\t${e.map(e=>`\n\t\t\t<div class="messenger-home-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-home-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t\t${e.coverText?`<span class="messenger-home-changelog-cover-text">${e.coverText}</span>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-home-changelog-card-content">\n\t\t\t\t\t<h4 class="messenger-home-changelog-card-title">${e.title}</h4>\n\t\t\t\t\t<p class="messenger-home-changelog-card-desc">${e.description||""}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`).join("")}\n\t\t\t</div>\n\t\t`}_formatDate(e){if(!e)return"";const t=new Date(e),n=new Date,s=Math.floor((n-t)/864e5);return 0===s?"Today":1===s?"Yesterday":s<7?`${s}d ago`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_attachEvents(){this.element.querySelector(".sdk-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".messenger-home-message-btn:not(.messenger-feedback-btn)");e&&e.addEventListener("click",()=>{const t=e.dataset.conversationId;t?(this.state.setActiveConversation(t),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t)):(this.state.setActiveConversation(null),this.state.setView("chat"))});const t=this.element.querySelector(".messenger-feedback-btn");t&&t.addEventListener("click",()=>{const e=this.state.urls?.feedback;this.options.onFeedbackClick?this.options.onFeedbackClick():e?window.open(e,"_blank"):console.warn("[Messenger] No feedback destination configured. Set `feedbackUrl` in MessengerWidget options.")}),this.element.querySelectorAll(".messenger-home-changelog-card").forEach(e=>{e.addEventListener("click",()=>{const t=this.state.homeChangelogItems.find(t=>t.id===e.dataset.changelogId);t?.url?window.open(t.url,"_blank"):this.state.setView("changelog")})});const n=this.element.querySelector(".messenger-home-changelog-all");n&&n.addEventListener("click",()=>{this.state.setView("changelog")});const s=this.element.querySelector(".messenger-home-featured-btn");s&&s.addEventListener("click",()=>{const e=s.dataset.action,t=s.dataset.value;"url"===e?window.open(t,"_blank"):"view"===e&&this.state.setView(t)})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class F{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._isSubmitting=!1}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-prechat-view",this._updateContent(),this.element}_updateContent(){const e=this.state.userContext?.name||"",t=this.state.userContext?.email||"";this.element.innerHTML=`\n\t\t\t<div class="messenger-prechat-overlay">\n\t\t\t\t<div class="messenger-prechat-card">\n\t\t\t\t\t<h4 class="messenger-prechat-title">Get notified when we reply</h4>\n\t\t\t\t\t<form class="sdk-form-group" novalidate>\n\t\t\t\t\t\t<div class="sdk-form-group">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\t\tid="messenger-prechat-name"\n\t\t\t\t\t\t\t\tname="name"\n\t\t\t\t\t\t\t\tplaceholder="Name (optional)"\n\t\t\t\t\t\t\t\tvalue="${this._escapeHtml(e)}"\n\t\t\t\t\t\t\t\tautocomplete="name"\n\t\t\t\t\t\t\t\tclass="sdk-input"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="sdk-form-group">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="email"\n\t\t\t\t\t\t\t\tid="messenger-prechat-email"\n\t\t\t\t\t\t\t\tname="email"\n\t\t\t\t\t\t\t\tplaceholder="Email address"\n\t\t\t\t\t\t\t\tvalue="${this._escapeHtml(t)}"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t\tautocomplete="email"\n\t\t\t\t\t\t\t\tclass="sdk-input"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class="messenger-prechat-error" id="messenger-email-error"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="messenger-prechat-actions">\n\t\t\t\t\t\t\t<button type="button" class="sdk-btn sdk-btn-secondary messenger-prechat-skip">Skip</button>\n\t\t\t\t\t\t\t<button type="submit" class="sdk-btn sdk-btn-primary sdk-btn-block messenger-prechat-submit" disabled>\n\t\t\t\t\t\t\t\t<span class="messenger-prechat-submit-text">Continue</span>\n\t\t\t\t\t\t\t\t<span class="messenger-prechat-submit-loading">\n\t\t\t\t\t\t\t\t\t<i class="ph ph-spinner"></i>\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">S</div>\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-md">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack">${e.slice(0,3).map(e=>"string"==typeof e&&e.startsWith("http")?`<div class="sdk-avatar sdk-avatar-md"><img src="${e}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-md">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_escapeHtml(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"):""}_attachEvents(){const e=this.element.querySelector("form"),t=this.element.querySelector("#messenger-prechat-email"),n=this.element.querySelector(".messenger-prechat-submit"),s=this.element.querySelector(".messenger-prechat-skip"),i=()=>{const e=t.value.trim(),s=this._isValidEmail(e);return n.disabled=!s,s};t.addEventListener("input",()=>{this._clearError("messenger-email-error"),i()}),t.addEventListener("blur",()=>{const e=t.value.trim();e&&!this._isValidEmail(e)&&this._showError("messenger-email-error","Please enter a valid email")}),s.addEventListener("click",()=>{this.state.setView("chat")}),e.addEventListener("submit",async e=>{e.preventDefault(),this._isSubmitting||(i()?await this._handleSubmit():this._showError("messenger-email-error","Please enter a valid email"))}),i(),setTimeout(()=>t.focus(),100)}_isValidEmail(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}_showError(e,t){const n=this.element.querySelector(`#${e}`);n&&(n.textContent=t,n.style.display="block")}_clearError(e){const t=this.element.querySelector(`#${e}`);t&&(t.textContent="",t.style.display="none")}async _handleSubmit(){const e=this.element.querySelector("#messenger-prechat-name"),t=this.element.querySelector("#messenger-prechat-email"),n=this.element.querySelector(".messenger-prechat-submit"),s=n.querySelector(".messenger-prechat-submit-text"),i=n.querySelector(".messenger-prechat-submit-loading"),a=e.value.trim(),r=t.value.trim();this._isSubmitting=!0,n.disabled=!0,s.style.display="none",i.style.display="inline-flex";try{this.options.onIdentifyContact&&await this.options.onIdentifyContact({name:a,email:r}),this.state.setIdentified(!0,{name:a,email:r}),this._isSubmitting=!1;const e=this.state.pendingMessage;e&&this.options.onStartConversation?(this.state.pendingMessage=null,this.state.setView("chat"),await this.options.onStartConversation(e.content,e.attachments)):this.state.setView("chat")}catch(e){console.error("[PreChatFormView] Error submitting form:",e),this._showError("messenger-email-error","Something went wrong. Please try again."),this._isSubmitting=!1,n.disabled=!1,s.style.display="inline",i.style.display="none"}}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class j extends C{constructor(e){super({...e,type:"messenger"}),this.messengerOptions={position:e.position||"bottom-right",theme:e.theme||"light",primaryColor:e.primaryColor||"#155EEF",textColor:e.textColor||"#1d1d1f",backgroundColor:e.backgroundColor||"#ffffff",logoUrl:e.logoUrl||"https://product7.io/p7logo.svg",teamName:e.teamName||"Support",teamAvatars:e.teamAvatars||[],welcomeMessage:e.welcomeMessage||"How can we help?",enableHelp:!1!==e.enableHelp,enableChangelog:!1!==e.enableChangelog,featuredContent:e.featuredContent||null,feedbackUrl:e.feedbackUrl||null,changelogUrl:e.changelogUrl||null,helpUrl:e.helpUrl||null,roadmapUrl:e.roadmapUrl||null,onSendMessage:e.onSendMessage||null,onFeedbackClick:e.onFeedbackClick||null,onArticleClick:e.onArticleClick||null,onChangelogClick:e.onChangelogClick||null},this.messengerState=new T({teamName:this.messengerOptions.teamName,teamAvatars:this.messengerOptions.teamAvatars,welcomeMessage:this.messengerOptions.welcomeMessage,enableHelp:this.messengerOptions.enableHelp,enableChangelog:this.messengerOptions.enableChangelog,userContext:this.sdk?.apiService?.getUserContext()||null,urls:{feedback:this.messengerOptions.feedbackUrl,changelog:this.messengerOptions.changelogUrl,help:this.messengerOptions.helpUrl,roadmap:this.messengerOptions.roadmapUrl}}),this.launcher=null,this.panel=null,this.wsService=null,this._wsUnsubscribers=[],this._handleOpenChange=this._handleOpenChange.bind(this),this._handleWebSocketMessage=this._handleWebSocketMessage.bind(this),this._handleTypingStarted=this._handleTypingStarted.bind(this),this._handleTypingStopped=this._handleTypingStopped.bind(this),this._handleConversationClosed=this._handleConversationClosed.bind(this)}_render(){const e=document.createElement("div");return e.className=`messenger-widget theme-${this.messengerOptions.theme}`,e.style.zIndex="999999",function(e={}){const{primaryColor:t="#155EEF",textColor:n="#1d1d1f",backgroundColor:s="#ffffff",theme:i="light"}=e;let a=document.getElementById("product7-messenger-custom-styles");a||(a=document.createElement("style"),a.id="product7-messenger-custom-styles",document.head.appendChild(a));const r=(e,t,n=1)=>{const s=parseInt(e.replace("#",""),16),i=Math.max(0,Math.min(255,(s>>16)+t)),a=Math.max(0,Math.min(255,(s>>8&255)+t)),r=Math.max(0,Math.min(255,(255&s)+t));return n<1?`rgba(${i}, ${a}, ${r}, ${n})`:"#"+(i<<16|a<<8|r).toString(16).padStart(6,"0")};a.textContent=`\n\t\t#product7-messenger-widget {\n\t\t\t--color-primary: ${t} !important;\n\t\t\t--color-primary-hover: ${r(t,-10)} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn {\n\t\t\tbackground: ${t} !important;\n\t\t}\n\n\t\t.messenger-launcher-btn:hover {\n\t\t\tbox-shadow: 0 8px 24px ${r(t,0,.3)} !important;\n\t\t}\n\n\t\t.sdk-btn-primary {\n\t\t\tbackground: ${t} !important;\n\t\t\tborder-color: ${t} !important;\n\t\t}\n\n\t\t.sdk-btn-primary:hover {\n\t\t\tbackground: ${r(t,-10)} !important;\n\t\t\tborder-color: ${r(t,-10)} !important;\n\t\t}\n\n\t\t.messenger-compose-send {\n\t\t\tbackground: ${t} !important;\n\t\t}\n\n\t\t.messenger-compose-send:hover:not(:disabled) {\n\t\t\tbackground: ${r(t,-10)} !important;\n\t\t}\n\n\t\t.messenger-nav-tab.active .messenger-nav-icon,\n\t\t.messenger-nav-tab.active .messenger-nav-label {\n\t\t\tcolor: ${t} !important;\n\t\t}\n\n\t\t.messenger-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${r(t,0,.08)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t${"#ffffff"!==s?`\n\t\t.messenger-panel-content {\n\t\t\tbackground: ${s} !important;\n\t\t}\n\t\t`:""}\n\n\t\t${"#1d1d1f"!==n?`\n\t\t.messenger-panel-content,\n\t\t.messenger-view {\n\t\t\tcolor: ${n} !important;\n\t\t}\n\t\t`:""}\n\t`,console.log("✅ Custom messenger styles applied:",{primaryColor:t,theme:i})}({primaryColor:this.messengerOptions.primaryColor,textColor:this.messengerOptions.textColor,backgroundColor:this.messengerOptions.backgroundColor,theme:this.messengerOptions.theme}),this.launcher=new z(this.messengerState,{position:this.messengerOptions.position,primaryColor:this.messengerOptions.primaryColor}),e.appendChild(this.launcher.render()),this.panel=new L(this.messengerState,{position:this.messengerOptions.position,theme:this.messengerOptions.theme,primaryColor:this.messengerOptions.primaryColor,logoUrl:this.messengerOptions.logoUrl,featuredContent:this.messengerOptions.featuredContent,onSendMessage:this.messengerOptions.onSendMessage||this._handleSendMessage.bind(this),onStartConversation:this._handleStartConversation.bind(this),onTyping:this.sendTypingIndicator.bind(this),onSelectConversation:this._handleSelectConversation.bind(this),onStartNewConversation:this._handleNewConversationClick.bind(this),onIdentifyContact:this._handleIdentifyContact.bind(this),onFeedbackClick:this.messengerOptions.onFeedbackClick,onArticleClick:this.messengerOptions.onArticleClick,onChangelogClick:this.messengerOptions.onChangelogClick}),this.panel.registerView("home",B),this.panel.registerView("messages",P),this.panel.registerView("chat",D),this.panel.registerView("prechat",F),this.panel.registerView("help",N),this.panel.registerView("changelog",O),e.appendChild(this.panel.render()),this.panel.hide(),e}_attachEvents(){this._stateUnsubscribe=this.messengerState.subscribe((e,t)=>{"openChange"===e&&this._handleOpenChange(t.isOpen),"conversationChange"===e&&this._handleActiveConversationChange(t.conversationId,t.previousConversationId)})}_handleOpenChange(e){e?(this.panel.show(),this.sdk.eventBus.emit("messenger:opened",{widget:this})):(this.panel.hide(),this.messengerState.reset(),this.sdk.eventBus.emit("messenger:closed",{widget:this}))}_handleActiveConversationChange(e,t){t&&this.wsService&&this.wsService.send("conversation:unsubscribe",{conversation_id:t}),e&&this.wsService&&this.wsService.send("conversation:subscribe",{conversation_id:e})}async _handleStartConversation(e,t){try{if(!this.messengerState.isIdentified)return this.messengerState.pendingMessage={content:e,attachments:t},this.messengerState.setView("prechat"),null;const n=this.messengerState.conversations.find(e=>"open"===e.status);return n?(this.messengerState.setActiveConversation(n.id),await this._handleSendMessage(n.id,{content:e},t),n):await this.startNewConversation(e,"",t)}catch(e){return console.error("[MessengerWidget] Failed to start conversation:",e),null}}async _handleSelectConversation(e){try{await this.fetchMessages(e)}catch(e){console.error("[MessengerWidget] Failed to fetch messages:",e)}}_handleNewConversationClick(){const e=this.messengerState.conversations.find(e=>"open"===e.status);e?(this.messengerState.setActiveConversation(e.id),this.messengerState.setView("chat"),this._handleSelectConversation(e.id)):(this.messengerState.setActiveConversation(null),this.messengerState.setView("chat"))}async _handleIdentifyContact(e){try{const t=await this.apiService.identifyContact({name:e.name,email:e.email});return t.status&&(console.log("[MessengerWidget] Contact identified:",t.data.contact_id),this.messengerState.setIdentified(!0,{name:e.name,email:e.email})),t}catch(e){throw console.error("[MessengerWidget] Failed to identify contact:",e),e}}markAsIdentified(e,t){this.messengerState.setIdentified(!0,{name:e,email:t}),console.log("[MessengerWidget] Marked as identified:",t)}async _handleUploadFile(e,t){try{const n=await this.apiService.uploadFile(e,t);if(n.status&&n.url)return n.url;throw new Error("Upload failed")}catch(e){throw console.error("[MessengerWidget] Failed to upload file:",e),e}}async _uploadPendingAttachments(e){if(!e||0===e.length)return[];const t=[];for(const n of e)try{const e=await this._handleUploadFile(n.preview,n.file.name);t.push({url:e,type:n.type.startsWith("image")?"image":"file",name:n.file.name})}catch(e){console.error("[MessengerWidget] Skipping failed attachment upload:",n.file.name,e)}return t}async _handleSendMessage(e,t,n){this.sdk.eventBus.emit("messenger:messageSent",{widget:this,conversationId:e,message:t});try{const s=await this._uploadPendingAttachments(n),i=await this.apiService.sendMessage(e,{content:t.content,attachments:s});i.status&&i.data&&console.log("[MessengerWidget] Message sent:",i.data.id),this.apiService?.mock&&setTimeout(()=>{const t={id:"msg_"+Date.now(),content:"Thanks for your message! We'll get back to you soon.",isOwn:!1,timestamp:(new Date).toISOString(),sender:{name:"Support Team",avatarUrl:null}};this.messengerState.addMessage(e,t)},1500)}catch(e){console.error("[MessengerWidget] Failed to send message:",e)}}_handleWebSocketMessage(e){const{conversation_id:t,message:n}=e;let s=[];if(n.attachments)try{s="string"==typeof n.attachments?JSON.parse(n.attachments):n.attachments}catch(e){}const i={id:n.id,content:n.content,isOwn:"customer"===n.sender_type,timestamp:n.created_at,attachments:s.length>0?s:void 0,sender:{name:n.sender_name||"Support",avatarUrl:n.sender_avatar||null}};this.messengerState.upsertMessage(t,i,{reconcileOwnOptimistic:!0,optimisticMatchWindowMs:3e4}),this.messengerState.isOpen&&this.messengerState.activeConversationId===t||this._updateUnreadCount()}_handleTypingStarted(e){e.is_agent&&this.messengerState._notify("typingStarted",{conversationId:e.conversation_id,userName:e.user_name})}_handleTypingStopped(e){this.messengerState._notify("typingStopped",{conversationId:e.conversation_id})}_handleConversationClosed(e){const t=e?.conversation_id||e?.id||e?.conversation?.id;t&&this.messengerState.updateConversation(t,{status:"closed"})}async _updateUnreadCount(){try{const e=await this.apiService.getUnreadCount();e.status&&e.data&&(this.messengerState.unreadCount=e.data.unread_count||0,this.messengerState._notify("unreadCountChange",{count:this.messengerState.unreadCount}))}catch(e){console.error("[MessengerWidget] Failed to get unread count:",e)}}_initWebSocket(){this.wsService&&this.wsService.disconnect(),this.wsService=new M({baseURL:this.apiService.baseURL,workspace:this.apiService.workspace,sessionToken:this.apiService.sessionToken,mock:this.apiService.mock}),this._wsUnsubscribers.push(this.wsService.on("message",this._handleWebSocketMessage)),this._wsUnsubscribers.push(this.wsService.on("typing_started",this._handleTypingStarted)),this._wsUnsubscribers.push(this.wsService.on("typing_stopped",this._handleTypingStopped)),this._wsUnsubscribers.push(this.wsService.on("conversation_closed",this._handleConversationClosed)),this._wsUnsubscribers.push(this.wsService.on("connected",()=>{console.log("[MessengerWidget] WebSocket connected"),this.messengerState.activeConversationId&&this.wsService.send("conversation:subscribe",{conversation_id:this.messengerState.activeConversationId})})),this._wsUnsubscribers.push(this.wsService.on("disconnected",()=>{console.log("[MessengerWidget] WebSocket disconnected")})),this.wsService.connect()}open(){this.messengerState.setOpen(!0)}close(){this.messengerState.setOpen(!1)}toggle(){this.messengerState.setOpen(!this.messengerState.isOpen)}navigateTo(e){this.messengerState.setView(e),this.messengerState.isOpen||this.open()}setConversations(e){this.messengerState.setConversations(e)}addMessage(e,t){this.messengerState.addMessage(e,t)}setHelpArticles(e){this.messengerState.setHelpArticles(e)}setHomeChangelogItems(e){this.messengerState.setHomeChangelogItems(e)}setChangelogItems(e){this.messengerState.setChangelogItems(e)}setUnreadCount(e){this.messengerState.unreadCount=e,this.messengerState._notify("unreadCountChange",{count:e})}getState(){return{isOpen:this.messengerState.isOpen,currentView:this.messengerState.currentView,unreadCount:this.messengerState.unreadCount,conversations:this.messengerState.conversations}}async loadInitialData(){try{const e=await this._fetchConversations();this.messengerState.setConversations(e)}catch(e){console.error("[MessengerWidget] Failed to load conversations:",e)}if(this.messengerOptions.enableHelp)try{const e=await this._fetchHelpArticles();this.messengerState.setHelpArticles(e)}catch(e){console.error("[MessengerWidget] Failed to load help articles:",e)}if(this.messengerOptions.enableChangelog)try{const{homeItems:e,changelogItems:t}=await this._fetchChangelog();this.messengerState.setHomeChangelogItems(e),this.messengerState.setChangelogItems(t)}catch(e){console.error("[MessengerWidget] Failed to load changelog:",e)}}async _fetchConversations(){try{const e=await this.apiService.getConversations();return e.status&&e.data?e.data.map(e=>({id:e.id,title:e.subject||`Chat with ${e.assigned_user?.name||"Support"}`,participants:e.assigned_user?[{name:e.assigned_user.name,avatarUrl:e.assigned_user.avatar}]:[{name:"Support",avatarUrl:null}],lastMessage:e.preview||e.snippet||"",lastMessageTime:e.last_message_at,unread:e.unread||0,status:e.status})):[]}catch(e){return console.error("[MessengerWidget] Failed to fetch conversations:",e),[]}}async _fetchHelpArticles(){try{const e=await this.apiService.getHelpCollections();if(e.success&&e.data){const t=e.data.collections||e.data,n=(this.messengerOptions.helpUrl||"").replace(/\/$/,"");return t.map(e=>({id:e.id,title:e.title,description:e.description||"",articleCount:e.article_count||0,url:e.url_slug&&n?`${n}/collections/${e.url_slug}`:n||null}))}return[]}catch(e){return console.error("[MessengerWidget] Failed to fetch help articles:",e),[]}}async fetchMessages(e){try{const t=await this.apiService.getConversation(e);if(t.status&&t.data){const n=(t.data.messages||[]).map(e=>{let t;if(e.attachments)try{t="string"==typeof e.attachments?JSON.parse(e.attachments):e.attachments}catch(e){}return{id:e.id,content:e.content,isOwn:"customer"===e.sender_type,timestamp:e.created_at,attachments:t&&t.length>0?t:void 0,sender:{name:e.sender_name||("customer"===e.sender_type?"You":"Support"),avatarUrl:e.sender_avatar||null}}});return this.messengerState.setMessages(e,n),await this.apiService.markConversationAsRead(e),this.messengerState.markAsRead(e),n}return[]}catch(e){return console.error("[MessengerWidget] Failed to fetch messages:",e),[]}}async startNewConversation(e,t="",n=[]){try{const s=await this._uploadPendingAttachments(n),i=await this.apiService.startConversation({message:e,subject:t,attachments:s});if(i.status&&i.data){const t=i.data,n={id:t.id,title:t.subject||"New conversation",participants:[{name:"Support",avatarUrl:null}],lastMessage:e,lastMessageTime:t.created_at||(new Date).toISOString(),unread:0,status:"open"};return this.messengerState.addConversation(n),this.messengerState.setMessages(t.id,[{id:"msg_"+Date.now(),content:e,isOwn:!0,timestamp:(new Date).toISOString()}]),this.messengerState.setActiveConversation(t.id),this.messengerState.setView("chat"),t}return null}catch(e){return console.error("[MessengerWidget] Failed to start conversation:",e),null}}async sendTypingIndicator(e,t){try{await this.apiService.sendTypingIndicator(e,t)}catch(e){}}async checkAgentAvailability(){try{const e=await this.apiService.checkAgentsOnline();return e.status&&e.data?(this.messengerState.agentsOnline=e.data.agents_online,this.messengerState.onlineCount=e.data.online_count||0,this.messengerState.responseTime=e.data.response_time||"",e.data.available_agents&&this.messengerState.setTeamAvatarsFromAgents(e.data.available_agents),this.messengerState._notify("availabilityUpdate",e.data),e.data):{agents_online:!1,online_count:0}}catch(e){return console.error("[MessengerWidget] Failed to check availability:",e),{agents_online:!1,online_count:0}}}async _fetchChangelog(){if(this.apiService?.mock)return{homeItems:[{id:"changelog_5",title:"New integrations available",description:"Connect with more tools you love and streamline your workflow.",tags:["Integration"],coverImage:"https://images.unsplash.com/photo-1674027444485-cec3da58eef4?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-12096e5).toISOString(),url:"#"},{id:"changelog_2",title:"A new era of Insights has arrived",description:"We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.",tags:["New feature","AI"],coverImage:"https://images.unsplash.com/photo-1666875753105-c63a6f3bdc86?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-432e6).toISOString(),url:"#"},{id:"changelog_1",title:"The 2025 Customer Service Transformation Report",description:"Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.",tags:["Report"],coverImage:"https://images.unsplash.com/photo-1762330467475-a565d04e1808?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-1728e5).toISOString(),url:"#"}],changelogItems:[{id:"changelog_4",title:"Enhanced conversation analytics",description:"Get deeper insights into your customer conversations with our new analytics dashboard.",tags:["Analytics"],coverImage:"https://images.unsplash.com/photo-1523961131990-5ea7c61b2107?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-864e6).toISOString(),url:"#"},{id:"changelog_3",title:"Escalation guidance for complex issues",description:"New AI-powered escalation guidance helps your team handle complex customer issues more effectively.",tags:["New feature","AI"],coverImage:"https://images.unsplash.com/photo-1764773516703-b246ac2ad5ef?w=500&auto=format&fit=crop&q=60",publishedAt:new Date(Date.now()-6048e5).toISOString(),url:"#"}]};try{const e=await this.apiService.getChangelogs({limit:20});if(e.success&&e.data){const t=Array.isArray(e.data)?e.data:[],n=(this.messengerOptions.changelogUrl||"").replace(/\/$/,""),s=t.map(e=>({id:e.id,title:e.title,description:e.excerpt||e.description||"",tags:e.labels?e.labels.map(e=>e.name):[],coverImage:e.cover_image||null,publishedAt:e.published_at,url:e.slug&&n?`${n}/${e.slug}`:n||null}));return{homeItems:s.slice(0,3),changelogItems:s}}return{homeItems:[],changelogItems:[]}}catch(e){return console.error("[MessengerWidget] Failed to fetch changelog:",e),{homeItems:[],changelogItems:[]}}}async onMount(){this.loadInitialData(),this.apiService?.sessionToken&&this._initWebSocket(),this.checkAgentAvailability(),this._availabilityInterval=setInterval(()=>{this.checkAgentAvailability()},6e4)}onDestroy(){this._stateUnsubscribe&&this._stateUnsubscribe(),this.wsService&&this.wsService.disconnect(),this._wsUnsubscribers.forEach(e=>e()),this._wsUnsubscribers=[],this._availabilityInterval&&clearInterval(this._availabilityInterval)}destroy(){!function(){const e=document.getElementById("product7-messenger-custom-styles");e&&e.parentNode&&e.parentNode.removeChild(e)}(),this.launcher&&this.launcher.destroy(),this.panel&&this.panel.destroy(),this.onDestroy(),super.destroy()}}class q extends C{constructor(e){super({...e,type:"survey"}),this.surveyOptions={surveyId:e.surveyId||null,surveyType:e.surveyType||"nps",position:e.position||"bottom-right",title:e.title||null,description:e.description||null,lowLabel:e.lowLabel||null,highLabel:e.highLabel||null,ratingScale:e.ratingScale||e.scale||null,showFeedbackInput:"boolean"==typeof e.showFeedbackInput?e.showFeedbackInput:null,showSubmitButton:"boolean"==typeof e.showSubmitButton?e.showSubmitButton:null,autoSubmitOnSelect:"boolean"==typeof e.autoSubmitOnSelect?e.autoSubmitOnSelect:null,showTitle:"boolean"==typeof e.showTitle?e.showTitle:null,showDescription:"boolean"==typeof e.showDescription?e.showDescription:null,customQuestions:e.customQuestions||[],pages:Array.isArray(e.pages)?e.pages:[],respondentId:e.respondentId||null,email:e.email||null,onSubmit:e.onSubmit||null,onDismiss:e.onDismiss||null},this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1}}_render(){const e=document.createElement("div");return e.className="feedback-survey-container",e}_attachEvents(){}show(){return this._renderSurvey(),this.surveyState.isVisible=!0,this.sdk.eventBus.emit("survey:shown",{widget:this,type:this.surveyOptions.surveyType}),this}hide(){return this._closeSurvey(),this}_renderSurvey(){this._closeSurvey(!1);const e=this._getSurveyConfig(),t=this._isMultiPageSurvey(),n=this._isLastPage(),s=this._shouldShowFeedbackInput(),i=this._shouldShowActions(),a=this._shouldShowTitle(e),r=this._shouldShowDescription(e),o=t?`Page ${this.surveyState.currentPageIndex+1} of ${this.surveyOptions.pages.length}`:"",l=t&&!n?"Next":"Submit",c=t&&this.surveyState.currentPageIndex>0?'<button class="feedback-survey-back">Back</button>':"";"center"===this.surveyOptions.position&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-survey-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this._handleDismiss())),this.surveyElement=document.createElement("div"),this.surveyElement.className=`feedback-survey feedback-survey-${this.surveyOptions.position}${r&&!a?" feedback-survey-description-primary":""}`,this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256"><rect width="256" height="256" fill="none"/><line x1="200" y1="56" x2="56" y2="200" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/><line x1="200" y1="200" x2="56" y2="56" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="16"/></svg></button>\n\t\t\t${a?`<h3 class="feedback-survey-title">${e.title}</h3>`:""}\n\t\t\t${r?`<p class="feedback-survey-description">${e.description}</p>`:""}\n\t\t\t${t?`<div class="feedback-survey-progress">${o}</div>`:""}\n\t\t\t<div class="feedback-survey-content">${e.html}</div>\n\t\t\t${s?`<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${i?`<div class="feedback-survey-actions">\n\t\t\t\t${c}\n\t\t\t\t<button class="feedback-survey-submit">${l}</button>\n\t\t\t</div>`:""}\n\t\t`,document.body.appendChild(this.surveyElement),this._attachSurveyEvents(),requestAnimationFrame(()=>{this.surveyElement.style.opacity="1",this.surveyElement.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(1)":"translateY(0)"})}_getSurveyConfig(){if(this._isMultiPageSurvey())return this._getCurrentPageConfig();const e=this._getNPSScale(),t=`feedback-survey-rating-scale${e.values.length>7?" feedback-survey-rating-scale-compact":""}`,n=this.surveyOptions.lowLabel||(0===e.start?"Not likely":"Strongly Disagree"),s=this.surveyOptions.highLabel||(0===e.start?"Very likely":"Strongly Agree"),i=this.surveyOptions.description||this.surveyOptions.title||"How likely are you to recommend us?",a=this.surveyOptions.description||this.surveyOptions.title||"How satisfied are you?",r=this.surveyOptions.description||this.surveyOptions.title||"How easy was it?",o={nps:{title:this.surveyOptions.title||"",description:i,html:`\n\t\t\t\t\t<div class="${t}">\n\t\t\t\t\t\t${e.values.map(e=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-nps-btn feedback-survey-rating-scale-btn" data-score="${e}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t${this._renderScaleLabels(n,s)}\n\t\t\t\t`},csat:{title:this.surveyOptions.title||"",description:a,html:`\n\t\t\t\t\t<div class="feedback-survey-csat">\n\t\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-csat-btn" data-score="${t+1}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t${this._renderScaleLabels(this.surveyOptions.lowLabel||"Very dissatisfied",this.surveyOptions.highLabel||"Very satisfied")}\n\t\t\t\t`},ces:{title:this.surveyOptions.title||"",description:r,html:`\n\t\t\t\t\t<div class="feedback-survey-ces">\n\t\t\t\t\t\t${["Very Difficult","Difficult","Neutral","Easy","Very Easy"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-ces-btn" data-score="${t+1}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t`},custom:{title:this.surveyOptions.title||"Quick Feedback",description:this.surveyOptions.description||"Help us improve by answering a few questions.",html:this._renderCustomQuestions()}};return o[this.surveyOptions.surveyType]||o.nps}_getNPSScale(){const e=Number(this.surveyOptions.ratingScale),t=Number.isFinite(e)&&e>=2?e:5,n=11===t?0:1;return{scale:t,start:n,values:Array.from({length:t},(e,t)=>n+t)}}_renderScaleLabels(e,t){const n=e||"",s=t||"";return n||s?`\n\t\t\t<div class="feedback-survey-labels">\n\t\t\t\t<span>${n}</span>\n\t\t\t\t<span>${s}</span>\n\t\t\t</div>\n\t\t`:""}_isRatingSurveyType(e=this.surveyOptions.surveyType){return"nps"===e||"csat"===e||"ces"===e}_shouldShowTitle(e){return!(!e||!e.title)&&("boolean"==typeof this.surveyOptions.showTitle?this.surveyOptions.showTitle:!(!this._isMultiPageSurvey()&&this._isRatingSurveyType())||!e.description)}_shouldShowDescription(e){return"boolean"==typeof this.surveyOptions.showDescription?this.surveyOptions.showDescription:!this._isMultiPageSurvey()&&this._isRatingSurveyType()?Boolean(e&&(e.description||e.title)):Boolean(e&&e.description)}_shouldShowFeedbackInput(){return!this._isMultiPageSurvey()&&("boolean"==typeof this.surveyOptions.showFeedbackInput&&this.surveyOptions.showFeedbackInput)}_shouldAutoSubmitOnSelect(){return"boolean"==typeof this.surveyOptions.autoSubmitOnSelect?this.surveyOptions.autoSubmitOnSelect:!this._isMultiPageSurvey()&&(!0!==this.surveyOptions.showSubmitButton&&(this._isRatingSurveyType()&&!this._shouldShowFeedbackInput()))}_shouldShowActions(){return!!this._isMultiPageSurvey()||("boolean"==typeof this.surveyOptions.showSubmitButton?this.surveyOptions.showSubmitButton:!this._shouldAutoSubmitOnSelect())}_isMultiPageSurvey(){return Array.isArray(this.surveyOptions.pages)&&this.surveyOptions.pages.length>0}_getCurrentPage(){return this._isMultiPageSurvey()&&this.surveyOptions.pages[this.surveyState.currentPageIndex]||null}_isLastPage(){return!this._isMultiPageSurvey()||this.surveyState.currentPageIndex>=this.surveyOptions.pages.length-1}_getCurrentPageConfig(){const e=this._getCurrentPage();return e?{title:e.title||this.surveyOptions.title||"Quick Feedback",description:e.description||this.surveyOptions.description||"",html:this._renderSurveyPage(e)}:this._getFallbackSurveyConfig()}_getFallbackSurveyConfig(){return{title:this.surveyOptions.title||"Quick Feedback",description:this.surveyOptions.description||"",html:this._renderCustomQuestions()}}_renderSurveyPage(e){switch(e.type){case"rating":return this._renderRatingPage(e);case"multiple_choice":return this._renderMultipleChoicePage(e);default:return this._renderTextPage(e)}}_renderRatingPage(e){const t=e.id||`page_${this.surveyState.currentPageIndex}`,n=e.ratingConfig||e.rating_config||{},s=Number(n.scale)||5,i=n.survey_type||this.surveyOptions.surveyType||"csat",a=(this.surveyState.pageAnswers[t]||{}).rating,r="nps"===i?11===s?"Not likely":"Strongly Disagree":"",o="nps"===i?11===s?"Very likely":"Strongly Agree":"",l=n.low_label||this.surveyOptions.lowLabel||r,c=n.high_label||this.surveyOptions.highLabel||o,d=this._renderScaleLabels(l,c);if("nps"===i){const e=Number.isFinite(s)&&s>=2?s:5,n=11===e?0:1,i=Array.from({length:e},(e,t)=>n+t),r=i.length>7?" feedback-survey-rating-scale-compact":"",o="feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-rating-scale-btn";return`\n\t\t\t\t<div class="${`feedback-survey-rating-scale${r}`}" data-page-id="${t}">\n\t\t\t\t\t${i.map(e=>`<button class="${o}${a===e?" selected":""}" data-page-id="${t}" data-score="${e}">${e}</button>`).join("")}\n\t\t\t\t</div>\n\t\t\t\t${d}\n\t\t\t`}if("emoji"===i&&5===s){return`\n\t\t\t\t<div class="feedback-survey-csat" data-page-id="${t}">\n\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((e,n)=>{const s=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-csat-btn${a===s?" selected":""}" data-page-id="${t}" data-score="${s}">${e}</button>`}).join("")}\n\t\t\t\t</div>\n\t\t\t\t${d}\n\t\t\t`}return`\n\t\t\t<div class="feedback-survey-rating-scale" data-page-id="${t}">\n\t\t\t\t${[...Array(s).keys()].map(e=>{const n=e+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-rating-scale-btn${a===n?" selected":""}" data-page-id="${t}" data-score="${n}">${n}</button>`}).join("")}\n\t\t\t</div>\n\t\t\t${d}\n\t\t`}_renderMultipleChoicePage(e){const t=e.id||`page_${this.surveyState.currentPageIndex}`,n=e.multipleChoiceConfig||e.multiple_choice_config||{},s=Array.isArray(n.options)?n.options:[],i=!0===n.allow_multiple||!0===n.multiple,a=this.surveyState.pageAnswers[t]||{},r=Array.isArray(a.values)?a.values:a.value?[a.value]:[];return`\n\t\t\t<div class="feedback-survey-multiple-choice" data-page-id="${t}" data-multiple="${i}">\n\t\t\t\t${s.map((e,n)=>{const s=e.value||e.id||e.key||`option_${n}`,i=e.label||e.text||String(s);return`<button class="feedback-survey-page-choice-btn${r.includes(s)?" selected":""}" data-page-id="${t}" data-value="${s}">${i}</button>`}).join("")}\n\t\t\t</div>\n\t\t`}_renderTextPage(e){const t=e.id||`page_${this.surveyState.currentPageIndex}`;return`\n\t\t\t<div class="feedback-survey-text-page" data-page-id="${t}">\n\t\t\t\t<textarea class="feedback-survey-page-textarea" data-page-id="${t}" placeholder="Type your answer...">${(this.surveyState.pageAnswers[t]||{}).text||""}</textarea>\n\t\t\t</div>\n\t\t`}_renderCustomQuestions(){return this.surveyOptions.customQuestions&&0!==this.surveyOptions.customQuestions.length?this.surveyOptions.customQuestions.map((e,t)=>`\n\t\t\t<div class="sdk-form-group">\n\t\t\t\t<label class="sdk-label">${e.label}</label>\n\t\t\t\t${this._renderQuestionInput(e,t)}\n\t\t\t</div>\n\t\t`).join(""):`\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"].map(e=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-freq-btn" data-freq="${e}">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`}_renderQuestionInput(e,t){switch(e.type){case"select":return`\n\t\t\t\t\t<select class="feedback-survey-select" data-question="${e.id||t}">\n\t\t\t\t\t\t<option value="">${e.placeholder||"Select an option"}</option>\n\t\t\t\t\t\t${e.options.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}\n\t\t\t\t\t</select>\n\t\t\t\t`;case"text":return`\n\t\t\t\t\t<input type="text" class="feedback-survey-input" data-question="${e.id||t}" placeholder="${e.placeholder||""}">\n\t\t\t\t`;default:return""}}_attachSurveyEvents(){if(!this.surveyElement)return;this.surveyElement.querySelector(".feedback-survey-close").addEventListener("click",()=>this._handleDismiss());const e=this.surveyElement.querySelector(".feedback-survey-submit");e&&e.addEventListener("click",()=>this._handleSubmit());const t=this.surveyElement.querySelector(".feedback-survey-back");t&&t.addEventListener("click",()=>this._handleBack());const n=this.surveyElement.querySelector(".feedback-survey-textarea");n&&n.addEventListener("input",e=>{this.surveyState.feedback=e.target.value}),this._attachTypeSpecificEvents(),this._escapeHandler=e=>{"Escape"===e.key&&this._handleDismiss()},document.addEventListener("keydown",this._escapeHandler)}_attachTypeSpecificEvents(){if(this._isMultiPageSurvey())return void this._attachCurrentPageEvents();const e=this.surveyOptions.surveyType;"nps"===e&&this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(e=>{e.addEventListener("click",()=>this._selectNPS(parseInt(e.dataset.score)))}),"csat"===e&&this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCSAT(parseInt(e.dataset.score)))}),"ces"===e&&this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCES(parseInt(e.dataset.score)))}),"custom"===e&&(this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(e=>{e.addEventListener("click",()=>this._selectFrequency(e.dataset.freq))}),this.surveyElement.querySelectorAll(".feedback-survey-select").forEach(e=>{e.addEventListener("change",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}),this.surveyElement.querySelectorAll(".feedback-survey-input").forEach(e=>{e.addEventListener("input",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}))}_attachCurrentPageEvents(){const e=this._getCurrentPage();if(!e||!this.surveyElement)return;const t=e.id||`page_${this.surveyState.currentPageIndex}`;if("rating"===e.type&&this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(e=>{e.addEventListener("click",()=>{const n=parseInt(e.dataset.score);Number.isNaN(n)||(this._setPageAnswer(t,{rating:n}),this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(e=>e.classList.remove("selected")),e.classList.add("selected"))})}),"multiple_choice"===e.type){const e=this.surveyElement.querySelector(".feedback-survey-multiple-choice"),n=!!e&&"true"===e.dataset.multiple;this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(e=>{e.addEventListener("click",()=>{const s=e.dataset.value;if(!s)return;const i=this.surveyState.pageAnswers[t]||{},a=Array.isArray(i.values)?i.values:i.value?[i.value]:[];let r=[];if(n){r=a.includes(s)?a.filter(e=>e!==s):[...a,s]}else r=[s];this._setPageAnswer(t,{value:r[0]||null,values:r}),n||this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(e=>e.classList.remove("selected")),e.classList.toggle("selected",r.includes(s))})})}if("text"===e.type){const e=this.surveyElement.querySelector(".feedback-survey-page-textarea");e&&e.addEventListener("input",e=>{this._setPageAnswer(t,{text:e.target.value})})}}_selectNPS(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(t=>{parseInt(t.dataset.score)===e?t.classList.add("selected"):t.classList.remove("selected")}),this._maybeAutoSubmit()}_selectCSAT(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(t=>{parseInt(t.dataset.score)===e?t.classList.add("selected"):t.classList.remove("selected")}),this._maybeAutoSubmit()}_selectCES(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(t=>{parseInt(t.dataset.score)===e?t.classList.add("selected"):t.classList.remove("selected")}),this._maybeAutoSubmit()}_maybeAutoSubmit(){this._shouldAutoSubmitOnSelect()&&this._handleSubmit()}_selectFrequency(e){this.surveyState.customAnswers.frequency=e,this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(t=>{t.dataset.freq===e?t.classList.add("selected"):t.classList.remove("selected")})}async _handleSubmit(){const e=this.surveyOptions.surveyType;if(this.surveyState.isSubmitting)return;if(this._isMultiPageSurvey()){if(!this._validateCurrentPage())return;const e=this._getNextPageIndex();if(-1!==e&&e!==this.surveyState.currentPageIndex)return this.surveyState.currentPageIndex=e,void this._renderSurvey()}if(!this._isMultiPageSurvey()&&("nps"===e||"csat"===e||"ces"===e)&&null===this.surveyState.score)return void this._showError("Please select a rating");this.surveyState.isSubmitting=!0;const t=this._getRespondentContext(),n=this._normalizePageAnswersForSubmit(),s={...this.surveyState.customAnswers,...Object.keys(n).length>0&&{page_answers:n}},i={rating:this._getSubmissionRating(),feedback:this.surveyState.feedback,answers:s,...t.respondentId&&{respondentId:t.respondentId},...t.email&&{email:t.email}},a={type:e,score:this._getSubmissionRating(),feedback:this.surveyState.feedback,customAnswers:s,pageAnswers:n,timestamp:(new Date).toISOString()};try{this.surveyOptions.onSubmit&&this.surveyOptions.onSubmit(a);const t=this.surveyOptions.surveyId||`local_${e}_${Date.now()}`;await this.apiService.submitSurveyResponse(t,i)}catch(e){console.error("[SurveyWidget] Failed to submit survey:",e)}finally{this.surveyState.isSubmitting=!1}this.sdk.eventBus.emit("survey:submitted",{widget:this,response:a}),this._closeSurvey(),this._showSuccessNotification()}_handleBack(){this._isMultiPageSurvey()&&(this.surveyState.currentPageIndex<=0||(this.surveyState.currentPageIndex-=1,this._renderSurvey()))}_setPageAnswer(e,t){e&&(this.surveyState.pageAnswers[e]={...this.surveyState.pageAnswers[e]||{},...t})}_validateCurrentPage(){const e=this._getCurrentPage();if(!e||!1===e.required)return!0;const t=e.id||`page_${this.surveyState.currentPageIndex}`,n=this.surveyState.pageAnswers[t]||{};if("rating"===e.type&&"number"!=typeof n.rating)return this._showError("Please select a rating"),!1;if("multiple_choice"===e.type){const e=Boolean(n.value),t=Array.isArray(n.values)&&n.values.length>0;if(!e&&!t)return this._showError("Please select an option"),!1}return!!("text"!==e.type||n.text&&String(n.text).trim())||(this._showError("Please enter an answer"),!1)}_getNextPageIndex(){if(!this._isMultiPageSurvey())return-1;const e=this._getCurrentPage(),t=this.surveyOptions.pages.length,n=this.surveyState.currentPageIndex,s=n+1<t?n+1:-1,i=e?e.afterThisPage||e.after_this_page:null;if(!i)return s;const a=i.default;if(!a)return s;if("end_survey"===a)return-1;if("next_page"===a||"next"===a)return s;if("number"==typeof a)return a>=0&&a<t?a:s;if("string"==typeof a){const e=a.replace(/^page:/,""),t=this.surveyOptions.pages.findIndex(t=>t.id===e);return t>=0?t:s}return s}_getSubmissionRating(){if("number"==typeof this.surveyState.score)return this.surveyState.score;if(!this._isMultiPageSurvey())return null;for(const e of this.surveyOptions.pages){const t=e.id||`page_${this.surveyOptions.pages.indexOf(e)}`,n=this.surveyState.pageAnswers[t];if(n&&"number"==typeof n.rating)return n.rating}return null}_normalizePageAnswersForSubmit(){const e={};for(const[t,n]of Object.entries(this.surveyState.pageAnswers))null!=n&&(Array.isArray(n.values)&&n.values.length>0?e[t]=n.values:null==n.value||""===n.value?"number"!=typeof n.rating?"string"==typeof n.text&&n.text.trim()&&(e[t]=n.text.trim()):e[t]=n.rating:e[t]=n.value);return e}_getRespondentContext(){const e="function"==typeof this.sdk.getUserContext&&this.sdk.getUserContext()||{},t=this.apiService&&"function"==typeof this.apiService.getUserContext&&this.apiService.getUserContext()||{},n=this.options.userContext||{};return{respondentId:this.surveyOptions.respondentId||n.user_id||e.user_id||t.user_id||null,email:this.surveyOptions.email||n.email||e.email||t.email||null}}async _handleDismiss(){if(this.surveyOptions.surveyId)try{await this.apiService.dismissSurvey(this.surveyOptions.surveyId)}catch(e){console.error("[SurveyWidget] Failed to dismiss survey:",e)}this.surveyOptions.onDismiss&&this.surveyOptions.onDismiss(),this.sdk.eventBus.emit("survey:dismissed",{widget:this}),this._closeSurvey()}_showError(e){const t=this.surveyElement.querySelector(".feedback-survey-error");t&&t.remove();const n=document.createElement("div");n.className="feedback-survey-error",n.textContent=e;const s=this.surveyElement.querySelector(".feedback-survey-submit"),i=this.surveyElement.querySelector(".feedback-survey-actions"),a=s||i;a&&a.parentNode?a.parentNode.insertBefore(n,a):this.surveyElement.appendChild(n),setTimeout(()=>n.remove(),3e3)}_showSuccessNotification(){const e=document.createElement("div");e.className="feedback-survey-success",e.innerHTML='\n\t\t\t<div>\n\t\t\t\t<span style="font-size: 18px;">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t',document.body.appendChild(e),setTimeout(()=>{e.style.opacity="0",e.style.transition="opacity 0.3s ease",setTimeout(()=>e.remove(),300)},3e3)}_closeSurvey(e=!0){this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null);const t=this.surveyElement,n=this.backdropElement;t&&(t.style.opacity="0",t.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(0.95)":"translateY(20px)",setTimeout(()=>{t&&t.parentNode&&t.parentNode.removeChild(t)},300),this.surveyElement=null),n&&(n.style.opacity="0",setTimeout(()=>{n&&n.parentNode&&n.parentNode.removeChild(n)},300),this.backdropElement=null),e&&(this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1})}destroy(){this._closeSurvey(),super.destroy()}}class H extends C{constructor(e){super({...e,type:"tab"})}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-tab position-${this.options.position}`,e.innerHTML='\n <div class="feedback-tab-trigger">\n <span class="feedback-tab-text">Feedback</span>\n </div>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){this.element.querySelector(".feedback-tab-trigger").addEventListener("click",this.openModal)}updateText(e){const t=this.element?.querySelector(".feedback-tab-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class U{static widgets=new Map([["button",E],["tab",H],["inline",A],["survey",q],["messenger",j],["changelog",I]]);static register(e,t){if("string"!=typeof e||!e.trim())throw new g("Widget type must be a non-empty string");if("function"!=typeof t)throw new g("Widget class must be a constructor function");this.widgets.set(e,t)}static create(e,t={}){const n=this.widgets.get(e);if(!n){const t=Array.from(this.widgets.keys()).join(", ");throw new g(`Unknown widget type: ${e}. Available types: ${t}`)}try{return new n(t)}catch(t){throw new g(`Failed to create widget of type '${e}': ${t.message}`,t)}}static getAvailableTypes(){return Array.from(this.widgets.keys())}static isTypeRegistered(e){return this.widgets.has(e)}static unregister(e){return this.widgets.delete(e)}static clear(){this.widgets.clear()}static getWidgetClass(e){return this.widgets.get(e)}}class R{constructor(e={}){this.config=this._validateAndMergeConfig(e),this.initialized=!1,this.widgets=new Map,this.eventBus=new w,this.apiService=new y({apiUrl:this.config.apiUrl,workspace:this.config.workspace,siteId:this.config.siteId,sessionToken:this.config.sessionToken,userContext:this.config.userContext,mock:this.config.mock,debug:this.config.debug,env:this.config.env}),this._bindMethods()}async init(){if(this.initialized)return{alreadyInitialized:!0};try{const e=await this.apiService.init(this.config.userContext);return e.config&&(this.config=x(e.config,this.config)),this.initialized=!0,this.eventBus.emit("sdk:initialized",{config:this.config,sessionToken:e.sessionToken}),{initialized:!0,config:e.config||{},sessionToken:e.sessionToken,expiresIn:e.expiresIn}}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new g(`Failed to initialize SDK: ${e.message}`,e)}}createWidget(e="button",t={}){if(!this.initialized)throw new g("SDK must be initialized before creating widgets. Call init() first.");const n=k("widget"),s={id:n,sdk:this,apiService:this.apiService,...this.config,...t};try{const t=U.create(e,s);return this.widgets.set(n,t),this.eventBus.emit("widget:created",{widget:t,type:e}),t}catch(e){throw new g(`Failed to create widget: ${e.message}`,e)}}getWidget(e){return this.widgets.get(e)}async getActiveSurveys(e={}){if(!this.initialized)throw new g("SDK must be initialized before fetching surveys. Call init() first.");try{const t=((await this.apiService.getActiveSurveys(e)).data||[]).map(e=>this._normalizeSurveyConfig(e));return e.includeIneligible?t:t.filter(e=>this._isSurveyEligible(e))}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new g(`Failed to fetch active surveys: ${e.message}`,e)}}async showSurveyById(e,t={}){if(!this.initialized)throw new g("SDK must be initialized before showing surveys. Call init() first.");const{context:n={},...s}=t,i=(await this.getActiveSurveys({...n,includeEligibility:!0,includeIneligible:!0})).find(t=>t.id===e);if(!i)throw new g(`Survey with ID '${e}' not found or not active`);return this._isSurveyEligible(i)?this.showSurvey({surveyId:i.id,surveyType:i.surveyType||i.type,title:i.title,description:i.description,lowLabel:i.lowLabel||i.low_label,highLabel:i.highLabel||i.high_label,ratingScale:i.ratingScale??i.rating_scale,showFeedbackInput:i.showFeedbackInput??i.show_feedback_input,showSubmitButton:i.showSubmitButton??i.show_submit_button,autoSubmitOnSelect:i.autoSubmitOnSelect??i.auto_submit_on_select,showTitle:i.showTitle??i.show_title,showDescription:i.showDescription??i.show_description,customQuestions:i.customQuestions||i.questions,pages:i.pages,...s}):(this.eventBus.emit("survey:suppressed",{surveyId:e,reason:this._getSurveyIneligibilityReason(i),survey:i}),null)}showSurvey(e={}){if(!this.initialized)throw new g("SDK must be initialized before showing surveys. Call init() first.");if(!this._isSurveyEligible(e))return this.eventBus.emit("survey:suppressed",{surveyId:e.surveyId||e.id||null,reason:this._getSurveyIneligibilityReason(e),survey:e}),null;const t=this._normalizeSurveyConfig(e),n=this.createWidget("survey",{surveyId:t.surveyId,surveyType:t.surveyType||t.type||"nps",position:t.position||"bottom-right",theme:t.theme||this.config.theme||"light",title:t.title,description:t.description,lowLabel:t.lowLabel,highLabel:t.highLabel,ratingScale:t.ratingScale??t.scale,showFeedbackInput:t.showFeedbackInput,showSubmitButton:t.showSubmitButton,autoSubmitOnSelect:t.autoSubmitOnSelect,showTitle:t.showTitle,showDescription:t.showDescription,customQuestions:t.customQuestions,pages:t.pages,respondentId:t.respondentId,email:t.email,onSubmit:t.onSubmit,onDismiss:t.onDismiss});return n.mount(),n.show(),n}_isSurveyEligible(e={}){const t=this._getSurveyField(e,["shouldShow","should_show"]);if("boolean"==typeof t)return t;const n=this._getSurveyField(e.eligibility||{},["shouldShow","should_show"]);if("boolean"==typeof n)return n;const s=this._getSurveyField(e,["eligible","isEligible","is_eligible"]);if("boolean"==typeof s)return s;const i=this._getSurveyField(e,["isAnswered","is_answered"]);if("boolean"==typeof i)return!i;const a=this._getSurveyField(e.eligibility||{},["isAnswered","is_answered"]);return"boolean"!=typeof a||!a}_getSurveyIneligibilityReason(e={}){const t=this._getSurveyField(e,["reason","suppressionReason","suppression_reason"]);if(t)return t;const n=this._getSurveyField(e.eligibility||{},["reason","suppressionReason","suppression_reason"]);if(n)return n;return!0===this._getSurveyField(e,["isAnswered","is_answered"])?"already_answered":"ineligible"}_normalizeSurveyConfig(e={}){const t=Array.isArray(e.pages)&&e.pages.length>0?e.pages[0]:null,n=t&&(t.rating_config||t.ratingConfig)||{},s=e.type||this._inferSurveyTypeFromPage(t)||"nps";return{...e,surveyId:e.surveyId||e.id||null,surveyType:e.surveyType||s,type:e.type||s,should_show:e.should_show??(e.eligibility?e.eligibility.should_show:void 0),reason:e.reason||(e.eligibility?e.eligibility.reason:void 0),title:e.title||e.name||(t?t.title:null),description:e.description||(t?t.description:null),lowLabel:e.lowLabel||e.low_label||n.low_label||null,highLabel:e.highLabel||e.high_label||n.high_label||null,ratingScale:e.ratingScale??e.rating_scale??n.scale??null,showFeedbackInput:e.showFeedbackInput??e.show_feedback_input??null,showSubmitButton:e.showSubmitButton??e.show_submit_button??null,autoSubmitOnSelect:e.autoSubmitOnSelect??e.auto_submit_on_select??null,showTitle:e.showTitle??e.show_title??null,showDescription:e.showDescription??e.show_description??null,customQuestions:e.customQuestions||e.questions||[],pages:this._normalizeSurveyPages(e.pages||[])}}_normalizeSurveyPages(e=[]){return Array.isArray(e)?e.map((e,t)=>({id:e.id||`page_${t}`,type:e.type||"rating",title:e.title||"",description:e.description||"",required:!1!==e.required,position:e.position??t,ratingConfig:e.ratingConfig||e.rating_config||null,multipleChoiceConfig:e.multipleChoiceConfig||e.multiple_choice_config||null,linkConfig:e.linkConfig||e.link_config||null,afterThisPage:e.afterThisPage||e.after_this_page||null})).sort((e,t)=>e.position-t.position):[]}_inferSurveyTypeFromPage(e){if(!e)return null;const t=e.rating_config||e.ratingConfig||{},n=t.scale,s=t.survey_type,i=(e.title||"").toLowerCase();return 11===n||"nps"===s?"nps":"emoji"===s||i.includes("effort")||i.includes("easy")?"ces":"csat"}_getSurveyField(e,t){for(const n of t)if(void 0!==e[n]&&null!==e[n])return e[n];return null}showChangelog(e={}){if(!this.initialized)throw new g("SDK must be initialized before showing changelog. Call init() first.");const t=this.createWidget("changelog",{position:e.position||"bottom-right",theme:e.theme||this.config.theme||"light",title:e.title||"What's New",triggerText:e.triggerText||"What's New",showBadge:!1!==e.showBadge,viewButtonText:e.viewButtonText||"View Update",changelogBaseUrl:e.changelogBaseUrl,openInNewTab:e.openInNewTab,onViewUpdate:e.onViewUpdate});return t.mount(),t.show(),t}async getChangelogs(e={}){if(!this.initialized)throw new g("SDK must be initialized before fetching changelogs. Call init() first.");try{return(await this.apiService.getChangelogs(e)).data||[]}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new g(`Failed to fetch changelogs: ${e.message}`,e)}}getAllWidgets(){return Array.from(this.widgets.values())}destroyWidget(e){const t=this.widgets.get(e);return!!t&&(t.destroy(),this.widgets.delete(e),this.eventBus.emit("widget:removed",{widgetId:e}),!0)}destroyAllWidgets(){for(const e of this.widgets.values())e.destroy();this.widgets.clear(),this.eventBus.emit("widgets:cleared")}updateConfig(e){const t={...this.config};this.config=this._validateAndMergeConfig(e,this.config);for(const e of this.widgets.values())e.handleConfigUpdate(this.config);this.eventBus.emit("config:updated",{oldConfig:t,newConfig:this.config})}setUserContext(e){this.config.userContext=e,this.apiService&&this.apiService.setUserContext(e),this.eventBus.emit("user:updated",{userContext:e})}getUserContext(){return this.config.userContext||(this.apiService?this.apiService.getUserContext():null)}async reinitialize(e=null){return this.apiService.clearSession(),this.initialized=!1,e&&this.setUserContext(e),this.init()}on(e,t){return this.eventBus.on(e,t),this}off(e,t){return this.eventBus.off(e,t),this}once(e,t){return this.eventBus.once(e,t),this}emit(e,t){return this.eventBus.emit(e,t),this}destroy(){this.destroyAllWidgets(),this.eventBus.removeAllListeners(),this.apiService.clearSession(),this.initialized=!1,this.eventBus.emit("sdk:destroyed")}hasFeedbackBeenSubmitted(e=30){const t=24*e*60*60*1e3,n=Date.now();if(this.config.last_feedback_at)try{if(n-new Date(this.config.last_feedback_at).getTime()<t)return!0}catch(e){}try{const e=`feedback_submitted_${this.config.workspace}`,s=localStorage.getItem(e);if(!s)return!1;return n-JSON.parse(s).submittedAt<t}catch(e){return!1}}clearFeedbackSubmissionTracking(){try{const e=`feedback_submitted_${this.config.workspace}`;localStorage.removeItem(e),this.eventBus.emit("feedback:trackingCleared")}catch(e){console.warn("Failed to clear feedback tracking:",e)}}_detectEnvironment(){if("undefined"==typeof window)return"production";const e=window.location.hostname.toLowerCase();return e.includes("staging")||e.includes("localhost")||e.includes("127.0.0.1")||e.includes(".local")?"staging":"production"}_validateAndMergeConfig(e,t={}){const n=x(x({apiUrl:null,workspace:null,userContext:null,position:"bottom-right",theme:"light",boardId:"general",autoShow:!0,debug:!1,mock:!1,env:this._detectEnvironment()},t),e);if(e.env||t.env||(n.env=this._detectEnvironment()),!n.workspace)throw new m("Missing required configuration: workspace");return n.userContext&&this._validateUserContext(n.userContext),n}_validateUserContext(e){if(!e.user_id&&!e.email)throw new m("User context must include at least user_id or email");const t={user_id:"string",email:"string",name:"string",custom_fields:"object",company:"object"};for(const[n,s]of Object.entries(t))if(e[n]&&typeof e[n]!==s)throw new m(`User context field '${n}' must be of type '${s}'`)}_bindMethods(){this.createWidget=this.createWidget.bind(this),this.destroyWidget=this.destroyWidget.bind(this),this.updateConfig=this.updateConfig.bind(this)}static create(e){return new R(e)}static async createAndInit(e){const t=new R(e);return await t.init(),t}static extractUserContextFromAuth(e){return e?{user_id:e.sub||e.id||e.user_id,email:e.email,name:e.name||e.display_name||e.full_name,custom_fields:{role:e.role,plan:e.plan||e.subscription?.plan,...e.custom_fields||{}},company:e.company||e.organization?{id:e.company?.id||e.organization?.id,name:e.company?.name||e.organization?.name,monthly_spend:e.company?.monthly_spend}:void 0}:null}}function W(){if("undefined"!=typeof document&&!document.querySelector("#feedback-sdk-styles")){const e=document.createElement("style");e.id="feedback-sdk-styles",e.textContent="\n:root {\n --color-primary: #155EEF;\n --color-primary-hover: #1249CA;\n --color-primary-active: #0D3A9F;\n --color-primary-light: rgba(21, 94, 239, 0.1);\n --color-primary-border: rgba(21, 94, 239, 0.3);\n \n --color-success: #10B981;\n --color-success-hover: #059669;\n --color-success-light: #D1FAE5;\n --color-success-dark: #065F46;\n \n --color-error: #EF4444;\n --color-error-hover: #DC2626;\n --color-error-light: #FEE2E2;\n --color-error-dark: #991B1B;\n --color-error-border: #FECACA;\n \n --color-warning: #F59E0B;\n --color-warning-light: #FEF3C7;\n \n --color-neutral-50: #F9FAFB;\n --color-neutral-100: #F3F4F6;\n --color-neutral-200: #E5E7EB;\n --color-neutral-300: #D1D5DB;\n --color-neutral-400: #9CA3AF;\n --color-neutral-500: #6B7280;\n --color-neutral-600: #4B5563;\n --color-neutral-700: #374151;\n --color-neutral-800: #1F2937;\n --color-neutral-900: #111827;\n \n --color-white: #FFFFFF;\n --color-black: #000000;\n \n --color-background: #FFFFFF;\n --color-surface: #F9FAFB;\n --color-border: #E5E7EB;\n --color-text-primary: #111827;\n --color-text-secondary: #4B5563;\n --color-text-tertiary: #6B7280;\n \n --spacing-1: 4px;\n --spacing-2: 8px;\n --spacing-3: 12px;\n --spacing-4: 16px;\n --spacing-5: 20px;\n --spacing-6: 24px;\n --spacing-7: 28px;\n --spacing-8: 32px;\n --spacing-10: 40px;\n --spacing-12: 48px;\n \n --font-size-xs: 11px;\n --font-size-sm: 12px;\n --font-size-base: 14px;\n --font-size-md: 15px;\n --font-size-lg: 16px;\n --font-size-xl: 18px;\n --font-size-2xl: 20px;\n --font-size-3xl: 24px;\n \n --font-weight-normal: 450;\n --font-weight-medium: 500;\n --font-weight-semibold: 600;\n --font-weight-bold: 700;\n \n --line-height-tight: 1.25;\n --line-height-snug: 1.3;\n --line-height-normal: 1.4;\n --line-height-relaxed: 1.5;\n --line-height-loose: 1.6;\n \n --radius-sm: 6px;\n --radius-md: 8px;\n --radius-lg: 10px;\n --radius-xl: 12px;\n --radius-2xl: 16px;\n --radius-3xl: 20px;\n --radius-4xl: 24px;\n --radius-full: 9999px;\n \n --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n --shadow-base: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px 0 rgba(0, 0, 0, 0.06);\n --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);\n --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);\n --shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n \n --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);\n --transition-base: 200ms cubic-bezier(0.4, 0, 0.2, 1);\n --transition-slow: 300ms cubic-bezier(0.4, 0, 0.2, 1);\n \n --z-dropdown: 1000;\n --z-sticky: 1020;\n --z-fixed: 1030;\n --z-modal-backdrop: 999998;\n --z-modal: 999999;\n --z-popover: 1000000;\n --z-tooltip: 1000001;\n --z-notification: 1000002;\n}\n\n.feedback-widget,\n.messenger-widget,\n.changelog-widget,\n.feedback-survey {\n box-sizing: border-box;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n}\n\n.feedback-widget *,\n.feedback-widget *::before,\n.feedback-widget *::after,\n.messenger-widget *,\n.messenger-widget *::before,\n.messenger-widget *::after,\n.changelog-widget *,\n.changelog-widget *::before,\n.changelog-widget *::after,\n.feedback-survey *,\n.feedback-survey *::before,\n.feedback-survey *::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .feedback-widget *,\n .messenger-widget *,\n .changelog-widget *,\n .feedback-survey * {\n transition: none !important;\n animation: none !important;\n }\n}\n\n@media print {\n .feedback-widget,\n .feedback-panel,\n .sdk-modal-backdrop,\n .sdk-notification,\n .changelog-widget,\n .changelog-modal,\n .messenger-widget,\n .messenger-launcher,\n .messenger-panel,\n .feedback-survey,\n .feedback-survey-backdrop {\n display: none !important;\n }\n}\n\n.sdk-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n border-radius: 8px;\n border: none;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-base);\n outline: none;\n}\n\n.sdk-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.sdk-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.sdk-btn-primary {\n background: var(--color-primary);\n color: var(--color-white);\n border: 1px solid var(--color-primary);\n border-radius: 8px;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n height: 44px;\n padding: 10px 18px;\n}\n\n.sdk-btn-primary:hover:not(:disabled) {\n background: var(--color-primary-hover);\n}\n\n.sdk-btn-primary:active:not(:disabled) {\n background: var(--color-primary-active);\n}\n\n.sdk-btn-secondary {\n background: transparent;\n color: var(--color-neutral-600);\n border: 1px solid var(--color-border);\n height: 44px;\n padding: 10px 18px;\n}\n\n.sdk-btn-secondary:hover:not(:disabled) {\n background: var(--color-neutral-50);\n border-color: var(--color-neutral-400);\n color: var(--color-neutral-700);\n}\n\n.sdk-btn-ghost {\n background: transparent;\n color: var(--color-neutral-600);\n}\n\n.sdk-btn-ghost:hover:not(:disabled) {\n background: var(--color-neutral-100);\n color: var(--color-neutral-700);\n}\n\n.sdk-btn-sm {\n height: 36px;\n padding: 8px 14px;\n font-size: var(--font-size-base);\n}\n\n.sdk-btn-lg {\n height: 48px;\n padding: 12px 20px;\n font-size: var(--font-size-lg);\n}\n\n.sdk-btn-pill {\n border-radius: var(--radius-full);\n}\n\n.sdk-btn-block {\n width: 100%;\n}\n\n.sdk-btn-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n background: none;\n border-radius: 8px;\n cursor: pointer;\n color: var(--color-text-secondary);\n transition: all var(--transition-base);\n padding: 0;\n}\n\n.sdk-btn-icon:hover {\n background: var(--color-neutral-100);\n color: var(--color-text-primary);\n}\n\n.sdk-input {\n width: 100%;\n height: 44px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 10px 14px;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-normal);\n line-height: var(--line-height-relaxed);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: all var(--transition-base);\n background: var(--color-white);\n}\n\n.sdk-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.sdk-input:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.sdk-input:disabled {\n background: var(--color-neutral-50);\n cursor: not-allowed;\n}\n\n.sdk-textarea {\n width: 100%;\n min-height: 120px;\n resize: vertical;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 10px 14px;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-normal);\n line-height: var(--line-height-relaxed);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: all var(--transition-base);\n background: var(--color-white);\n}\n\n.sdk-textarea::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.sdk-textarea:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.sdk-select {\n width: 100%;\n height: 44px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 10px 14px;\n font-size: var(--font-size-md);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: all var(--transition-base);\n background: var(--color-white);\n cursor: pointer;\n}\n\n.sdk-select:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.sdk-label {\n display: block;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n line-height: var(--line-height-tight);\n color: var(--color-neutral-700);\n margin-bottom: var(--spacing-2);\n}\n\n.sdk-form-group {\n display: flex;\n flex-direction: column;\n margin-bottom: var(--spacing-5);\n}\n\n.sdk-form-group:last-child {\n margin-bottom: 0;\n}\n\n.sdk-card {\n background: var(--color-white);\n border-radius: 10px;\n box-shadow: var(--shadow-base);\n overflow: hidden;\n}\n\n.sdk-card-header {\n padding: var(--spacing-6);\n border-bottom: 1px solid var(--color-border);\n}\n\n.sdk-card-body {\n padding: var(--spacing-6);\n}\n\n.sdk-card-footer {\n padding: var(--spacing-6);\n border-top: 1px solid var(--color-border);\n}\n\n.sdk-modal-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n transition: opacity var(--transition-slow);\n pointer-events: none;\n z-index: var(--z-modal-backdrop);\n}\n\n.sdk-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.sdk-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n pointer-events: none;\n}\n\n.sdk-modal.open {\n pointer-events: auto;\n}\n\n.sdk-modal-container {\n position: relative;\n width: 100%;\n max-width: 580px;\n max-height: 90vh;\n background: var(--color-white);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: var(--shadow-2xl);\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n transition: all var(--transition-slow);\n}\n\n.sdk-modal.open .sdk-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.sdk-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-6);\n border-bottom: 1px solid var(--color-border);\n}\n\n.sdk-modal-title {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.sdk-modal-body {\n overflow-y: auto;\n max-height: calc(90vh - 120px);\n}\n\n.sdk-close-btn {\n background: none;\n border: none;\n padding: 0;\n cursor: pointer;\n color: var(--color-neutral-500);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: 8px;\n transition: all var(--transition-base);\n line-height: 1;\n flex-shrink: 0;\n}\n\n.sdk-close-btn:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.sdk-close-btn svg {\n width: 18px;\n height: 18px;\n}\n\n.sdk-avatar {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-primary);\n color: var(--color-white);\n font-weight: var(--font-weight-semibold);\n border-radius: var(--radius-full);\n overflow: hidden;\n flex-shrink: 0;\n}\n\n.sdk-avatar-sm {\n width: 24px;\n height: 24px;\n font-size: var(--font-size-xs);\n}\n\n.sdk-avatar-md {\n width: 32px;\n height: 32px;\n font-size: var(--font-size-sm);\n}\n\n.sdk-avatar-lg {\n width: 40px;\n height: 40px;\n font-size: var(--font-size-base);\n}\n\n.sdk-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.sdk-badge {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 2px var(--spacing-2);\n border-radius: var(--radius-full);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n line-height: 1;\n}\n\n.sdk-badge-primary {\n background: var(--color-primary-light);\n color: var(--color-primary);\n}\n\n.sdk-badge-success {\n background: var(--color-success-light);\n color: var(--color-success-dark);\n}\n\n.sdk-badge-error {\n background: var(--color-error-light);\n color: var(--color-error-dark);\n}\n\n.sdk-badge-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n position: absolute;\n top: -2px;\n right: -2px;\n}\n\n.sdk-badge-dot.primary {\n background: var(--color-primary);\n}\n\n.sdk-badge-dot.error {\n background: var(--color-error);\n border: 2px solid var(--color-white);\n}\n\n.sdk-notification {\n position: fixed;\n top: var(--spacing-6);\n right: var(--spacing-6);\n z-index: var(--z-notification);\n background: var(--color-white);\n border-radius: 10px;\n box-shadow: var(--shadow-lg);\n min-width: 320px;\n animation: slideInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.sdk-notification-content {\n display: flex;\n align-items: center;\n padding: var(--spacing-4) var(--spacing-5);\n gap: var(--spacing-3);\n}\n\n.sdk-notification-success {\n border: 1px solid var(--color-success-light);\n}\n\n.sdk-notification-success .sdk-notification-icon {\n width: 20px;\n height: 20px;\n border-radius: var(--radius-full);\n background: var(--color-success);\n color: var(--color-white);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n flex-shrink: 0;\n}\n\n.sdk-notification-text {\n color: var(--color-success-dark);\n font-weight: var(--font-weight-medium);\n font-size: var(--font-size-base);\n flex: 1;\n}\n\n.sdk-notification .sdk-close-btn {\n flex-shrink: 0;\n}\n\n.sdk-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid var(--color-neutral-200);\n border-top-color: var(--color-primary);\n border-radius: var(--radius-full);\n animation: spin 0.8s linear infinite;\n}\n\n.sdk-spinner-sm {\n width: 20px;\n height: 20px;\n border-width: 2px;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes slideInRight {\n from {\n transform: translateX(400px);\n opacity: 0;\n }\n to {\n transform: translateX(0);\n opacity: 1;\n }\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@media (max-width: 768px) {\n .sdk-modal {\n padding: var(--spacing-4);\n }\n \n .sdk-modal-container {\n max-width: 100%;\n border-radius: 10px;\n }\n \n .sdk-notification {\n top: var(--spacing-4);\n right: var(--spacing-4);\n left: var(--spacing-4);\n min-width: auto;\n }\n}\n\n.feedback-widget-button {\n position: fixed;\n z-index: var(--z-notification);\n}\n\n.feedback-widget-button.position-bottom-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.feedback-widget-button.position-bottom-left {\n bottom: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.feedback-widget-button.position-top-right {\n top: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.feedback-widget-button.position-top-left {\n top: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.feedback-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n height: 48px;\n border-radius: var(--radius-full);\n border: none;\n padding: var(--spacing-3) var(--spacing-5);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-slow);\n color: var(--color-white);\n background: var(--color-primary);\n box-shadow: var(--shadow-md);\n width: fit-content;\n touch-action: manipulation;\n -webkit-tap-highlight-color: transparent;\n}\n\n.feedback-trigger-btn:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.feedback-trigger-btn:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n.feedback-trigger-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.feedback-icon {\n flex-shrink: 0;\n}\n\n.feedback-minimize-icon,\n.feedback-expand-icon {\n position: absolute;\n top: -6px;\n right: -6px;\n width: 24px;\n height: 24px;\n padding: var(--spacing-1);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-white);\n border-radius: var(--radius-full);\n opacity: 0;\n transition: opacity var(--transition-base);\n box-shadow: var(--shadow-sm);\n cursor: pointer;\n pointer-events: none;\n}\n\n.feedback-minimize-icon svg,\n.feedback-expand-icon svg {\n width: 16px;\n height: 16px;\n display: block;\n fill: var(--color-primary);\n}\n\n.feedback-widget-button:not(.minimized) .feedback-trigger-btn:hover .feedback-minimize-icon {\n opacity: 1;\n pointer-events: auto;\n}\n\n.feedback-widget-button.minimized .feedback-trigger-btn {\n padding: var(--spacing-3);\n width: 48px;\n height: 48px;\n justify-content: center;\n}\n\n.feedback-widget-button.minimized .feedback-text {\n display: none;\n}\n\n.feedback-widget-button.minimized .feedback-minimize-icon {\n display: none;\n}\n\n.feedback-widget-button.minimized .feedback-trigger-btn:hover .feedback-expand-icon {\n opacity: 1;\n pointer-events: auto;\n}\n\n.feedback-panel {\n position: fixed;\n bottom: 80px;\n right: var(--spacing-6);\n width: 420px;\n max-height: 500px;\n z-index: var(--z-popover);\n transform: translateX(calc(100% + 24px));\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n font-family: inherit;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n}\n\n.feedback-panel.open {\n transform: translateX(0);\n}\n\n.feedback-panel-content {\n background: var(--color-white);\n height: 100%;\n display: flex;\n flex-direction: column;\n border-radius: 10px;\n}\n\n.feedback-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-6);\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n}\n\n.feedback-panel-header h3 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.feedback-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: var(--spacing-6);\n}\n\n.feedback-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.feedback-form-actions {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n margin-top: auto;\n padding-top: var(--spacing-6);\n}\n\n.feedback-error {\n color: var(--color-error-dark);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n margin-top: var(--spacing-2);\n padding: var(--spacing-3);\n background: var(--color-error-light);\n border: 1px solid var(--color-error-border);\n border-radius: var(--radius-md);\n display: none;\n}\n\n.feedback-error.show {\n display: block;\n}\n\n@media (max-width: 768px) {\n .feedback-widget-button {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n \n .feedback-widget-button.position-bottom-left {\n left: var(--spacing-4);\n }\n \n .feedback-minimize-icon,\n .feedback-expand-icon {\n top: -4px;\n right: -4px;\n width: 20px;\n height: 20px;\n }\n \n .feedback-minimize-icon svg,\n .feedback-expand-icon svg {\n width: 14px;\n height: 14px;\n }\n\n .feedback-panel {\n width: min(420px, calc(100vw - (var(--spacing-4) * 2)));\n max-height: min(500px, calc(100vh - 88px));\n top: auto;\n bottom: 72px;\n right: var(--spacing-4);\n left: auto;\n transform: translateX(calc(100% + 24px));\n border-radius: var(--radius-2xl);\n }\n \n .feedback-panel.open {\n transform: translateX(0);\n }\n \n .feedback-panel-header {\n padding: var(--spacing-4) var(--spacing-6);\n }\n \n .feedback-panel-body {\n padding: var(--spacing-6);\n }\n \n .feedback-form-group textarea {\n min-height: 120px;\n }\n}\n\n.changelog-widget {\n position: fixed;\n z-index: var(--z-modal);\n}\n\n.changelog-widget.position-bottom-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.changelog-widget.position-bottom-left {\n bottom: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.changelog-widget.position-top-right {\n top: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.changelog-widget.position-top-left {\n top: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.changelog-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n height: 48px;\n border-radius: var(--radius-full);\n border: none;\n padding: var(--spacing-3) var(--spacing-5);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-slow);\n color: var(--color-white);\n background: var(--color-primary);\n box-shadow: var(--shadow-md);\n width: fit-content;\n}\n\n.changelog-trigger-btn:hover {\n transform: translateY(-2px);\n box-shadow: var(--shadow-lg);\n}\n\n.changelog-trigger-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.changelog-icon {\n flex-shrink: 0;\n}\n\n.changelog-confetti-emoji {\n font-size: var(--font-size-base);\n margin-left: 2px;\n}\n\n.changelog-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n width: 12px;\n height: 12px;\n background: var(--color-error);\n border-radius: var(--radius-full);\n border: 2px solid var(--color-white);\n}\n\n/* ========================================\n CONFETTI\n ======================================== */\n\n.changelog-confetti-container {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: var(--z-notification);\n overflow: hidden;\n}\n\n.changelog-confetti {\n position: absolute;\n top: -20px;\n opacity: 0;\n animation: confettiFall 2s ease-out forwards;\n}\n\n@keyframes confettiFall {\n 0% {\n opacity: 1;\n transform: translateY(0) rotate(0deg) scale(1);\n }\n 10% {\n opacity: 1;\n }\n 100% {\n opacity: 0;\n transform: translateY(100vh) rotate(720deg) scale(0.5);\n }\n}\n\n/* ========================================\n POPUP MODAL\n ======================================== */\n\n.changelog-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n pointer-events: none;\n font-family: inherit;\n}\n\n.changelog-modal.open {\n pointer-events: auto;\n}\n\n.changelog-modal-container {\n position: relative;\n width: 100%;\n max-width: 580px;\n max-height: 90vh;\n background: var(--color-primary-light);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n transition: all var(--transition-slow);\n}\n\n.changelog-modal.open .changelog-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.changelog-modal-close {\n position: absolute;\n top: var(--spacing-4);\n right: var(--spacing-4);\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-neutral-500);\n padding: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n transition: all var(--transition-base);\n line-height: 1;\n z-index: 10;\n}\n\n.changelog-modal-close:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.changelog-modal-close svg {\n width: 18px;\n height: 18px;\n}\n\n.changelog-modal-content {\n overflow-y: auto;\n max-height: 90vh;\n}\n\n.changelog-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px var(--spacing-5);\n}\n\n.changelog-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px var(--spacing-5);\n text-align: center;\n color: var(--color-text-tertiary);\n}\n\n.changelog-empty svg {\n margin-bottom: var(--spacing-4);\n stroke: var(--color-neutral-300);\n}\n\n.changelog-empty p {\n margin: 0;\n font-size: var(--font-size-md);\n}\n\n/* ========================================\n POPUP ITEM\n ======================================== */\n\n.changelog-popup-item {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-popup-image {\n width: 100%;\n padding: var(--spacing-6) var(--spacing-6) 0;\n}\n\n.changelog-popup-image img {\n width: 100%;\n height: auto;\n display: block;\n object-fit: cover;\n border-radius: 8px;\n border: 2px solid var(--color-primary);\n box-shadow: 0 4px 20px rgba(21, 94, 239, 0.2);\n}\n\n.changelog-popup-body {\n padding: var(--spacing-6) var(--spacing-8) var(--spacing-8);\n text-align: center;\n}\n\n.changelog-popup-title {\n margin: 0 0 var(--spacing-3);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n color: var(--color-neutral-900);\n}\n\n.changelog-popup-description {\n margin: 0 0 var(--spacing-6);\n font-size: var(--font-size-md);\n line-height: var(--line-height-loose);\n color: var(--color-neutral-600);\n}\n\n.changelog-popup-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-3) var(--spacing-8);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n color: var(--color-white);\n background: var(--color-primary);\n border: 1px solid var(--color-primary);\n border-radius: 8px;\n cursor: pointer;\n transition: all var(--transition-base);\n font-family: inherit;\n}\n\n.changelog-popup-btn:hover {\n background: var(--color-primary-hover);\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(21, 94, 239, 0.3);\n}\n\n.changelog-popup-btn:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n/* ========================================\n POPUP FOOTER / DOTS\n ======================================== */\n\n.changelog-popup-footer {\n padding: 0 var(--spacing-8) var(--spacing-6);\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: var(--spacing-4);\n}\n\n.changelog-popup-dots {\n display: flex;\n gap: var(--spacing-2);\n}\n\n.changelog-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--color-primary-border);\n cursor: pointer;\n transition: all var(--transition-base);\n}\n\n.changelog-dot:hover {\n background: rgba(21, 94, 239, 0.5);\n}\n\n.changelog-dot.active {\n background: var(--color-primary);\n transform: scale(1.2);\n}\n\n.changelog-view-all-btn {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n background: none;\n border: none;\n color: var(--color-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: 8px;\n transition: all var(--transition-base);\n font-family: inherit;\n}\n\n.changelog-view-all-btn:hover {\n background: var(--color-primary-light);\n}\n\n.changelog-view-all-btn svg {\n transition: transform var(--transition-base);\n}\n\n.changelog-view-all-btn:hover svg {\n transform: translateX(3px);\n}\n\n/* ========================================\n LIST MODAL\n ======================================== */\n\n.changelog-list-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: var(--z-modal);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n pointer-events: none;\n font-family: inherit;\n}\n\n.changelog-list-modal.open {\n pointer-events: auto;\n}\n\n.changelog-list-modal-container {\n position: relative;\n width: 100%;\n max-width: 460px;\n max-height: 85vh;\n background: var(--color-white);\n border-radius: 10px;\n overflow: hidden;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n transform: scale(0.95) translateY(20px);\n opacity: 0;\n transition: all var(--transition-slow);\n display: flex;\n flex-direction: column;\n}\n\n.changelog-list-modal.open .changelog-list-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.changelog-list-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n flex-shrink: 0;\n background: var(--color-white);\n}\n\n.changelog-list-modal-header h2 {\n margin: 0;\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.changelog-list-modal-close {\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-neutral-500);\n padding: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n transition: all var(--transition-base);\n}\n\n.changelog-list-modal-close svg {\n width: 18px;\n height: 18px;\n}\n\n.changelog-list-modal-close:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.changelog-list-modal-body {\n flex: 1;\n overflow-y: auto;\n}\n\n/* ========================================\n LIST ITEMS\n ======================================== */\n\n.changelog-list {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-list-item {\n display: flex;\n align-items: center;\n padding: var(--spacing-3) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n cursor: pointer;\n transition: background var(--transition-base);\n}\n\n.changelog-list-item:hover {\n background: var(--color-neutral-50);\n}\n\n.changelog-list-item:last-child {\n border-bottom: none;\n}\n\n.changelog-list-item-image {\n width: 100%;\n margin-bottom: var(--spacing-2);\n border-radius: 8px;\n overflow: hidden;\n border: 1px solid var(--color-border);\n}\n\n.changelog-list-item-image img {\n width: 100%;\n height: 100px;\n display: block;\n object-fit: cover;\n}\n\n.changelog-list-item-main {\n flex: 1;\n min-width: 0;\n}\n\n.changelog-list-item-content {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.changelog-list-item-date {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n font-weight: var(--font-weight-medium);\n}\n\n.changelog-list-item-labels {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-1);\n margin-bottom: 1px;\n}\n\n.changelog-list-item-title {\n margin: 0;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n color: var(--color-text-primary);\n}\n\n.changelog-list-item-description {\n margin: 0;\n font-size: var(--font-size-sm);\n line-height: var(--line-height-normal);\n color: var(--color-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.changelog-list-item-arrow {\n flex-shrink: 0;\n margin-left: var(--spacing-3);\n color: var(--color-text-tertiary);\n transition: all var(--transition-base);\n}\n\n.changelog-list-item:hover .changelog-list-item-arrow {\n color: var(--color-primary);\n transform: translateX(3px);\n}\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n\n@media (max-width: 768px) {\n .changelog-widget {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n\n .changelog-widget.position-bottom-left {\n left: var(--spacing-4);\n }\n\n .changelog-modal {\n padding: var(--spacing-4);\n }\n\n .changelog-modal-container {\n max-width: 100%;\n border-radius: 10px;\n }\n\n .changelog-popup-image {\n padding: var(--spacing-5) var(--spacing-5) 0;\n }\n\n .changelog-popup-body {\n padding: var(--spacing-5) var(--spacing-6) var(--spacing-6);\n }\n\n .changelog-popup-title {\n font-size: var(--font-size-lg);\n }\n\n .changelog-popup-description {\n font-size: var(--font-size-base);\n }\n\n .changelog-popup-btn {\n padding: var(--spacing-3) var(--spacing-7);\n font-size: var(--font-size-base);\n width: 100%;\n }\n\n .changelog-popup-footer {\n padding: 0 var(--spacing-6) var(--spacing-5);\n }\n\n .changelog-list-modal {\n padding: var(--spacing-4);\n }\n\n .changelog-list-modal-container {\n max-width: 100%;\n max-height: 90vh;\n border-radius: 10px;\n }\n\n .changelog-list-item {\n padding: var(--spacing-3) var(--spacing-4);\n }\n\n .changelog-list-item-image img {\n height: 80px;\n }\n}\n\n.feedback-survey-container {\n display: none;\n}\n\n.feedback-survey-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n z-index: var(--z-modal-backdrop);\n animation: fadeIn var(--transition-slow);\n}\n\n/* ========================================\n SURVEY CARD\n ======================================== */\n\n.feedback-survey {\n position: fixed;\n z-index: var(--z-modal);\n background: var(--color-neutral-50);\n border: 1px solid var(--color-neutral-300);\n border-radius: 10px;\n box-shadow: var(--shadow-lg);\n padding: var(--spacing-8);\n min-width: 320px;\n max-width: 400px;\n font-family: inherit;\n}\n\n.feedback-survey-bottom-right {\n bottom: var(--spacing-6);\n right: var(--spacing-6);\n}\n\n.feedback-survey-bottom-left {\n bottom: var(--spacing-6);\n left: var(--spacing-6);\n}\n\n.feedback-survey-center {\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: min(680px, calc(100vw - 24px));\n max-width: 680px;\n}\n\n.feedback-survey-bottom {\n bottom: 0;\n left: 0;\n right: 0;\n border-radius: 10px 10px 0 0;\n max-width: none;\n}\n\n.feedback-survey-close {\n position: absolute;\n top: var(--spacing-4);\n right: var(--spacing-4);\n background: none;\n border: none;\n cursor: pointer;\n color: var(--color-neutral-500);\n padding: 0;\n width: 20px;\n height: 20px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 8px;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-close svg {\n width: 18px;\n height: 18px;\n}\n\n.feedback-survey-close:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.feedback-survey-close:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-title {\n margin: 0 0 var(--spacing-2) 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n padding-right: var(--spacing-12);\n color: var(--color-text-primary);\n}\n\n.feedback-survey-description {\n color: var(--color-text-secondary);\n margin: 0 0 var(--spacing-4) 0;\n font-size: var(--font-size-md);\n line-height: var(--line-height-relaxed);\n}\n\n.feedback-survey-description-primary .feedback-survey-description {\n color: var(--color-text-primary);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n line-height: var(--line-height-snug);\n padding-right: var(--spacing-12);\n}\n\n.feedback-survey-content {\n margin-bottom: var(--spacing-3);\n}\n\n/* ========================================\n NPS\n ======================================== */\n\n.feedback-survey-nps {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-1);\n}\n\n.feedback-survey-nps-btn {\n width: 28px;\n height: 36px;\n border: 1px solid var(--color-border);\n border-radius: 8px;\n background: var(--color-surface);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-primary);\n transition: all var(--transition-fast);\n font-family: inherit;\n}\n\n.feedback-survey-nps-btn:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-border);\n}\n\n.feedback-survey-nps-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n/* ========================================\n CSAT\n ======================================== */\n\n.feedback-survey-csat {\n display: flex;\n justify-content: center;\n gap: var(--spacing-4);\n}\n\n.feedback-survey-csat-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 28px;\n transition: transform var(--transition-fast);\n padding: var(--spacing-2);\n}\n\n.feedback-survey-csat-btn:hover {\n transform: scale(1.1);\n}\n\n.feedback-survey-csat-btn.selected {\n transform: scale(1.2);\n}\n\n/* ========================================\n CES\n ======================================== */\n\n.feedback-survey-ces {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-ces-btn {\n flex: 1;\n padding: var(--spacing-3) var(--spacing-2);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n cursor: pointer;\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-primary);\n transition: all var(--transition-fast);\n font-family: inherit;\n text-align: center;\n}\n\n.feedback-survey-ces-btn:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-border);\n}\n\n.feedback-survey-ces-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n.feedback-survey-rating-scale {\n display: flex;\n gap: 0;\n border: 1px solid var(--color-neutral-300);\n border-radius: 8px;\n overflow: hidden;\n background: var(--color-white);\n}\n\n.feedback-survey-rating-scale-btn {\n flex: 1;\n width: auto;\n height: auto;\n min-height: 64px;\n padding: 0;\n border: 0;\n border-right: 1px solid var(--color-neutral-300);\n border-radius: 0;\n background: var(--color-white);\n cursor: pointer;\n font-size: clamp(16px, 3vw, 22px);\n font-weight: var(--font-weight-medium);\n color: var(--color-black);\n transition:\n background var(--transition-fast),\n color var(--transition-fast),\n box-shadow var(--transition-fast);\n position: relative;\n}\n\n.feedback-survey-rating-scale-btn:last-child {\n border-right: none;\n}\n\n.feedback-survey-rating-scale-btn:hover {\n background: var(--color-neutral-100);\n}\n\n.feedback-survey-rating-scale-btn:focus-visible {\n outline: none;\n z-index: 1;\n box-shadow: inset 0 0 0 3px var(--color-primary);\n}\n\n.feedback-survey-rating-scale-btn.selected {\n background: var(--color-primary-light);\n color: var(--color-primary-active);\n box-shadow: inset 0 0 0 2px var(--color-primary);\n}\n\n.feedback-survey-rating-scale-compact .feedback-survey-rating-scale-btn {\n min-height: 50px;\n font-size: clamp(12px, 2vw, 16px);\n}\n\n.feedback-survey-labels {\n display: flex;\n justify-content: space-between;\n margin-top: var(--spacing-2);\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n}\n\n.feedback-survey-rating-scale + .feedback-survey-labels {\n margin-top: var(--spacing-3);\n padding: 0 var(--spacing-1);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-normal);\n color: var(--color-text-tertiary);\n}\n\n/* ========================================\n FREQUENCY\n ======================================== */\n\n.feedback-survey-frequency {\n display: flex;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-freq-btn {\n flex: 1;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-primary);\n transition: all var(--transition-fast);\n font-family: inherit;\n}\n\n.feedback-survey-freq-btn:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-border);\n}\n\n.feedback-survey-freq-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n/* ========================================\n FORM INPUTS\n ======================================== */\n\n.feedback-survey-feedback {\n margin-top: var(--spacing-4);\n}\n\n.feedback-survey-textarea {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n resize: none;\n height: 80px;\n background: var(--color-white);\n color: var(--color-text-primary);\n font-family: inherit;\n box-sizing: border-box;\n transition: border-color var(--transition-base);\n outline: none;\n}\n\n.feedback-survey-textarea::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.feedback-survey-textarea:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-select {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n background: var(--color-white);\n color: var(--color-text-primary);\n font-family: inherit;\n cursor: pointer;\n transition: border-color var(--transition-base);\n outline: none;\n}\n\n.feedback-survey-select:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-input {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n background: var(--color-white);\n color: var(--color-text-primary);\n font-family: inherit;\n box-sizing: border-box;\n transition: border-color var(--transition-base);\n outline: none;\n}\n\n.feedback-survey-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.feedback-survey-input:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.feedback-survey-progress {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n margin-bottom: var(--spacing-3);\n}\n\n.feedback-survey-actions {\n display: flex;\n gap: var(--spacing-2);\n margin-top: var(--spacing-3);\n}\n\n.feedback-survey-back {\n padding: var(--spacing-3) var(--spacing-4);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n color: var(--color-text-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n}\n\n.feedback-survey-page-choice-btn {\n width: 100%;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-surface);\n color: var(--color-text-primary);\n text-align: left;\n font-size: var(--font-size-base);\n cursor: pointer;\n margin-bottom: var(--spacing-2);\n font-family: inherit;\n}\n\n.feedback-survey-page-choice-btn.selected {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--color-white);\n}\n\n.feedback-survey-page-textarea {\n width: 100%;\n min-height: 96px;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n font-family: inherit;\n box-sizing: border-box;\n outline: none;\n}\n\n.feedback-survey-page-textarea:focus {\n border-color: var(--color-primary);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n/* ========================================\n SUBMIT & FEEDBACK\n ======================================== */\n\n.feedback-survey-submit {\n width: 100%;\n padding: var(--spacing-3);\n background: var(--color-primary);\n color: var(--color-white);\n border: 1px solid var(--color-primary);\n border-radius: var(--radius-md);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-submit:hover {\n background: var(--color-primary-hover);\n border-color: var(--color-primary-hover);\n}\n\n.feedback-survey-error {\n color: var(--color-error);\n font-size: var(--font-size-sm);\n margin-top: var(--spacing-2);\n text-align: center;\n}\n\n.feedback-survey-success {\n position: fixed;\n top: var(--spacing-6);\n right: var(--spacing-6);\n background: var(--color-success);\n color: var(--color-white);\n padding: var(--spacing-3) var(--spacing-5);\n border-radius: var(--radius-xl);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n z-index: var(--z-notification);\n box-shadow: var(--shadow-lg);\n font-family: inherit;\n}\n\n.feedback-survey-success > div {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n\n@media (max-width: 768px) {\n .feedback-survey {\n min-width: 300px;\n padding: var(--spacing-6);\n }\n\n .feedback-survey-bottom {\n padding: var(--spacing-5);\n }\n\n .feedback-survey-nps-btn {\n width: 24px;\n height: 32px;\n font-size: var(--font-size-xs);\n }\n\n .feedback-survey-csat-btn {\n font-size: 24px;\n }\n\n .feedback-survey-title {\n font-size: var(--font-size-lg);\n }\n\n .feedback-survey-description-primary .feedback-survey-description {\n font-size: var(--font-size-md);\n }\n\n .feedback-survey-rating-scale-btn {\n min-height: 52px;\n font-size: clamp(14px, 6vw, 18px);\n }\n\n .feedback-survey-rating-scale-compact .feedback-survey-rating-scale-btn {\n min-height: 44px;\n font-size: clamp(11px, 3.7vw, 14px);\n }\n\n .feedback-survey-rating-scale + .feedback-survey-labels {\n font-size: var(--font-size-xs);\n }\n}\n\n\n.messenger-launcher {\n position: fixed;\n z-index: var(--z-modal);\n}\n\n.messenger-launcher-bottom-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.messenger-launcher-bottom-left {\n bottom: var(--spacing-5);\n left: var(--spacing-5);\n}\n\n.messenger-launcher-btn {\n width: 60px;\n height: 60px;\n border-radius: var(--radius-full);\n border: none;\n background: var(--color-primary);\n color: var(--color-white);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: var(--shadow-lg);\n transition: all var(--transition-slow);\n position: relative;\n}\n\n.messenger-launcher-btn:hover {\n transform: translateY(-2px);\n box-shadow: var(--shadow-xl);\n}\n\n.messenger-launcher-btn:active {\n transform: scale(0.95);\n}\n\n.messenger-launcher-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n background: var(--color-error);\n color: var(--color-white);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-semibold);\n border-radius: var(--radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n border: 2px solid var(--color-white);\n}\n\n.messenger-panel {\n position: fixed;\n z-index: var(--z-popover);\n width: 440px;\n height: 720px;\n max-height: calc(100vh - 100px);\n display: none;\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n transition: all var(--transition-slow);\n}\n\n.messenger-panel.open {\n display: block;\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.messenger-panel-bottom-right {\n bottom: 90px;\n right: var(--spacing-5);\n}\n\n.messenger-panel-bottom-left {\n bottom: 90px;\n left: var(--spacing-5);\n}\n\n.messenger-panel-content {\n background: var(--color-white);\n height: 100%;\n border-radius: var(--radius-2xl);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: rgba(50, 50, 93, 0.25) 0px 2px 5px -1px, rgba(0, 0, 0, 0.3) 0px 1px 3px -1px;\n border: 1px solid var(--color-border);\n}\n\n.messenger-panel-views {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.messenger-view {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n.messenger-avatar-stack {\n display: flex;\n align-items: center;\n}\n\n.messenger-avatar-stack .sdk-avatar {\n margin-left: -8px;\n}\n\n.messenger-avatar-stack .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n.messenger-avatar-stack-tiny .sdk-avatar {\n margin-left: -6px;\n}\n\n.messenger-avatar-stack-tiny .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n@media (max-width: 480px) {\n .messenger-panel {\n width: 100%;\n height: 100%;\n max-height: 100%;\n bottom: 0;\n right: 0;\n left: 0;\n border-radius: 0;\n }\n\n .messenger-panel-content {\n border-radius: 0;\n }\n\n .messenger-launcher {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n\n .messenger-launcher-bottom-left {\n left: var(--spacing-4);\n }\n}\n\n\n/* ========================================\n HOME VIEW\n ======================================== */\n\n.messenger-home-view {\n background: linear-gradient(180deg, #f0f4ff 0%, #FFFFFF 50%);\n position: relative;\n overflow: hidden;\n}\n\n.messenger-home-view::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 600px;\n height: 600px;\n background: radial-gradient(circle, rgba(21, 94, 239, 0.08) 0%, transparent 70%);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.messenger-home-view::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 500px;\n height: 500px;\n background: radial-gradient(circle, rgba(139, 92, 246, 0.05) 0%, transparent 70%);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.messenger-home-scroll {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.messenger-home-header {\n padding: var(--spacing-6) var(--spacing-5);\n position: relative;\n z-index: 2;\n flex-shrink: 0;\n}\n\n.messenger-home-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-8);\n position: relative;\n z-index: 2;\n}\n\n.messenger-home-logo {\n width: 48px;\n height: 48px;\n border-radius: var(--radius-lg);\n overflow: visible;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.messenger-home-logo img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n border-radius: var(--radius-lg);\n}\n\n.messenger-home-avatars {\n flex: 1;\n display: flex;\n justify-content: flex-end;\n margin-right: var(--spacing-4);\n margin-left: var(--spacing-4);\n}\n\n.messenger-home-welcome {\n display: flex;\n flex-direction: column;\n text-align: left;\n position: relative;\n z-index: 2;\n}\n\n.messenger-home-greeting {\n font-size: 28px;\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-tight);\n}\n\n.messenger-home-question {\n font-size: 28px;\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-tight);\n}\n\n.messenger-home-body {\n flex: 1;\n padding: 0 var(--spacing-5) var(--spacing-5);\n position: relative;\n z-index: 2;\n}\n\n.messenger-home-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-5);\n background: var(--color-white);\n border: none;\n border-radius: 8px;\n color: var(--color-text-primary);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-base);\n margin-bottom: var(--spacing-5);\n font-family: inherit;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-home-message-btn:hover {\n background: var(--color-neutral-50);\n transform: translateX(4px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-home-continue-btn {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-3);\n}\n\n.messenger-home-continue-btn > svg {\n flex-shrink: 0;\n}\n\n.messenger-home-continue-info {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-1);\n text-align: left;\n flex: 1;\n}\n\n.messenger-home-continue-label {\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n}\n\n.messenger-home-continue-preview {\n font-size: var(--font-size-sm);\n opacity: 0.6;\n font-weight: var(--font-weight-normal);\n}\n\n.messenger-home-featured {\n background: var(--color-neutral-50);\n border-radius: var(--radius-xl);\n overflow: hidden;\n margin-bottom: var(--spacing-5);\n border: 1px solid var(--color-border);\n}\n\n.messenger-home-featured-image {\n width: 100%;\n height: 120px;\n object-fit: cover;\n}\n\n.messenger-home-featured-content {\n padding: var(--spacing-4);\n}\n\n.messenger-home-featured-content h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-home-featured-content p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n}\n\n.messenger-home-featured-btn {\n margin-top: var(--spacing-3);\n}\n\n.messenger-home-changelog-section {\n margin-top: var(--spacing-5);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n}\n\n.messenger-home-changelog-card {\n background: var(--color-white);\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n transition: all var(--transition-base);\n border: none;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-home-changelog-card:hover {\n background: var(--color-neutral-50);\n transform: translateY(-2px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-home-changelog-cover {\n width: 100%;\n height: 140px;\n overflow: hidden;\n position: relative;\n}\n\n.messenger-home-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.messenger-home-changelog-cover-text {\n position: absolute;\n bottom: var(--spacing-3);\n left: var(--spacing-3);\n right: var(--spacing-3);\n color: var(--color-white);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);\n line-height: var(--line-height-snug);\n}\n\n.messenger-home-changelog-card-content {\n padding: var(--spacing-4);\n border-top: 1px solid var(--color-border);\n}\n\n.messenger-home-changelog-card-title {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-home-changelog-card-desc {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.messenger-home-availability,\n.messenger-chat-availability {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n margin-top: var(--spacing-2);\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n}\n\n.messenger-availability-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.messenger-availability-online {\n background: var(--color-success);\n box-shadow: 0 0 0 2px var(--color-success-light);\n}\n\n.messenger-availability-away {\n background: var(--color-neutral-400);\n}\n\n.messenger-availability-text {\n opacity: 0.9;\n}\n\n/* ========================================\n CONVERSATIONS VIEW\n ======================================== */\n\n.messenger-conversations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-4) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n}\n\n.messenger-conversations-header h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-conversations-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-conversations-list {\n display: flex;\n flex-direction: column;\n}\n\n.messenger-conversation-item + .messenger-conversation-item {\n border-top: 1px solid var(--color-border);\n}\n\n.messenger-conversation-item {\n display: flex;\n align-items: flex-start;\n gap: var(--spacing-3);\n padding: 10px var(--spacing-4);\n cursor: pointer;\n transition: background var(--transition-base);\n}\n\n.messenger-conversation-item:hover {\n background: var(--color-neutral-50);\n}\n\n.messenger-conversation-avatars {\n flex-shrink: 0;\n}\n\n.messenger-conversation-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-conversation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: var(--spacing-1);\n gap: var(--spacing-3);\n}\n\n.messenger-conversation-title {\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-conversation-time {\n font-size: var(--font-size-sm);\n color: var(--color-text-secondary);\n flex-shrink: 0;\n}\n\n.messenger-conversation-preview {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.messenger-conversation-message {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n color: var(--color-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: var(--line-height-normal);\n}\n\n.messenger-conversation-item.unread .messenger-conversation-message {\n color: var(--color-text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n.messenger-unread-dot {\n width: 8px;\n height: 8px;\n background: var(--color-primary);\n border-radius: var(--radius-full);\n flex-shrink: 0;\n}\n\n.messenger-conversations-footer {\n padding: var(--spacing-4);\n border-top: none;\n}\n\n.messenger-new-message-btn {\n max-width: 220px;\n margin: 0 auto;\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n background: var(--color-white);\n border: none;\n border-radius: var(--radius-xl);\n color: var(--color-text-primary);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: all var(--transition-base);\n font-family: inherit;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-new-message-btn:hover {\n background: var(--color-neutral-50);\n transform: translateX(4px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-new-message-btn span {\n flex: 1;\n text-align: left;\n}\n\n/* ========================================\n HELP VIEW\n ======================================== */\n\n.messenger-help-header {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n padding: var(--spacing-4) var(--spacing-5) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-help-header-top {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.messenger-help-header-top h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-help-header-top .sdk-close-btn {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.messenger-help-search-input {\n width: 100%;\n background: var(--color-neutral-50);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n padding: var(--spacing-2) var(--spacing-3);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n color: var(--color-text-primary);\n font-family: inherit;\n outline: none;\n transition: border-color var(--transition-base);\n}\n\n.messenger-help-search-input:focus {\n border-color: var(--color-primary);\n background: var(--color-white);\n}\n\n.messenger-help-search-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.messenger-help-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-help-collections-header {\n display: none;\n}\n\n.messenger-help-collections {\n padding: 0;\n}\n\n.messenger-help-collection {\n display: flex;\n align-items: center;\n padding: var(--spacing-4) var(--spacing-5);\n cursor: pointer;\n transition: background var(--transition-base);\n border-bottom: 1px solid var(--color-border);\n}\n\n.messenger-help-collection:hover {\n background: var(--color-neutral-50);\n}\n\n.messenger-help-collection-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-help-collection-title {\n margin: 0 0 var(--spacing-1);\n font-size: var(--font-size-md);\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-help-collection-desc {\n margin: 0 0 var(--spacing-1);\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n line-height: var(--line-height-normal);\n}\n\n.messenger-help-collection-count {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n\n.messenger-help-collection-arrow {\n color: var(--color-text-tertiary);\n flex-shrink: 0;\n margin-left: var(--spacing-3);\n}\n\n.messenger-help-footer {\n padding: var(--spacing-4) var(--spacing-5);\n border-top: 1px solid var(--color-border);\n text-align: center;\n}\n\n.messenger-help-footer-link {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-2);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--transition-base);\n}\n\n.messenger-help-footer-link:hover {\n color: var(--color-primary);\n}\n\n/* ========================================\n CHANGELOG VIEW\n ======================================== */\n\n.messenger-changelog-header {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-3) var(--spacing-5);\n}\n\n.messenger-changelog-header h2 {\n margin: 0;\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-changelog-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-changelog-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n padding: var(--spacing-4);\n}\n\n.messenger-changelog-card {\n background: var(--color-white);\n border-radius: var(--radius-xl);\n overflow: hidden;\n cursor: pointer;\n transition: all var(--transition-base);\n border: none;\n box-shadow: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n}\n\n.messenger-changelog-card:hover {\n transform: translateY(-2px);\n box-shadow: rgba(9, 30, 66, 0.3) 0px 4px 8px -2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\n}\n\n.messenger-changelog-cover {\n width: 100%;\n height: 160px;\n overflow: hidden;\n}\n\n.messenger-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.messenger-changelog-content {\n padding: var(--spacing-4);\n}\n\n.messenger-changelog-tags {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-2);\n margin-bottom: var(--spacing-2);\n}\n\n.messenger-changelog-title {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-bold);\n color: var(--color-text-primary);\n line-height: var(--line-height-snug);\n}\n\n.messenger-changelog-description {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.messenger-changelog-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: var(--spacing-3);\n}\n\n.messenger-changelog-date {\n font-size: var(--font-size-sm);\n color: var(--color-text-tertiary);\n}\n\n.messenger-changelog-arrow {\n color: var(--color-text-tertiary);\n}\n\n\n/* ========================================\n MESSAGES\n ======================================== */\n\n.messenger-message {\n display: flex;\n gap: var(--spacing-2);\n max-width: 85%;\n}\n\n.messenger-message-own {\n align-self: flex-end;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.messenger-message-received {\n align-self: flex-start;\n flex-direction: column;\n}\n\n.messenger-message-row {\n display: flex;\n align-items: flex-end;\n gap: var(--spacing-2);\n}\n\n.messenger-message-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.messenger-message-avatar {\n flex-shrink: 0;\n}\n\n.messenger-message-sender {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-secondary);\n margin-bottom: 2px;\n margin-left: 0;\n}\n\n.messenger-message-bubble {\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-2xl);\n word-wrap: break-word;\n}\n\n.messenger-message-own .messenger-message-bubble {\n background: var(--color-primary);\n color: var(--color-white);\n border-bottom-right-radius: var(--spacing-1);\n}\n\n.messenger-message-received .messenger-message-bubble {\n background: var(--color-neutral-100);\n color: var(--color-text-primary);\n border-bottom-left-radius: var(--spacing-1);\n}\n\n.messenger-message-content {\n font-size: var(--font-size-base);\n line-height: var(--line-height-relaxed);\n}\n\n.messenger-message-time {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n margin-top: 2px;\n padding: 0 var(--spacing-1);\n}\n\n.messenger-message-image {\n max-width: 220px;\n max-height: 200px;\n width: auto;\n height: auto;\n border-radius: var(--radius-lg);\n margin-top: var(--spacing-1);\n cursor: pointer;\n object-fit: contain;\n display: block;\n}\n\n.messenger-message-file {\n display: inline-flex;\n align-items: center;\n gap: var(--spacing-2);\n margin-top: var(--spacing-1);\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-lg);\n background: var(--color-neutral-100);\n color: var(--color-primary);\n text-decoration: none;\n font-size: var(--font-size-sm);\n transition: background var(--transition-base);\n max-width: 100%;\n word-break: break-all;\n cursor: pointer;\n}\n\n.messenger-message-file:hover {\n background: var(--color-neutral-200);\n}\n\n.messenger-file-download-icon {\n margin-left: auto;\n opacity: 0.5;\n flex-shrink: 0;\n}\n\n.messenger-message-file:hover .messenger-file-download-icon {\n opacity: 1;\n}\n\n.messenger-closed-banner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n margin: var(--spacing-4);\n background: var(--color-success-light);\n color: var(--color-success-dark);\n border-radius: var(--radius-xl);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n}\n\n/* ========================================\n CHAT HEADER\n ======================================== */\n\n.messenger-chat-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: var(--spacing-4) var(--spacing-5);\n border-bottom: 1px solid var(--color-border);\n}\n\n.messenger-chat-header-info {\n flex: 1;\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.messenger-chat-title {\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: var(--spacing-4);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n}\n\n.messenger-chat-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: var(--spacing-10);\n}\n\n.messenger-chat-empty-avatars {\n margin-bottom: var(--spacing-4);\n}\n\n.messenger-chat-empty h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-chat-empty p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n max-width: 240px;\n}\n\n/* ========================================\n COMPOSE AREA\n ======================================== */\n\n.messenger-chat-compose {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n border-top: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-compose-input-wrapper {\n flex: 1;\n background: var(--color-neutral-100);\n border-radius: var(--radius-lg);\n padding: var(--spacing-2) var(--spacing-4);\n}\n\n.messenger-compose-input {\n width: 100%;\n background: transparent;\n border: none;\n outline: none;\n color: var(--color-text-primary);\n font-size: var(--font-size-md);\n line-height: var(--line-height-normal);\n resize: none;\n max-height: 120px;\n font-family: inherit;\n}\n\n.messenger-compose-input::placeholder {\n color: var(--color-text-tertiary);\n}\n\n.messenger-compose-send {\n width: 40px;\n height: 40px;\n background: var(--color-primary);\n border: none;\n border-radius: var(--radius-full);\n color: var(--color-white);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all var(--transition-base);\n flex-shrink: 0;\n}\n\n.messenger-compose-send:hover:not(:disabled) {\n background: var(--color-primary-hover);\n transform: scale(1.05);\n}\n\n.messenger-compose-send:disabled {\n background: var(--color-neutral-300);\n cursor: not-allowed;\n}\n\n.messenger-compose-file-input {\n display: none;\n}\n\n.messenger-compose-attach {\n width: 28px;\n height: 28px;\n flex-shrink: 0;\n}\n\n.messenger-compose-attach svg {\n width: 20px;\n height: 20px;\n}\n\n/* ========================================\n TYPING INDICATOR\n ======================================== */\n\n.messenger-typing-indicator {\n display: none;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-3);\n margin: var(--spacing-1) 0;\n}\n\n.messenger-typing-dots {\n display: flex;\n align-items: center;\n gap: 4px;\n background: var(--color-neutral-100);\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-2xl);\n}\n\n.messenger-typing-dots span {\n width: 6px;\n height: 6px;\n background: var(--color-neutral-400);\n border-radius: var(--radius-full);\n animation: messenger-typing-bounce 1.4s infinite ease-in-out;\n}\n\n.messenger-typing-dots span:nth-child(1) { animation-delay: -0.32s; }\n.messenger-typing-dots span:nth-child(2) { animation-delay: -0.16s; }\n.messenger-typing-dots span:nth-child(3) { animation-delay: 0s; }\n\n.messenger-typing-text {\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\n}\n\n/* ========================================\n NAVIGATION TABS\n ======================================== */\n\n.messenger-panel-nav {\n border-top: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-nav-tabs {\n display: flex;\n padding: var(--spacing-1) var(--spacing-2) 0;\n gap: var(--spacing-1);\n}\n\n.messenger-nav-footer {\n padding: 2px var(--spacing-2) var(--spacing-2);\n text-align: center;\n}\n\n.messenger-powered-by {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n color: var(--color-text-tertiary);\n text-decoration: none;\n transition: color var(--transition-base);\n}\n\n.messenger-powered-by:hover {\n color: var(--color-text-secondary);\n}\n\n.messenger-powered-by svg {\n width: 12px;\n height: 14px;\n}\n\n.messenger-powered-by strong {\n font-weight: var(--font-weight-semibold);\n}\n\n.messenger-nav-tab {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 2px;\n padding: var(--spacing-1) var(--spacing-1);\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 8px;\n transition: all var(--transition-base);\n position: relative;\n}\n\n.messenger-nav-tab:hover {\n background: var(--color-neutral-50);\n}\n\n.messenger-nav-icon {\n color: var(--color-text-secondary);\n transition: color var(--transition-base);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n}\n\n.messenger-nav-icon svg {\n width: 20px;\n height: 20px;\n display: block;\n}\n\n.messenger-nav-label {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--color-text-secondary);\n transition: color var(--transition-base);\n}\n\n.messenger-nav-tab.active .messenger-nav-icon,\n.messenger-nav-tab.active .messenger-nav-label {\n color: var(--color-primary);\n}\n\n.messenger-nav-badge {\n position: absolute;\n top: var(--spacing-1);\n right: calc(50% - 16px);\n min-width: 16px;\n height: 16px;\n background: var(--color-error);\n color: var(--color-white);\n font-size: 10px;\n font-weight: var(--font-weight-semibold);\n border-radius: var(--radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 var(--spacing-1);\n}\n\n/* ========================================\n PRECHAT\n ======================================== */\n\n.messenger-prechat-view {\n position: relative;\n}\n\n.messenger-prechat-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.5);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n z-index: var(--z-popover);\n}\n\n.messenger-prechat-card {\n background: var(--color-white);\n border-radius: 10px;\n padding: var(--spacing-6);\n width: 100%;\n max-width: 360px;\n box-shadow: var(--shadow-xl);\n}\n\n.messenger-prechat-title {\n margin: 0 0 var(--spacing-5);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n text-align: center;\n}\n\n.messenger-prechat-error {\n display: none;\n font-size: var(--font-size-sm);\n color: var(--color-error);\n margin-top: calc(var(--spacing-1) * -1);\n}\n\n.messenger-prechat-actions {\n display: flex;\n gap: var(--spacing-3);\n margin-top: var(--spacing-2);\n}\n\n.messenger-prechat-skip {\n flex: 1;\n}\n\n.messenger-prechat-submit {\n flex: 2;\n}\n\n.messenger-prechat-submit-loading {\n display: none;\n align-items: center;\n justify-content: center;\n}\n\n.messenger-prechat-submit-loading i {\n animation: spin 0.8s linear infinite;\n}\n\n/* ========================================\n ATTACHMENTS\n ======================================== */\n.messenger-compose-attachments-preview {\n display: none;\n flex-wrap: wrap;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-4);\n border-top: 1px solid var(--color-border);\n background: var(--color-white);\n}\n\n.messenger-attachment-preview {\n position: relative;\n width: 56px;\n height: 56px;\n border-radius: var(--radius-lg);\n overflow: hidden;\n border: 1px solid var(--color-border);\n}\n\n.messenger-attachment-thumb {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.messenger-attachment-file-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--color-neutral-100);\n color: var(--color-text-secondary);\n}\n\n.messenger-attachment-remove {\n position: absolute;\n top: 2px;\n right: 2px;\n width: 18px;\n height: 18px;\n background: rgba(0, 0, 0, 0.7);\n border: none;\n border-radius: var(--radius-full);\n color: var(--color-white);\n font-size: var(--font-size-xs);\n line-height: 1;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n transition: background var(--transition-base);\n}\n\n.messenger-attachment-remove:hover {\n background: var(--color-error);\n}\n\n/* ========================================\n EMAIL OVERLAY\n ======================================== */\n.messenger-email-overlay {\n position: absolute;\n bottom: 0;\n left: 0;\n right: 0;\n top: 0;\n display: none;\n align-items: flex-end;\n z-index: 20;\n background: rgba(0, 0, 0, 0.5);\n pointer-events: auto;\n}\n\n.messenger-email-card {\n width: 100%;\n animation: messenger-slide-up 0.25s ease;\n}\n\n.messenger-email-actions {\n display: flex;\n gap: var(--spacing-2);\n margin-top: var(--spacing-1);\n}\n\n/* ========================================\n EMPTY STATE\n ======================================== */\n.messenger-empty-state {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: var(--spacing-10);\n}\n\n.messenger-empty-state-icon {\n color: var(--color-neutral-300);\n margin-bottom: var(--spacing-4);\n}\n\n.messenger-empty-state h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--color-text-primary);\n}\n\n.messenger-empty-state p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--color-text-secondary);\n}\n\n/* ========================================\n ANIMATIONS\n ======================================== */\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@keyframes messenger-typing-bounce {\n 0%, 80%, 100% {\n transform: scale(0);\n }\n 40% {\n transform: scale(1);\n }\n}\n\n@keyframes messenger-slide-up {\n from {\n transform: translateY(100%);\n opacity: 0;\n }\n to {\n transform: translateY(0);\n opacity: 1;\n }\n}\n\n@keyframes messenger-fade-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n@media (max-width: 480px) {\n .messenger-prechat-overlay {\n padding: var(--spacing-4);\n }\n .messenger-prechat-card {\n max-width: 100%;\n }\n}\n",document.head.appendChild(e)}}function V(){if("undefined"!=typeof window&&window.FeedbackSDKConfig){W();const e={...window.FeedbackSDKConfig},t=new R(e);t.init().then(n=>{if(window.FeedbackSDK.instance=t,window.FeedbackSDKConfig.autoCreate){(Array.isArray(window.FeedbackSDKConfig.autoCreate)?window.FeedbackSDKConfig.autoCreate:[window.FeedbackSDKConfig.autoCreate]).forEach(e=>{try{t.createWidget(e.type||"button",e).mount(e.container)}catch(e){console.error("[FeedbackSDK] Failed to create widget:",e)}})}if("undefined"!=typeof CustomEvent){const s=new CustomEvent("FeedbackSDKReady",{detail:{sdk:t,config:e,initData:n}});window.dispatchEvent(s)}}).catch(t=>{if(console.error("[FeedbackSDK] Auto-initialization failed:",t),"undefined"!=typeof CustomEvent){const n=new CustomEvent("FeedbackSDKError",{detail:{error:t,config:e,phase:"initialization"}});window.dispatchEvent(n)}})}}const Z={FeedbackSDK:R,BaseWidget:C,ButtonWidget:E,ChangelogWidget:I,TabWidget:H,InlineWidget:A,SurveyWidget:q,MessengerWidget:j,WidgetFactory:U,EventBus:w,APIService:y,SDKError:g,APIError:p,WidgetError:u,ConfigError:m,ValidationError:v,helpers:S,create:e=>(W(),new R(e)),version:"1.0.0",instance:null,isReady:()=>Boolean(Z.instance),getInstance:()=>Z.instance,setUserContext:e=>{Z.instance?Z.instance.setUserContext(e):"undefined"!=typeof window&&(window.FeedbackSDKUserContext=e)},initWithUser:async(e,t)=>{W();const n={...e,userContext:t},s=new R(n);return await s.init(),"undefined"!=typeof window&&(window.FeedbackSDK.instance=s),s},onReady:e=>{"undefined"!=typeof window&&(Z.isReady()?e(Z.instance):window.addEventListener("FeedbackSDKReady",t=>{e(t.detail.sdk,t.detail)},{once:!0}))},onError:e=>{"undefined"!=typeof window&&window.addEventListener("FeedbackSDKError",t=>{e(t.detail.error,t.detail)})},extractUserContext:R.extractUserContextFromAuth};"undefined"!=typeof window&&(window.FeedbackSDK=Z,"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",V):setTimeout(V,0))),e.APIError=p,e.APIService=y,e.BaseWidget=C,e.ButtonWidget=E,e.ChangelogWidget=I,e.ConfigError=m,e.EventBus=w,e.FeedbackSDK=R,e.InlineWidget=A,e.MessengerWidget=j,e.SDKError=g,e.SurveyWidget=q,e.TabWidget=H,e.ValidationError=v,e.WidgetError=u,e.WidgetFactory=U,e.default=Z,e.helpers=S,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=feedback-sdk.min.js.map