@product7/product7-js 0.6.7 → 0.6.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/product7-js.js +280 -12
- package/dist/product7-js.js.map +1 -1
- package/dist/product7-js.min.js +1 -1
- package/dist/product7-js.min.js.map +1 -1
- package/package.json +1 -1
- package/src/styles/liveChat-components.js +159 -0
- package/src/styles/liveChat-core.js +4 -0
- package/src/widgets/LiveChatWidget.js +2 -0
- package/src/widgets/liveChat/components/LiveChatPanel.js +3 -2
- package/src/widgets/liveChat/views/FeedbackFormView.js +104 -0
- package/src/widgets/liveChat/views/HomeView.js +8 -10
package/dist/product7-js.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Product7={})}(this,function(t){"use strict";const e=[{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}}],i={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()}]},a=[{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:"#"}],s=[{id:"mock_nps_survey",name:"NPS Score",slug:"nps",status:"active",trigger_type:"manual",pages:[{id:"nps-page-1",type:"rating",title:"How likely are you to recommend us to a friend?",description:"",placeholder:"",rating_config:{scale:11,low_label:"Very unlikely",high_label:"Very likely",survey_type:"nps"},multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_csat_survey",name:"CSAT Survey",slug:"csat",status:"active",trigger_type:"manual",pages:[{id:"csat-page-1",type:"rating",title:"How satisfied are you with our service?",description:"",placeholder:"",rating_config:{scale:5,low_label:"Very dissatisfied",high_label:"Very satisfied",survey_type:"emoji"},multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_ces_survey",name:"Customer Effort Score",slug:"ces",status:"active",trigger_type:"manual",pages:[{id:"ces-page-1",type:"rating",title:"How easy was it to use our product?",description:"",placeholder:"",rating_config:{scale:5,low_label:"Very difficult",high_label:"Very easy",survey_type:"ces"},multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_open_question_survey",name:"Open Question",slug:"open-question",status:"active",trigger_type:"manual",pages:[{id:"open-page-1",type:"text",title:"What could we do better?",description:"Is there anything we could do to make our product better for you?",placeholder:"Type your answer here",rating_config:null,multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_product_idea_poll_survey",name:"Product Idea Poll",slug:"product-idea-poll",status:"active",trigger_type:"manual",pages:[{id:"poll-page-1",type:"multiple_choice",title:"Which feature should we add next?",description:"Vote on the feature you would like to see next.",placeholder:"",rating_config:null,multiple_choice_config:{allow_multiple_selection:!1,survey_type:"regular",options:[{id:"opt1",label:"Better reporting"},{id:"opt2",label:"Mobile app"},{id:"opt3",label:"Integrations"},{id:"opt4",label:"AI features"}]},link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_pmf_survey",name:"Product Market Fit (PMF)",slug:"pmf",status:"active",trigger_type:"manual",pages:[{id:"pmf-page-1",type:"multiple_choice",title:"How would you feel if you could no longer use our product?",description:"",placeholder:"",rating_config:null,multiple_choice_config:{allow_multiple_selection:!1,survey_type:"regular",options:[{id:"very_disappointed",label:"Very disappointed"},{id:"somewhat_disappointed",label:"Somewhat disappointed"},{id:"not_disappointed",label:"Not disappointed"}]},link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_user_interview_survey",name:"User Interview Request",slug:"user-interview",status:"active",trigger_type:"manual",pages:[{id:"interview-page-1",type:"link",title:"Would you like to hop on a quick demo?",description:"We would love to hear your thoughts and answer any questions you have.",placeholder:"",rating_config:null,multiple_choice_config:null,link_config:{button_text:"Book a demo",link_text:"",redirect_url:"https://example.com",open_in:"new_tab"},after_this_page:{default:"end_survey",conditions:[]},required:!0}]}],o=t=>new Promise(e=>setTimeout(e,t));function r(){if("undefined"==typeof navigator)return{device:null,browser:null,os:null};const t=navigator.userAgent;let e="desktop";/Mobi|Android/i.test(t)&&(e=/Tablet|iPad/i.test(t)?"tablet":"mobile");let n="unknown";t.includes("Firefox")?n="firefox":t.includes("Edg")?n="edge":t.includes("Chrome")?n="chrome":t.includes("Safari")?n="safari":(t.includes("Opera")||t.includes("OPR"))&&(n="opera");let i="unknown";return t.includes("Windows")?i="windows":t.includes("Mac")?i="macos":t.includes("Linux")?i="linux":t.includes("Android")?i="android":(t.includes("iPhone")||t.includes("iPad"))&&(i="ios"),{device:e,browser:n,os:i}}class l{constructor(t){this.api=t}async getChangelogs(t={}){return await this.api._ensureSession(),this.api.mock?(await o(300),{success:!0,data:e}):this.api._handleAuthRetry(async()=>{const e=this.api._getEndpointWithParams("/widget/changelogs",t);return await this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}}class c{constructor(t){this.api=t}async submitFeedback(t){if(await this.api._ensureSession(),this.api.mock)return await o(500),{success:!0,data:{id:"mock_post_"+Date.now(),title:t.title,content:t.content},message:"Feedback submitted successfully!"};const e=this.api.getContactIdentity(),n={board:t.board_id||t.board||t.boardName,title:t.title,content:t.content,attachments:t.attachments||[],...e?.contactId&&{contact_id:e.contactId,contact_email:e.contactEmail,contact_name:e.contactName}};return this.api._handleAuthRetry(async()=>await this.api._makeRequest("/widget/feedback",{method:"POST",body:JSON.stringify(n),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}}class d{constructor(t){this.api=t}async getHelpCollections(t={}){if(await this.api._ensureSession(),this.api.mock)return await o(200),{status:!0,data:a};const e=this.api._getEndpointWithParams("/widget/help/collections",t);return this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async searchHelpArticles(t,e={}){if(await this.api._ensureSession(),this.api.mock){await o(200);return{status:!0,data:a.filter(e=>e.title.toLowerCase().includes(t.toLowerCase())||e.description.toLowerCase().includes(t.toLowerCase()))}}const n={q:t,...e},i=this.api._getEndpointWithParams("/widget/help/search",n);return this.api._makeRequest(i,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}}class h{constructor(t){this.api=t}async getLiveChatSettings(){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/livechat/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",available_agents:[{full_name:"Sarah",picture:""},{full_name:"Tom",picture:""}]}}:this.api._makeRequest("/widget/livechat/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversations(t={}){if(await this.api._ensureSession(),this.api.mock)return await o(300),{status:!0,data:n,meta:{total:n.length,page:1,limit:20}};const e=this.api._getEndpointWithParams("/widget/livechat/conversations",t);return this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversation(t){if(await this.api._ensureSession(),this.api.mock){await o(200);return{status:!0,data:{...n.find(e=>e.id===t),messages:i[t]||[]}}}return this.api._makeRequest(`/widget/livechat/conversations/${t}`,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async startConversation(t){if(await this.api._ensureSession(),this.api.mock){await o(300);const e={id:"conv_"+Date.now(),subject:t.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:t.message,sender_type:"customer",created_at:(new Date).toISOString(),attachments:t.attachments||[]}]};return n.unshift(e),i[e.id]=e.messages,{status:!0,data:e}}return this.api._makeRequest("/widget/livechat/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({message:t.message,subject:t.subject||"",attachments:t.attachments||[]})})}async sendMessage(t,e){if(await this.api._ensureSession(),this.api.mock){await o(200);const n={id:"msg_"+Date.now(),content:e.content,sender_type:"customer",created_at:(new Date).toISOString(),attachments:e.attachments||[]};return i[t]||(i[t]=[]),i[t].push(n),{status:!0,data:n}}return this.api._makeRequest(`/widget/livechat/conversations/${t}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({content:e.content,attachments:e.attachments||[]})})}async getUnreadCount(){if(await this.api._ensureSession(),this.api.mock){const t=n.reduce((t,e)=>t+(e.unread||0),0);return{status:!0,data:{unread_count:t,unread_conversations:t>0?1:0}}}return this.api._makeRequest("/widget/livechat/unread",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async markConversationAsRead(t){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/livechat/conversations/${t}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getMessages(t,e={}){if(await this.api._ensureSession(),this.api.mock)return await o(200),{status:!0,data:i[t]||[],meta:{total:0,page:1,limit:50}};const n={...e},a=this.api._getEndpointWithParams(`/widget/livechat/conversations/${t}/messages`,n);return this.api._makeRequest(a,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async uploadFile(t,e){return await this.api._ensureSession(),this.api.mock?(await o(300),{status:!0,url:`https://mock-cdn.example.com/${e}`}):this.api._makeRequest("/widget/livechat/upload",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({file:t,filename:e})})}async identifyContact(t){return this.api.identify(t)}async submitRating(t,e){return await this.api._ensureSession(),this.api.mock?{status:!0,data:{rated:!0}}:this.api._makeRequest(`/widget/livechat/conversations/${t}/rating`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify(e)})}async sendTypingIndicator(t,e){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/livechat/conversations/${t}/typing`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({is_typing:e})})}}class p extends Error{constructor(t,e){super(t),this.name="SDKError",this.cause=e,Error.captureStackTrace&&Error.captureStackTrace(this,p)}}class g extends Error{constructor(t,e,n){super(e),this.name="APIError",this.status=t,this.response=n,Error.captureStackTrace&&Error.captureStackTrace(this,g)}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(t,e,n){super(t),this.name="WidgetError",this.widgetType=e,this.widgetId=n,Error.captureStackTrace&&Error.captureStackTrace(this,u)}}class v extends Error{constructor(t,e){super(t),this.name="ConfigError",this.configKey=e,Error.captureStackTrace&&Error.captureStackTrace(this,v)}}class m extends Error{constructor(t,e,n){super(t),this.name="ValidationError",this.field=e,this.value=n,Error.captureStackTrace&&Error.captureStackTrace(this,m)}}class f{constructor(t){this.api=t}async getActiveSurveys(t={}){if(await this.api._ensureSession(),this.api.mock)return await o(200),{success:!0,data:s};const e=this._getRespondentContext(t),n={url:t.url||("undefined"!=typeof window?window.location.href:""),...r(),...e.respondent_id&&{respondent_id:e.respondent_id},...e.email&&{email:e.email},...void 0!==t.includeEligibility&&{include_eligibility:t.includeEligibility},...t.userProperties&&{user_properties:t.userProperties}};return this.api._handleAuthRetry(async()=>{const t=this.api._getEndpointWithParams("/widget/surveys/active",n);return await this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}_getRespondentContext(t={}){const e="function"==typeof this.api.getMetadata&&this.api.getMetadata()||{};return{respondent_id:t.respondentId||t.userId||e.user_id||null,email:t.email||e.email||null}}async submitSurveyResponse(t,e){if(!t)throw new g(400,"Survey ID is required");if(await this.api._ensureSession(),this.api.mock)return await o(300),{success:!0,data:{id:"mock_response_"+Date.now(),survey_id:t,...e},message:"Survey response submitted successfully!"};const n=this._getRespondentContext(e),i=this.api.getContactIdentity?.()||null,a={answers:Array.isArray(e.answers)?e.answers:[],...e.feedback&&{feedback:e.feedback},...n.respondent_id&&{respondent_id:n.respondent_id},...n.email&&{email:n.email},...i?.contactId&&{contact_id:i.contactId,contact_email:i.contactEmail,contact_name:i.contactName}};return this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${t}/responses`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}async dismissSurvey(t){if(!t)throw new g(400,"Survey ID is required");return await this.api._ensureSession(),this.api.mock?(await o(100),{success:!0,message:"Survey dismissed successfully"}):this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${t}/dismiss`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}}))}}class b{constructor(t={}){this.workspace=t.workspace,this.sessionToken=null,this.sessionExpiry=null,this.metadata=t.metadata||null,this.identitySyncedToken=null,this.mock=t.mock||!1,this.env=t.env||"production",this.baseURL=this._getBaseURL(t),this._loadStoredSession(),this._loadStoredMetadata(),this.isSessionValid()&&this.metadata&&(this.identitySyncedToken=this.sessionToken)}_getBaseURL(t){if(t.apiUrl)return t.apiUrl;const e={production:{base:"https://api.product7.io/api/v1",withWorkspace:t=>`https://${t}.api.product7.io/api/v1`},staging:{base:"https://staging.api.product7.io/api/v1",withWorkspace:t=>`https://${t}.staging.api.product7.io/api/v1`},localstack:{base:"http://localhost:1323/api/v1",withWorkspace:t=>`http://${t}.localhost:1323/api/v1`}};let n=this.env;if(!n||"production"===n){const t="undefined"!=typeof window&&window.location?.hostname||"",e="undefined"!=typeof window&&window.location?.port||"";t.includes("staging")?n="staging":"app.localhost"===t&&"3005"===e&&(n="localstack")}const i=e[n]||e.production;return this.workspace?i.withWorkspace(this.workspace):i.base}async init(t=void 0){if(void 0!==t&&this.setMetadata(t),this.isSessionValid())return{sessionToken:this.sessionToken};if(!this.workspace)throw new g(400,"Missing 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.identitySyncedToken=null,this._storeSession(),{sessionToken:this.sessionToken,config:{primaryColor:"#21244A",backgroundColor:"#ffffff",textColor:"#1F2937",boardName:"feature-requests",size:"medium",displayMode:"modal"},expiresIn:3600}}async _initRealSession(){const t={workspace:this.workspace};try{const e=await this._makeRequest("/widget/init",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}}),n=this._extractInitResponseData(e);return this.sessionToken=n.sessionToken,this.sessionExpiry=new Date(Date.now()+1e3*n.expiresIn),this.identitySyncedToken=null,this._storeSession(),{sessionToken:this.sessionToken,config:n.config,widgets:n.widgets,expiresIn:n.expiresIn,status:n.status,message:n.message,configVersion:n.configVersion}}catch(t){throw new g(t.status||500,`Failed to initialize widget: ${t.message}`,t.response)}}_extractInitResponseData(t){const e=t&&"object"==typeof t.data?t.data:t||{},n=e.config&&"object"==typeof e.config?e.config:{},i=e.session_token||e.sessionToken||n.session_token||n.sessionToken,a=Number(e.expires_in??e.expiresIn??n.expires_in??n.expiresIn);if(!i)throw new g(500,"Invalid init response: missing session_token");if(!Number.isFinite(a)||a<=0)throw new g(500,"Invalid init response: missing expires_in");return{sessionToken:i,expiresIn:a,config:n,widgets:e.widgets&&"object"==typeof e.widgets?e.widgets:null,configVersion:n.config_version??n.configVersion??e.config_version??e.configVersion??null,status:t?.status??e?.status??!0,message:t?.message??e?.message??null}}async _ensureSession(){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new g(401,"No valid session token available")}async _handleAuthRetry(t,...e){try{return await t.apply(this,e)}catch(n){if(401===n.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),await this._restoreIdentity(),await t.apply(this,e);throw n}}async identify(t=this.metadata){if(void 0!==t&&this.setMetadata(t),!this.metadata)throw new g(400,"Missing user context for identify");await this._ensureSession();const e=this._buildIdentifyPayload(this.metadata);if(this.mock)return this.identitySyncedToken=this.sessionToken,{status:!0,identified:!0,data:{user_id:e.user_id||null,email:e.email||null,name:e.name||null}};const n=await this._makeRequest("/widget/identify",{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`}});return this.identitySyncedToken=this.sessionToken,n}isSessionValid(){return this.sessionToken&&this.sessionExpiry&&new Date<this.sessionExpiry}setMetadata(t){this.metadata=t||null,this.identitySyncedToken=null,this.metadata?this._storeData("product7_metadata",this.metadata):this._removeData("product7_metadata")}getMetadata(){return this.metadata}clearSession(){this.sessionToken=null,this.sessionExpiry=null,this.identitySyncedToken=null,this.contactId=null,this.contactEmail=null,this.contactName=null,this._removeData("product7_session"),this._removeData("product7_metadata"),this._removeData("product7_contact")}_storeSession(){if("undefined"!=typeof localStorage)try{const t={token:this.sessionToken,expiry:this.sessionExpiry.toISOString(),workspace:this.workspace};this._storeData("product7_session",t)}catch(t){}}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const t=localStorage.getItem("product7_session");if(!t)return!1;const e=JSON.parse(t);return(e.token&&e.token.startsWith("mock_"))!==this.mock||this.workspace&&e.workspace&&e.workspace!==this.workspace?(localStorage.removeItem("product7_session"),!1):(this.sessionToken=e.token,this.sessionExpiry=new Date(e.expiry),this.isSessionValid())}catch(t){return!1}}_loadStoredMetadata(){if(this.metadata||"undefined"==typeof localStorage)return!1;try{const t=localStorage.getItem("product7_session");if(t){const e=JSON.parse(t);if(this.workspace&&e.workspace&&e.workspace!==this.workspace)return!1}const e=localStorage.getItem("product7_metadata");return!!e&&(this.metadata=JSON.parse(e),!0)}catch(t){return!1}}_storeData(t,e){"undefined"!=typeof localStorage&&localStorage.setItem(t,JSON.stringify(e))}_removeData(t){"undefined"!=typeof localStorage&&localStorage.removeItem(t)}async _makeRequest(t,e={}){const n=`${this.baseURL}${t}`;try{const t=await fetch(n,e);if(!t.ok){let e=`HTTP ${t.status}`,n=null;try{n=await t.json(),e=n.message||n.error||e}catch(n){e=await t.text()||e}throw new g(t.status,e,n)}const i=t.headers.get("content-type");return i&&i.includes("application/json")?await t.json():await t.text()}catch(t){if(t instanceof g)throw t;throw new g(0,t.message,null)}}_buildQueryParams(t){const e=new URLSearchParams;return Object.entries(t).forEach(([t,n])=>{null!=n&&e.append(t,"object"==typeof n?JSON.stringify(n):n)}),e.toString()}_getEndpointWithParams(t,e){const n=this._buildQueryParams(e);return`${t}${n?"?"+n:""}`}_buildIdentifyPayload(t={}){const e={user_id:t.user_id,email:t.email,name:t.name,avatar:t.profile_picture||t.avatar_url||t.avatar,attributes:t.custom_fields||{}};return t.company&&(e.company=t.company),e}async _restoreIdentity(){this.metadata&&this.sessionToken&&this.identitySyncedToken&&this.identitySyncedToken!==this.sessionToken&&await this.identify(this.metadata)}}class y extends b{constructor(t={}){super(t),this.feedback=new c(this),this.survey=new f(this),this.liveChat=new h(this),this.help=new d(this),this.changelog=new l(this)}async submitFeedback(t){return this.feedback.submitFeedback(t)}async getActiveSurveys(t){return this.survey.getActiveSurveys(t)}async submitSurveyResponse(t,e){return this.survey.submitSurveyResponse(t,e)}async dismissSurvey(t){return this.survey.dismissSurvey(t)}async getLiveChatSettings(){return this.liveChat.getLiveChatSettings()}async checkAgentsOnline(){return this.liveChat.checkAgentsOnline()}async getConversations(t){return this.liveChat.getConversations(t)}async getConversation(t){return this.liveChat.getConversation(t)}async getMessages(t,e){return this.liveChat.getMessages(t,e)}async startConversation(t){return this.liveChat.startConversation(t)}async sendMessage(t,e){return this.liveChat.sendMessage(t,e)}async uploadFile(t,e){return this.liveChat.uploadFile(t,e)}async sendTypingIndicator(t,e){return this.liveChat.sendTypingIndicator(t,e)}async markConversationAsRead(t){return this.liveChat.markConversationAsRead(t)}async getUnreadCount(){return this.liveChat.getUnreadCount()}async submitRating(t,e){return this.liveChat.submitRating(t,e)}async identify(t){if(await this._ensureSession(),this.mock){await new Promise(t=>setTimeout(t,300));const e={status:!0,data:{contact_id:"mock_contact_"+Date.now(),email:t.email||"",name:t.name||"",avatar:t.avatar||"",is_new:!0}};return this._storeContactIdentity(e.data,t),e}const e={};t.email&&(e.email=t.email),t.user_id&&(e.user_id=t.user_id),t.name&&(e.name=t.name),t.avatar&&(e.avatar=t.avatar),t.attributes&&(e.attributes=t.attributes),t.company&&(e.company=t.company);const n=await this._makeRequest("/widget/identify",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify(e)});return n?.status&&n?.data&&this._storeContactIdentity(n.data,t),n}_storeContactIdentity(t,e={}){this.contactId=t.contact_id||null,this.contactEmail=t.email||e.email||null,this.contactName=t.name||e.name||null;try{localStorage.setItem("product7_contact",JSON.stringify({contactId:this.contactId,contactEmail:this.contactEmail,contactName:this.contactName}))}catch(t){}}getContactIdentity(){if(this.contactId)return{contactId:this.contactId,contactEmail:this.contactEmail,contactName:this.contactName};try{const t=localStorage.getItem("product7_contact");if(t){const e=JSON.parse(t);return this.contactId=e.contactId,this.contactEmail=e.contactEmail,this.contactName=e.contactName,e}}catch(t){}return null}async identifyContact(t){return this.identify(t)}async getHelpCollections(t){return this.help.getHelpCollections(t)}async searchHelpArticles(t,e){return this.help.searchHelpArticles(t,e)}async getChangelogs(t){return this.changelog.getChangelogs(t)}}class w{constructor(){this.events=new Map}on(t,e){return this.events.has(t)||this.events.set(t,[]),this.events.get(t).push(e),()=>this.off(t,e)}off(t,e){const n=this.events.get(t);if(n){const t=n.indexOf(e);t>-1&&n.splice(t,1)}}emit(t,e){const n=this.events.get(t);n&&n.forEach(t=>{try{t(e)}catch(t){console.error("[Product7] Event callback error:",t)}})}once(t,e){const n=this.on(t,t=>{e(t),n()});return n}clear(){this.events.clear()}getListenerCount(t){const e=this.events.get(t);return e?e.length:0}}function C(t="feedback"){return`${t}_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}function k(t,e){const n={...t};for(const i in e)e.hasOwnProperty(i)&&(e[i]&&"object"==typeof e[i]&&!Array.isArray(e[i])?n[i]=k(t[i]||{},e[i]):n[i]=e[i]);return n}function x(){return"undefined"!=typeof window&&"undefined"!=typeof document}var _=Object.freeze({__proto__:null,debounce:function(t,e){let n;return function(...i){clearTimeout(n),n=setTimeout(()=>{clearTimeout(n),t(...i)},e)}},deepMerge:k,delay:function(t){return new Promise(e=>setTimeout(e,t))},escapeRegex:function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},formatFileSize:function(t){if(0===t)return"0 Bytes";const e=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,e)).toFixed(2))+" "+["Bytes","KB","MB","GB"][e]},generateId:C,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(t,e,n=""){if(!t||!e)return n;try{return window.getComputedStyle(t).getPropertyValue(e)||n}catch(t){return n}},getCurrentTimestamp:function(){return(new Date).toISOString()},getNestedProperty:function(t,e,n=void 0){if(!t||!e)return n;const i=e.split(".");let a=t;for(const t of i){if(null==a||!(t in a))return n;a=a[t]}return a},isBrowser:x,isInViewport:function(t){if(!t)return!1;const e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)},isMobile:function(){return!!x()&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<=768)},isValidEmail:function(t){return!(!t||"string"!=typeof t)&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.trim())},safeJsonParse:function(t,e=null){try{return JSON.parse(t)}catch(t){return e}},sanitizeHTML:function(t){if(!t||"string"!=typeof t)return"";const e=document.createElement("div");return e.textContent=t,e.innerHTML},scrollToElement:function(t,e={}){if(!t)return;t.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest",...e})},setNestedProperty:function(t,e,n){if(!t||!e)return t;const i=e.split("."),a=i.pop();let s=t;for(const t of i)t in s&&"object"==typeof s[t]||(s[t]={}),s=s[t];return s[a]=n,t},throttle:function(t,e){let n,i;return function(...a){i?(clearTimeout(n),n=setTimeout(()=>{Date.now()-i>=e&&(t(...a),i=Date.now())},e-(Date.now()-i))):(t(...a),i=Date.now())}},validateConfig:function(t,e=[]){const n=[];for(const i of e)t[i]||n.push(i);if(n.length>0)throw new Error(`Missing required configuration: ${n.join(", ")}`);return!0}});class q{static STORAGE_KEY="feedback_submitted";static DEFAULT_COOLDOWN_DAYS=30;constructor(t={}){this.id=t.id,this.sdk=t.sdk,this.apiService=t.apiService,this.type=t.type||"base",this.options={container:null,position:this.sdk.config.position,boardName:this.sdk.config.boardName,displayMode:t.displayMode||"panel",size:t.size||"medium",primaryColor:t.primaryColor||"#155EEF",backgroundColor:t.backgroundColor||"#ffffff",textColor:t.textColor||"#1F2937",autoShow:!1,showBackdrop:!0,customStyles:{},suppressAfterSubmission:!0,suppressionDays:q.DEFAULT_COOLDOWN_DAYS,trigger:!0,...t},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(t){if(this.mounted||this.destroyed)return this;if(!1===this.options.enabled)return this.sdk.eventBus.emit("widget:suppressed",{widget:this,type:this.type,reason:"disabled"}),this;if(this.options.suppressAfterSubmission&&this._hasRecentlySubmitted())return this.sdk.eventBus.emit("widget:suppressed",{widget:this,reason:"recently_submitted"}),this;if("string"==typeof t&&(t=document.querySelector(t)),t||(t=document.body),this.container=t,this.element=this._render(),this.container.appendChild(this.element),this.mounted=!0,this._attachEvents(),this.options.trigger&&!0!==this.options.trigger){const t="string"==typeof this.options.trigger?document.querySelector(this.options.trigger):this.options.trigger instanceof Element?this.options.trigger:null;t&&t.addEventListener("click",()=>this.open())}return 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,this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")})}_showLoadingModal(){this.state.isLoading=!0,this.options.showBackdrop&&(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&&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"),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()}async submitFeedback(){if(!this.state.isSubmitting){this._hideError();try{this.state.isSubmitting=!0,this._updateSubmitButton();const t={title:this.state.title||"Feedback",content:this.state.content,email:this.state.email,board_id:this.options.boardName,attachments:this.state.attachments};if(!this.state.title.trim())return void this._showError("Please enter a title.");if(!this.state.content.trim())return void this._showError("Please enter your feedback message.");const e=await this.apiService.submitFeedback(t);this._trackSubmission(),this._showSuccessInPanel(),this.sdk.eventBus.emit("feedback:submitted",{widget:this,feedback:e})}catch(t){this._showError("Failed to submit feedback. Please try again."),this.sdk.eventBus.emit("feedback:error",{widget:this,error:t})}finally{this.state.isSubmitting=!1,this._updateSubmitButton()}}}handleConfigUpdate(t){this.options.theme=t.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 t=this.sdk.config.workspace,e=`${q.STORAGE_KEY}_${t}`,n={submittedAt:Date.now(),boardName:this.options.boardName};localStorage.setItem(e,JSON.stringify(n))}catch(t){console.warn("Failed to track feedback submission:",t)}}_hasRecentlySubmitted(){const t=24*this.options.suppressionDays*60*60*1e3,e=Date.now();if(this.sdk.config.last_feedback_at)try{if(e-new Date(this.sdk.config.last_feedback_at).getTime()<t)return!0}catch(t){}try{const n=this.sdk.config.workspace,i=`${q.STORAGE_KEY}_${n}`,a=localStorage.getItem(i);if(!a)return!1;const s=JSON.parse(a);return e-s.submittedAt<t}catch(t){return!1}}clearSubmissionTracking(){try{const t=this.sdk.config.workspace,e=`${q.STORAGE_KEY}_${t}`;localStorage.removeItem(e)}catch(t){console.warn("Failed to clear submission tracking:",t)}}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 t="modal"===this.options.displayMode?"feedback-modal":"feedback-panel",e=`size-${this.options.size}`;this.panelElement=document.createElement("div");const n=`theme-${this.options.theme||"light"}`,i="feedback-panel"===t&&String(this.options.position).includes("left")?"panel-from-left":"";this.panelElement.className=`${t} ${e} ${n} ${i}`.trim(),this.panelElement.style.setProperty("--color-primary",this.options.primaryColor),this.panelElement.style.setProperty("--feedback-panel-bg",this.options.backgroundColor),this.panelElement.style.setProperty("--feedback-panel-text",this.options.textColor),this.panelElement.innerHTML=this._getPanelHTML(),document.body.appendChild(this.panelElement),this._attachPanelEvents();const a=this.panelElement.querySelector("input, textarea");a&&setTimeout(()=>a.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 <iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n </button>\n</div>\n <div class="feedback-panel-body">\n <form class="feedback-form">\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-title-${this.id}">Title <span class="sdk-required">*</span></label>\n <input \n type="text" \n id="feedback-title-${this.id}" \n name="title" \n class="sdk-input"\n placeholder="Brief description of your feedback"\n value="${this.state.title}"\n />\n </div>\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-content-${this.id}">Message <span class="sdk-required">*</span></label>\n <textarea \n id="feedback-content-${this.id}" \n name="content" \n class="sdk-textarea"\n placeholder="Tell us what you think..."\n required\n >${this.state.content}</textarea>\n </div>\n <div class="feedback-error" role="alert"></div>\n <div class="feedback-form-actions">\n <button type="submit" class="sdk-btn-primary sdk-btn-block">\n ${this.state.isSubmitting?"Sending...":"Send Feedback"}\n </button>\n </div>\n </form>\n </div>\n </div>\n `}_attachPanelEvents(){const t=this.panelElement;t.querySelector(".sdk-close-btn").addEventListener("click",this.closePanel);t.querySelector(".feedback-form").addEventListener("submit",t=>{t.preventDefault(),this.submitFeedback()}),t.querySelector('input[name="title"]').addEventListener("input",t=>{this.state.title=t.target.value}),t.querySelector('textarea[name="content"]').addEventListener("input",t=>{this.state.content=t.target.value});const e=t=>{"Escape"===t.key&&(this.closePanel(),document.removeEventListener("keydown",e))};document.addEventListener("keydown",e)}_updateSubmitButton(){if(this.panelElement){const t=this.panelElement.querySelector(".sdk-btn-primary");t&&(t.disabled=this.state.isSubmitting,t.innerHTML=this.state.isSubmitting?'<iconify-icon icon="ph:circle-notch" width="16" height="16" style="animation: spin 0.8s linear infinite;"></iconify-icon> Sending...':"Send Feedback")}}_showError(t){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-error");e&&(e.textContent=t,e.classList.add("show"))}}_hideError(){if(this.panelElement){const t=this.panelElement.querySelector(".feedback-error");t&&t.classList.remove("show")}}_showSuccessInPanel(){if(!this.panelElement)return;const t=this.panelElement.querySelector(".feedback-panel-content");t&&(t.innerHTML='\n\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; padding: 40px 24px; text-align: center;">\n\t\t\t\t<div style="width: 56px; height: 56px; border-radius: 50%; background: #037F0C; display: flex; align-items: center; justify-content: center; margin-bottom: 20px;">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" stroke="#ffffff" stroke-width="24" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 256 256">\n\t\t\t\t\t\t<polyline points="216,72 96,192 40,136"/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3 style="margin: 0 0 8px; font-size: 1.25rem; font-weight: 600; color: var(--feedback-panel-text, #1d1d1f);">Thank you!</h3>\n\t\t\t\t<p style="margin: 0; font-size: 0.875rem; color: #6b7280; line-height: 1.5;">Your feedback has been submitted successfully.</p>\n\t\t\t</div>\n\t\t',setTimeout(()=>this.closePanel(),2e3))}_resetForm(){this.state.title="",this.state.content="",this.state.email="",this.state.errors={}}_updateTheme(){}open(){return this.openPanel(),this}close(){return this.closePanel(),this}toggle(){return this.state.isOpen?this.closePanel():this.openPanel(),this}openModal(){this.openPanel()}closeModal(){this.closePanel()}}class S extends q{constructor(t){super({...t,type:"button"}),this.isMinimized=!1,this._hiddenForOpenPanel=!1}_hasTrigger(){return!0===this.options.trigger||void 0===this.options.trigger}_render(){if(!this._hasTrigger()){const t=document.createElement("div");return t.style.display="none",t}const t=this.options.buttonText||this.options.triggerText||this.options.label||this.options.text||"Feedback",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" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n <path d="M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-8,144H40V74.19l82.59,75.71a8,8,0,0,0,10.82,0L216,74.19V192Z"/>\n </svg>\n <span class="feedback-text">${t}</span>\n </button>\n `,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){if(!this._hasTrigger())return;const t=this.element.querySelector(".feedback-trigger-btn");t.addEventListener("click",()=>{this.openPanel()}),t.addEventListener("pointerup",t=>{"mouse"!==t.pointerType&&this.openPanel()})}openPanel(){this._hasTrigger()&&!this.state.isOpen&&(this._hiddenForOpenPanel=!0,this.hide()),super.openPanel()}closePanel(){const t=this._hiddenForOpenPanel;super.closePanel(),t&&setTimeout(()=>{this.destroyed||this.options._noTriggerButton||this.show(),this._hiddenForOpenPanel=!1},320)}mount(t){super.mount(t)}updateText(t){const e=this.element?.querySelector(".feedback-text");e&&(e.textContent=t)}updatePosition(t){this.options.position=t,this.element&&(this.element.className=this.element.className.replace(/position-\w+/,`position-${t}`))}}class A extends q{constructor(t){super({...t,type:"changelog"}),this.changelogs=[],this.isLoading=!1,this.modalElement=null,this.sidebarElement=null,this.listModalBackdropElement=null,this.currentIndex=0}_hasTrigger(){return!0===this.options.trigger||void 0===this.options.trigger}_render(){if(!this._hasTrigger()){const t=document.createElement("div");return t.style.display="none",t}const t=document.createElement("div");return t.className=`changelog-widget position-${this.options.position} changelog-theme-${this.options.theme||"light"}`,t.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(t.style,this.options.customStyles),t}_attachEvents(){if(!this._hasTrigger())return;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(){!1!==this.options.showBackdrop&&(this.backdropElement=document.createElement("div"),this.backdropElement.className=`changelog-modal-backdrop changelog-theme-${this.options.theme||"light"}`,document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this.closeModal())),this.modalElement=document.createElement("div"),this.modalElement.className=`changelog-modal changelog-theme-${this.options.theme||"light"}`,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">\n\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class="changelog-modal-content">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',document.body.appendChild(this.modalElement),this.modalElement.querySelector(".changelog-modal-container").addEventListener("click",t=>t.stopPropagation()),this.modalElement.querySelector(".changelog-modal-close").addEventListener("click",()=>this.closeModal()),this._escapeHandler=t=>{"Escape"===t.key&&this.closeModal()},document.addEventListener("keydown",this._escapeHandler)}async openSidebar(){this.listModalElement||(this.modalElement&&(this.closeModal(),await new Promise(t=>setTimeout(t,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 t=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA"],e=document.createElement("div");e.className="changelog-confetti-container",document.body.appendChild(e);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=t[Math.floor(Math.random()*t.length)],n.style.animationDelay=.5*Math.random()+"s",n.style.animationDuration=1*Math.random()+1.5+"s";const i=["circle","square","rectangle"],a=i[Math.floor(Math.random()*i.length)];"circle"===a?(n.style.borderRadius="50%",n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width):"rectangle"===a?(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),e.appendChild(n)}setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},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(){!1!==this.options.showBackdrop&&(this.listModalBackdropElement=document.createElement("div"),this.listModalBackdropElement.className=`changelog-list-modal-backdrop changelog-theme-${this.options.theme||"light"}`,document.body.appendChild(this.listModalBackdropElement),this.listModalBackdropElement.addEventListener("click",()=>this.closeSidebar())),this.listModalElement=document.createElement("div"),this.listModalElement.className=`changelog-list-modal changelog-theme-${this.options.theme||"light"}`,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\t<button class="changelog-list-modal-close" type="button" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="changelog-list-modal-body">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,document.body.appendChild(this.listModalElement),this.listModalElement.querySelector(".changelog-list-modal-container").addEventListener("click",t=>t.stopPropagation()),this.listModalElement.querySelector(".changelog-list-modal-close").addEventListener("click",()=>this.closeSidebar()),this._listModalEscapeHandler=t=>{"Escape"===t.key&&this.closeSidebar()},document.addEventListener("keydown",this._listModalEscapeHandler)}_renderChangelogList(){const t=this.listModalElement.querySelector(".changelog-list-modal-body");this.isLoading||(0!==this.changelogs.length?(t.innerHTML=`\n\t\t\t<div class="changelog-list">\n\t\t\t\t${this.changelogs.map((t,e)=>this._renderChangelogListItem(t,e)).join("")}\n\t\t\t</div>\n\t\t`,t.querySelectorAll(".changelog-list-item").forEach((t,e)=>{t.addEventListener("click",()=>{this._handleViewUpdate(this.changelogs[e])})})):t.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(t,e){const n=t.cover_image||t.image,i=t.cover_image||t.image,a=t.published_at?this._formatDate(t.published_at):"",s=this._stripHtml(t.excerpt||t.description);return`\n\t\t\t<div class="changelog-list-item" data-index="${e}">\n\t\t\t\t<div class="changelog-list-item-content">\n\t\t\t\t\t<div class="changelog-list-item-meta">\n\t\t\t\t\t\t${a?`<span class="changelog-list-item-date">${a}</span>`:""}\n\t\t\t\t\t\t${t.labels&&t.labels.length>0?`<div class="changelog-list-item-labels">\n\t\t\t\t\t\t${t.labels.map(t=>`<span class="changelog-label" style="background-color: ${t.color||"#E5E7EB"}; color: ${this._getContrastColor(t.color||"#E5E7EB")}">${t.name}</span>`).join("")}\n\t\t\t\t\t</div>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3 class="changelog-list-item-title">${t.title}</h3>\n\t\t\t\t\t${s?`<p class="changelog-list-item-description">${s}</p>`:""}\n\t\t\t\t</div>\n\t\t\t\t${n?`<div class="changelog-list-item-image"><img src="${i}" alt="${t.title}" loading="lazy" /></div>`:""}\n\t\t\t\t<iconify-icon icon="ph:caret-right" class="changelog-list-item-arrow" width="16" height="16"></iconify-icon>\n\t\t\t</div>\n\t\t`}async _loadChangelogs(){this.isLoading=!0;try{const t=await this.apiService.getChangelogs();this.changelogs=t.data||[],this.sdk.eventBus.emit("changelog:loaded",{changelogs:this.changelogs})}catch(t){this.changelogs=[],this.sdk.eventBus.emit("changelog:error",{error:t})}finally{this.isLoading=!1}}_renderCurrentChangelog(){const t=this.modalElement.querySelector(".changelog-modal-content");if(this.isLoading)return;if(0===this.changelogs.length)return void(t.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 e=this.changelogs[this.currentIndex],n=e.cover_image||e.image,i=e.cover_image||e.image,a=this.changelogs.length>1,s=this._stripHtml(e.excerpt||e.description);t.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="${i}" alt="${e.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">${e.title}</h2>\n\t\t\t\t\t${s?`<p class="changelog-popup-description">${s}</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${a?`\n\t\t\t\t\t\t<div class="changelog-popup-dots">\n\t\t\t\t\t\t\t${this.changelogs.map((t,e)=>`\n\t\t\t\t\t\t\t\t<span class="changelog-dot ${e===this.currentIndex?"active":""}" data-index="${e}"></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<iconify-icon icon="ph:arrow-right" width="16" height="16"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,t.querySelector(".changelog-popup-btn").addEventListener("click",()=>{this._handleViewUpdate(e)}),t.querySelector(".changelog-view-all-btn").addEventListener("click",()=>{this.closeModal(),setTimeout(()=>this.openSidebar(),350)}),a&&t.querySelectorAll(".changelog-dot").forEach(t=>{t.addEventListener("click",t=>{this.currentIndex=parseInt(t.target.dataset.index,10),this._renderCurrentChangelog()})})}_handleViewUpdate(t){this.sdk.eventBus.emit("changelog:view",{changelog:t});const e=(this.options.changelogBaseUrl||"").replace(/\/$/,""),n=t.url||(t.slug&&e?`${e}/${t.slug}`:null)||e||null;n&&(!1!==this.options.openInNewTab?window.open(n,"_blank","noopener,noreferrer"):window.location.href=n),"function"==typeof this.options.onViewUpdate&&this.options.onViewUpdate(t)}_stripHtml(t){const e=document.createElement("div");return e.innerHTML=t,(e.textContent||e.innerText||"").trim()}_truncateDescription(t,e=120){if(!t)return"";const n=this._stripHtml(t);return n.length<=e?n:n.substring(0,e).trimEnd()+"..."}_formatDate(t){return new Date(t).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}_getContrastColor(t){const e=t.replace("#","");return(.299*parseInt(e.substr(0,2),16)+.587*parseInt(e.substr(2,2),16)+.114*parseInt(e.substr(4,2),16))/255>.5?"#1F2937":"#FFFFFF"}hideBadge(){const t=this.element?.querySelector(".changelog-badge");t&&(t.style.display="none")}showBadge(){const t=this.element?.querySelector(".changelog-badge");t&&(t.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()}open(){return this.openSidebar(),this}close(){return this.closeSidebar(),this}toggle(){return this.state.isOpen?this.closeSidebar():this.openSidebar(),this}mount(t){if(super.mount(t),this.options.trigger&&!0!==this.options.trigger){const t="string"==typeof this.options.trigger?document.querySelector(this.options.trigger):this.options.trigger instanceof Element?this.options.trigger:null;t&&t.addEventListener("click",()=>this.open())}}destroy(){this._escapeHandler&&document.removeEventListener("keydown",this._escapeHandler),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler),this.closeModal(),this.closeSidebar(),super.destroy()}}class E extends q{constructor(t){super({...t,type:"inline"})}_render(){const t=document.createElement("div");return t.className="feedback-widget feedback-widget-inline",t.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(t.style,this.options.customStyles),t}_attachEvents(){const t=this.element.querySelector(".feedback-inline-form");t.addEventListener("submit",t=>{t.preventDefault(),this.submitFeedback()}),t.querySelector('input[name="title"]').addEventListener("input",t=>{this.state.title=t.target.value}),t.querySelector('textarea[name="content"]').addEventListener("input",t=>{this.state.content=t.target.value}),t.querySelector('input[name="email"]').addEventListener("input",t=>{this.state.email=t.target.value})}openModal(){const t=this.element.querySelector('textarea[name="content"]');t&&t.focus()}closeModal(){}_showSuccessMessage(){const t=this.element.querySelector(".feedback-inline-content"),e=t.innerHTML;t.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 ';t.querySelector(".sdk-btn-primary").addEventListener("click",()=>{t.innerHTML=e,this._attachEvents(),this._resetForm()})}_showError(t){const e=this.element.querySelector(".feedback-error");e&&(e.textContent=t,e.classList.add("show"),setTimeout(()=>{e&&e.classList.remove("show")},5e3))}_updateSubmitButton(){const t=this.element.querySelector(".sdk-btn-primary");t&&(t.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",t.disabled=this.state.isSubmitting)}updateTitle(t){const e=this.element?.querySelector("h3");e&&(e.textContent=t)}setPlaceholder(t,e){const n=this.element?.querySelector(`[name="${t}"]`);n&&(n.placeholder=e)}}class I{constructor(t={}){this.baseURL=t.baseURL||"",this.workspace=t.workspace||"",this.sessionToken=t.sessionToken||null,this.mock=t.mock||!1,this.ws=null,this.reconnectAttempts=0,this.reconnectBaseDelay=1e3,this.reconnectMaxDelay=3e4,this.pingInterval=null,this.isConnected=!1,this.lastFrameAt=0,this.heartbeatTimeoutMs=9e4,this.heartbeatCheckIntervalMs=15e3,this.heartbeatInterval=null,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(t=null){if(t&&(this.sessionToken=t),!this.sessionToken)return void console.warn("[WebSocket] No session token provided");if(this._intentionallyClosed=!1,this.mock)return this.isConnected=!0,this._emit("connected",{}),void this._startMockResponses();const e="https:"===window.location.protocol?"wss:":"ws:";let n=this.baseURL.replace(/^https?:/,e);n=n.replace("/api/v1",""),n=`${n}/api/v1/widget/livechat/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(t){console.error("[WebSocket] Connection error:",t),this._scheduleReconnect()}}disconnect(){this.isConnected=!1,this._intentionallyClosed=!0,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._stopHeartbeat(),this.ws&&(this.ws.close(),this.ws=null),this._mockInterval&&(clearInterval(this._mockInterval),this._mockInterval=null)}_startHeartbeat(){this._stopHeartbeat(),this.lastFrameAt=Date.now(),this.heartbeatInterval=setInterval(()=>{if(Date.now()-this.lastFrameAt>this.heartbeatTimeoutMs&&(console.warn(`[WebSocket] No frames in ${this.heartbeatTimeoutMs}ms, forcing reconnect`),this._stopHeartbeat(),this.ws))try{this.ws.close()}catch(t){}},this.heartbeatCheckIntervalMs)}_stopHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}on(t,e){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(e),()=>this._listeners.get(t).delete(e)}off(t,e){this._listeners.has(t)&&this._listeners.get(t).delete(e)}send(t,e={}){this.isConnected?this.mock?console.log("[WebSocket Mock] Sending:",t,e):this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:t,payload:e})):console.warn("[WebSocket] Not connected, cannot send message")}_onOpen(){console.log("[WebSocket] Connected"),this.isConnected=!0,this.reconnectAttempts=0,this._intentionallyClosed=!1,this._startHeartbeat(),this._emit("connected",{}),this.pingInterval=setInterval(()=>{this.send("ping",{})},3e4)}_onMessage(t){this.lastFrameAt=Date.now();try{const e=JSON.parse(t.data),{type:n,payload:i}=e;switch(n){case"message:new":this._emit("message",i);break;case"typing:started":this._emit("typing_started",i);break;case"typing:stopped":this._emit("typing_stopped",i);break;case"conversation:updated":this._emit("conversation_updated",i);break;case"conversation:closed":this._emit("conversation_closed",i);break;case"availability:changed":this._emit("availability_changed",i);break;case"pong":break;default:console.log("[WebSocket] Unknown event:",n,i)}}catch(t){console.error("[WebSocket] Failed to parse message:",t)}}_onClose(t){console.log("[WebSocket] Disconnected:",t.code,t.reason),this.isConnected=!1,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._stopHeartbeat(),this._emit("disconnected",{code:t.code,reason:t.reason}),this._intentionallyClosed||this._scheduleReconnect()}_onError(t){console.error("[WebSocket] Error:",t),this._emit("error",{error:t})}_scheduleReconnect(){if(this._intentionallyClosed)return;this.reconnectAttempts++;const t=Math.min(this.reconnectBaseDelay*Math.pow(2,this.reconnectAttempts-1),this.reconnectMaxDelay);console.log(`[WebSocket] Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),setTimeout(()=>{this.connect()},t)}_emit(t,e){this._listeners.has(t)&&this._listeners.get(t).forEach(n=>{try{n(e)}catch(e){console.error(`[WebSocket] Error in ${t} handler:`,e)}})}_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(t,e){this.mock&&this._emit("message",{conversation_id:t,message:{id:"msg_"+Date.now(),content:e.content,sender_type:e.sender_type||"agent",sender_name:e.sender_name||"Support",sender_avatar:e.sender_avatar||null,created_at:(new Date).toISOString()}})}}function T(t={}){const{primaryColor:e="#155EEF",textColor:n="#1d1d1f",backgroundColor:i="#ffffff",theme:a="light"}=t;let s=document.getElementById("product7-liveChat-custom-styles");s||(s=document.createElement("style"),s.id="product7-liveChat-custom-styles",document.head.appendChild(s));const o=(t,e,n=1)=>{const i=String(t||"").trim();if(!/^#?[0-9a-fA-F]{6}$/.test(i))return i||"#000000";const a=parseInt(i.replace("#",""),16),s=Math.max(0,Math.min(255,(a>>16)+e)),o=Math.max(0,Math.min(255,(a>>8&255)+e)),r=Math.max(0,Math.min(255,(255&a)+e));return n<1?`rgba(${s}, ${o}, ${r}, ${n})`:"#"+(s<<16|o<<8|r).toString(16).padStart(6,"0")};o(i,12),o(i,20),o(i,34),s.textContent=`\n\t\t#product7-liveChat-widget {\n\t\t\t--color-primary: ${e} !important;\n\t\t\t--color-primary-hover: ${o(e,-10)} !important;\n\t\t}\n\n\t\t.liveChat-launcher-btn {\n\t\t\tbackground: ${e} !important;\n\t\t}\n\n\t\t.liveChat-launcher-btn:hover {\n\t\t\tbox-shadow: 0 8px 24px ${o(e,0,.3)} !important;\n\t\t}\n\n\t\t.sdk-btn-primary {\n\t\t\tbackground: ${e} !important;\n\t\t\tborder-color: ${e} !important;\n\t\t}\n\n\t\t.sdk-btn-primary:hover {\n\t\t\tbackground: ${o(e,-10)} !important;\n\t\t\tborder-color: ${o(e,-10)} !important;\n\t\t}\n\n\t\t.liveChat-compose-send:hover:not(:disabled) {\n\t\t\tbackground: ${e} !important;\n\t\t\tborder-color: ${e} !important;\n\t\t\tcolor: #FFFFFF !important;\n\t\t}\n\n\t\t.liveChat-nav-tab.active .liveChat-nav-icon,\n\t\t.liveChat-nav-tab.active .liveChat-nav-label {\n\t\t\tcolor: ${e} !important;\n\t\t}\n\n\t\t.liveChat-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${o(e,0,.08)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t${"#ffffff"!==i?`\n\t\t.liveChat-panel-content {\n\t\t\tbackground: ${i} !important;\n\t\t}\n\t\t`:""}\n\n\t\t${"#1d1d1f"!==n?`\n\t\t.liveChat-panel-content,\n\t\t.liveChat-view {\n\t\t\tcolor: ${n} !important;\n\t\t}\n\t\t`:""}\n\n\t\t/* Dark theme is now handled by CSS custom properties in liveChat-core.js */\n\t`,console.log("✅ Custom web chat styles applied:",{primaryColor:e,theme:a})}class L{constructor({soundUrl:t="data:audio/mpeg;base64,SUQzBAAAAAAAGFRTU0UAAAAOAAADTGF2ZjUyLjExMS4wAP/7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhpbmcAAAAHAAAAHAAAIwgAHBwcNDQ0ND4+PlNTU1NfX190dHR0gICAioqKipSUlJSdnZ2oqKiosrKyu7u7u8bGxs7Ozs7X19fX3d3d4uLi4uXl5ejo6Ojr6+vu7u7u8fHx8fT09Pf39/f6+vr9/f39////AAAAAP/70GQAAAFZANHlBAAIMYAaXaCAARjV1Un5yIIKOJpo/zmAASTQWo7TdQAWD5toISgIYPg/lAQBCJw/+XP/UcKHFg++oEPwQ5c/9Rz+IAwCUm47pbZVAAROD4fBAEAQBAEw+XB8HwQBAEAQwffDHBM//Ln/iAEKwf/Lv9QIHPhjQAUrwgq4irMio5s5BUEAAAHCSeMAiNK062DzEZqDg43EwYIywBjGwcFiG8BeOXiQFAASMAAQRyHqBtpfAbggmYC5BhCyQyoANAEQsoSiRAZEc4oichtjvICKXDpy4bpkNJoXw1xzCLEwPouEsQMiZPjoEBDw4iZJUeSdNEFEoQIkCCEabjjJgrk0meMVGdJJOmx8qGxECcKZfTZRsmaIPdlysyZxRui91rqp7sv1TUwupJd/+3//onkM66K0mzVX//////8ydhEqptEMhmJZZVf3aRpEAAAFKRxTJQBaadeApgkSDQ1AQCpFGDFQEHQVfpsrtV+/z1gdSkjncSxSCceMSpHAuhKaWPxiG37ZjEW2o3XkG+6+pX+cZU6F6MX4s6EapLF/LL6lLZp7tWQWPj09HaTdNeltynw7jc3nu3P0FJAmeu43JqrUlcwr/Rydbmn1F/KqZXIAEAMkdbRou7ktcejaANCJAAlFZ4FRga9Rg2UNPqzFDTK/JF4lEjEo09F7NRDDECs5Y4DAY5JvN/EzKTZIIwMRRtNOGDSgk4VhBxa1pu4MJi04KIDFh4IcgcWJhmICJatIxBYWBQMALceRMFi67EvgcGbdmIRFOaG2VtPzccu+XJHgMtokMrl75iGZ3G5K8J+RxS8Dg9HtYBSsMAUSwEANxhuzTQ1Cqt6ksWXUqzytzNW3UHWwvRrk3bschmMwmaprXYvWkd+Uw/fj8rfyUu/EYHfySRV33Dh7Vret67qZ3S4f/9y/eWPxStez5n9vDd4LAwxk7/8LmlRxAAAgBVaDWNKCECikAADaBkbyhTdJ9AwALxiACrkxlRgIBqGRIrDGVBEw43AaJGBAGcJAQGiiAQQQOCr06EM9ZMDClaUEIiAodogZokISAGAhg8OEiMUYkQn1LVTI6dSJZctRJxCmZpW7TTWqe3hJJ6H/+9BktoAH0FVUfm9gAOeLaj/NaAAN/QFl/YWAIVwK7H+wMAT5bMWYy48/uaf7KZ7zn/moAlUj6Y0GW9Wcj5YyjU3q3W7vdmKb64D4wQv5UkdeWT0mrdLLbEq1v6kxhUy/95u5Bb9v/HoEfyP5Ou7Fa/VxwlXfq1eYfr/////xvZ4WJufl9THHPDLCmy/63aXYSWj/C4g//qb7VwAARXIiQR0NbJZURqcJH54mvNKXZpmUbACzEJJcteXbANB2YSXLL73w1zH6LbkPaRYbpNt7OO2W7rj6fui4t0Pjq43Q/v/+adzVcOdDr28f9w2Wdy5RPWXNmqKlHtZMnhYYBU/+txproyhDW/HJ/K6gAO2kkQA7v4IOiMyRrjYWrjxOU3Dk3DmefQiXGdNjEVgADik2LDDOCBcWMsNfVrEZwHGjfEw8NA0eBpYw80kkQi1KFKaGUKepd+3/0DK7EDnbt7U1XNeQEAVHf9kqBLzjxchaDngEDJaeEpfJ9oegJMJNIEqM0SUDozTc5R/85vvqZWKAgIUMfrSOzzpzjBdoTOJBsKgu4FhYGSRVY1Z5Sv8kVAoiFjQMBV36Hq+xJ/rIAADtXe63ACLsC0EudKI+PvNYWozM2vT+MFighxHKtMkGLP9V3n2v4OsZ/+i5WNZ5AbMuzfVnVq5VdiolNpio6q3tfysZRKgJwqWIhoekJp/6Ku5UQADPT2xtM6skVsL6KlTcpIeUOZk7hODETSqZzJfApYpusk8SP94xv+PLP/gmKT4DkuZUkmxnl9I+KZBZYc1IsY0FrTpqfaPJIvDCgg2SKsIpVStst3hvu9r6qP+ui/jlUQFF+3sjYO5OmwqbpxT1eFpa43QKABtkdSai5slNSzq0r6lDMJC0a4ZTymh555BgUPgZzQ4VBWKhy13G2VhsCH5R4OMsTWzV3+nobKeCAAZ997I3CudEoCwlmso4tZRVajMqeGWnRiTuKxkFdJug655kFnkj9JZ1cv3po1roaF1qQ9ZmBCAAaSKjTGLsrqSFwSeD7TQ5BeaJKOtqtegdfu08KKta9TmppaKVKbNRgAAdr/tXGB6CSCPl1Lelt7XW7T01ifVk2zjE1bLW839346gs//uAZPGAAtMh2Hn4GlhT52rfPeJdDAirVe28aaE2Dmr9tY0siLho4mUCDpWMFgQGgu42pLnLawWb/bpWNprQxluj9TNaXJSgOIMS1KzM0TRIAAAABFakEh3cgBQEGVwwSAstoCBiYpGhkVAplAwJmPAkYLCBkEDgYHpEhgdJRk+AeYkqaA6eReiyrxNIvmnxxStER14EjE2/9hljaO2siCoAhzKnpuRt269O0veD7Pq/uNbdzt6jfydzch/Kkpf1/dcqV6ta/y3Y1MWIft8iMqtZzUahrWPO71nqvG43fsROXu5Y3KZJGnRZbEH1clnOWX//OZ/+2WTnxeAH4ZfTSxQdl7ovLbXkoM0tW5UzXqqe3b9bPWP/+H7q59vrHa/P1WVuvIHDdeijc/LKqG114l3Joq5VSQSsRUcUBhEnmWs49v5f///////////////y/mff///////////////3Ad21LEZyZxNSU0SUaZb/+8Bk6AADBiBVfWGgCEbieq+nmAEjzhFJ+cyQBEdCKT85gkCgwCAAAAA6AP0AywXlGoy0hpYVBKCMGkNVAtKWyXWFQkQg10C3jJ4dCWsMS6ezji0j3yF6W6MVa5lLJbaXvIFSNMi8Vdp4aejr0kYgJ/IpLXJpq0lmN4S38scPty+3K4brc1En1pL+vzx/k/bwt3IYllNldscl0R/HlzH9/zJ2IEd+3kzt34vWlVWVWqbn5Z/njz8O/+aXAXCHDZovNNc0AZypebBMlXypavJwV2u4yFL1vG4qA//93+9d/ff/Fg5dCKWEFHZcd41TwOim499QNk7qNZnHhm2uvA4NA5XIelTssq//5////////////////KFL24Op////////////////I3ifN9VM55RBBXv+tQAA8aAYzpLaSOxTi1EgJ6SJFPyUphVqcwGS1LvW/Hx+27zX1/f7Y2w5rdPTwuJkLERYGnMZHg0LksCgqGoKvEWkqYTKtOnRLvoGgFPadXgqdiKxbu2ws92sNCIOHN0xkAtG+saAAuK4rNZxyl0v8x2rfuXaCm7ruwZLSEFAQkKru7B2WMZy0qeUZjNZr5eXDP+8VVSOR/5cly6S3120bi5SXY5P/1/UrllfUiyZj+qtq/Gz6oCQis9gNG1u21A0eEUXlKZgMvvdIkmDwsbcNCBMVljFm2IIcE8ACMnAIqJ5o4ovJhYfY7tmbWsu4ZKGwoGj1xMcMFgkXCSxoCoYgLnHOeXrZ732rlR3aaea7yj3pmotxSf7xyc1Dh+5TFr0wqwIVP21sSQbmXDVCyWUShytfMIk5hICPrNcf8gAU0jNh7zmBR7zKBdJnMh5iGmKwCw2AhFFLET9V5UhXa9tKeiboUnWpVnXt+hNyqNSCo/9lbTHi4JEl8E7XYjqAVkytmTqv480FwBHphkz+gCImRlt/l+zgEGBYUUwqFASIlSa4kDqXSQjZP/7kGTXgAMhHFV/PMAIZMpqf+yMAQuYW1PtMMchLYiqfYeY5BKRPlwyPGm0h57mTRatw8sKFSxJ6Qkii3cxr7t2npUe5jiBHD36yNAFjaTGCLBODkTI8F3rOs3tJq5ibOTHBB/1e77vxB9BcDBRj1iri4ZU1tWpYCaAHxVLR88FRh8YzNlFoqoARURTEfrZ7RoAkQhVlVWs7kJoNAICEvqiYTnEAh83wMwqBEKljl/QAQUBzQU23VCwbQiboHCIi7pAGW0gucKh1qaVodzUER3Dg1yo+yGHJ6G1rvqj2zdBAmDJmdP5O0copn7ffNlat8dijhMpej6btfn+oPJ4otdnkPadqff53u42cq/fnIcll53LGayZdEXZjbsvb/OfzuH+/E3F5unzldfBurLXidmAHmijdn7/+c7zm8d/lc5v6naliUUlNv/y3W+rlvmv/X6/f4frncYcoaOnjfX7tWOzF6knJa/stjkZlU1Wl0rpsqGXRX/73////////////////s4D//40JO7lCKrIQMosxW5slIAgAAHEwqUBMBpIRP/7wGTdgALpEdV9YSAISyJ6j6eYAR9V1U35zJID5kInvzkwAAUOswQKYfbgRGMcAS2mShYBtVW+/ZQGTCYcC3krCfxeBuQDTFYiw7QDkA3ALgAuFESiPhMeycGTD1BC4g8ghGjIkcXDdMqkiLGaGZUctjNFMTaKKtSkETR3WZuX0lHTh0mK0a7pEmUCQIITjD2QIZYS8cQyouH/RJwzNzM3l84gMaLhGeGVFcE5jmCkhX0mb/OEUYihiZrL58g5wVsOsaJASAkYRUuECJoXN21Mv8qEUPG54m3J9SB8ihoRA6LWOcLJGUEJR9E0WCLF8ZYiYuUY0dv////m6Zu////5HEyUi2pay7VlQCu/lSLHr5UCnC3EtWSFFyPmU41ejDtVSXOUIxUVBqppIkDQKAaU8ccc4zuLqKthvPFLw59cO5bp17S1EFlKlQyBT6abQESjyoKuDoVd3//lnthVblKF/drhqpZv7hlUE//+scGe4n4Q4lSGBcEogF3elPhZTsZ2coDNmWOCtBE3fZz7SILsNB1AkWdqmlMDZI1BUBCNQ1Iul4GD7Rc2DjR0iapBWDVosxqlte1v20vfURLf/pa7ynUzMPtbFGA3zySgiGps6D5zr7ODoUF4smCtcWz3bTaasLlq0xTAYpCLC6X0UmU3depWpSj6zqy8PFHhQHgfEa1PKElkGbaF8UFai7TQooacDSXjrTaPFcUSauGYzQNfJEyAKhWG8FcP8viIFAa50N5ND2W0Mc2JVsuY1Txq2OTWnDBSlV9tXD6X6t1yaCwkHB087asUePLgy425hNiFnUtG7LhWCzwEscEpuWlXf30a6hqLdiEjBKRtEAf6BBmCnAObOEnDlBUeEIBjAyhrUkE5q9kUgpSmOAgBgbI32T2TCCG4o0FgXINWfFCixcmUMXEXMbKg0oLIcr1pa0Vz//qS7y4YGU5LZGUAf7FhhZpvYfa4mE4zyQA0//uQROqAAvohVP89AAhaQlq/55gBC1hzT+wxqWFgDOm896zkkHhHC3zY4TW6KxZeeKijTMT7x9fOHdIcBkxmlbM0I12nnqZs5Z+/n5nMqWbjMfLM7/+hX3X+saipUxAhEkciIGjzqgQ8URCgNZstVheWBmVAKBo+ftWTNXCKebWrP24SjE0YX29v5rH72d81aRJL/w6Z0nn0YzJaxpb+fnhAsI6ApelH2Mtp9vt1DCwzABAL11QSiX4mGFSvLH3+axdogBgOu+7zpu1mf4VhdI8PSi0IpwO5p3mbT4DLsWT1tw4JllrCREqdrljZZEIzFEvOGBZjkNfTS51Skl3dSgiYVDETG66kCUJWoGUHMHITiA/JzUAURQYJzmIRmFM19h5usH9KQ60PYKShp//ufqhGRKRKlKNjkJjUkwezNAFODQxo04gu0SBwnWFXlnpE7iuLatTZf/7nt1hDw7qKoTkjbaAK1DTUZhRnskXFHIsWikTJ5qGF7W51ruOMyXzpaqqJ6kSTRDD0RBYsKMYxjTlQsA5rchxBj6GiUY1kPfrt//uAZPKAAnoa0nnsEchPRppfYQNdCnTRQ+wka4FHked5hY0oc39Zo0OZGBFVMoHsnkrloTUGaFvYGZA8gFU6wcxWSli08ad1Lrv5C433TW+XUieWDO1yB8LTvTBlaWe5n4KVy2dEBtMkBIJWBlbp6ieU0VS6BUkmtFibBzJb/ctv+xIv6WqiTUciSKAt2D0DUKllO0vVsrMZw5hcotN206zXfvums4xvL1c+cvHmt+PuVuP20DNmRpsP2P2KG7zFDa1RVy7atP/vmglphUU0P/+kRHjQjPDpb2fTSipOIQpCAyNjl45Ep59YxWDiLcUo54i9geA4cNCdZ0QhJQTACBANNBoPJaRIhxBahgVS6hSSYCYXFFPmXCwrqJJ83dTejV/0Vf0H+9txKlVAK4QEiqv5c6amObwOV9meA8s3x3bC/lGMJIS9SgtJpbzPgRetZcsOXbRGt5cfMu61n9Se1QS0w0OjHLJHEwDzhE3/+4Bk9QCC1SVPcewaUEkDqg89Y0oL9Ks5zLBpgQ8OZ7WHmSjE0DOWD1UB6x2selkCOsgsdBIhQ0fIGHnQ4AT4fUBlOE5sGSQ0MBdoEcKhaSFQK5iKC7T0hLGj5oiYWbQcclKOlnYV4rqssFEC6vDOpIbcaSAAWlmLGECRI+zfOsT4gSrqN0lxgvDzj73j2xaLJn42lK0jKPmSqSzF7G5gxSGgeLkBtj3RVifNmRnZFXiFv/VVmHh3RDM42okgDg8ewcCjcCIB0JSwqFjEyQ2L8IuzGm8YVQnVfFrhVQGCYcHoED0LtuDgCLBkPrWgNH0MYEBebFrnCNgTeGgmpuoeU1n8HxQqw1Udq9O3+iea3JIfWIB/ZGr8taNAbzQw+0BT8VNDEHASHaccmmny+p+pvUJQ2exjvPOVk/GnY7JHrfu+Qz3uOOGBY+CYy9r311KaFqhZZJyjHRf0e7+pau7/q0n2ldaUKQIBzXwCEv/7cGT2AALbEE9zDBnAOsI5vGHjOAqoM0HnvSTBHw6nPPeNKJ4wSnnL3Pfd0nkVIfx3OCLRicV7A+zrEd7BzqJbZZ9dkRpMxNApobQLtadQYMAUPBtalBgIBk0YOFix6y01dsQSQxAoj+3bb/P19nq8w6RdlrttScROZCmzUN6vAN+s/1SGFiAeZhiCx6whRcskuRZaViO4OBIIBr6vq4qvOtRQqJ6tnSd1Kczt//Rr/f//6ChnZlVVORpJAgpIloYiZQpciVtOkowTmgIBk0sJxk+ZPLaMyJ9zT3rTRVH5MzmrZ5KgIgciJWFDp95c5Dx2IRUyMIEUCoKqwyYAwoLoI7/0e6N010Q/+hd366xSNkhAH1CvSYD9yiZrYQzAIrgxeWh9ViBA7AoZ6bTtZ5ywmoQBWBohn6D/+4Bk5oASwhHO+68ZwFOEeZxtZkoLcHE3rTxpQQMO5rW0DShLNF0HMvMgw1KeroR/++t/5IVDj9u1jaqaUDUVzxaodFpuUs0SJRNxbDxbFw4rhYiPI1MQAnbTE2bbpkfjT/Oyc8c5yj4jU55x70An0AeJoKHGi0AkZNrWGEzhCJlUXub230ep32f6mbKTttrHF/cAAjJcXiXKZlY2UkK2ISVhcgeynDULl55lV9lCtdjnmgpfjUGrH1B96Tp0KCwUAd4mRPElrkf7f//6agiHdXVlRxJIAAXC5SiMAwSeHlBKGPPAiIRwTqhgmRAi5TtLq7Op6lv14pszASS/+hUic05F4WUCt7c/UuglYV9KXd2n5dAv2K29teToHq5/8N4Eu8RKxDW2SIAANEw6hD6sj16yu8O0AD5J7LqnGmDtxa7Xq7SIexnpFZKdht54Z4Oj1E2y0QGJxJBHZNEzYYFLKd/G/divLiNrJZYr/v/7gGTnAAK6Gc57KTHAQSOpvWGDSgrEXzWMPMcBAg7msPSNKAQFBtAIyBJkLlvLzVSrYwJxwewpn8lp6s223beynSZ0IneseWpnmooQHg6KFgOJgkPUCACALkIQeCQq++iu7c/bDdlNOK4sRGKaw0zpZc+38vkQiIeImIb/Wk1cZLK7EB43TskkqRG0FhHduBqDZHDdKisxWGAZN5ple7KJuBXtLQ1p7l0b+NPdj5Kb/57v4ZrqkbMbaDwAM6rBajuLsj4Ud2RICsnXF2PxsK2tSiX8diXI1qQ1JigPjaFs8zr2oEK8K336e4xbnJcH47+f79qLDdyD/+V+3tqWm5e1D2v+X5vvP398v/9od95G6lX656mgdnhndmVyRogABpch8ohZhELgTFMkSISHhFpFyyFSe+MiIj9wJhMqeBxCcGhyhCk8YOE2LF01ul93eOVG0j267bOVyNgAATvEkEaOaidgMSH4qyPgUbFy//twZPQAEpEsTnnpGmpHRHn/PYNLSwRzM4wwaUD8ieg9hIzlVAbKoTUn/3D7LGpKCUdiZUPlNrbOoOUDAXBqRPDGgmFVtTZWH3OeOn6hHOdChrv99rYmwI7UdNMzqbakgHB6wqihck19DBtNwP4pQ7NMgx/+1EDOb2C5vMbrmiQp32Mb/0NyRpstUrAB+y02vpp7I7EAQ9MW04wMDj01ikpOXWVnDNiw9K6jYgGh8Pmf3S8+pOab1sihfCWIrIoQSizTah9rDondc6MYcUX6WrGhj6lHPfa+i7vQ1hWpFA6SGlmroBNdnSZWrVLRV+MUQAgXJ6OGnhBrOaWi5oxeVypErF0q6rlTBQVvMngOGQcclwfoYLrizqkvTAos7ePFyviz5XXrGFWdC9mLe91XV4tnMqoAeBNrD//7gGTmABL8F0rZ7BnCPWHZ3z0mJwjseTWnpGlA0o6nNPQJLbTse1HtTVAsiGnwADAQIM7GGcgCw0iUCxE68DAUXOgcHA4gSgcdckYeWgCAiQD14HWYDzww8Vtzlr0FrKh+t+3FEaarPoa8lCqj1aShkASbSlk64mSs7XS7zNsOfjErzKEEhaJxczc5LuxHRpS7TJ7mR0RmCTg1TRFnjmk6fz8hbahvY1KF/////o/61fftqpUAEJSosR2aohuAyWwgO4P0Nshk1pZpUw9zMHCo5RFIGccjRqlgAuLHlC5ZHffCdO0s8eold5tIxaw7z6EZZ9wzffr2baG7hVjljWRSS2NtAAAK1xFubUtCh1rnrEKMFfztMiFchUPMrEfp0QrU4K8rB5qBiyEzLyCrUymqjdLAyPAiX8U5VZVi3NKwqFA+LhAsDwdB1YfDpNQKsOPDg9JLLgEMVC1TRy7dGlTmFz6lNQpDUXJTW6tJ//twZP4AEtgrSuNJGmBOo6k4aMNKCsA5KSwkRMD+jqUxkxUoWjcnetr3ossDa0aH0L3kmq/CJJtG2joTVrFHEQzo4DGAI2Ql56ZEDaaXMWv/JJtdZRP/2bP//tfZq//0qrEyUkn/wAHcC0113Nq8luMSKgQIkJlUNEcgT1erIi5L2mSZjUmbYdCAbi6ljBom3/bR2f/bZ///p3ej+hsQlptHIAAsz9aja4E1e7h5a3d6KUmRKHuCokDY6405AoEK0oak9UqZGJqoCM3qXEai7IfdVGqwYVNgAoPBprDLgbnKTDRZccx3/+5/yW27/6v//s//6hRIbmgHpoQlYp81tSaKCweNpfT3OQ4QEyLRqUmkuFbWVKAACNmhlQQJFBRB3abC/DhKBDY26rMLy/9qff7Wd1Hf7l/7///7cGTogRJpE8pJ6BHALUP5nTxiSwnkOScnmGTAupClJPCNKP/+vYloJAA4ZFjoWBXEhWPsCTyrPkf/VSrTEEk22LwIs0qCJVR4ChMPygSAPknFIoJtQTH/AQJecQ5IDGuj/2y1TEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVpAAAgAAAPiQJHPs/5FKgoQCgAABUiS+nyxsaAadglwQFUlUrmUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcQAAAAIy8NYgAAAHlp56ACNuQRQWWUqTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrgAAFNcQgc0AAAC14AAlbgmdVMQU1FMy45OS41VVVVVVX/+1Bk9oER4htK4yEZwCfBeVw9AycF4CEnLCRigHsA5WUAgARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVgAAAS6HUNUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVKTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//swZPOBEUQESTIJGAAXYLk4YEMSA1AHLYwEACAxASTU8QAEqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQRPAHMH0BycjpAAgK4Dk4QSABQIgFJqWAACgZAGUVAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xBk6QdwQAFJweAACgYgOSUwIAHAsAcnB4QAKAoA5ECwAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EGTmh3A7Asop4RAOBGAZNRQAAUB8AyahAAAoBwCjwLAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQZOEH8CYBSajgAAwAAA/wAAABACwBKAAAACABgGVAEAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xBk3g/wAwDJgCAACAAAD/AAAAEAAAH+AAAAIAAAP8AAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EETdj/AAAH+AAAAIAAAP8AAAAQAAAf4AAAAgAAA/wAAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQZN2P8AAAf4AAAAgAAA/wAAABAAAB/gAAACAAAD/AAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xBk3Y/wAAB/gAAACAAAD/AAAAEAAAH+AAAAIAAAP8AAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EETdj/AAAH+AAAAIAAAP8AAAAQAAAf4AAAAgAAA/wAAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQZN2P8AAAf4AAAAgAAA/wAAABAAABpAAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=",volume:e=.4}={}){this._soundUrl=t,this._volume=Math.min(1,Math.max(0,e)),this._enabled=!0,this._audioCtx=null,this._audioBuffer=null,this._loadPromise=null,t&&(this._loadPromise=this._loadAudioFile(t))}setEnabled(t){this._enabled=Boolean(t)}setVolume(t){this._volume=Math.min(1,Math.max(0,t))}async play(){if(this._enabled&&"undefined"!=typeof window)try{this._soundUrl?await this._playFile():await this._playSynthetic()}catch{}}_getAudioContext(){if(!this._audioCtx||"closed"===this._audioCtx.state){const t=window.AudioContext||window.webkitAudioContext;if(!t)return null;this._audioCtx=new t}return this._audioCtx}async _playSynthetic(){const t=this._getAudioContext();if(!t)return;"suspended"===t.state&&await t.resume();const e=t.currentTime,n=this._volume;[{freq:880,start:0,end:.08},{freq:1100,start:.06,end:.16}].forEach(({freq:i,start:a,end:s})=>{const o=t.createOscillator(),r=t.createGain();o.type="sine",o.frequency.value=i,r.gain.setValueAtTime(0,e+a),r.gain.linearRampToValueAtTime(n,e+a+.01),r.gain.linearRampToValueAtTime(0,e+s),o.connect(r),r.connect(t.destination),o.start(e+a),o.stop(e+s+.01)})}async _loadAudioFile(t){try{const e=this._getAudioContext();if(!e)return;const n=await fetch(t),i=await n.arrayBuffer();this._audioBuffer=await e.decodeAudioData(i)}catch{this._soundUrl=null}}async _playFile(){if(this._loadPromise&&(await this._loadPromise,this._loadPromise=null),!this._audioBuffer)return void this._playSynthetic();const t=this._getAudioContext();if(!t)return;"suspended"===t.state&&await t.resume();const e=t.createBufferSource(),n=t.createGain();e.buffer=this._audioBuffer,n.gain.value=this._volume,e.connect(n),n.connect(t.destination),e.start()}}class M{constructor(t={}){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=t.teamName||"Support",this.teamAvatars=t.teamAvatars||[],this.greetingMessage=t.greetingMessage||"Hi there 👋",this.welcomeMessage=t.welcomeMessage||"How can we help?",this.startButtonText=t.startButtonText||"Send us a message",this.showAvatars=!1!==t.showAvatars,this.metadata=t.metadata||null,this.isIdentified=!1,this.pendingMessage=null,this.enableHelp=!1!==t.enableHelp,this.enableChangelog=!1!==t.enableChangelog,this.homeModuleEnabled=!1!==t.homeModuleEnabled,this.messagesModuleEnabled=!1!==t.messagesModuleEnabled,this.requireEmailBeforeChat=t.requireEmailBeforeChat||!1,this.allowAttachments=!1!==t.allowAttachments,this.allowEmoji=!1!==t.allowEmoji,this.showReplyTime=!1!==t.showReplyTime,this.agentsOnline=!1,this.onlineCount=0,this.onlineMessage=t.onlineMessage||"We're online now",this.responseTime=t.responseTime||"We typically reply within a few minutes",this.businessHoursState=t.businessHoursState||null,this.nextOpenAt=t.nextOpenAt||null,this.holidayName=t.holidayName||null,this.typingUsers={},this.isLoading=!1,this.isLoadingMessages=!1,this.urls=t.urls||{feedback:null,changelog:null,help:null,roadmap:null},this._listeners=new Set}subscribe(t){return this._listeners.add(t),()=>this._listeners.delete(t)}_notify(t,e){this._listeners.forEach(n=>n(t,e,this))}setView(t){const e=this.currentView;this.currentView=t,this._notify("viewChange",{previousView:e,currentView:t})}setOpen(t){this.isOpen=t,this._notify("openChange",{isOpen:t})}setActiveConversation(t){const e=this.activeConversationId;this.activeConversationId=t,this._notify("conversationChange",{conversationId:t,previousConversationId:e})}setIdentified(t,e=null){this.isIdentified=t,e&&(this.metadata={...this.metadata,...e}),this._notify("identificationChange",{isIdentified:t,metadata:e})}setConversations(t){this.conversations=t,this._updateUnreadCount(),this._notify("conversationsUpdate",{conversations:t})}addConversation(t){this.conversations.unshift(t),this._updateUnreadCount(),this._notify("conversationAdded",{conversation:t})}setMessages(t,e){this.messages[t]=e,this._notify("messagesUpdate",{conversationId:t,messages:e})}_getMessageAttachmentsSignature(t){return Array.isArray(t?.attachments)&&0!==t.attachments.length?t.attachments.map(t=>`${t?.type||""}:${t?.name||""}`).join("|"):""}_findOptimisticMatchIndex(t,e,n){const i=this.messages[t]||[],a=Date.parse(e.timestamp),s=this._getMessageAttachmentsSignature(e);for(let t=i.length-1;t>=0;t--){const o=i[t];if(!o?.isOptimistic||!o?.isOwn)continue;if((o.content||"")!==(e.content||""))continue;if(this._getMessageAttachmentsSignature(o)!==s)continue;const r=Date.parse(o.timestamp);if(Number.isNaN(a)||Number.isNaN(r)||Math.abs(a-r)<=n)return t}return-1}_updateConversationFromMessage(t,e,n){const i=this.conversations.find(e=>e.id===t);i&&(i.lastMessage=e.content,i.lastMessageTime=e.timestamp,n&&!e.isOwn&&(i.unread=(i.unread||0)+1,this._updateUnreadCount()))}upsertMessage(t,e,n={}){this.messages[t]||(this.messages[t]=[]);const i=!0===n.reconcileOwnOptimistic,a=n.optimisticMatchWindowMs||3e4,s=this.messages[t],o=null!=e?.id?s.findIndex(t=>t?.id===e.id):-1;if(-1!==o)return s[o]={...s[o],...e,isOptimistic:!1},this._updateConversationFromMessage(t,s[o],!1),this._notify("messagesUpdate",{conversationId:t,messages:[...s]}),s[o];if(i&&e?.isOwn){const n=this._findOptimisticMatchIndex(t,e,a);if(-1!==n)return s[n]={...s[n],...e,isOptimistic:!1},this._updateConversationFromMessage(t,s[n],!1),this._notify("messagesUpdate",{conversationId:t,messages:[...s]}),s[n]}const r={...e,isOptimistic:Boolean(e?.isOptimistic)};return s.push(r),this._updateConversationFromMessage(t,r,!0),this._notify("messageAdded",{conversationId:t,message:r}),r}addMessage(t,e){return this.upsertMessage(t,e)}updateConversation(t,e){const n=this.conversations.find(e=>e.id===t);return n?(Object.assign(n,e),this._notify("conversationUpdated",{conversationId:t,conversation:n}),n):null}markAsRead(t){const e=this.conversations.find(e=>e.id===t);e&&e.unread>0&&(e.unread=0,this._updateUnreadCount(),this._notify("conversationRead",{conversationId:t}))}_updateUnreadCount(){this.unreadCount=this.conversations.reduce((t,e)=>t+(e.unread||0),0),this._notify("unreadCountChange",{count:this.unreadCount})}setHelpArticles(t){this.helpArticles=t,this._notify("helpArticlesUpdate",{articles:t})}setHelpSearchQuery(t){this.helpSearchQuery=t,this._notify("helpSearchChange",{query:t})}setHomeChangelogItems(t){this.homeChangelogItems=t,this._notify("homeChangelogUpdate",{items:t})}setChangelogItems(t){this.changelogItems=t,this._notify("changelogUpdate",{items:t})}getActiveConversation(){return this.conversations.find(t=>t.id===this.activeConversationId)}getActiveMessages(){return this.messages[this.activeConversationId]||[]}setTeamAvatarsFromAgents(t){t&&0!==t.length&&(this.teamAvatars=t.map(t=>t.picture?t.picture:t.full_name||"?"),this._notify("teamAvatarsUpdate",{teamAvatars:this.teamAvatars}))}getFilteredHelpArticles(){if(!this.helpSearchQuery)return this.helpArticles;const t=this.helpSearchQuery.toLowerCase();return this.helpArticles.filter(e=>e.title.toLowerCase().includes(t)||e.description&&e.description.toLowerCase().includes(t))}reset(){const t=this.currentView;this.currentView="home",this.activeConversationId=null,this.helpSearchQuery="","home"!==t&&this._notify("viewChange",{previousView:t,currentView:"home"}),this._notify("reset",{})}}class O{constructor(t,e={}){this.state=t,this.options={position:e.position||"right",primaryColor:e.primaryColor||"#155EEF",...e},this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className=`liveChat-launcher liveChat-launcher-${this.options.position}`,this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe((t,e)=>{"openChange"===t&&this._updateIcon(),"unreadCountChange"===t&&this._updateBadge()}),this.element}_updateContent(){const t=this.state.unreadCount>0?`<span class="liveChat-launcher-badge">${this.state.unreadCount>9?"9+":this.state.unreadCount}</span>`:"";this.element.innerHTML=`\n <button class="liveChat-launcher-btn" aria-label="Open live chat">\n <span class="liveChat-launcher-icon liveChat-launcher-icon-chat">\n <iconify-icon icon="ph:chats-circle" width="24" height="24"></iconify-icon>\n </span>\n <span class="liveChat-launcher-icon liveChat-launcher-icon-close" style="display: none;">\n <iconify-icon icon="ph:caret-down-bold" width="22" height="22"></iconify-icon>\n </span>\n ${t}\n </button>\n `;const e=this.element.querySelector(".liveChat-launcher-btn");e&&this.options.primaryColor&&e.style.setProperty("background",this.options.primaryColor,"important")}_attachEvents(){this.element.querySelector(".liveChat-launcher-btn").addEventListener("click",()=>{this.state.setOpen(!this.state.isOpen)})}_updateIcon(){const t=this.element.querySelector(".liveChat-launcher-icon-chat"),e=this.element.querySelector(".liveChat-launcher-icon-close");this.state.isOpen?(t.style.display="none",e.style.display="flex",this.element.classList.add("liveChat-launcher-open")):(t.style.display="flex",e.style.display="none",this.element.classList.remove("liveChat-launcher-open"))}_updateBadge(){const t=this.element.querySelector(".liveChat-launcher-badge");if(t&&t.remove(),this.state.unreadCount>0&&!this.state.isOpen){const t=document.createElement("span");t.className="liveChat-launcher-badge",t.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,this.element.querySelector(".liveChat-launcher-btn").appendChild(t)}}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 z{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-panel-nav",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(t=>{"viewChange"===t||"unreadCountChange"===t?this._updateActiveTab():"settingsUpdate"===t&&(this._updateContent(),this._updateActiveTab())}),this.element}_getTabs(){const t=[];return!1!==this.state.homeModuleEnabled&&t.push({id:"home",label:"Home",icon:"ph:house-simple"}),!1!==this.state.messagesModuleEnabled&&t.push({id:"messages",label:"Messages",icon:"ph:chats",badge:this.state.unreadCount}),this.state.enableHelp&&t.push({id:"help",label:"Help",icon:"ph:books"}),this.state.enableChangelog&&t.push({id:"changelog",label:"Updates",icon:"ph:megaphone"}),t}_updateContent(){const t=this._getTabs().map(t=>{const e=this.state.currentView===t.id,n=t.badge&&t.badge>0?`<span class="liveChat-nav-badge">${t.badge>9?"9+":t.badge}</span>`:"";return`\n\t\t\t\t\t<button class="liveChat-nav-tab ${e?"active":""}" data-tab="${t.id}">\n\t\t\t\t\t\t<span class="liveChat-nav-icon">\n\t\t\t\t\t\t\t<iconify-icon icon="${t.icon}" width="22" height="22"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class="liveChat-nav-label">${t.label}</span>\n\t\t\t\t\t\t${n}\n\t\t\t\t\t</button>\n\t\t\t\t`}).join("");this.element.innerHTML=`\n\t\t\t<div class="liveChat-nav-tabs">\n\t\t\t\t${t}\n\t\t\t</div>\n\t\t\t<div class="liveChat-nav-footer">\n\t\t\t\t<a href="https://product7.io" target="_blank" rel="noopener noreferrer" class="liveChat-powered-by">\n\t\t\t\t\t<svg width="12" height="14" viewBox="0 0 28 32" fill="none" xmlns="http://www.w3.org/2000/svg">\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.0615 5.28044C8.5161 4.42949 3.30825 11.1456 5.89967 17.6588C6.9321 20.2538 9.06268 22.2644 11.8777 23.1968C16.2682 24.6507 18.4038 22.3222 19.0483 23.9691C19.4055 24.8894 18.7282 25.3209 17.988 25.4938C10.9146 27.15 5.15304 22.7566 3.5869 17.5531C1.52205 10.6941 5.98684 4.6667 11.3483 3.41065C17.8801 1.88094 24.0325 6.19355 24.3926 12.7175C24.7448 19.0921 18.6217 24.5978 11.927 22.2036C10.8789 21.8285 8.8419 20.6682 8.46823 19.858C8.06026 18.9727 8.80261 18.1725 9.68285 18.3576C10.2223 18.4726 10.3116 18.8706 11.3161 19.5372C14.4549 21.6213 19.1276 20.6132 21.2046 17.0972C23.991 12.3817 21.0481 6.05351 15.06 5.27758L15.0615 5.28044Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.2492 2.19833C11.944 1.71463 8.88819 3.07214 6.91479 4.49682C2.27067 7.85488 0.76169 14.5038 3.49672 19.8731C4.08535 21.0096 4.84379 22.0497 5.7459 22.9576L7.16343 24.2515C7.67214 24.9131 7.27203 25.7176 6.64115 25.9269C5.13502 26.4271 2.0499 21.8172 1.42044 20.5383C0.0872204 17.8297 -0.312889 14.9047 0.242977 11.503C1.66908 2.77063 11.221 -2.51652 19.7197 1.21021C27.7548 4.73331 30.2733 15.4555 23.9351 22.0773C23.3107 22.7296 21.6352 24.4823 20.6278 23.8907C20.0076 23.5263 19.8933 22.6446 20.5192 22.1238C21.0301 21.6986 21.4759 21.435 21.9896 20.9734C23.6665 19.4688 25.2562 16.8752 25.3477 13.5636C25.4427 10.2055 24.1266 7.5848 22.3904 5.74859C20.6392 3.89665 18.6751 2.69919 15.2456 2.19691L15.2492 2.19833Z" fill="#F69F06"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M8.48332 27.2217C7.93817 26.265 8.89987 25.3776 10.1352 25.8641C15.5653 27.9926 18.3081 25.5269 19.0255 27.0823C19.2655 27.6039 19.0448 28.1619 18.7354 28.3863C17.9895 28.9257 14.82 28.9343 13.9262 28.8714C12.9071 28.8053 11.897 28.6377 10.9111 28.3713C10.0888 28.1348 8.88057 27.9247 8.48189 27.2281L8.48332 27.2217Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.8722 31.0607C15.7765 32.1381 14.579 32.0331 13.5766 31.9545C12.5742 31.8759 11.5203 31.8502 11.601 30.7013C11.6789 29.5882 12.8035 29.7532 13.8274 29.8332C14.4425 29.8811 15.9951 29.681 15.8722 31.0607Z" fill="#21244A"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\tPowered by <strong>Product7</strong>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`}_attachEvents(){this.element.addEventListener("click",t=>{const e=t.target.closest(".liveChat-nav-tab");if(e){const t=e.dataset.tab;this.state.setView(t)}})}_updateActiveTab(){this.element.querySelectorAll(".liveChat-nav-tab").forEach(t=>{const e=t.dataset.tab===this.state.currentView;if(t.classList.toggle("active",e),"messages"===t.dataset.tab){const e=t.querySelector(".liveChat-nav-badge");if(e&&e.remove(),this.state.unreadCount>0){const e=document.createElement("span");e.className="liveChat-nav-badge",e.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,t.appendChild(e)}}})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class V{constructor(t,e={}){this.state=t,this.options={position:e.position||"right",...e},this.element=null,this.navigationTabs=null,this.currentViewComponent=null,this.viewRegistry={},this._unsubscribe=null,this._expanded=!1}registerView(t,e){this.viewRegistry[t]=e}render(){this.element=document.createElement("div"),this.element.className=`liveChat-panel liveChat-panel-${this.options.position}`,this.element.innerHTML='\n\t\t\t<div class="liveChat-panel-content">\n\t\t\t\t<div class="liveChat-panel-views"></div>\n\t\t\t\t<div class="liveChat-panel-nav"></div>\n\t\t\t</div>\n\t\t',this.options.onToggleExpand=()=>this._toggleExpand(),this.options.isExpanded=()=>this._expanded,this.navigationTabs=new z(this.state,this.options);return this.element.querySelector(".liveChat-panel-nav").appendChild(this.navigationTabs.render()),this._renderCurrentView(),this._unsubscribe=this.state.subscribe(t=>{"viewChange"===t&&this._renderCurrentView()}),this.element}_toggleExpand(){this._expanded=!this._expanded,this.element.classList.toggle("liveChat-panel-expanded",this._expanded);const t=this.element.querySelector(".liveChat-expand-window-btn iconify-icon"),e=this.element.querySelector(".liveChat-expand-window-btn span");t&&t.setAttribute("icon",this._expanded?"ph:arrows-in":"ph:arrows-out"),e&&(e.textContent=this._expanded?"Collapse window":"Expand window")}_renderCurrentView(){const t=this.element.querySelector(".liveChat-panel-views"),e=this.element.querySelector(".liveChat-panel-nav");this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),t.innerHTML="","chat"!==this.state.currentView&&this._expanded&&(this._expanded=!1,this.element.classList.remove("liveChat-panel-expanded"));const n=this.viewRegistry[this.state.currentView];if(n?(this.currentViewComponent=new n(this.state,this.options),t.appendChild(this.currentViewComponent.render())):t.innerHTML=`<div class="liveChat-empty-state">\n\t\t\t\t<p>View not found: ${this.state.currentView}</p>\n\t\t\t</div>`,e){const t="chat"===this.state.currentView||"prechat"===this.state.currentView;e.style.display=t?"none":""}}show(){this.element&&requestAnimationFrame(()=>{this.element.classList.add("open")})}hide(){this.element&&this.element.classList.remove("open")}setHeader(t){const e=this.element.querySelector(".liveChat-panel-header");e&&(e.innerHTML=t)}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 F{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null,this._headerBg="linear-gradient(180deg, #f0f4ff 0%, #ffffff 100%)"}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-changelog-view",this._updateContent(),this._unsubscribe=this.state.subscribe(t=>{"changelogUpdate"===t&&this._updateChangelogList()}),this.element}_updateContent(){this.element.innerHTML='\n\t\t\t<div class="liveChat-changelog-header">\n\t\t\t\t<div class="liveChat-changelog-header-top">\n\t\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t\t\t<button class="sdk-close-btn liveChat-changelog-close-btn liveChat-mobile-close-btn" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-changelog-body">\n\t\t\t\t<div class="liveChat-changelog-list"></div>\n\t\t\t</div>\n\t\t',this._updateChangelogList(),this._attachEvents()}_updateChangelogList(){const t=this.element.querySelector(".liveChat-changelog-list"),e=this.state.changelogItems;0!==e.length?(t.innerHTML=e.map(t=>this._renderChangelogCard(t)).join(""),this._attachChangelogEvents()):t.innerHTML=this._renderEmptyState()}_stripHtml(t){if(!t)return"";const e=document.createElement("div");return e.innerHTML=t,(e.textContent||e.innerText||"").trim()}_renderChangelogCard(t){return`\n\t\t\t<div class="liveChat-changelog-card" data-changelog-id="${t.id}">\n\t\t\t\t${t.coverImage?`<div class="liveChat-changelog-thumb"><img src="${t.coverImage}" alt="${t.title}" onerror="this.parentElement.style.display='none';" /></div>`:""}\n\t\t\t\t<div class="liveChat-changelog-content">\n\t\t\t\t\t<h3 class="liveChat-changelog-title">${t.title}</h3>\n\t\t\t\t\t${t.description?`<p class="liveChat-changelog-description">${this._stripHtml(t.description)}</p>`:""}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_getContrastColor(t){const e=t.replace("#","");return(.299*parseInt(e.substring(0,2),16)+.587*parseInt(e.substring(2,4),16)+.114*parseInt(e.substring(4,6),16))/255>.5?"#374151":"#ffffff"}_renderEmptyState(){return'\n\t\t\t<div class="liveChat-empty-state">\n\t\t\t\t<div class="liveChat-empty-state-icon">\n\t\t\t\t\t<iconify-icon icon="ph:megaphone" width="48" height="48"></iconify-icon>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t'}_formatDate(t){if(!t)return"";return new Date(t).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}_truncateText(t,e){return t?t.length<=e?t:t.substring(0,e).trim()+"...":""}_attachEvents(){const t=this.element.querySelector(".liveChat-changelog-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)}),this._attachChangelogEvents()}_attachChangelogEvents(){this.element.querySelectorAll(".liveChat-changelog-card").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.changelogId,n=this.state.changelogItems.find(t=>t.id===e);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 P{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null,this._typingTimeout=null,this._isTyping=!1,this._typingIndicator=null,this._isConversationClosed=!1,this._pendingAttachments=[],this._emojiPickerOpen=!1,this._emojiOutsideHandler=null,this._menuOutsideHandler=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-chat-view",this._updateContent(),this._unsubscribe=this.state.subscribe((t,e)=>{if("connectionChange"===t){const t=this.element?.querySelector(".liveChat-connection-banner");return void(t&&(t.style.display=e.connected?"none":"flex"))}"messageAdded"===t&&e.conversationId===this.state.activeConversationId?(this._hideTypingIndicator(),this._appendMessage(e.message)):"typingStarted"===t&&e.conversationId===this.state.activeConversationId?this._showTypingIndicator(e.userName):"typingStopped"===t&&e.conversationId===this.state.activeConversationId?this._hideTypingIndicator():("conversationUpdated"===t&&e.conversationId===this.state.activeConversationId||"messagesUpdate"===t&&e.conversationId===this.state.activeConversationId||"settingsUpdate"===t)&&this._updateContent()}),this.element}_updateContent(){const t=this.state.getActiveConversation(),e=this.state.getActiveMessages(),n=!this.state.activeConversationId,i=!n&&"closed"===t?.status;this._isConversationClosed=i;const a=0===e.length?this._renderEmptyState(n):this._renderGroupedMessages(e),s=this.options.composePlaceholder||"Write a message...",o=n?this.options.composePlaceholder||"Start typing your message...":i?"Conversation closed":s,r=this.options.logoUrl,l=this.state.teamName||"Support",c=r?`<img src="${this._escapeHtml(r)}" alt="${this._escapeHtml(l)}" />`:'<iconify-icon icon="ph:chats-circle" width="20" height="20"></iconify-icon>',d=this.options.isExpanded?.()??!1,h=d?"ph:arrows-in":"ph:arrows-out",p=d?"Collapse window":"Expand window";this.element.innerHTML=`\n\t\t\t<div class="liveChat-chat-header">\n\t\t\t\t<button class="sdk-btn-icon liveChat-back-btn" aria-label="Back">\n\t\t\t\t\t<iconify-icon icon="ph:arrow-left" width="20" height="20"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class="liveChat-chat-header-avatar">\n\t\t\t\t\t${c}\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-chat-header-info">\n\t\t\t\t\t<span class="liveChat-chat-title">${this._escapeHtml(l)}</span>\n\t\t\t\t\t${i||!1!==this.state.showReplyTime?`<span class="liveChat-chat-subtitle">${i?"Conversation resolved":this.state.responseTime||"Typically replies within minutes"}</span>`:""}\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-chat-header-actions">\n\t\t\t\t\t<div class="liveChat-chat-menu-wrapper">\n\t\t\t\t\t\t<button class="sdk-btn-icon liveChat-chat-menu-btn" aria-label="Options">\n\t\t\t\t\t\t\t<iconify-icon icon="ph:dots-three" width="20" height="20"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class="liveChat-chat-menu-dropdown">\n\t\t\t\t\t\t\t<button class="liveChat-chat-menu-item liveChat-expand-window-btn">\n\t\t\t\t\t\t\t\t<iconify-icon icon="${h}" width="16" height="16"></iconify-icon>\n\t\t\t\t\t\t\t\t<span>${p}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="sdk-btn-icon sdk-close-btn liveChat-mobile-close-btn" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-connection-banner" style="display:none;">\n\t\t\t\t<iconify-icon icon="ph:wifi-slash" width="14" height="14"></iconify-icon>\n\t\t\t\t<span>Reconnecting…</span>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-chat-messages">\n\t\t\t\t${a}\n\t\t\t\t${i?'\n\t\t\t\t<div class="liveChat-closed-banner">\n\t\t\t\t\t<iconify-icon icon="ph:check-circle" width="18" height="18"></iconify-icon>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t':""}\n\t\t\t\t<div class="liveChat-typing-indicator">\n\t\t\t\t\t<div class="liveChat-typing-dots">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class="liveChat-typing-text"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-scroll-pill" style="display:none;">\n\t\t\t\t<iconify-icon icon="ph:arrow-down" width="14" height="14"></iconify-icon>\n\t\t\t\t<span>New message</span>\n\t\t\t</div>\n\n\t\t\t${i?"":`\n\t\t\t<div class="liveChat-compose-attachments-preview"></div>\n\n\t\t\t<div class="liveChat-chat-compose">\n\t\t\t\t<div class="liveChat-compose-input-wrapper">\n\t\t\t\t\t<textarea class="liveChat-compose-input" placeholder="${o}" rows="1"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-compose-bottom">\n\t\t\t\t\t<div class="liveChat-compose-actions">\n\t\t\t\t\t\t${!1!==this.state.allowAttachments?'<button class="sdk-btn-icon liveChat-compose-attach" aria-label="Attach file"><iconify-icon icon="ph:paperclip" width="20" height="20"></iconify-icon></button>':""}\n\t\t\t\t\t\t${!1!==this.state.allowEmoji?'<button class="sdk-btn-icon liveChat-emoji-btn" aria-label="Emoji"><iconify-icon icon="ph:smiley" width="20" height="20"></iconify-icon></button>':""}\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="liveChat-compose-send" aria-label="Send" disabled>\n\t\t\t\t\t\t<iconify-icon icon="ph:paper-plane-right" width="20" height="20"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t${!1!==this.state.allowAttachments?'<input type="file" class="liveChat-compose-file-input" multiple accept="image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip" />':""}\n\t\t\t</div>\n\t\t\t`}\n\t\t`,this._typingIndicator=this.element.querySelector(".liveChat-typing-indicator"),this._attachEvents(),this._scrollToBottom(),this._renderAttachmentPreviews(),this._setupScrollPill()}_renderEmptyState(t=!1){const e=this.options.logoUrl;return`\n\t\t\t<div class="liveChat-chat-empty">\n\t\t\t\t${e?`<div class="liveChat-chat-empty-logo"><img src="${this._escapeHtml(e)}" alt="${this._escapeHtml(this.state.teamName)}" /></div>`:""}\n\t\t\t\t<h3>${t?"Start a new conversation":"Start the conversation"}</h3>\n\t\t\t</div>\n\t\t`}_renderMessageAttachments(t){return t&&0!==t.length?t.map(t=>"image"===t.type?`<img class="liveChat-message-image" src="${this._escapeHtml(t.url)}" alt="${this._escapeHtml(t.name||"image")}" data-url="${this._escapeHtml(t.url)}" />`:`<a class="liveChat-message-file" href="${this._escapeHtml(t.url)}" data-url="${this._escapeHtml(t.url)}" data-name="${this._escapeHtml(t.name||"file")}">\n\t\t\t\t<iconify-icon icon="ph:file" width="18" height="18"></iconify-icon>\n\t\t\t\t<span>${this._escapeHtml(t.name||"file")}</span>\n\t\t\t\t<iconify-icon icon="ph:download-simple" width="16" height="16" class="liveChat-file-download-icon"></iconify-icon>\n\t\t\t</a>`).join(""):""}_renderMessage(t,e=!0){if(t.isSystem)return this._renderSystemMessage(t);const n=t.isOwn,i=n?"liveChat-message-own":"liveChat-message-received",a=e?this._formatMessageTime(t.timestamp):"",s=this._renderMessageAttachments(t.attachments),o=t.isOptimistic,r=t.content?`<div class="liveChat-message-content">${this._formatMessageContent(t.content)}</div>`:"",l=r?`<div class="liveChat-message-bubble">${r}</div>`:"";if(n){return`\n\t\t\t\t<div class="liveChat-message ${i}${o?" liveChat-message-optimistic":""}">\n\t\t\t\t\t${l}\n\t\t\t\t\t${s}\n\t\t\t\t\t${e?`<div class="liveChat-message-meta liveChat-message-meta-own">\n\t\t\t\t\t\t${o?'<span class="liveChat-message-sent-status">Sending…</span>':'<span class="liveChat-message-sent-status">Sent</span>'}\n\t\t\t\t\t\t${a?`<span>·</span><span>${a}</span>`:""}\n\t\t\t\t\t</div>`:""}\n\t\t\t\t</div>\n\t\t\t`}return`\n\t\t\t<div class="liveChat-message ${i}">\n\t\t\t\t<div class="liveChat-message-row">\n\t\t\t\t\t<div class="liveChat-message-avatar">${this._renderSenderAvatar(t.sender)}</div>\n\t\t\t\t\t<div class="liveChat-message-wrapper">\n\t\t\t\t\t\t${l}\n\t\t\t\t\t\t${s}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${a?`<div class="liveChat-message-meta"><span>${a}</span></div>`:""}\n\t\t\t</div>\n\t\t`}_renderSystemMessage(t){const e=t.content||"";if((e.includes("joined the chat")||e.includes("left the chat")||e.includes("joined the conversation")||e.includes("left the conversation"))&&t.sender){const n=t.sender.name||"",i=n.split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" "),a=this.options.logoUrl,s=a?`<img src="${this._escapeHtml(a)}" alt="logo" />`:i.charAt(0).toUpperCase(),o=this._formatMessageTime(t.timestamp),r=e.replace(n,"").trim(),l=r.charAt(0).toUpperCase()+r.slice(1);return`\n\t\t\t\t<div class="liveChat-message-system-event">\n\t\t\t\t\t<div class="liveChat-message-system-event-avatar">${s}</div>\n\t\t\t\t\t<span class="liveChat-message-system-event-name">${this._escapeHtml(i)}</span>\n\t\t\t\t\t<span class="liveChat-message-system-event-action">${this._escapeHtml(l)}</span>\n\t\t\t\t\t${o?`<span class="liveChat-message-system-event-time">${o}</span>`:""}\n\t\t\t\t</div>\n\t\t\t`}const n=this.state.teamName||"Support",i=this.options.logoUrl,a=i?`<div class="sdk-avatar sdk-avatar-sm"><img src="${this._escapeHtml(i)}" alt="${this._escapeHtml(n)}" /></div>`:`<div class="sdk-avatar sdk-avatar-sm">${n.charAt(0).toUpperCase()}</div>`,s=this._formatMessageTime(t.timestamp);return`\n\t\t\t<div class="liveChat-message liveChat-message-received">\n\t\t\t\t<div class="liveChat-message-row">\n\t\t\t\t\t<div class="liveChat-message-avatar">${a}</div>\n\t\t\t\t\t<div class="liveChat-message-wrapper">\n\t\t\t\t\t\t<div class="liveChat-message-bubble">\n\t\t\t\t\t\t\t<div class="liveChat-message-content">${this._formatMessageContent(e)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${s?`<div class="liveChat-message-meta"><span>${s}</span></div>`:""}\n\t\t\t</div>\n\t\t`}_renderSenderAvatar(t){if(t?.avatarUrl)return`<div class="sdk-avatar sdk-avatar-sm"><img src="${t.avatarUrl}" alt="${t.name}" /></div>`;return`<div class="sdk-avatar sdk-avatar-sm">${(t?.name||"S").charAt(0).toUpperCase()}</div>`}_renderTeamAvatars(){const t=this.state.teamAvatars;if(!t||0===t.length)return"";return`<div class="liveChat-avatar-stack">${t.slice(0,3).map(t=>"string"==typeof t&&t.startsWith("http")?`<div class="sdk-avatar sdk-avatar-md"><img src="${t}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-md">${t.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_formatMessageTime(t){if(!t)return"";const e=new Date(t);return`${e.toLocaleDateString("en-GB",{day:"2-digit",month:"short",year:"numeric"})}, ${e.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",hour12:!1})}`}_formatMessageContent(t){return t?t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/\n/g,"<br>"):""}_appendMessage(t){const e=this.element.querySelector(".liveChat-chat-messages"),n=e.querySelector(".liveChat-chat-empty");n&&n.remove();const i=this._renderMessage(t),a=document.createElement("div");a.innerHTML=i,e.appendChild(a.firstElementChild);if(e.scrollHeight-e.scrollTop-e.clientHeight<80)this._scrollToBottom();else if(!t.isOwn){const t=this.element.querySelector(".liveChat-scroll-pill");t&&(t.style.display="flex")}}_scrollToBottom(){const t=this.element.querySelector(".liveChat-chat-messages");t&&setTimeout(()=>{t.scrollTop=t.scrollHeight},50)}_setupScrollPill(){const t=this.element.querySelector(".liveChat-chat-messages"),e=this.element.querySelector(".liveChat-scroll-pill");t&&e&&(e.addEventListener("click",()=>{this._scrollToBottom(),e.style.display="none"}),t.addEventListener("scroll",()=>{t.scrollHeight-t.scrollTop-t.clientHeight<80&&(e.style.display="none")}))}_renderGroupedMessages(t){let e="";return t.forEach((n,i)=>{const a=i===t.length-1,s=t[i+1],o=n.timestamp?new Date(n.timestamp).getTime():0,r=s?.timestamp?new Date(s.timestamp).getTime():null,l=n.isSystem?"system":n.isOwn?"own":n.sender?.name||"agent",c=s?s.isSystem?"system":s.isOwn?"own":s.sender?.name||"agent":null,d=a||r&&r-o>3e5||s&&l!==c;e+=this._renderMessage(n,d)}),e}_updateSendButtonState(){const t=this.element.querySelector(".liveChat-compose-input"),e=this.element.querySelector(".liveChat-compose-send");t&&e&&(e.disabled=!t.value.trim()&&0===this._pendingAttachments.length)}_renderAttachmentPreviews(){const t=this.element.querySelector(".liveChat-compose-attachments-preview");if(t){if(0===this._pendingAttachments.length)return t.innerHTML="",void(t.style.display="none");t.style.display="flex",t.innerHTML=this._pendingAttachments.map((t,e)=>`\n\t\t\t\t<div class="liveChat-attachment-preview" data-index="${e}">\n\t\t\t\t\t${t.type.startsWith("image")?`<img class="liveChat-attachment-thumb" src="${t.preview}" alt="${this._escapeHtml(t.file.name)}" />`:'<div class="liveChat-attachment-thumb liveChat-attachment-file-icon"><iconify-icon icon="ph:file" width="24" height="24"></iconify-icon></div>'}\n\t\t\t\t\t<button class="liveChat-attachment-remove" data-index="${e}" aria-label="Remove">×</button>\n\t\t\t\t</div>\n\t\t\t`).join(""),t.querySelectorAll(".liveChat-attachment-remove").forEach(t=>{t.addEventListener("click",t=>{const e=parseInt(t.currentTarget.dataset.index,10);this._pendingAttachments.splice(e,1),this._renderAttachmentPreviews(),this._updateSendButtonState()})})}}_attachEvents(){this.element.querySelector(".liveChat-back-btn").addEventListener("click",()=>{this.state.setView("messages")});const t=this.element.querySelector(".liveChat-mobile-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".liveChat-chat-menu-btn"),n=this.element.querySelector(".liveChat-chat-menu-dropdown");e&&n&&e.addEventListener("click",t=>{t.stopPropagation(),n.classList.toggle("open"),n.classList.contains("open")&&null===this._menuOutsideHandler&&(this._menuOutsideHandler=t=>{n.contains(t.target)||e.contains(t.target)||(n.classList.remove("open"),document.removeEventListener("click",this._menuOutsideHandler),this._menuOutsideHandler=null)},setTimeout(()=>document.addEventListener("click",this._menuOutsideHandler),0))});const i=this.element.querySelector(".liveChat-expand-window-btn");i&&n&&i.addEventListener("click",()=>{n.classList.remove("open"),this._menuOutsideHandler&&(document.removeEventListener("click",this._menuOutsideHandler),this._menuOutsideHandler=null),this.options.onToggleExpand?.()});const a=this.element.querySelector(".liveChat-compose-input"),s=this.element.querySelector(".liveChat-compose-send");a&&s&&(a.addEventListener("input",()=>{a.style.height="auto",a.style.height=Math.min(a.scrollHeight,120)+"px",this._updateSendButtonState(),a.value.trim()&&this._startTyping()}),a.addEventListener("keydown",t=>{"Enter"!==t.key||t.shiftKey||(t.preventDefault(),this._sendMessage())}),s.addEventListener("click",()=>{this._sendMessage()}));const o=this.element.querySelector(".liveChat-emoji-btn");o&&o.addEventListener("click",t=>{t.stopPropagation(),this._toggleEmojiPicker()});const r=this.element.querySelector(".liveChat-compose-attach"),l=this.element.querySelector(".liveChat-compose-file-input");r&&l&&(r.addEventListener("click",()=>{l.click()}),l.addEventListener("change",t=>{const e=t.target.files;e&&(Array.from(e).forEach(t=>{const e=new FileReader;e.onload=e=>{this._pendingAttachments.push({file:t,preview:e.target.result,type:t.type}),this._renderAttachmentPreviews(),this._updateSendButtonState()},e.readAsDataURL(t)}),l.value="")}));const c=this.element.querySelector(".liveChat-chat-messages");c&&c.addEventListener("click",t=>{const e=t.target.closest(".liveChat-message-file");if(e){t.preventDefault();const n=e.dataset.url,i=e.dataset.name;return void this._downloadFile(n,i)}const n=t.target.closest(".liveChat-message-image");if(n){const t=n.dataset.url||n.src;window.open(t,"_blank")}})}async _downloadFile(t,e){try{const n=await fetch(t),i=await n.blob(),a=URL.createObjectURL(i),s=document.createElement("a");s.href=a,s.download=e||"download",s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(a)}catch{window.open(t,"_blank")}}_escapeHtml(t){return t?t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}async _sendMessage(){if(this._isConversationClosed)return;const t=this.element.querySelector(".liveChat-compose-input"),e=t.value.trim(),n=this._pendingAttachments.length>0;if(!e&&!n)return;this._stopTyping();const i=[...this._pendingAttachments];if(!this.state.activeConversationId)this.options.onStartConversation&&this.options.onStartConversation(e,i);else{const t={id:"msg_"+Date.now(),content:e,isOwn:!0,isOptimistic:!0,timestamp:(new Date).toISOString(),attachments:i.map(t=>({url:t.preview,type:t.type.startsWith("image")?"image":"file",name:t.file.name}))};this.state.addMessage(this.state.activeConversationId,t),this.options.onSendMessage&&this.options.onSendMessage(this.state.activeConversationId,t,i)}t.value="",t.style.height="auto",this._pendingAttachments=[],this._renderAttachmentPreviews(),this._updateSendButtonState()}_loadEmojiPicker(){return document.querySelector("#product7-emoji-picker-script")?Promise.resolve():new Promise((t,e)=>{const n=document.createElement("script");n.id="product7-emoji-picker-script",n.type="module",n.src="https://cdn.jsdelivr.net/npm/emoji-picker-element@1/index.js",n.onload=t,n.onerror=e,document.head.appendChild(n)})}async _toggleEmojiPicker(){const t=this.element.querySelector(".liveChat-emoji-picker-container");if(t)return t.remove(),this._emojiPickerOpen=!1,void(this._emojiOutsideHandler&&(document.removeEventListener("click",this._emojiOutsideHandler),this._emojiOutsideHandler=null));try{await this._loadEmojiPicker()}catch{return}const e=document.createElement("div");e.className="liveChat-emoji-picker-container";const n=document.createElement("emoji-picker");e.appendChild(n);const i=this.element.querySelector(".liveChat-chat-compose");i.parentNode.insertBefore(e,i),this._emojiPickerOpen=!0,n.addEventListener("emoji-click",t=>{this._insertEmoji(t.detail.unicode),e.remove(),this._emojiPickerOpen=!1,this._emojiOutsideHandler&&(document.removeEventListener("click",this._emojiOutsideHandler),this._emojiOutsideHandler=null)}),this._emojiOutsideHandler=t=>{e.contains(t.target)||t.target.closest(".liveChat-emoji-btn")||(e.remove(),this._emojiPickerOpen=!1,document.removeEventListener("click",this._emojiOutsideHandler),this._emojiOutsideHandler=null)},setTimeout(()=>document.addEventListener("click",this._emojiOutsideHandler),0)}_insertEmoji(t){const e=this.element.querySelector(".liveChat-compose-input");if(!e)return;const n=e.selectionStart,i=e.selectionEnd;e.value=e.value.slice(0,n)+t+e.value.slice(i),e.selectionStart=e.selectionEnd=n+t.length,e.focus(),e.dispatchEvent(new Event("input"))}_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(t){if(this._typingIndicator){this._typingIndicator.style.display="flex";const e=this._typingIndicator.querySelector(".liveChat-typing-text");e&&(e.textContent=`${t||"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._emojiOutsideHandler&&document.removeEventListener("click",this._emojiOutsideHandler),this._menuOutsideHandler&&document.removeEventListener("click",this._menuOutsideHandler),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class B{constructor(t,e={}){this.state=t,this.options=e,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="liveChat-view liveChat-conversations-view",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(t=>{"conversationsUpdate"!==t&&"conversationAdded"!==t&&"conversationRead"!==t&&"conversationUpdated"!==t||this._updateContent()}),this.element}_getAvatarColor(t){const e=(t||"S").charCodeAt(0);return this.avatarColors[e%this.avatarColors.length]}_updateContent(){const t=this.state.conversations;let e;e=0===t.length?'\n <div class="liveChat-empty-state">\n <div class="liveChat-empty-state-icon">\n <iconify-icon icon="ph:chat-circle" width="48" height="48"></iconify-icon>\n </div>\n <h3>No conversations yet</h3>\n <p>Start a new conversation with our team</p>\n </div>\n ':`\n <div class="liveChat-conversations-list">\n ${t.map(t=>this._renderConversationItem(t)).join("")}\n </div>\n `,this.element.innerHTML=`\n <div class="liveChat-conversations-header">\n <h2>Messages</h2>\n <button class="sdk-close-btn liveChat-mobile-close-btn" aria-label="Close">\n <iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n</button>\n </div>\n\n <div class="liveChat-conversations-body">\n ${e}\n </div>\n\n <div class="liveChat-conversations-footer">\n <button class="liveChat-new-message-btn">\n <iconify-icon icon="ph:pencil-simple" width="16" height="16" style="flex-shrink: 0; color: var(--msg-text-secondary);"></iconify-icon>\n <span style="flex: 1;">New conversation</span>\n <iconify-icon icon="ph:caret-right" width="16" height="16" style="flex-shrink: 0; color: var(--msg-text-tertiary);"></iconify-icon>\n </button>\n </div>\n `,this._attachEvents()}_renderConversationItem(t){const e="closed"===t.status,n=t.unread>0?"unread":"",i=e?"closed":"",a=this._formatTimeAgo(t.lastMessageTime),s=this._renderConversationAvatars(t.participants);return`\n\t\t\t<div class="liveChat-conversation-item ${n} ${i}" data-conversation-id="${t.id}">\n\t\t\t\t<div class="liveChat-conversation-avatars">\n\t\t\t\t\t${s}\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-conversation-content">\n\t\t\t\t\t<div class="liveChat-conversation-header">\n\t\t\t\t\t\t<span class="liveChat-conversation-title">${t.title||"Chat with team"}</span>\n\t\t\t\t\t\t<span class="liveChat-conversation-time">${a}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="liveChat-conversation-preview">\n\t\t\t\t\t\t${t.unread>0?'<span class="liveChat-unread-dot"></span>':""}\n\t\t\t\t\t\t${e?'<span class="liveChat-conversation-resolved-badge">Resolved</span>':""}\n\t\t\t\t\t\t<span class="liveChat-conversation-message">${this._truncateMessage(t.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderConversationAvatars(t){if(!t||0===t.length){return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor("S")};">S</div>`}const e=t[0];if(e.avatarUrl)return`<div class="sdk-avatar sdk-avatar-md"><img src="${e.avatarUrl}" alt="${e.name}" /></div>`;const n=(e.name||"S").charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor(e.name)};">${n}</div>`}_renderAvatarStack(){const t=this.state.teamAvatars;if(!t||0===t.length){return`\n\t\t\t\t<div class="liveChat-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${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="liveChat-avatar-stack">${t.slice(0,2).map(t=>{if("string"==typeof t&&t.startsWith("http"))return`<div class="sdk-avatar sdk-avatar-sm"><img src="${t}" alt="Team member" /></div>`;const e=t.charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor(t)};">${e}</div>`}).join("")}</div>`}_formatTimeAgo(t){if(!t)return"";const e=new Date(t),n=new Date-e,i=Math.floor(n/6e4),a=Math.floor(n/36e5),s=Math.floor(n/864e5);return i<1?"now":i<60?`${i}m`:a<24?`${a}h`:s<7?`${s}d`:e.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_truncateMessage(t){if(!t)return"No messages yet";return t.length<=50?t:t.substring(0,50)+"..."}_attachEvents(){const t=this.element.querySelector(".sdk-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelectorAll(".liveChat-conversation-item").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.conversationId;this.state.setActiveConversation(e),this.state.markAsRead(e),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(e)})});const e=this.element.querySelector(".liveChat-new-message-btn");e&&e.addEventListener("click",()=>{this._startNewConversation()})}_startNewConversation(){const t=this.state.conversations.find(t=>"open"===t.status);t?(this.state.setActiveConversation(t.id),this.state.markAsRead(t.id),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t.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 D{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-help-view",this._updateContent(),this._unsubscribe=this.state.subscribe(t=>{"helpArticlesUpdate"!==t&&"helpSearchChange"!==t||this._updateCollectionsList()}),this.element}_updateContent(){const t=this.state.helpSearchQuery||"";this.element.innerHTML=`\n\t\t\t<div class="liveChat-help-header">\n\t\t\t\t<div class="liveChat-help-header-top">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class="sdk-close-btn liveChat-help-close-btn liveChat-mobile-close-btn" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-help-search-wrap">\n\t\t\t\t\t<span class="liveChat-help-search-icon">\n\t\t\t\t\t\t<iconify-icon icon="ph:magnifying-glass" width="16" height="16"></iconify-icon>\n\t\t\t\t\t</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\tclass="liveChat-help-search-input"\n\t\t\t\t\t\tplaceholder="Search for help..."\n\t\t\t\t\t\tvalue="${t}"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="liveChat-help-body">\n\t\t\t\t<div class="liveChat-help-collections"></div>\n\t\t\t</div>\n\t\t`,this._updateCollectionsList(),this._attachEvents()}_updateCollectionsList(){const t=this.element.querySelector(".liveChat-help-collections"),e=(this.state.helpArticles||[]).filter(t=>(t.articleCount||0)>0),n=(this.state.helpSearchQuery||"").toLowerCase(),i=n?e.filter(t=>t.title.toLowerCase().includes(n)||t.description&&t.description.toLowerCase().includes(n)):e;0!==i.length?(t.innerHTML=i.map(t=>this._renderCollectionItem(t)).join(""),this._attachCollectionEvents()):t.innerHTML=this._renderEmptyState()}_avatarColors=[{bg:"#EF4444",text:"#FFFFFF"},{bg:"#F97316",text:"#FFFFFF"},{bg:"#F59E0B",text:"#FFFFFF"},{bg:"#10B981",text:"#FFFFFF"},{bg:"#06B6D4",text:"#FFFFFF"},{bg:"#3B82F6",text:"#FFFFFF"},{bg:"#8B5CF6",text:"#FFFFFF"},{bg:"#EC4899",text:"#FFFFFF"}];_getAvatarColor(t){const e=t.split("").reduce((t,e)=>t+e.charCodeAt(0),0);return this._avatarColors[e%this._avatarColors.length]}_getInitials(t){return t?t.split(" ").map(t=>t[0]).join("").toUpperCase().slice(0,2):"A"}_renderAuthorAvatar(t){if(t.author?.picture)return`<img\n\t\t\t\tsrc="${t.author.picture}"\n\t\t\t\talt="${t.author.name||""}"\n\t\t\t\tclass="liveChat-help-collection-avatar"\n\t\t\t\ttitle="${t.author.name||""}"\n\t\t\t/>`;const{bg:e,text:n}=this._getAvatarColor(t.id),i=t.author?.name?this._getInitials(t.author.name):"A";return`<span\n\t\t\tclass="liveChat-help-collection-avatar liveChat-help-collection-avatar--initials"\n\t\t\tstyle="background-color: ${e}; color: ${n};"\n\t\t\ttitle="${t.author?.name||"Author"}"\n\t\t>${i}</span>`}_resolveCollectionIcon(t){return t?t.trimStart().startsWith("<")?`<span class="liveChat-help-collection-icon">${t}</span>`:t.startsWith("ph:")?`<span class="liveChat-help-collection-icon">\n\t\t\t\t<iconify-icon icon="${t}"></iconify-icon>\n\t\t\t</span>`:this._defaultCollectionIcon():this._defaultCollectionIcon()}_defaultCollectionIcon(){return'<span class="liveChat-help-collection-icon">\n\t\t\t<iconify-icon icon="ph:book-open"></iconify-icon>\n\t\t</span>'}_renderCollectionItem(t){const e=t.articleCount||0;return`\n\t\t\t<div class="liveChat-help-collection" data-collection-id="${t.id}">\n\t\t\t\t${this._resolveCollectionIcon(t.icon)}\n\t\t\t\t<div class="liveChat-help-collection-content">\n\t\t\t\t\t<div class="liveChat-help-collection-title">${t.title}</div>\n\t\t\t\t\t${t.description?`<p class="liveChat-help-collection-desc">${t.description}</p>`:""}\n\t\t\t\t\t<div class="liveChat-help-collection-meta">\n\t\t\t\t\t\t${this._renderAuthorAvatar(t)}\n\t\t\t\t\t\t<span class="liveChat-help-collection-count">\n\t\t\t\t\t\t\t${e} ${1===e?"article":"articles"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderEmptyState(){return this.state.helpSearchQuery?'\n\t\t\t\t<div class="liveChat-empty-state">\n\t\t\t\t\t<div class="liveChat-empty-state-icon">\n\t\t\t\t\t\t<iconify-icon icon="ph:magnifying-glass" width="48" height="48"></iconify-icon>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t':'\n\t\t\t<div class="liveChat-empty-state">\n\t\t\t\t<div class="liveChat-empty-state-icon">\n\t\t\t\t\t<iconify-icon icon="ph:books" width="48" height="48"></iconify-icon>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t'}_attachEvents(){const t=this.element.querySelector(".liveChat-help-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)});let e;this.element.querySelector(".liveChat-help-search-input").addEventListener("input",t=>{clearTimeout(e),e=setTimeout(()=>{this.state.setHelpSearchQuery(t.target.value)},300)}),this._attachCollectionEvents()}_attachCollectionEvents(){this.element.querySelectorAll(".liveChat-help-collection").forEach(t=>{t.addEventListener("click",()=>{const e=this.state.helpArticles.find(e=>e.id===t.dataset.collectionId);e?.url?window.open(e.url,"_blank"):this.options.onArticleClick&&this.options.onArticleClick(e)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element?.parentNode&&this.element.parentNode.removeChild(this.element)}}class N{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-home-view",this._updateContent(),this._unsubscribe=this.state.subscribe(t=>{"homeChangelogUpdate"!==t&&"conversationsUpdate"!==t&&"availabilityUpdate"!==t&&"settingsUpdate"!==t||this._updateContent()}),this.element}_updateContent(){const t="offline"===this.state.businessHoursState||"away"===this.state.businessHoursState,e=this.state.showAvatars&&!t?this._renderAvatarStack():"",n=this._renderRecentChangelog(),i=this._renderAvailabilityStatus();this.element.innerHTML=`\n\t\t\t<div class="liveChat-home-scroll">\n\t\t\t\t<div class="liveChat-home-header">\n\t\t\t\t\t<div class="liveChat-home-header-top">\n\t\t\t\t\t\t<div class="liveChat-home-logo">\n\t\t\t\t\t\t\t${this.options.logoUrl?`<img src="${this.options.logoUrl}" alt="${this.state.teamName}" />`:""}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="liveChat-home-avatars">${e||i}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="liveChat-home-welcome">\n\t\t\t\t\t\t<span class="liveChat-home-greeting">${this.state.greetingMessage}</span>\n\t\t\t\t\t\t<span class="liveChat-home-question">${this.state.welcomeMessage}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="liveChat-home-body">\n\t\t\t\t\t${this._renderMessageButton()}\n\t\t\t\t\t${this._renderFeaturedCard()}\n\t\t\t\t\t${n}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderAvatarStack(){const t=this.state.teamAvatars,e=["#5856d6","#007aff","#34c759","#ff9500"];if(!t||0===t.length)return"";return`<div class="liveChat-avatar-stack">${t.slice(0,4).map((t,n)=>"string"==typeof t&&t.startsWith("http")?`<div class="sdk-avatar sdk-avatar-lg"><img src="${t}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-lg" style="background: ${e[n%e.length]};">${t.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderAvailabilityStatus(){const t=this.state.businessHoursState;if("offline"===t){let t="We're currently closed";if(this.state.holidayName)t=`Closed for ${this.state.holidayName}`;else if(this.state.nextOpenAt){const e=new Date(this.state.nextOpenAt),n=new Date,i=Math.round((e-n)/36e5);t=i<24?`Opens in ${i}h`:`Opens ${e.toLocaleDateString("en-US",{weekday:"short",hour:"numeric",hour12:!0})}`}return`\n\t\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-away"></span>\n\t\t\t\t\t<span class="liveChat-availability-text">${t}</span>\n\t\t\t\t</div>\n\t\t\t`}return"away"===t?'\n\t\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-away"></span>\n\t\t\t\t\t<span class="liveChat-availability-text">We\'re currently away</span>\n\t\t\t\t</div>\n\t\t\t':this.state.agentsOnline?`\n\t\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-online"></span>\n\t\t\t\t\t<span class="liveChat-availability-text">${this.state.onlineMessage}</span>\n\t\t\t\t</div>\n\t\t\t`:`\n\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-away"></span>\n\t\t\t\t<span class="liveChat-availability-text">${this.state.responseTime}</span>\n\t\t\t</div>\n\t\t`}_renderMessageButton(){const t=this.state.conversations.find(t=>"open"===t.status),e=this.state.responseTime||"We typically reply within a few minutes";return`\n\t\t\t${t?this._renderRecentMessageCard(t):""}\n\t\t\t<button class="liveChat-home-message-btn">\n\t\t\t\t<div class="liveChat-home-continue-info">\n\t\t\t\t\t<span class="liveChat-home-continue-label">${this.state.startButtonText}</span>\n\t\t\t\t\t<span class="liveChat-home-message-subtext">${e}</span>\n\t\t\t\t</div>\n\t\t\t\t<iconify-icon icon="ph:paper-plane-right" width="20" height="20" style="flex-shrink: 0;"></iconify-icon>\n\t\t\t</button>\n\t\t\t<button class="liveChat-home-message-btn liveChat-feedback-btn" data-action="feedback">\n\t\t\t\t<span>Leave us feedback</span>\n\t\t\t\t<iconify-icon icon="ph:caret-right" width="20" height="20" style="flex-shrink: 0;"></iconify-icon>\n\t\t\t</button>\n\t\t`}_renderRecentMessageCard(t){const e=this.options.logoUrl,n=this.state.teamName||"Support",i=e?`<div class="liveChat-home-recent-avatar liveChat-home-recent-avatar-logo"><img src="${e}" alt="${n}" /></div>`:`<div class="liveChat-home-recent-avatar" style="background: var(--color-primary);">${n.charAt(0).toUpperCase()}</div>`,a=t.title||n,s=this._formatTimeAgo(t.lastMessageTime),o=t.lastMessage?t.lastMessage.substring(0,48)+(t.lastMessage.length>48?"...":""):"",r=t.unread>0;return`\n\t\t\t<div class="liveChat-home-recent-card" data-conversation-id="${t.id}">\n\t\t\t\t<div class="liveChat-home-recent-card-label">Recent message</div>\n\t\t\t\t<div class="liveChat-home-recent-card-row">\n\t\t\t\t\t${i}\n\t\t\t\t\t<div class="liveChat-home-recent-card-content">\n\t\t\t\t\t\t<div class="liveChat-home-recent-card-header">\n\t\t\t\t\t\t\t<span class="liveChat-home-recent-card-name">${a}</span>\n\t\t\t\t\t\t\t<span class="liveChat-home-recent-card-time">${s}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="liveChat-home-recent-card-preview">\n\t\t\t\t\t\t\t<span class="liveChat-home-recent-card-message">${o}</span>\n\t\t\t\t\t\t\t${r?'<span class="liveChat-home-recent-unread-dot"></span>':""}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_formatTimeAgo(t){if(!t)return"";const e=new Date(t),n=new Date-e,i=Math.floor(n/6e4),a=Math.floor(n/36e5),s=Math.floor(n/864e5);return i<1?"now":i<60?`${i}m`:a<24?`${a}h`:s<7?`${s}d`:e.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_renderFeaturedCard(){if(!this.options.featuredContent)return"";const{title:t,description:e,imageUrl:n,action:i}=this.options.featuredContent;return`\n\t\t\t<div class="liveChat-home-featured">\n\t\t\t\t${n?`<img src="${n}" alt="${t}" class="liveChat-home-featured-image" onerror="this.style.display='none';" />`:""}\n\t\t\t\t<div class="liveChat-home-featured-divider"></div>\n\t\t\t\t<div class="liveChat-home-featured-content">\n\t\t\t\t\t<h3>${t}</h3>\n\t\t\t\t\t${e?`<p>${e}</p>`:""}\n\t\t\t\t\t${i?`<button class="sdk-btn sdk-btn-primary liveChat-home-featured-btn" data-action="${i.type}" data-value="${i.value}">${i.label}</button>`:""}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderRecentChangelog(){const t=this.state.homeChangelogItems;if(0===t.length)return"";return`\n\t\t\t<div class="liveChat-home-changelog-section">\n\t\t\t\t${t.map(t=>`\n\t\t\t<div class="liveChat-home-changelog-card" data-changelog-id="${t.id}">\n\t\t\t\t${t.coverImage?`\n\t\t\t\t\t<div class="liveChat-home-changelog-cover">\n\t\t\t\t\t\t<img src="${t.coverImage}" alt="${t.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t\t${t.coverText?`<span class="liveChat-home-changelog-cover-text">${t.coverText}</span>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="liveChat-home-changelog-card-content">\n\t\t\t\t\t<h4 class="liveChat-home-changelog-card-title">${t.title}</h4>\n\t\t\t\t\t<p class="liveChat-home-changelog-card-desc">${this._stripHtml(t.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`}_stripHtml(t){if(!t)return"";const e=document.createElement("div");return e.innerHTML=t,(e.textContent||e.innerText||"").trim()}_formatDate(t){if(!t)return"";const e=new Date(t),n=new Date,i=Math.floor((n-e)/864e5);return 0===i?"Today":1===i?"Yesterday":i<7?`${i}d ago`:e.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_attachEvents(){const t=this.element.querySelector(".liveChat-home-recent-card");t&&t.addEventListener("click",()=>{const e=t.dataset.conversationId;this.state.setActiveConversation(e),this.state.markAsRead(e),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(e)});const e=this.element.querySelector(".liveChat-home-message-btn:not(.liveChat-feedback-btn)");e&&e.addEventListener("click",()=>{this.state.setActiveConversation(null),this.state.setView("chat")});const n=this.element.querySelector(".liveChat-feedback-btn");n&&n.addEventListener("click",()=>{this.options.onFeedbackClick?(this.state.setOpen(!1),this.options.onFeedbackClick()):this.state.urls?.feedback&&window.open(this.state.urls.feedback,"_blank")}),this.element.querySelectorAll(".liveChat-home-changelog-card").forEach(t=>{t.addEventListener("click",()=>{const e=this.state.homeChangelogItems.find(e=>e.id===t.dataset.changelogId);e?.url?window.open(e.url,"_blank"):this.state.setView("changelog")})});const i=this.element.querySelector(".liveChat-home-changelog-all");i&&i.addEventListener("click",()=>{this.state.setView("changelog")});const a=this.element.querySelector(".liveChat-home-featured-btn");a&&a.addEventListener("click",()=>{const t=a.dataset.action,e=a.dataset.value;"url"===t?window.open(e,"_blank"):"view"===t&&this.state.setView(e)})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class j{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._isSubmitting=!1}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-prechat-view",this._updateContent(),this.element}_updateContent(){this.element.innerHTML='\n\t\t\t<div class="liveChat-prechat-overlay">\n\t\t\t\t<div class="liveChat-prechat-card">\n\t\t\t\t\t<h4 class="liveChat-prechat-title">Before we continue</h4>\n\t\t\t\t\t<p class="liveChat-prechat-subtitle">Enter your details so we can get back to you.</p>\n\t\t\t\t\t<form class="liveChat-prechat-form" novalidate>\n\t\t\t\t\t\t<div class="liveChat-prechat-field">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\t\tname="name"\n\t\t\t\t\t\t\t\tclass="liveChat-prechat-input"\n\t\t\t\t\t\t\t\tplaceholder="Your name"\n\t\t\t\t\t\t\t\tautocomplete="name"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="liveChat-prechat-field">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="email"\n\t\t\t\t\t\t\t\tname="email"\n\t\t\t\t\t\t\t\tclass="liveChat-prechat-input"\n\t\t\t\t\t\t\t\tplaceholder="Your email address"\n\t\t\t\t\t\t\t\tautocomplete="email"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class="liveChat-prechat-error" style="display:none;"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button type="submit" class="liveChat-prechat-submit">\n\t\t\t\t\t\t\tStart chat\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',this._attachEvents()}_attachEvents(){this.element.querySelector(".liveChat-prechat-form").addEventListener("submit",async t=>{t.preventDefault(),await this._handleSubmit()})}async _handleSubmit(){if(this._isSubmitting)return;const t=this.element.querySelector('input[name="email"]'),e=this.element.querySelector('input[name="name"]'),n=this.element.querySelector(".liveChat-prechat-error"),i=this.element.querySelector(".liveChat-prechat-submit"),a=t.value.trim(),s=e.value.trim();if(!a||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(a))return n.textContent="Please enter a valid email address.",n.style.display="block",void t.focus();n.style.display="none",this._isSubmitting=!0,i.disabled=!0,i.innerHTML='\n\t\t\t<iconify-icon icon="ph:circle-notch" width="16" height="16" style="animation: spin 0.8s linear infinite;"></iconify-icon>\n\t\t\tJust a moment...\n\t\t';try{this.options.onIdentifyContact&&await this.options.onIdentifyContact({name:s||void 0,email:a}),this.state.setIdentified(!0,{name:s,email:a});const t=this.state.pendingMessage;t&&this.options.onStartConversation?(this.state.pendingMessage=null,this.state.setView("chat"),await this.options.onStartConversation(t.content,t.attachments)):this.state.setView("chat")}catch(t){console.error("[PreChatFormView] Error:",t),n.textContent="Something went wrong. Please try again.",n.style.display="block",this._isSubmitting=!1,i.disabled=!1,i.textContent="Start chat"}}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class $ extends q{constructor(t){super({...t,type:"liveChat"}),this._explicitOptions=t||{};const e=t.theme||"light",n=Object.prototype.hasOwnProperty.call(t,"textColor"),i=Object.prototype.hasOwnProperty.call(t,"backgroundColor"),a="dark"===e?"#E2E8F0":"#1d1d1f",s="dark"===e?"#0F172A":"#ffffff",o="boolean"==typeof t.enableChangelog?t.enableChangelog:!1!==t.enableNews;this.liveChatOptions={position:t.position||"right",theme:e,primaryColor:t.primaryColor||"#155EEF",textColor:n?t.textColor:a,backgroundColor:i?t.backgroundColor:s,logoUrl:t.logoUrl||"https://product7.io/p7logo.svg",teamName:t.teamName||"Support",teamAvatars:t.teamAvatars||[],greetingMessage:t.greetingMessage||"Hi there 👋",welcomeMessage:t.welcomeMessage||"How can we help?",onlineMessage:t.onlineMessage||"We're online now",responseTime:t.responseTime||"We typically reply within a few minutes",enableHelp:!1!==t.enableHelp,enableChangelog:o,autoLoadData:!1!==t.autoLoadData,initialView:t.initialView||"home",previewData:t.previewData||null,featuredContent:t.featuredContent||null,feedbackBoardName:t.feedbackBoardName||null,feedbackUrl:t.feedbackUrl||null,changelogUrl:t.changelogUrl||null,helpUrl:t.helpUrl||null,roadmapUrl:t.roadmapUrl||null,composePlaceholder:t.composePlaceholder||null,onSendMessage:t.onSendMessage||null,onFeedbackClick:t.onFeedbackClick||null,onArticleClick:t.onArticleClick||null,onChangelogClick:t.onChangelogClick||null};const r=this.sdk?.apiService?.getMetadata()||null;this.LiveChatState=new M({teamName:this.liveChatOptions.teamName,teamAvatars:this.liveChatOptions.teamAvatars,greetingMessage:this.liveChatOptions.greetingMessage,welcomeMessage:this.liveChatOptions.welcomeMessage,onlineMessage:this.liveChatOptions.onlineMessage,responseTime:this.liveChatOptions.responseTime,enableHelp:this.liveChatOptions.enableHelp,enableChangelog:this.liveChatOptions.enableChangelog,metadata:r,urls:{feedback:this.liveChatOptions.feedbackUrl,changelog:this.liveChatOptions.changelogUrl,help:this.liveChatOptions.helpUrl,roadmap:this.liveChatOptions.roadmapUrl}}),this.sdk?.identified&&r&&(this.LiveChatState.isIdentified=!0),this.launcher=null,this.panel=null,this.wsService=null,this._wsUnsubscribers=[],this._feedbackWidget=null;const l=void 0===t.notificationSound||t.notificationSound;this._notificationSound=new L({soundUrl:"string"==typeof l?l:void 0,volume:t.notificationVolume??.4}),!1===l&&this._notificationSound.setEnabled(!1),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)}_hasTrigger(){return!0===this.options.trigger||void 0===this.options.trigger}_createInternalFeedbackWidget(){try{const t=this.sdk.createWidget("button",{trigger:!1,displayMode:"modal",boardName:this.liveChatOptions.feedbackBoardName||this.sdk.config.boardName,primaryColor:this.liveChatOptions.primaryColor,theme:this.liveChatOptions.theme});return t.mount(),t}catch(t){return console.warn("[LiveChat] Could not create internal feedback widget:",t),null}}_render(){const t=document.createElement("div");return t.className=`liveChat-widget theme-${this.liveChatOptions.theme}`,t.style.zIndex="999999",t.style.setProperty("--liveChat-h-padding",`${this.liveChatOptions.horizontalPadding??20}px`),t.style.setProperty("--liveChat-v-padding",`${this.liveChatOptions.verticalPadding??20}px`),this._widgetContainer=t,T({primaryColor:this.liveChatOptions.primaryColor,textColor:this.liveChatOptions.textColor,backgroundColor:this.liveChatOptions.backgroundColor,theme:this.liveChatOptions.theme}),this.liveChatOptions.onFeedbackClick||(this._feedbackWidget=this._createInternalFeedbackWidget()),this._hasTrigger()&&(this.launcher=new O(this.LiveChatState,{position:this.liveChatOptions.position,primaryColor:this.liveChatOptions.primaryColor}),t.appendChild(this.launcher.render())),this.panel=new V(this.LiveChatState,{position:this.liveChatOptions.position,theme:this.liveChatOptions.theme,primaryColor:this.liveChatOptions.primaryColor,logoUrl:this.liveChatOptions.logoUrl,featuredContent:this.liveChatOptions.featuredContent,onSendMessage:this.liveChatOptions.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.liveChatOptions.onFeedbackClick||(this._feedbackWidget?()=>this._feedbackWidget.open():null),onArticleClick:this.liveChatOptions.onArticleClick,onChangelogClick:this.liveChatOptions.onChangelogClick}),this.panel.registerView("home",N),this.panel.registerView("messages",B),this.panel.registerView("chat",P),this.panel.registerView("prechat",j),this.panel.registerView("help",D),this.panel.registerView("changelog",F),t.appendChild(this.panel.render()),this.panel.hide(),t}_attachEvents(){this._stateUnsubscribe=this.LiveChatState.subscribe((t,e)=>{"openChange"===t&&this._handleOpenChange(e.isOpen),"conversationChange"===t&&this._handleActiveConversationChange(e.conversationId,e.previousConversationId)})}_handleOpenChange(t){t?(this.panel.show(),this.sdk.eventBus.emit("liveChat:opened",{widget:this})):(this.panel.hide(),this.LiveChatState.reset(),this.sdk.eventBus.emit("liveChat:closed",{widget:this}))}_handleActiveConversationChange(t,e){e&&this.wsService&&this.wsService.send("conversation:unsubscribe",{conversation_id:e}),t&&this.wsService&&this.wsService.send("conversation:subscribe",{conversation_id:t})}async _handleStartConversation(t,e){try{if(this.LiveChatState.requireEmailBeforeChat&&!this.LiveChatState.isIdentified)return this.LiveChatState.pendingMessage={content:t,attachments:e},this.LiveChatState.setView("prechat"),null;const n=this.LiveChatState.conversations.find(t=>"open"===t.status);return n?(this.LiveChatState.setActiveConversation(n.id),await this._handleSendMessage(n.id,{content:t},e),n):await this.startNewConversation(t,"",e)}catch(t){return console.error("[LiveChatWidget] Failed to start conversation:",t),null}}async _handleSelectConversation(t){try{await this.fetchMessages(t)}catch(t){console.error("[LiveChatWidget] Failed to fetch messages:",t)}}_handleNewConversationClick(){const t=this.LiveChatState.conversations.find(t=>"open"===t.status);t?(this.LiveChatState.setActiveConversation(t.id),this.LiveChatState.setView("chat"),this._handleSelectConversation(t.id)):(this.LiveChatState.setActiveConversation(null),this.LiveChatState.setView("chat"))}async _handleIdentifyContact(t){try{return await this.sdk.identify({email:t.email,name:t.name})}catch(t){throw console.error("[LiveChatWidget] Failed to identify contact:",t),t}}markAsIdentified(t,e){this.applyIdentity({name:t,email:e})}applyIdentity(t={}){this.LiveChatState.setIdentified(!0,t),this.apiService?.sessionToken&&!this.wsService?.isConnected&&this._initWebSocket()}async _handleUploadFile(t,e){try{const n=await this.apiService.uploadFile(t,e);if(n.status&&n.url)return n.url;throw new Error("Upload failed")}catch(t){throw console.error("[LiveChatWidget] Failed to upload file:",t),t}}async _uploadPendingAttachments(t){if(!t||0===t.length)return[];const e=[];for(const n of t)try{const t=await this._handleUploadFile(n.preview,n.file.name);e.push({url:t,type:n.type.startsWith("image")?"image":"file",name:n.file.name})}catch(t){console.error("[LiveChatWidget] Skipping failed attachment upload:",n.file.name,t)}return e}async _handleSendMessage(t,e,n){this.sdk.eventBus.emit("liveChat:messageSent",{widget:this,conversationId:t,message:e});try{const i=await this._uploadPendingAttachments(n),a=await this.apiService.sendMessage(t,{content:e.content,attachments:i});if(a.status&&a.data){const e=a.data;let n=[];if(e.attachments)try{n="string"==typeof e.attachments?JSON.parse(e.attachments):e.attachments}catch(t){n=[]}this.LiveChatState.upsertMessage(t,{id:e.id,content:e.content,isOwn:!0,timestamp:e.created_at,attachments:Array.isArray(n)&&n.length>0?n:void 0},{reconcileOwnOptimistic:!0,optimisticMatchWindowMs:6e4})}this.apiService?.mock&&setTimeout(()=>{const e={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.LiveChatState.addMessage(t,e)},1500)}catch(t){console.error("[LiveChatWidget] Failed to send message:",t)}}_handleWebSocketMessage(t){const{conversation_id:e,message:n}=t;let i=[];if(n.attachments)try{i="string"==typeof n.attachments?JSON.parse(n.attachments):n.attachments}catch(t){}const a={id:n.id,content:n.content,isOwn:"customer"===n.sender_type,isSystem:"system"===n.sender_type,timestamp:n.created_at,attachments:i.length>0?i:void 0,sender:{name:n.sender_name||"Support",avatarUrl:n.sender_avatar||null}};this.LiveChatState.upsertMessage(e,a,{reconcileOwnOptimistic:!0,optimisticMatchWindowMs:3e4});!("customer"===n.sender_type)&&this.LiveChatState.isIdentified&&this._notificationSound.play(),this.LiveChatState.isOpen&&this.LiveChatState.activeConversationId===e||this._updateUnreadCount()}_handleTypingStarted(t){t.is_agent&&this.LiveChatState._notify("typingStarted",{conversationId:t.conversation_id,userName:t.user_name})}_handleTypingStopped(t){this.LiveChatState._notify("typingStopped",{conversationId:t.conversation_id})}_handleConversationClosed(t){const e=t?.conversation_id||t?.id||t?.conversation?.id;e&&this.LiveChatState.updateConversation(e,{status:"closed"})}async _updateUnreadCount(){try{const t=await this.apiService.getUnreadCount();t.status&&t.data&&(this.LiveChatState.unreadCount=t.data.unread_count||0,this.LiveChatState._notify("unreadCountChange",{count:this.LiveChatState.unreadCount}))}catch(t){console.error("[LiveChatWidget] Failed to get unread count:",t)}}_initWebSocket(){this.wsService&&this.wsService.disconnect(),this.wsService=new I({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));let t=!1;this._wsUnsubscribers.push(this.wsService.on("connected",()=>{console.log("[LiveChatWidget] WebSocket connected");const e=t;t=!0,this.LiveChatState.activeConversationId&&(this.wsService.send("conversation:subscribe",{conversation_id:this.LiveChatState.activeConversationId}),e&&this.fetchMessages(this.LiveChatState.activeConversationId).catch(t=>{console.error("[LiveChatWidget] Failed to backfill messages on reconnect:",t)}))})),this._wsUnsubscribers.push(this.wsService.on("disconnected",()=>{console.log("[LiveChatWidget] WebSocket disconnected"),this.LiveChatState._notify("connectionChange",{connected:!1})})),this._wsUnsubscribers.push(this.wsService.on("connected",()=>{this.LiveChatState._notify("connectionChange",{connected:!0})})),this.wsService.connect()}open(){this.LiveChatState.setOpen(!0)}close(){this.LiveChatState.setOpen(!1)}toggle(){this.LiveChatState.setOpen(!this.LiveChatState.isOpen)}navigateTo(t){this.LiveChatState.setView(t),this.LiveChatState.isOpen||this.open()}setConversations(t){this.LiveChatState.setConversations(t)}addMessage(t,e){this.LiveChatState.addMessage(t,e)}setHelpArticles(t){this.LiveChatState.setHelpArticles(t)}setHomeChangelogItems(t){this.LiveChatState.setHomeChangelogItems(t)}setChangelogItems(t){this.LiveChatState.setChangelogItems(t)}setUnreadCount(t){this.LiveChatState.unreadCount=t,this.LiveChatState._notify("unreadCountChange",{count:t})}getState(){return{isOpen:this.LiveChatState.isOpen,currentView:this.LiveChatState.currentView,unreadCount:this.LiveChatState.unreadCount,conversations:this.LiveChatState.conversations}}_applyPreviewData(){const t=this.liveChatOptions.previewData;if(t&&"object"==typeof t){if(Array.isArray(t.conversations)&&this.LiveChatState.setConversations(t.conversations),Array.isArray(t.helpArticles)&&this.LiveChatState.setHelpArticles(t.helpArticles),Array.isArray(t.homeChangelogItems)&&this.LiveChatState.setHomeChangelogItems(t.homeChangelogItems),Array.isArray(t.changelogItems)&&this.LiveChatState.setChangelogItems(t.changelogItems),"number"==typeof t.unreadCount&&this.setUnreadCount(t.unreadCount),t.availability&&"object"==typeof t.availability){const e=t.availability;this.LiveChatState.agentsOnline=Boolean(e.agentsOnline??e.agents_online??e.is_online),this.LiveChatState.onlineCount=e.onlineCount??e.online_count??0,this.LiveChatState.responseTime=e.responseTime??e.response_time??this.LiveChatState.responseTime,this.LiveChatState._notify("availabilityUpdate",e)}"string"==typeof t.currentView&&this.LiveChatState.setView(t.currentView)}}async loadInitialData(){try{const t=await this._fetchConversations();this.LiveChatState.setConversations(t)}catch(t){console.error("[LiveChatWidget] Failed to load conversations:",t)}if(this.liveChatOptions.enableHelp)try{const t=await this._fetchHelpArticles();this.LiveChatState.setHelpArticles(t)}catch(t){console.error("[LiveChatWidget] Failed to load help articles:",t)}if(this.liveChatOptions.enableChangelog)try{const{homeItems:t,changelogItems:e}=await this._fetchChangelog();this.LiveChatState.setHomeChangelogItems(t),this.LiveChatState.setChangelogItems(e)}catch(t){console.error("[LiveChatWidget] Failed to load changelog:",t)}}async _fetchConversations(){try{const t=await this.apiService.getConversations();return t.status&&t.data?t.data.map(t=>({id:t.id,title:t.subject||`Chat with ${t.assigned_user?.name||"Support"}`,participants:t.assigned_user?[{name:t.assigned_user.name,avatarUrl:t.assigned_user.avatar}]:[{name:"Support",avatarUrl:null}],lastMessage:t.preview||t.snippet||"",lastMessageTime:t.last_message_at,unread:t.unread||0,status:t.status})):[]}catch(t){return console.error("[LiveChatWidget] Failed to fetch conversations:",t),[]}}async _fetchHelpArticles(){try{const t=await this.apiService.getHelpCollections();if(t.success&&t.data){const e=t.data.collections||t.data,n=(this.liveChatOptions.helpUrl||"").replace(/\/$/,"");return[...e].sort((t,e)=>(t.order??0)-(e.order??0)).map(t=>({id:t.id,title:t.title,description:t.description||"",articleCount:t.article_count||0,icon:t.icon||null,author:t.author||null,url:t.url_slug&&n?`${n}/collections/${t.url_slug}`:n||null}))}return[]}catch(t){return console.error("[LiveChatWidget] Failed to fetch help articles:",t),[]}}async fetchMessages(t){try{const e=await this.apiService.getConversation(t);if(e.status&&e.data){const n=(e.data.messages||[]).map(t=>{let e;if(t.attachments)try{e="string"==typeof t.attachments?JSON.parse(t.attachments):t.attachments}catch(t){}return{id:t.id,content:t.content,isOwn:"customer"===t.sender_type,isSystem:"system"===t.sender_type,timestamp:t.created_at,attachments:e&&e.length>0?e:void 0,sender:{name:t.sender_name||("customer"===t.sender_type?"You":"Support"),avatarUrl:t.sender_avatar||null}}});return this.LiveChatState.setMessages(t,n),await this.apiService.markConversationAsRead(t),this.LiveChatState.markAsRead(t),n}return[]}catch(t){return console.error("[LiveChatWidget] Failed to fetch messages:",t),[]}}async startNewConversation(t,e="",n=[]){try{const i=await this._uploadPendingAttachments(n),a=await this.apiService.startConversation({message:t,subject:e,attachments:i});if(a.status&&a.data){const e=a.data,n={id:e.id,title:e.subject||"New conversation",participants:[{name:"Support",avatarUrl:null}],lastMessage:t,lastMessageTime:e.created_at||(new Date).toISOString(),unread:0,status:"open"};this.LiveChatState.addConversation(n);const i=[{id:"msg_"+Date.now(),content:t,isOwn:!0,timestamp:(new Date).toISOString()}];return i.push({id:"system_rt_"+Date.now(),content:this.LiveChatState.agentsOnline?"One of our customer support agents will be with you shortly.":this.LiveChatState.responseTime,isSystem:!0,timestamp:(new Date).toISOString()}),this.LiveChatState.setMessages(e.id,i),this.LiveChatState.setActiveConversation(e.id),this.LiveChatState.setView("chat"),e}return null}catch(t){return console.error("[LiveChatWidget] Failed to start conversation:",t),null}}async sendTypingIndicator(t,e){try{await this.apiService.sendTypingIndicator(t,e)}catch(t){}}async _fetchAndApplySettings(){try{const t=await this.apiService.getLiveChatSettings();if(!t?.status||!t?.data)return;const e=t.data;let n=!1;if(e.team_name&&!this._hasExplicitOption("teamName")&&(this.liveChatOptions.teamName=e.team_name,this.LiveChatState.teamName=e.team_name),e.logo_url&&!this._hasExplicitOption("logoUrl")&&(this.liveChatOptions.logoUrl=e.logo_url),e.greeting_message&&!this._hasExplicitOption("greetingMessage")&&(this.LiveChatState.greetingMessage=e.greeting_message),e.welcome_message&&!this._hasExplicitOption("welcomeMessage")&&(this.LiveChatState.welcomeMessage=e.welcome_message),e.response_time&&!this._hasExplicitOption("responseTime")&&(this.LiveChatState.responseTime=e.response_time),Array.isArray(e.team_avatars)&&e.team_avatars.length>0&&!this._hasExplicitOption("teamAvatars")&&(this.LiveChatState.teamAvatars=e.team_avatars),e.primary_color&&!this._hasExplicitOption("primaryColor")&&(this.liveChatOptions.primaryColor=e.primary_color,n=!0),e.background_color&&!this._hasExplicitOption("backgroundColor")&&(this.liveChatOptions.backgroundColor=e.background_color,n=!0),e.text_color&&!this._hasExplicitOption("textColor")&&(this.liveChatOptions.textColor=e.text_color,n=!0),e.theme&&!this._hasExplicitOption("theme")&&(this.liveChatOptions.theme=e.theme,n=!0),n&&T({primaryColor:this.liveChatOptions.primaryColor,textColor:this.liveChatOptions.textColor,backgroundColor:this.liveChatOptions.backgroundColor,theme:this.liveChatOptions.theme}),e.launcher_position&&!this._hasExplicitOption("position")){const t=e.launcher_position.split("-");this.liveChatOptions.position=t[t.length-1]||"right"}"number"!=typeof e.horizontal_padding||this._hasExplicitOption("horizontalPadding")||(this.liveChatOptions.horizontalPadding=e.horizontal_padding),"number"!=typeof e.vertical_padding||this._hasExplicitOption("verticalPadding")||(this.liveChatOptions.verticalPadding=e.vertical_padding),this._widgetContainer&&(this._widgetContainer.style.setProperty("--liveChat-h-padding",`${this.liveChatOptions.horizontalPadding??20}px`),this._widgetContainer.style.setProperty("--liveChat-v-padding",`${this.liveChatOptions.verticalPadding??20}px`)),"boolean"!=typeof e.home_module_enabled||this._hasExplicitOption("homeModuleEnabled")||(this.LiveChatState.homeModuleEnabled=e.home_module_enabled,e.home_module_enabled||"home"!==this.LiveChatState.currentView||(this.LiveChatState.currentView=!1!==this.LiveChatState.messagesModuleEnabled?"messages":"help")),"boolean"!=typeof e.messages_module_enabled||this._hasExplicitOption("messagesModuleEnabled")||(this.LiveChatState.messagesModuleEnabled=e.messages_module_enabled,e.messages_module_enabled||"messages"!==this.LiveChatState.currentView||(this.LiveChatState.currentView=!1!==this.LiveChatState.homeModuleEnabled?"home":"help")),"boolean"!=typeof e.show_avatars||this._hasExplicitOption("showAvatars")||(this.LiveChatState.showAvatars=e.show_avatars),e.start_button_text&&!this._hasExplicitOption("startButtonText")&&(this.LiveChatState.startButtonText=e.start_button_text),"boolean"!=typeof e.require_email_before_chat||this._hasExplicitOption("requireEmailBeforeChat")||(this.LiveChatState.requireEmailBeforeChat=e.require_email_before_chat),"boolean"!=typeof e.allow_attachments||this._hasExplicitOption("allowAttachments")||(this.LiveChatState.allowAttachments=e.allow_attachments),"boolean"!=typeof e.allow_emoji||this._hasExplicitOption("allowEmoji")||(this.LiveChatState.allowEmoji=e.allow_emoji),"boolean"!=typeof e.show_reply_time||this._hasExplicitOption("showReplyTime")||(this.LiveChatState.showReplyTime=e.show_reply_time),e.feedback_url&&!this._hasExplicitOption("feedbackUrl")&&(this.liveChatOptions.feedbackUrl=e.feedback_url,this.LiveChatState.urls.feedback=e.feedback_url),e.help_url&&!this._hasExplicitOption("helpUrl")&&(this.liveChatOptions.helpUrl=e.help_url,this.LiveChatState.urls.help=e.help_url),e.changelog_url&&!this._hasExplicitOption("changelogUrl")&&(this.liveChatOptions.changelogUrl=e.changelog_url,this.LiveChatState.urls.changelog=e.changelog_url),e.roadmap_url&&!this._hasExplicitOption("roadmapUrl")&&(this.liveChatOptions.roadmapUrl=e.roadmap_url,this.LiveChatState.urls.roadmap=e.roadmap_url),e.availability&&"object"==typeof e.availability&&(this.LiveChatState.businessHoursState=e.availability.state||null,this.LiveChatState.nextOpenAt=e.availability.next_open_at||null,this.LiveChatState.holidayName=e.availability.holiday_name||null),this.LiveChatState._notify("settingsUpdate",{})}catch(t){}}_hasExplicitOption(t){return Object.prototype.hasOwnProperty.call(this._explicitOptions||{},t)}async checkAgentAvailability(){try{const t=await this.apiService.checkAgentsOnline();return t.status&&t.data?(this.LiveChatState.agentsOnline=t.data.agents_online??t.data.is_online??!1,this.LiveChatState.onlineCount=t.data.online_count||0,this.LiveChatState.responseTime=t.data.response_time||"",t.data.available_agents&&!1!==this.LiveChatState.showAvatars&&this.LiveChatState.setTeamAvatarsFromAgents(t.data.available_agents),this.LiveChatState._notify("availabilityUpdate",t.data),t.data):{agents_online:!1,online_count:0}}catch(t){return console.error("[LiveChatWidget] Failed to check availability:",t),{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.",labels:[{name:"Integration",color:"#dbeafe"}],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.",labels:[{name:"New feature",color:"#dcfce7"},{name:"AI",color:"#f3e8ff"}],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.",labels:[{name:"Report",color:"#fef9c3"}],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.",labels:[{name:"Analytics",color:"#fce7f3"}],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.",labels:[{name:"New feature",color:"#dcfce7"},{name:"AI",color:"#f3e8ff"}],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 t=await this.apiService.getChangelogs({limit:20});if(t.success&&t.data){const e=Array.isArray(t.data)?t.data:[],n=(this.liveChatOptions.changelogUrl||"").replace(/\/$/,""),i=e.map(t=>({id:t.id,title:t.title,description:t.excerpt||t.description||"",labels:t.labels||[],coverImage:t.cover_image||null,publishedAt:t.published_at,url:t.slug&&n?`${n}/${t.slug}`:n||null}));return{homeItems:i.slice(0,3),changelogItems:i}}return{homeItems:[],changelogItems:[]}}catch(t){return console.error("[LiveChatWidget] Failed to fetch changelog:",t),{homeItems:[],changelogItems:[]}}}async onMount(){this._applyPreviewData(),this.liveChatOptions.autoLoadData&&(this._fetchAndApplySettings(),this.loadInitialData(),this.apiService?.sessionToken&&this._initWebSocket(),this.checkAgentAvailability(),this._availabilityInterval=setInterval(()=>{this.checkAgentAvailability()},6e4)),this.liveChatOptions.initialView&&this.liveChatOptions.initialView!==this.LiveChatState.currentView&&this.LiveChatState.setView(this.liveChatOptions.initialView)}onDestroy(){this._stateUnsubscribe&&this._stateUnsubscribe(),this.wsService&&this.wsService.disconnect(),this._wsUnsubscribers.forEach(t=>t()),this._wsUnsubscribers=[],this._availabilityInterval&&clearInterval(this._availabilityInterval)}destroy(){!function(){const t=document.getElementById("product7-liveChat-custom-styles");t&&t.parentNode&&t.parentNode.removeChild(t)}(),this.launcher&&this.launcher.destroy(),this.panel&&this.panel.destroy(),this.onDestroy(),super.destroy()}}class H extends q{constructor(t){super({...t,type:"survey"}),this.surveyOptions={surveyId:t.surveyId||null,surveyType:t.surveyType||"nps",position:t.position||"center",theme:t.theme||"light",enabled:"boolean"==typeof t.enabled?t.enabled:void 0,title:t.title||null,description:t.description||null,lowLabel:t.lowLabel||null,highLabel:t.highLabel||null,ratingScale:t.ratingScale||t.scale||null,showFeedbackInput:"boolean"==typeof t.showFeedbackInput?t.showFeedbackInput:null,showSubmitButton:"boolean"==typeof t.showSubmitButton?t.showSubmitButton:null,autoSubmitOnSelect:"boolean"==typeof t.autoSubmitOnSelect?t.autoSubmitOnSelect:null,showTitle:"boolean"==typeof t.showTitle?t.showTitle:null,showDescription:"boolean"==typeof t.showDescription?t.showDescription:null,customQuestions:t.customQuestions||[],pages:Array.isArray(t.pages)?t.pages:[],thankYouConfig:t.thankYouConfig||t.thank_you_config||null,respondentId:t.respondentId||null,email:t.email||null,onSubmit:t.onSubmit||null,onDismiss:t.onDismiss||null},this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1}}static removeDanglingElements(){"undefined"!=typeof document&&document.querySelectorAll(".feedback-survey, .feedback-survey-backdrop, .feedback-survey-success, .product7-notification").forEach(t=>{t&&t.parentNode&&t.parentNode.removeChild(t)})}_render(){const t=document.createElement("div");return t.className="feedback-survey-container",t}_attachEvents(){}show(){return!1===this.options.enabled||!1===this.surveyOptions.enabled?(this.sdk.eventBus.emit("survey:suppressed",{widget:this,surveyId:this.surveyOptions.surveyId,reason:"disabled"}),this):(H.removeDanglingElements(),this._renderSurvey(),this.state.isOpen=!0,this.surveyState.isVisible=!0,this.sdk.eventBus.emit("survey:shown",{widget:this,type:this.surveyOptions.surveyType}),this)}hide(){return this.state.isOpen=!1,this._closeSurvey(),this}_renderSurvey(){this._closeSurvey(!1);const t=this._getSurveyConfig();if(!t)return;const e=this._isMultiPageSurvey(),n=this._isLastPage(),i=this._shouldShowFeedbackInput(),a=this._shouldShowActions(),s=this._shouldShowTitle(t),o=this._shouldShowDescription(t),r=e?Math.round((this.surveyState.currentPageIndex+1)/this.surveyOptions.pages.length*100):0,l=e&&!n?"Next":"Submit",c=e&&this.surveyState.currentPageIndex>0?'<button class="feedback-survey-back"><iconify-icon icon="ph:arrow-left" width="16" height="16"></iconify-icon> Back</button>':"";"center"===this.surveyOptions.position&&(this.backdropElement=document.createElement("div"),this.backdropElement.className=`feedback-survey-backdrop feedback-survey-backdrop-${this.surveyOptions.theme}`,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} feedback-survey-theme-${this.surveyOptions.theme}${o&&!s?" feedback-survey-description-primary":""}`,this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close"><iconify-icon icon="ph:x" width="16" height="16"></iconify-icon></button>\n\t\t\t${s?`<h3 class="feedback-survey-title">${t.title}</h3>`:""}\n\t\t\t${o?`<p class="feedback-survey-description">${t.description}</p>`:""}\n\t\t\t${e&&this.surveyOptions.pages.length>1?`<div class="feedback-survey-progress"><div class="feedback-survey-progress-track"><div class="feedback-survey-progress-fill" style="width:${r}%"></div></div></div>`:""}\n\t\t\t<div class="feedback-survey-content">${t.html}</div>\n\t\t\t${i?`<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${a?`<div class="feedback-survey-actions">\n\t\t\t\t${c}\n\t\t\t\t<button class="feedback-survey-submit">${l} <iconify-icon icon="ph:arrow-right" width="16" height="16"></iconify-icon></button>\n\t\t\t</div>`:""}\n\t\t`,document.body.appendChild(this.surveyElement),this._attachSurveyEvents(),requestAnimationFrame(()=>{this.surveyElement&&(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 t=this._getNPSScale(),e=t.values.length<=7,n=e?"feedback-survey-ces feedback-survey-rating-scale":"feedback-survey-nps",i=e?"feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn":"feedback-survey-nps-btn",a=this.surveyOptions.lowLabel||(0===t.start?"Not likely":"Strongly Disagree"),s=this.surveyOptions.highLabel||(0===t.start?"Very likely":"Strongly Agree"),o=this.surveyOptions.description||this.surveyOptions.title||"How likely are you to recommend us?",r=this.surveyOptions.description||this.surveyOptions.title||"How satisfied are you?",l=this.surveyOptions.description||this.surveyOptions.title||"How easy was it?";return{nps:{title:this.surveyOptions.title||"",description:o,html:`\n\t\t\t\t\t<div class="${n}">\n\t\t\t\t\t\t${t.values.map(t=>`\n\t\t\t\t\t\t\t<button class="${i}" data-score="${t}">${t}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t${this._renderScaleLabels(a,s)}\n\t\t\t\t`},csat:{title:this.surveyOptions.title||"",description:r,html:`\n\t\t\t\t\t<div class="feedback-survey-csat">\n\t\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((t,e)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-csat-btn" data-score="${e+1}">${t}</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-list">\n\t\t\t\t\t\t${["Very Difficult","Difficult","Neutral","Easy","Very Easy"].map((t,e)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-ces-btn feedback-survey-ces-list-btn" data-score="${e+1}">${t}</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()}}[this.surveyOptions.surveyType]||null}_getNPSScale(){const t=Number(this.surveyOptions.ratingScale),e=Number.isFinite(t)&&t>=2?t:5,n=11===e?0:1;return{scale:e,start:n,values:Array.from({length:e},(t,e)=>n+e)}}_renderScaleLabels(t,e){const n=t||"",i=e||"";return n||i?`\n\t\t\t<div class="feedback-survey-labels">\n\t\t\t\t<span>${n}</span>\n\t\t\t\t<span>${i}</span>\n\t\t\t</div>\n\t\t`:""}_isRatingSurveyType(t=this.surveyOptions.surveyType){return"nps"===t||"csat"===t||"ces"===t}_shouldShowTitle(t){return!(!t||!t.title)&&("boolean"==typeof this.surveyOptions.showTitle?this.surveyOptions.showTitle:!(!this._isMultiPageSurvey()&&this._isRatingSurveyType())||!t.description)}_shouldShowDescription(t){return"boolean"==typeof this.surveyOptions.showDescription?this.surveyOptions.showDescription:!this._isMultiPageSurvey()&&this._isRatingSurveyType()?Boolean(t&&(t.description||t.title)):Boolean(t&&t.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 t=this._getCurrentPage();return t?{title:t.title||"",description:t.description||"",html:this._renderSurveyPage(t)}:null}_renderSurveyPage(t){switch(t.type){case"rating":return this._renderRatingPage(t);case"multiple_choice":return this._renderMultipleChoicePage(t);case"text":return this._renderTextPage(t);default:return""}}_renderRatingPage(t){const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=t.rating_config||t.ratingConfig||{},i=Number(n.scale)||5,a=n.survey_type||"number",s=(this.surveyState.pageAnswers[e]||{}).rating,o={nps:11===i?["Not likely","Very likely"]:["Strongly Disagree","Strongly Agree"],emoji:["Very dissatisfied","Very satisfied"],number:["Poor","Excellent"],star:["Poor","Excellent"]},[r,l]=o[a]||["",""],c=n.low_label||r,d=n.high_label||l,h=this._renderScaleLabels(c,d);if("nps"===a){const t=Number.isFinite(i)&&i>=2?i:11,n=11===t?0:1,a=Array.from({length:t},(t,e)=>n+e);return`\n\t\t\t\t<div class="feedback-survey-nps" data-page-id="${e}">\n\t\t\t\t\t${a.map(t=>`<button class="feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-nps-score-${t}${s===t?" selected":""}" data-page-id="${e}" data-score="${t}">${t}</button>`).join("")}\n\t\t\t\t</div>\n\t\t\t\t${h}\n\t\t\t`}if("emoji"===a){const t=["😞","😕","😐","🙂","😄"],n=Number.isFinite(i)&&i>=2?Math.min(i,5):5;return`\n\t\t\t\t<div class="feedback-survey-csat" data-page-id="${e}">\n\t\t\t\t\t${t.slice(0,n).map((t,n)=>{const i=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-csat-btn${s===i?" selected":""}" data-page-id="${e}" data-score="${i}">${t}</button>`}).join("")}\n\t\t\t\t</div>\n\t\t\t\t${h}\n\t\t\t`}if("star"===a){const t=Number.isFinite(i)&&i>=2?i:5;return`\n\t\t\t\t<div class="feedback-survey-stars" data-page-id="${e}">\n\t\t\t\t\t${Array.from({length:t},(t,n)=>{const i=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-star-btn${"number"==typeof s&&s>=i?" filled":""}" data-page-id="${e}" data-score="${i}"><iconify-icon icon="ph:star" width="32" height="32" style="pointer-events:none;"></iconify-icon></button>`}).join("")}\n\t\t\t\t</div>\n\t\t\t\t${h}\n\t\t\t`}const p=Number.isFinite(i)&&i>=2?i:5;return`\n\t\t\t<div class="feedback-survey-rating-scale" data-page-id="${e}">\n\t\t\t\t${Array.from({length:p},(t,n)=>{const i=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-rating-scale-btn${s===i?" selected":""}" data-page-id="${e}" data-score="${i}">${i}</button>`}).join("")}\n\t\t\t</div>\n\t\t\t${h}\n\t\t`}_renderMultipleChoicePage(t){const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=t.multipleChoiceConfig||t.multiple_choice_config||{},i=Array.isArray(n.options)?n.options:[],a=!0===n.allow_multiple||!0===n.multiple||!0===n.allow_multiple_selection,s=this.surveyState.pageAnswers[e]||{},o=Array.isArray(s.values)?s.values:s.value?[s.value]:[];return`\n\t\t\t<div class="feedback-survey-multiple-choice" data-page-id="${e}" data-multiple="${a}">\n\t\t\t\t${i.map((t,n)=>{const i=t.value||t.id||t.key||`option_${n}`,a=t.label||t.text||String(i);return`<button class="feedback-survey-page-choice-btn${o.includes(i)?" selected":""}" data-page-id="${e}" data-value="${i}">${a}</button>`}).join("")}\n\t\t\t</div>\n\t\t`}_renderTextPage(t){const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=(this.surveyState.pageAnswers[e]||{}).text||"";return`\n\t\t\t<div class="feedback-survey-text-page" data-page-id="${e}">\n\t\t\t\t<textarea class="feedback-survey-page-textarea" data-page-id="${e}" placeholder="${t.placeholder||"Type your answer..."}">${n}</textarea>\n\t\t\t</div>\n\t\t`}_renderCustomQuestions(){return this.surveyOptions.customQuestions&&0!==this.surveyOptions.customQuestions.length?this.surveyOptions.customQuestions.map((t,e)=>`\n\t\t\t<div class="sdk-form-group">\n\t\t\t\t<label class="sdk-label">${t.label}</label>\n\t\t\t\t${this._renderQuestionInput(t,e)}\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(t=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-freq-btn" data-freq="${t}">${t}</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(t,e){switch(t.type){case"select":return`\n\t\t\t\t\t<select class="feedback-survey-select" data-question="${t.id||e}">\n\t\t\t\t\t\t<option value="">${t.placeholder||"Select an option"}</option>\n\t\t\t\t\t\t${t.options.map(t=>`<option value="${t.value}">${t.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="${t.id||e}" placeholder="${t.placeholder||""}">\n\t\t\t\t`;default:return""}}_attachSurveyEvents(){if(!this.surveyElement)return;this.surveyElement.querySelector(".feedback-survey-close").addEventListener("click",()=>this._handleDismiss());const t=this.surveyElement.querySelector(".feedback-survey-submit");t&&t.addEventListener("click",()=>this._handleSubmit());const e=this.surveyElement.querySelector(".feedback-survey-back");e&&e.addEventListener("click",()=>this._handleBack());const n=this.surveyElement.querySelector(".feedback-survey-textarea");n&&n.addEventListener("input",t=>{this.surveyState.feedback=t.target.value}),this._attachTypeSpecificEvents(),this._escapeHandler=t=>{"Escape"===t.key&&this._handleDismiss()},document.addEventListener("keydown",this._escapeHandler)}_attachTypeSpecificEvents(){if(this._isMultiPageSurvey())return void this._attachCurrentPageEvents();const t=this.surveyOptions.surveyType;"nps"===t&&this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(t=>{t.addEventListener("click",()=>this._selectNPS(parseInt(t.dataset.score)))}),"csat"===t&&this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(t=>{t.addEventListener("click",()=>this._selectCSAT(parseInt(t.dataset.score)))}),"ces"===t&&this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(t=>{t.addEventListener("click",()=>this._selectCES(parseInt(t.dataset.score)))}),"custom"===t&&(this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(t=>{t.addEventListener("click",()=>this._selectFrequency(t.dataset.freq))}),this.surveyElement.querySelectorAll(".feedback-survey-select").forEach(t=>{t.addEventListener("change",e=>{this.surveyState.customAnswers[t.dataset.question]=e.target.value})}),this.surveyElement.querySelectorAll(".feedback-survey-input").forEach(t=>{t.addEventListener("input",e=>{this.surveyState.customAnswers[t.dataset.question]=e.target.value})}))}_attachCurrentPageEvents(){const t=this._getCurrentPage();if(!t||!this.surveyElement)return;const e=t.id||`page_${this.surveyState.currentPageIndex}`;if("rating"===t.type){const t=!!this.surveyElement.querySelector(".feedback-survey-star-btn");if(this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(n=>{n.addEventListener("click",()=>{const i=parseInt(n.dataset.score);Number.isNaN(i)||(this._setPageAnswer(e,{rating:i}),t?this.surveyElement.querySelectorAll(".feedback-survey-star-btn").forEach(t=>{const e=parseInt(t.dataset.score);t.classList.toggle("filled",e<=i)}):(this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(t=>t.classList.remove("selected")),n.classList.add("selected")))}),t&&n.addEventListener("mouseenter",()=>{const t=parseInt(n.dataset.score);this.surveyElement.querySelectorAll(".feedback-survey-star-btn").forEach(e=>{const n=parseInt(e.dataset.score);e.classList.toggle("hovered",n<=t)})})}),t){const t=this.surveyElement.querySelector(".feedback-survey-stars");t&&t.addEventListener("mouseleave",()=>{this.surveyElement.querySelectorAll(".feedback-survey-star-btn").forEach(t=>t.classList.remove("hovered"))})}}if("multiple_choice"===t.type){const t=this.surveyElement.querySelector(".feedback-survey-multiple-choice"),n=!!t&&"true"===t.dataset.multiple;this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(t=>{t.addEventListener("click",()=>{const i=t.dataset.value;if(!i)return;const a=this.surveyState.pageAnswers[e]||{},s=Array.isArray(a.values)?a.values:a.value?[a.value]:[];let o=[];if(n){o=s.includes(i)?s.filter(t=>t!==i):[...s,i]}else o=[i];this._setPageAnswer(e,{value:o[0]||null,values:o}),n||this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(t=>t.classList.remove("selected")),t.classList.toggle("selected",o.includes(i))})})}if("text"===t.type){const t=this.surveyElement.querySelector(".feedback-survey-page-textarea");t&&t.addEventListener("input",t=>{this._setPageAnswer(e,{text:t.target.value})})}}_selectNPS(t){this.surveyState.score=t,this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(e=>{const n=parseInt(e.dataset.score);e.classList.toggle("selected",n===t)}),this._maybeAutoSubmit()}_selectCSAT(t){this.surveyState.score=t,this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(e=>{const n=parseInt(e.dataset.score);e.classList.toggle("selected",n===t)}),this._maybeAutoSubmit()}_maybeAutoSubmit(){this._shouldAutoSubmitOnSelect()&&this._handleSubmit()}_setSubmitLoading(t){const e=this.surveyElement?.querySelector(".feedback-survey-submit");e&&(e.disabled=t,e.innerHTML=t?'<iconify-icon icon="ph:circle-notch" width="16" height="16" style="animation: spin 0.8s linear infinite;"></iconify-icon> Submitting...':'Submit <iconify-icon icon="ph:arrow-right" width="16" height="16"></iconify-icon>')}async _handleSubmit(){const t=this.surveyOptions.surveyType;if(this.surveyState.isSubmitting)return;if(this._isMultiPageSurvey()){if(!this._validateCurrentPage())return;const t=this._getNextPageIndex();if(-1!==t&&t!==this.surveyState.currentPageIndex)return this.surveyState.currentPageIndex=t,void this._renderSurvey()}if(!this._isMultiPageSurvey()&&("nps"===t||"csat"===t||"ces"===t)&&null===this.surveyState.score)return void this._showError("Please select a rating");this.surveyState.isSubmitting=!0,this._setSubmitLoading(!0);const e=this._getRespondentContext(),n={answers:this._normalizePageAnswersForSubmit(),...this.surveyState.feedback&&{feedback:this.surveyState.feedback},...e.respondentId&&{respondentId:e.respondentId},...e.email&&{email:e.email}},i={type:t,answers:n.answers,feedback:this.surveyState.feedback,timestamp:(new Date).toISOString()};try{const e=this.surveyOptions.surveyId||`local_${t}_${Date.now()}`;await this.apiService.submitSurveyResponse(e,n),this.sdk.eventBus.emit("survey:submitted",{widget:this,response:i}),this._showThankYouScreen(()=>{this.surveyOptions.onSubmit&&this.surveyOptions.onSubmit(i)})}catch(t){console.error("[SurveyWidget] Failed to submit survey:",t),this._showError("Something went wrong. Please try again.")}finally{this.surveyState.isSubmitting=!1,this._setSubmitLoading(!1)}}_handleBack(){this._isMultiPageSurvey()&&(this.surveyState.currentPageIndex<=0||(this.surveyState.currentPageIndex-=1,this._renderSurvey()))}_setPageAnswer(t,e){if(!t)return;this.surveyState.pageAnswers[t]={...this.surveyState.pageAnswers[t]||{},...e};const n=this._getCurrentPage();this.sdk.eventBus.emit("survey:questionAnswered",{widget:this,pageId:t,pageType:n?.type,answer:this.surveyState.pageAnswers[t]})}_validateCurrentPage(){const t=this._getCurrentPage();if(!t||!0!==t.required)return!0;const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=this.surveyState.pageAnswers[e]||{};if("rating"===t.type&&"number"!=typeof n.rating)return this._showError("Please select a rating"),!1;if("multiple_choice"===t.type){if(!(Boolean(n.value)||Array.isArray(n.values)&&n.values.length>0))return this._showError("Please select an option"),!1}return!!("text"!==t.type||n.text&&String(n.text).trim())||(this._showError("Please enter an answer"),!1)}_getNextPageIndex(){if(!this._isMultiPageSurvey())return-1;const t=this._getCurrentPage(),e=this.surveyOptions.pages.length,n=this.surveyState.currentPageIndex,i=n+1<e?n+1:-1,a=t?t.after_this_page||t.afterThisPage:null;if(!a)return i;const s=Array.isArray(a.conditions)?a.conditions:[],o=t.id||`page_${n}`,r=this.surveyState.pageAnswers[o]||{};for(const n of s)if(this._evaluateCondition(n,t,r))return this._resolvePageTarget(n.go_to,e,i);return this._resolvePageTarget(a.default,e,i)}_evaluateCondition(t,e,n){const{operator:i,values:a}=t;if(!i||!Array.isArray(a))return!1;let s=null;if("rating"===e.type?s="number"==typeof n.rating?n.rating:null:"multiple_choice"===e.type?s=n.value||(Array.isArray(n.values)?n.values[0]:null):"text"===e.type&&(s=n.text||null),"is_empty"===i)return null===s||""===s;if("not_empty"===i)return null!==s&&""!==s;if(null===s)return!1;const[o,r]=a;switch(i){case"equals":return String(s)===String(o);case"greater_than":return Number(s)>Number(o);case"less_than":return Number(s)<Number(o);case"between":return Number(s)>=Number(o)&&Number(s)<=Number(r);case"contains":return String(s).includes(String(o));default:return!1}}_resolvePageTarget(t,e,n){if(!t)return n;if("end_survey"===t)return-1;if("next_page"===t||"next"===t)return n;if("number"==typeof t)return t>=0&&t<e?t:n;if("string"==typeof t){const e=t.replace(/^page:/,""),i=this.surveyOptions.pages.findIndex(t=>t.id===e);return i>=0?i:n}return n}_getSubmissionRating(){if("number"==typeof this.surveyState.score)return this.surveyState.score;if(!this._isMultiPageSurvey())return null;for(const t of this.surveyOptions.pages){const e=t.id||`page_${this.surveyOptions.pages.indexOf(t)}`,n=this.surveyState.pageAnswers[e];if(n&&"number"==typeof n.rating)return n.rating}return null}_normalizePageAnswersForSubmit(){if(!this._isMultiPageSurvey())return"number"==typeof this.surveyState.score?[{page_id:"p1",value:this.surveyState.score}]:[];const t=[];for(const e of this.surveyOptions.pages){const n=e.id||`page_${this.surveyOptions.pages.indexOf(e)}`,i=this.surveyState.pageAnswers[n];if(null==i)continue;let a=null;if("rating"===e.type&&"number"==typeof i.rating)a=i.rating;else if("multiple_choice"===e.type){const t=e.multipleChoiceConfig||e.multiple_choice_config||{};(!0===t.allow_multiple||!0===t.multiple||!0===t.allow_multiple_selection)&&Array.isArray(i.values)&&i.values.length>0?a=i.values:null!=i.value&&""!==i.value&&(a=i.value)}else"text"===e.type&&"string"==typeof i.text&&i.text.trim()?a=i.text.trim():"link"===e.type&&"boolean"==typeof i.clicked&&(a=i.clicked);null!==a&&t.push({page_id:n,value:a})}return t}_getRespondentContext(){const t="function"==typeof this.sdk.getMetadata&&this.sdk.getMetadata()||{},e=this.apiService&&"function"==typeof this.apiService.getMetadata&&this.apiService.getMetadata()||{},n=this.options.metadata||{};return{respondentId:this.surveyOptions.respondentId||n.user_id||t.user_id||e.user_id||null,email:this.surveyOptions.email||n.email||t.email||e.email||null}}async _handleDismiss(){if(this.surveyOptions.surveyId)try{await this.apiService.dismissSurvey(this.surveyOptions.surveyId)}catch(t){console.error("[SurveyWidget] Failed to dismiss survey:",t)}this.surveyOptions.onDismiss&&this.surveyOptions.onDismiss(),this.sdk.eventBus.emit("survey:dismissed",{widget:this}),this._closeSurvey()}_showError(t){const e=this.surveyElement.querySelector(".feedback-survey-error");e&&e.remove();const n=document.createElement("div");n.className="feedback-survey-error",n.innerHTML=`<iconify-icon icon="ph:warning" width="15" height="15"></iconify-icon><span>${t}</span>`,this.surveyElement.prepend(n),setTimeout(()=>n.remove(),3e3)}_showThankYouScreen(t){if(!this.surveyElement)return;const e=this.surveyOptions.pages||[],n=e[this.surveyState.currentPageIndex]||e[e.length-1]||null,i=n?.thankYouConfig||null,a=this.surveyOptions.thankYouConfig||null,s=(i?.title?i:null)||(a?.title?a:null)||{},o=s.title||"Thanks for your feedback!",r=s.button_text||null,l=s.button_url||"",c=l?/^https?:\/\//i.test(l)?l:`https://${l}`:"#";this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null),this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close"><iconify-icon icon="ph:x" width="16" height="16"></iconify-icon></button>\n\t\t\t<div class="feedback-survey-thankyou">\n\t\t\t\t<iconify-icon icon="ph:check-circle" width="48" height="48" class="feedback-survey-thankyou-icon"></iconify-icon>\n\t\t\t\t<h3 class="feedback-survey-thankyou-title">${o}</h3>\n\t\t\t\t${r?`\n\t\t\t\t\t<a class="feedback-survey-thankyou-btn" href="${c}" target="_blank" rel="noopener noreferrer">\n\t\t\t\t\t\t${r}\n\t\t\t\t\t\t<iconify-icon icon="ph:arrow-square-out" width="15" height="15" style="pointer-events:none;"></iconify-icon>\n\t\t\t\t\t</a>`:""}\n\t\t\t</div>\n\t\t`;const d=this.surveyElement.querySelector(".feedback-survey-close");d&&d.addEventListener("click",()=>this._closeSurvey()),setTimeout(()=>{this.surveyElement&&this._closeSurvey(),t&&t()},r?6e3:3500)}_closeSurvey(t=!0,e=!1){this.state.isOpen=!1,this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null);const n=this.surveyElement,i=this.backdropElement;if(n){n.style.opacity="0";const t=this.surveyOptions.position;n.style.transform="center"===t?"translate(-50%, -50%) scale(0.95)":"bottom"===t?"translateY(100%)":"translateY(10px)",e?n.parentNode&&n.parentNode.removeChild(n):setTimeout(()=>{n&&n.parentNode&&n.parentNode.removeChild(n)},300),this.surveyElement=null}i&&(i.style.opacity="0",e?i.parentNode&&i.parentNode.removeChild(i):setTimeout(()=>{i&&i.parentNode&&i.parentNode.removeChild(i)},300),this.backdropElement=null),t&&(this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1}),this.sdk.eventBus.emit("survey:closed",{widget:this})}open(){return this.show()}close(){return this.hide()}toggle(){return this.surveyState.isVisible?this.hide():this.show()}destroy(){this._closeSurvey(!0,!0),super.destroy()}}class U extends q{constructor(t){super({...t,type:"tab"})}_render(){const t=document.createElement("div");return t.className=`feedback-widget feedback-widget-tab position-${this.options.position}`,t.innerHTML='\n <div class="feedback-tab-trigger">\n <span class="feedback-tab-text">Feedback</span>\n </div>\n ',this.options.customStyles&&Object.assign(t.style,this.options.customStyles),t}_attachEvents(){this.element.querySelector(".feedback-tab-trigger").addEventListener("click",this.openModal)}updateText(t){const e=this.element?.querySelector(".feedback-tab-text");e&&(e.textContent=t)}updatePosition(t){this.options.position=t,this.element&&(this.element.className=this.element.className.replace(/position-\w+/,`position-${t}`))}}class W{static widgets=new Map([["button",S],["tab",U],["inline",E],["survey",H],["liveChat",$],["changelog",A]]);static register(t,e){if("string"!=typeof t||!t.trim())throw new p("Widget type must be a non-empty string");if("function"!=typeof e)throw new p("Widget class must be a constructor function");this.widgets.set(t,e)}static create(t,e={}){const n=this.widgets.get(t);if(!n){const e=Array.from(this.widgets.keys()).join(", ");throw new p(`Unknown widget type: ${t}. Available types: ${e}`)}try{return new n(e)}catch(e){throw new p(`Failed to create widget of type '${t}': ${e.message}`,e)}}static getAvailableTypes(){return Array.from(this.widgets.keys())}static isTypeRegistered(t){return this.widgets.has(t)}static unregister(t){return this.widgets.delete(t)}static clear(){this.widgets.clear()}static getWidgetClass(t){return this.widgets.get(t)}}let R=class t{constructor(t={}){this.config=this._validateAndMergeConfig(t),this.initialized=!1,this.identified=!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,metadata:this.config.metadata,mock:this.config.mock,debug:this.config.debug,env:this.config.env}),this._bindMethods()}_injectStyles(){if("undefined"==typeof document)return;if(document.querySelector("#product7-styles"))return;const t=document.createElement("style");if(t.id="product7-styles",t.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 /* Web Chat semantic tokens (light defaults) */\n --msg-bg: #FFFFFF;\n --msg-bg-surface: #F3F4F6;\n --msg-bg-elevated: #FFFFFF;\n --msg-bg-hover: #F9FAFB;\n --msg-bg-input: rgba(255, 255, 255, 0.7);\n --msg-bg-bubble-own: #F3F4F6;\n --msg-bg-bubble-received: #155EEF;\n --msg-bg-header-gradient: linear-gradient(180deg, #e0e7ff 0%, #f0f4ff 35%, #FFFFFF 65%);\n --msg-bg-header-glow1: radial-gradient(circle, rgba(21, 94, 239, 0.08) 0%, transparent 70%);\n --msg-bg-header-glow2: radial-gradient(circle, rgba(139, 92, 246, 0.05) 0%, transparent 70%);\n --msg-text: #111827;\n --msg-text-secondary: #4B5563;\n --msg-text-tertiary: #6B7280;\n --msg-text-muted: #9CA3AF;\n --msg-border: #E5E7EB;\n --msg-border-bubble: transparent;\n --msg-shadow-card: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n --msg-shadow-card-hover: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\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: 0.75rem;\n --font-size-sm: 0.8125rem;\n --font-size-base: 0.875rem;\n --font-size-md: 0.9375rem;\n --font-size-lg: 1rem;\n --font-size-xl: 1.125rem;\n --font-size-2xl: 1.25rem;\n --font-size-3xl: 1.5rem;\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.liveChat-widget,\n.changelog-widget,\n.feedback-survey,\n.feedback-panel,\n.feedback-modal,\n.changelog-modal,\n.changelog-list-modal,\n.product7-notification {\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.liveChat-widget *,\n.liveChat-widget *::before,\n.liveChat-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.feedback-panel *,\n.feedback-panel *::before,\n.feedback-panel *::after,\n.feedback-modal *,\n.feedback-modal *::before,\n.feedback-modal *::after,\n.changelog-modal *,\n.changelog-modal *::before,\n.changelog-modal *::after,\n.changelog-list-modal *,\n.changelog-list-modal *::before,\n.changelog-list-modal *::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .feedback-widget *,\n .liveChat-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 .liveChat-widget,\n .liveChat-launcher,\n .liveChat-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 display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\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 font-family: inherit;\n cursor: pointer;\n height: 40px;\n padding: 8px 18px;\n transition: all var(--transition-base);\n}\n\n.sdk-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\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 transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.sdk-btn-secondary {\n background: transparent;\n color: var(--color-neutral-600);\n border: 1px solid var(--color-border);\n height: 40px;\n padding: 8px 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-secondary:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\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-ghost:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\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: rgba(128, 128, 128, 0.12);\n color: var(--color-text-primary);\n}\n\n.sdk-btn-icon:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.sdk-btn-icon:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.sdk-input {\n width: 100%;\n height: 40px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 8px 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: 40px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 8px 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-required {\n color: var(--color-error, #D13212);\n margin-left: 1px;\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: 28px;\n height: 28px;\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: rgba(128, 128, 128, 0.12);\n color: var(--color-text-primary);\n}\n\n.sdk-close-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.feedback-widget-button.position-left {\n bottom: 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: #ffffff;\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 box-shadow: var(--shadow-lg);\n}\n\n.feedback-trigger-btn:active:not(:disabled) {\n transform: translateY(1px);\n box-shadow: var(--shadow-md);\n transition-duration: 100ms;\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.feedback-modal {\n box-sizing: border-box;\n}\n\n.feedback-panel *,\n.feedback-panel *::before,\n.feedback-panel *::after,\n.feedback-modal *,\n.feedback-modal *::before,\n.feedback-modal *::after {\n box-sizing: border-box;\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 border-radius: 12px;\n overflow: hidden;\n opacity: 0;\n transform: translateX(calc(100% + 24px));\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease;\n font-family: inherit;\n box-shadow: var(--shadow-lg);\n}\n\n.feedback-panel.open {\n transform: translateX(0);\n opacity: 1;\n}\n\n.feedback-panel.panel-from-left {\n right: auto;\n left: var(--spacing-6);\n transform: translateX(calc(-100% - 24px));\n}\n\n.feedback-panel.panel-from-left.open {\n transform: translateX(0);\n}\n\n.feedback-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n border-radius: 12px;\n overflow: hidden;\n opacity: 0;\n transform: translate(-50%, -50%) scale(0.96);\n width: min(460px, calc(100vw - (var(--spacing-5) * 2)));\n max-height: min(560px, calc(100vh - (var(--spacing-6) * 2)));\n z-index: var(--z-popover);\n transition: transform var(--transition-slow), opacity var(--transition-slow);\n font-family: inherit;\n box-shadow: var(--shadow-xl);\n}\n\n.feedback-modal.open {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n}\n\n.feedback-panel-content {\n background: var(--feedback-panel-bg, var(--color-white));\n color: var(--feedback-panel-text, var(--color-text-primary));\n height: 100%;\n display: flex;\n flex-direction: column;\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(--feedback-panel-text, var(--color-text-primary));\n}\n\n.feedback-panel-body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\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: #ffffff;\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: #D13212;\n border-radius: var(--radius-md);\n display: none;\n}\n\n.feedback-error.show {\n display: block;\n}\n\n/* ========================================\n DARK THEME — scoped variable overrides\n ======================================== */\n\n.feedback-panel.theme-dark,\n.feedback-modal.theme-dark {\n /* Aligned with web chat dark theme */\n --color-white: #0f1317;\n --color-background: #0f1317;\n --color-surface: #1a1e24;\n --color-border: #232930;\n --color-neutral-50: #1a1e24;\n --color-neutral-100: #1a1e24;\n --color-neutral-200: #232930;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-neutral-900: #e8e8e8;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\n --feedback-panel-bg: #1a1e24;\n --feedback-panel-text: #e8e8e8;\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-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.panel-from-left {\n right: auto;\n left: var(--spacing-4);\n transform: translateX(calc(-100% - 24px));\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-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.changelog-widget.position-left {\n bottom: 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: #ffffff;\n background: var(--color-primary);\n box-shadow: var(--shadow-md);\n width: fit-content;\n}\n\n.changelog-trigger-btn:hover {\n box-shadow: var(--shadow-lg);\n}\n\n.changelog-trigger-btn:active {\n transform: translateY(1px);\n box-shadow: var(--shadow-md);\n transition-duration: 100ms;\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-backdrop,\n.changelog-list-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--transition-slow);\n z-index: var(--z-modal-backdrop);\n}\n\n.changelog-modal-backdrop.show,\n.changelog-list-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\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: 480px;\n max-height: 90vh;\n background: var(--color-white);\n border-radius: 12px;\n overflow: hidden;\n box-shadow: var(--shadow-xl);\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: 28px;\n height: 28px;\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:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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: 1px solid var(--color-border);\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-text-primary);\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-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\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: #ffffff;\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 height: 40px;\n}\n\n.changelog-popup-btn:hover:not(:disabled) {\n background: var(--color-primary-hover);\n}\n\n.changelog-popup-btn:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\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-neutral-300);\n cursor: pointer;\n transition: all var(--transition-base);\n}\n\n.changelog-dot:hover {\n background: var(--color-neutral-400);\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:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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: 12px;\n overflow: hidden;\n box-shadow: var(--shadow-lg);\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}\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: 28px;\n height: 28px;\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:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.changelog-list-modal-close:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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 gap: var(--spacing-3);\n padding: var(--spacing-4) 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-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.changelog-list-item-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n flex-wrap: wrap;\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}\n\n.changelog-label {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--radius-full);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n line-height: 1.5;\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 white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\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-image {\n width: 64px;\n height: 64px;\n flex-shrink: 0;\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: 100%;\n display: block;\n object-fit: cover;\n}\n\n.changelog-list-item-arrow {\n flex-shrink: 0;\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 DARK THEME — scoped variable overrides\n ======================================== */\n\n.changelog-theme-dark.changelog-widget .changelog-trigger-btn {\n background: #1a1e24;\n color: #e8e8e8;\n border: 1px solid #232930;\n}\n\n.changelog-theme-dark.changelog-modal-backdrop,\n.changelog-theme-dark.changelog-list-modal-backdrop {\n background: rgba(2, 6, 23, 0.72);\n}\n\n.changelog-theme-dark .changelog-modal-container,\n.changelog-theme-dark .changelog-list-modal-container {\n --color-white: #1a1e24;\n --color-border: #232930;\n --color-neutral-50: #232930;\n --color-neutral-100: #2d343c;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-neutral-900: #e8e8e8;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\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-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: 12px;\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: 12px;\n }\n\n .changelog-list-item {\n padding: var(--spacing-3) var(--spacing-4);\n }\n\n .changelog-list-item-image {\n width: 56px;\n height: 56px;\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.4);\n z-index: var(--z-modal-backdrop);\n animation: fadeIn var(--transition-slow);\n}\n\n.feedback-survey-backdrop-dark {\n background: rgba(2, 6, 23, 0.65);\n}\n\n/* ========================================\n SURVEY CARD\n ======================================== */\n\n.feedback-survey {\n position: fixed;\n z-index: var(--z-modal);\n background: var(--color-white);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-xl);\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n padding: var(--spacing-6);\n min-width: 320px;\n max-width: 400px;\n font-family: inherit;\n overflow: hidden;\n opacity: 0;\n transition: opacity 200ms ease, transform 240ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* ========================================\n DARK THEME\n ======================================== */\n\n.feedback-survey-theme-dark {\n --color-white: #0f1317;\n --color-background: #0f1317;\n --color-surface: #1a1e24;\n --color-border: #232930;\n --color-neutral-50: #1a1e24;\n --color-neutral-100: #1a1e24;\n --color-neutral-200: #232930;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-neutral-900: #e8e8e8;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\n --color-primary-light: rgba(21, 94, 239, 0.18);\n --color-primary-border: rgba(21, 94, 239, 0.4);\n --color-error-light: rgba(239, 68, 68, 0.15);\n --color-error-border: rgba(239, 68, 68, 0.25);\n --color-error-dark: #fca5a5;\n}\n\n/* ========================================\n POSITION VARIANTS + ENTRANCE STATES\n ======================================== */\n\n.feedback-survey-right {\n bottom: var(--spacing-6);\n right: var(--spacing-6);\n transform: translateY(10px);\n}\n\n.feedback-survey-left {\n bottom: var(--spacing-6);\n left: var(--spacing-6);\n transform: translateY(10px);\n}\n\n.feedback-survey-center {\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.97);\n}\n\n/* ========================================\n CLOSE BUTTON\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: 4px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--radius-md);\n transition: all var(--transition-base);\n}\n\n.feedback-survey-close iconify-icon {\n display: block;\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/* ========================================\n TYPOGRAPHY\n ======================================== */\n\n.feedback-survey-title {\n margin: 0 0 var(--spacing-3) 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: 36px;\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-base);\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: 36px;\n}\n\n.feedback-survey-content {\n margin-bottom: var(--spacing-3);\n}\n\n/* ========================================\n PROGRESS BAR\n ======================================== */\n\n.feedback-survey-progress {\n margin-bottom: var(--spacing-4);\n}\n\n.feedback-survey-progress-track {\n height: 3px;\n background: var(--color-neutral-200);\n border-radius: var(--radius-full);\n overflow: hidden;\n}\n\n.feedback-survey-progress-fill {\n height: 100%;\n background: var(--color-primary);\n border-radius: var(--radius-full);\n transition: width 320ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* ========================================\n NPS — individual colored buttons\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 flex: 1;\n height: 40px;\n min-height: unset;\n border-radius: 6px;\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: #ffffff;\n border: 1px solid transparent;\n transition: filter var(--transition-fast), transform var(--transition-fast);\n font-family: inherit;\n}\n\n.feedback-survey-nps-btn:hover {\n filter: brightness(1.12);\n}\n\n.feedback-survey-nps-btn.selected {\n filter: brightness(0.82);\n box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.25);\n}\n\n.feedback-survey-nps-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* NPS score colors */\n.feedback-survey-nps-score-0 { background: #dc2626; border-color: #dc2626; }\n.feedback-survey-nps-score-1 { background: #ef4444; border-color: #ef4444; }\n.feedback-survey-nps-score-2 { background: #f97316; border-color: #f97316; }\n.feedback-survey-nps-score-3 { background: #fb923c; border-color: #fb923c; }\n.feedback-survey-nps-score-4 { background: #fdba74; border-color: #fdba74; }\n.feedback-survey-nps-score-5 { background: #fbbf24; border-color: #fbbf24; }\n.feedback-survey-nps-score-6 { background: #fde047; border-color: #fde047; color: #171717; }\n.feedback-survey-nps-score-7 { background: #e5e7eb; border-color: #e5e7eb; color: #374151; }\n.feedback-survey-nps-score-8 { background: #e5e7eb; border-color: #e5e7eb; color: #374151; }\n.feedback-survey-nps-score-9 { background: #4ade80; border-color: #4ade80; }\n.feedback-survey-nps-score-10 { background: #16a34a; border-color: #16a34a; }\n\n/* ========================================\n CSAT — emoji row\n ======================================== */\n\n.feedback-survey-csat {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-3);\n padding: var(--spacing-2) 0;\n}\n\n.feedback-survey-csat-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 32px;\n transition: transform var(--transition-fast), opacity var(--transition-fast);\n padding: var(--spacing-2) var(--spacing-1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--radius-lg);\n line-height: 1;\n}\n\n.feedback-survey-csat-btn:hover {\n transform: scale(1.15);\n}\n\n.feedback-survey-csat-btn.selected {\n transform: scale(1.2);\n}\n\n.feedback-survey-csat:has(.selected) .feedback-survey-csat-btn:not(.selected) {\n transform: scale(0.85);\n opacity: 0.3;\n}\n\n.feedback-survey-csat-btn:active {\n transform: scale(1.05) translateY(1px);\n transition-duration: 100ms;\n}\n\n.feedback-survey-csat-btn.selected:active {\n transform: scale(1.2) translateY(1px);\n}\n\n/* ========================================\n NUMBER RATING (segmented scale)\n ======================================== */\n\n.feedback-survey-rating-scale {\n display: flex;\n overflow: hidden;\n border: 1px solid var(--color-neutral-200);\n border-radius: 6px;\n background: var(--color-white);\n}\n\n.feedback-survey-rating-scale-btn {\n flex: 1;\n height: 40px;\n padding: 0;\n border: 0;\n border-right: 1px solid var(--color-neutral-200);\n border-radius: 0;\n background: var(--color-white);\n cursor: pointer;\n font-size: clamp(14px, 3vw, 18px);\n font-weight: var(--font-weight-medium);\n color: #374151;\n transition: background var(--transition-fast), color var(--transition-fast);\n font-family: inherit;\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-primary-light);\n color: var(--color-primary);\n}\n\n.feedback-survey-rating-scale-btn:focus-visible {\n outline: none;\n z-index: 1;\n box-shadow: inset 0 0 0 2px 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-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* ========================================\n STARS\n ======================================== */\n\n.feedback-survey-stars {\n display: flex;\n gap: var(--spacing-2);\n justify-content: center;\n}\n\n.feedback-survey-star-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n width: 40px;\n height: 40px;\n flex-shrink: 0;\n line-height: 1;\n color: var(--color-neutral-300);\n transition: color var(--transition-fast), transform var(--transition-fast);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.feedback-survey-star-btn iconify-icon {\n display: block;\n pointer-events: none;\n flex-shrink: 0;\n}\n\n.feedback-survey-star-btn.filled,\n.feedback-survey-star-btn.hovered {\n color: #f59e0b;\n}\n\n.feedback-survey-star-btn:hover {\n color: #f59e0b;\n}\n\n.feedback-survey-star-btn:active {\n transform: scale(0.9);\n transition-duration: 100ms;\n}\n\n/* ========================================\n SCALE LABELS\n ======================================== */\n\n.feedback-survey-labels {\n display: flex;\n justify-content: space-between;\n margin-top: var(--spacing-2);\n padding: 0 var(--spacing-1);\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\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: vertical;\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/* ========================================\n MULTI-PAGE TEXT INPUT\n ======================================== */\n\n.feedback-survey-page-textarea {\n width: 100%;\n min-height: 120px;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-family: inherit;\n background: var(--color-white);\n color: var(--color-text-primary);\n box-sizing: border-box;\n resize: vertical;\n outline: none;\n transition: border-color var(--transition-base);\n}\n\n.feedback-survey-page-textarea::placeholder {\n color: var(--color-text-tertiary);\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 MULTIPLE CHOICE\n ======================================== */\n\n.feedback-survey-multiple-choice {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-page-choice-btn {\n width: 100%;\n height: 40px;\n padding: 0 var(--spacing-4);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n background: var(--color-white);\n color: #374151;\n text-align: left;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n display: flex;\n align-items: center;\n justify-content: space-between;\n transition: all var(--transition-fast);\n}\n\n.feedback-survey-page-choice-btn::after {\n content: '';\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 1.5px solid #D1D5DB;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n transition: all var(--transition-fast);\n}\n\n.feedback-survey-page-choice-btn:hover {\n border-color: var(--color-primary);\n background: var(--color-primary-light);\n color: var(--color-primary);\n}\n\n.feedback-survey-page-choice-btn:hover::after {\n border-color: var(--color-primary);\n}\n\n.feedback-survey-page-choice-btn.selected {\n border-color: var(--color-primary);\n background: var(--color-primary-light);\n color: var(--color-primary-active);\n}\n\n.feedback-survey-page-choice-btn.selected::after {\n content: '✓';\n color: #ffffff;\n font-size: 11px;\n font-weight: 700;\n border-color: var(--color-primary);\n background-color: var(--color-primary);\n}\n\n.feedback-survey-page-choice-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* ========================================\n ACTIONS\n ======================================== */\n\n.feedback-survey-actions {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n margin-top: var(--spacing-4);\n}\n\n.feedback-survey-back {\n padding: 0 var(--spacing-4);\n min-height: 40px;\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-white);\n color: var(--color-text-secondary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n transition: all var(--transition-fast);\n flex: 1;\n white-space: nowrap;\n}\n\n.feedback-survey-back:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-neutral-300);\n color: var(--color-text-primary);\n}\n\n.feedback-survey-back:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* ========================================\n SUBMIT BUTTON\n ======================================== */\n\n.feedback-survey-submit {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n min-height: 40px;\n padding: 0 var(--spacing-4);\n background: var(--color-primary);\n color: #ffffff;\n border: 1px solid var(--color-primary);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n text-align: center;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-submit:hover:not(:disabled) {\n background: var(--color-primary-hover);\n border-color: var(--color-primary-hover);\n}\n\n.feedback-survey-submit:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.feedback-survey-submit:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.feedback-survey-submit iconify-icon,\n.feedback-survey-back iconify-icon {\n flex-shrink: 0;\n}\n\n/* ========================================\n ERROR\n ======================================== */\n\n.feedback-survey-error {\n margin-bottom: var(--spacing-3);\n background: #D13212;\n border-radius: var(--radius-md);\n color: #ffffff;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n padding: var(--spacing-3) var(--spacing-4);\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-error iconify-icon {\n flex-shrink: 0;\n}\n\n/* ========================================\n THANK YOU SCREEN\n ======================================== */\n\n.feedback-survey-thankyou {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: var(--spacing-6) 0;\n}\n\n.feedback-survey-thankyou-icon {\n color: #10b981;\n margin-bottom: var(--spacing-4);\n display: block;\n}\n\n.feedback-survey-thankyou-title {\n margin: 0;\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-text-primary);\n}\n\n.feedback-survey-thankyou-btn {\n margin-top: var(--spacing-5);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n height: 40px;\n padding: 0 var(--spacing-6);\n background: var(--color-primary);\n color: #ffffff;\n border: 1px solid var(--color-primary);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n text-decoration: none;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-thankyou-btn:hover {\n background: var(--color-primary-hover);\n border-color: var(--color-primary-hover);\n color: #ffffff;\n text-decoration: none;\n}\n\n/* ========================================\n DARK MODE — SELECTED STATE OVERRIDES\n ======================================== */\n\n.feedback-survey-theme-dark .feedback-survey-page-choice-btn.selected,\n.feedback-survey-theme-dark .feedback-survey-rating-scale-btn.selected,\n.feedback-survey-theme-dark .feedback-survey-nps-btn.selected {\n color: var(--color-text-primary);\n}\n\n/* ========================================\n NOTIFICATION TOASTS\n ======================================== */\n\n.product7-notification {\n position: fixed;\n top: var(--spacing-6);\n right: var(--spacing-6);\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 color: #fff;\n}\n\n.product7-notification > div {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.product7-notification svg {\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n}\n\n.product7-notification-success { background: #037F0C; }\n.product7-notification-error { background: #D13212; }\n.product7-notification-warning { background: #FF9900; color: #000; }\n.product7-notification-info { background: #0972D3; }\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n\n@media (max-width: 768px) {\n .feedback-survey {\n min-width: 288px;\n padding: var(--spacing-5);\n }\n\n .feedback-survey-nps-btn {\n font-size: var(--font-size-xs);\n }\n\n .feedback-survey-csat-btn {\n font-size: 28px;\n min-width: 40px;\n min-height: 40px;\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 font-size: clamp(13px, 5vw, 16px);\n }\n}\n\n\n.liveChat-launcher {\n position: fixed;\n z-index: var(--z-modal);\n}\n\n.liveChat-launcher-right {\n bottom: var(--liveChat-v-padding, var(--spacing-5));\n right: var(--liveChat-h-padding, var(--spacing-5));\n}\n\n.liveChat-launcher-left {\n bottom: var(--liveChat-v-padding, var(--spacing-5));\n left: var(--liveChat-h-padding, var(--spacing-5));\n}\n\n.liveChat-launcher-btn {\n width: 60px;\n height: 60px;\n border-radius: var(--radius-full);\n border: none;\n background: var(--color-primary);\n color: #ffffff;\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.liveChat-launcher-btn:hover {\n box-shadow: var(--shadow-xl);\n}\n\n.liveChat-launcher-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-launcher-badge {\n position: absolute;\n top: -3px;\n right: -3px;\n min-width: 22px;\n height: 22px;\n background: #ef4444;\n color: #ffffff;\n font-size: 11px;\n font-weight: 700;\n border-radius: var(--radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n border: 2.5px solid #ffffff;\n box-shadow: 0 2px 6px rgb(239 68 68 / 0.45);\n letter-spacing: -0.2px;\n line-height: 1;\n}\n\n.liveChat-panel {\n position: fixed;\n z-index: var(--z-popover);\n width: 400px;\n height: 720px;\n max-height: calc(100vh - 100px);\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transform: translateY(8px) scale(0.97);\n transition:\n opacity 160ms cubic-bezier(0.4, 0, 1, 1),\n transform 180ms cubic-bezier(0.4, 0, 1, 1),\n visibility 0s linear 180ms,\n width 300ms cubic-bezier(0.16, 1, 0.3, 1),\n height 300ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 300ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.liveChat-panel.open {\n opacity: 1;\n visibility: visible;\n pointer-events: auto;\n transform: translateY(0) scale(1);\n transition:\n opacity 220ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 300ms cubic-bezier(0.16, 1, 0.3, 1),\n visibility 0s linear 0s;\n}\n\n.liveChat-panel-right {\n bottom: calc(var(--liveChat-v-padding, var(--spacing-5)) + 70px);\n right: var(--liveChat-h-padding, var(--spacing-5));\n transform-origin: bottom right;\n}\n\n.liveChat-panel-left {\n bottom: calc(var(--liveChat-v-padding, var(--spacing-5)) + 70px);\n left: var(--liveChat-h-padding, var(--spacing-5));\n transform-origin: bottom left;\n}\n\n.liveChat-panel-content {\n background: var(--msg-bg);\n height: 100%;\n border-radius: var(--radius-2xl);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: var(--shadow-xl);\n border: 1px solid var(--msg-border);\n}\n\n.liveChat-panel-content *::-webkit-scrollbar {\n display: none;\n}\n\n.liveChat-panel-content * {\n scrollbar-width: none;\n}\n\n.liveChat-panel-views {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.liveChat-view {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n.liveChat-avatar-stack {\n display: flex;\n align-items: center;\n}\n\n.liveChat-avatar-stack .sdk-avatar {\n margin-left: -8px;\n}\n\n.liveChat-avatar-stack .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n.liveChat-avatar-stack-tiny .sdk-avatar {\n margin-left: -6px;\n}\n\n.liveChat-avatar-stack-tiny .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n.liveChat-mobile-close-btn {\n display: none;\n}\n\n.liveChat-panel.liveChat-panel-expanded {\n width: 720px;\n height: 88vh;\n max-height: 88vh;\n}\n\n.liveChat-chat-menu-wrapper {\n position: relative;\n}\n\n.liveChat-chat-menu-dropdown {\n position: absolute;\n top: calc(100% + 6px);\n right: 0;\n background: var(--color-white, #ffffff);\n border: 1px solid var(--color-border, #e5e7eb);\n border-radius: var(--radius-lg);\n box-shadow: 0 4px 16px rgba(0,0,0,0.12);\n min-width: 190px;\n z-index: 20;\n overflow: hidden;\n opacity: 0;\n visibility: hidden;\n transform: translateY(-4px);\n transition: opacity 140ms ease, transform 140ms ease, visibility 0s linear 140ms;\n}\n\n.liveChat-chat-menu-dropdown.open {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n transition: opacity 140ms ease, transform 140ms ease, visibility 0s linear 0s;\n}\n\n.liveChat-chat-menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--color-text-primary, #111827);\n text-align: left;\n transition: background 120ms;\n}\n\n.liveChat-chat-menu-item:hover {\n background: var(--color-neutral-50, #f9fafb);\n}\n\n.liveChat-chat-menu-item iconify-icon {\n color: var(--color-text-secondary, #6b7280);\n flex-shrink: 0;\n}\n\n@media (max-width: 480px) {\n .liveChat-mobile-close-btn {\n display: flex;\n }\n .liveChat-chat-menu-wrapper {\n display: none;\n }\n .liveChat-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 transform-origin: bottom center;\n transform: translateY(12px) scale(0.98);\n }\n\n .liveChat-panel.open {\n transform: translateY(0) scale(1);\n }\n\n .liveChat-panel-content {\n border-radius: 0;\n }\n\n .liveChat-launcher {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n\n .liveChat-launcher-left {\n left: var(--spacing-4);\n }\n}\n\n/* ========================================\n DARK THEME — token overrides only\n ======================================== */\n\n.liveChat-widget.theme-dark {\n /* Web Chat semantic tokens */\n --msg-bg: #0f1317;\n --msg-bg-surface: #1a1e24;\n --msg-bg-elevated: #232930;\n --msg-bg-hover: #232930;\n --msg-bg-input: #1a1e24;\n --msg-bg-bubble-own: #1e2330;\n --msg-bg-bubble-received: #1D4ED8;\n --msg-bg-header-gradient: linear-gradient(180deg, #1a1e2e 0%, #141720 50%, #0f1317 100%);\n --msg-bg-header-glow1: radial-gradient(circle, rgba(21, 94, 239, 0.07) 0%, transparent 70%);\n --msg-bg-header-glow2: radial-gradient(circle, rgba(139, 92, 246, 0.05) 0%, transparent 70%);\n --msg-text: #e8e8e8;\n --msg-text-secondary: #999999;\n --msg-text-tertiary: #666666;\n --msg-text-muted: #555555;\n --msg-border: #232930;\n --msg-border-bubble: #3a4255;\n --msg-shadow-card: none;\n --msg-shadow-card-hover: none;\n\n /* Override base design tokens within web chat scope */\n --color-white: #0f1317;\n --color-background: #0f1317;\n --color-surface: #1a1e24;\n --color-neutral-50: #1a1e24;\n --color-neutral-100: #1a1e24;\n --color-neutral-200: #232930;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-border: #232930;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\n --color-success-light: rgba(16, 185, 129, 0.15);\n --color-success-dark: #34d399;\n --color-error: #f87171;\n --color-error-light: rgba(239, 68, 68, 0.15);\n --color-error-dark: #fca5a5;\n}\n\n/* ========================================\n HOME VIEW\n ======================================== */\n\n.liveChat-home-view {\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-home-view::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 600px;\n height: 600px;\n background: var(--msg-bg-header-glow1);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.liveChat-home-view::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 500px;\n height: 500px;\n background: var(--msg-bg-header-glow2);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.liveChat-home-scroll {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.liveChat-home-header {\n padding: var(--spacing-6) var(--spacing-5);\n position: relative;\n z-index: 2;\n flex-shrink: 0;\n}\n\n.liveChat-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.liveChat-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.liveChat-home-logo img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n border-radius: var(--radius-lg);\n}\n\n.liveChat-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.liveChat-home-avatars:empty {\n display: none;\n}\n\n.liveChat-home-welcome {\n display: flex;\n flex-direction: column;\n text-align: left;\n position: relative;\n z-index: 2;\n}\n\n.liveChat-home-greeting {\n font-size: clamp(22px, 8vw, 34px);\n font-weight: var(--font-weight-bold);\n color: var(--msg-text);\n line-height: var(--line-height-tight);\n word-break: break-word;\n}\n\n.liveChat-home-question {\n font-size: clamp(18px, 6.5vw, 28px);\n font-weight: var(--font-weight-bold);\n color: var(--msg-text);\n line-height: var(--line-height-tight);\n word-break: break-word;\n}\n\n.liveChat-home-body {\n flex: 1;\n padding: 0 var(--spacing-5) var(--spacing-5);\n position: relative;\n z-index: 2;\n}\n\n.liveChat-home-recent-card {\n background: var(--msg-bg);\n border: 1px solid var(--msg-border);\n border-radius: 10px;\n padding: var(--spacing-3) var(--spacing-4);\n margin-bottom: var(--spacing-2);\n cursor: pointer;\n transition: background var(--transition-base);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.liveChat-home-recent-card:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-home-recent-card-label {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--msg-text-tertiary);\n margin-bottom: var(--spacing-2);\n}\n\n.liveChat-home-recent-card-row {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n}\n\n.liveChat-home-recent-avatar {\n width: 36px;\n height: 36px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\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 color: #ffffff;\n overflow: hidden;\n}\n\n.liveChat-home-recent-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.liveChat-home-recent-avatar-logo {\n background: var(--msg-bg-surface);\n border: 1px solid var(--msg-border);\n padding: 4px;\n}\n\n.liveChat-home-recent-avatar-logo img {\n object-fit: contain;\n}\n\n.liveChat-home-recent-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.liveChat-home-recent-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-2);\n margin-bottom: 2px;\n}\n\n.liveChat-home-recent-card-name {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-home-recent-card-time {\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n flex-shrink: 0;\n}\n\n.liveChat-home-recent-card-preview {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-2);\n}\n\n.liveChat-home-recent-card-message {\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-home-recent-unread-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--color-primary);\n flex-shrink: 0;\n}\n\n.liveChat-home-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-3) var(--spacing-5);\n background: var(--msg-bg-surface);\n border: 1px solid var(--msg-border);\n border-radius: 8px;\n color: var(--msg-text);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n cursor: pointer;\n transition: all var(--transition-base);\n margin-bottom: var(--spacing-2);\n font-family: inherit;\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.liveChat-home-message-btn:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-home-message-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-home-continue-btn {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-3);\n}\n\n.liveChat-home-continue-btn > svg {\n flex-shrink: 0;\n}\n\n.liveChat-home-continue-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: left;\n flex: 1;\n}\n\n.liveChat-home-continue-label {\n font-size: 0.875rem;\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-home-message-subtext {\n font-size: var(--font-size-xs);\n font-weight: 400;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-home-continue-preview {\n font-size: var(--font-size-sm);\n opacity: 0.6;\n font-weight: var(--font-weight-normal);\n}\n\n.liveChat-home-featured {\n background: var(--msg-bg);\n border-radius: var(--radius-xl);\n overflow: hidden;\n margin-bottom: var(--spacing-5);\n box-shadow: var(--msg-shadow-card);\n}\n\n.liveChat-home-featured-image {\n width: 100%;\n height: 160px;\n object-fit: cover;\n display: block;\n}\n\n.liveChat-home-featured-divider {\n height: 1px;\n background: var(--msg-border);\n}\n\n.liveChat-home-featured-content {\n padding: var(--spacing-4) var(--spacing-5);\n}\n\n.liveChat-home-featured-content 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(--msg-text);\n line-height: var(--line-height-normal);\n}\n\n.liveChat-home-featured-content p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--msg-text-tertiary);\n line-height: var(--line-height-relaxed);\n}\n\n.liveChat-home-featured-btn {\n margin-top: var(--spacing-3);\n}\n\n.liveChat-home-changelog-section {\n margin-top: var(--spacing-5);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n}\n\n.liveChat-home-changelog-card {\n background: var(--msg-bg-surface);\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n border: 1px solid var(--msg-border);\n transition: all var(--transition-base);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.liveChat-home-changelog-card:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-home-changelog-card:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-home-changelog-cover {\n width: 100%;\n height: 140px;\n overflow: hidden;\n position: relative;\n}\n\n.liveChat-home-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.liveChat-home-changelog-cover-text {\n position: absolute;\n bottom: var(--spacing-3);\n left: var(--spacing-3);\n right: var(--spacing-3);\n color: #ffffff;\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.liveChat-home-changelog-card-content {\n padding: var(--spacing-4);\n border-top: 1px solid var(--msg-border);\n}\n\n.liveChat-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(--msg-text);\n line-height: var(--line-height-snug);\n}\n\n.liveChat-home-changelog-card-desc {\n margin: 0;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-normal);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-relaxed);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.liveChat-home-availability,\n.liveChat-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(--msg-text-secondary);\n}\n\n.liveChat-availability-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n align-self: center;\n display: block;\n}\n\n.liveChat-availability-online {\n background: var(--color-success);\n box-shadow: 0 0 0 2px var(--color-success-light);\n}\n\n.liveChat-availability-away {\n background: var(--color-neutral-400);\n}\n\n.liveChat-availability-text {\n opacity: 0.9;\n}\n\n/* ========================================\n CONVERSATIONS VIEW\n ======================================== */\n\n.liveChat-conversations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-3) var(--spacing-5);\n border-bottom: 1px solid var(--msg-border);\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-conversations-header h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n text-align: center;\n flex: 1;\n}\n\n.liveChat-conversations-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.liveChat-conversations-list {\n display: flex;\n flex-direction: column;\n}\n\n.liveChat-conversation-item + .liveChat-conversation-item {\n border-top: 1px solid var(--msg-border);\n}\n\n.liveChat-conversation-item {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: 10px var(--spacing-4);\n cursor: pointer;\n transition: background var(--transition-base);\n}\n\n.liveChat-conversation-item:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-conversation-item:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-conversation-avatars {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n align-self: stretch;\n}\n\n.liveChat-conversation-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.liveChat-conversation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 2px;\n gap: var(--spacing-3);\n}\n\n.liveChat-conversation-title {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-conversation-time {\n font-size: var(--font-size-sm);\n color: var(--msg-text-tertiary);\n flex-shrink: 0;\n}\n\n.liveChat-conversation-preview {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.liveChat-conversation-message {\n font-size: var(--font-size-sm);\n font-weight: 400;\n color: var(--msg-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.4;\n}\n\n.liveChat-conversation-item.unread .liveChat-conversation-message {\n color: var(--msg-text);\n font-weight: 500;\n}\n\n.liveChat-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.liveChat-conversation-item.closed .liveChat-conversation-title,\n.liveChat-conversation-item.closed .liveChat-conversation-message {\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-conversation-resolved-badge {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--color-success-dark);\n background: var(--color-success-light);\n border-radius: var(--radius-full);\n padding: 1px 7px;\n flex-shrink: 0;\n}\n\n.liveChat-conversations-footer {\n border-top: 1px solid var(--msg-border);\n}\n\n.liveChat-new-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: 12px var(--spacing-4);\n background: transparent;\n border: none;\n color: var(--msg-text);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: background var(--transition-base);\n font-family: inherit;\n text-align: left;\n}\n\n.liveChat-new-message-btn:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-new-message-btn:active {\n transform: translateX(4px) translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-new-message-btn span {\n flex: 1;\n text-align: left;\n}\n\n/* ========================================\n HELP VIEW\n ======================================== */\n\n.liveChat-help-header {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-5) var(--spacing-3);\n border-bottom: 1px solid var(--msg-border);\n flex-shrink: 0;\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-help-header::before {\n content: '';\n position: absolute;\n top: -20px;\n left: -20px;\n width: 200px;\n height: 200px;\n background: var(--msg-bg-header-glow1);\n filter: blur(30px);\n pointer-events: none;\n}\n\n.liveChat-help-header::after {\n content: '';\n position: absolute;\n top: -10px;\n right: -20px;\n width: 150px;\n height: 150px;\n background: var(--msg-bg-header-glow2);\n filter: blur(25px);\n pointer-events: none;\n}\n\n.liveChat-help-header-top {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.liveChat-help-header-top h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-help-close-btn {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.liveChat-help-search-wrap {\n position: relative;\n width: 100%;\n}\n\n.liveChat-help-search-icon {\n position: absolute;\n left: var(--spacing-3);\n top: 50%;\n transform: translateY(-50%);\n color: var(--msg-text-tertiary);\n display: flex;\n align-items: center;\n pointer-events: none;\n}\n\n.liveChat-help-search-input {\n width: 100%;\n background: var(--msg-bg-input);\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-md);\n padding: var(--spacing-2) var(--spacing-3) var(--spacing-2) calc(var(--spacing-3) + 16px + var(--spacing-2));\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n color: var(--msg-text);\n font-family: inherit;\n outline: none;\n transition: border-color var(--transition-base), background var(--transition-base);\n box-sizing: border-box;\n}\n\n.liveChat-help-search-input:focus {\n border-color: var(--color-primary);\n background: var(--msg-bg);\n}\n\n.liveChat-help-search-input::placeholder {\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-help-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.liveChat-help-collections-header {\n display: none;\n}\n\n.liveChat-help-collections {\n padding: 0;\n}\n\n.liveChat-help-collection {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: var(--spacing-3) var(--spacing-5);\n cursor: pointer;\n transition: background var(--transition-base);\n border-bottom: 1px solid var(--msg-border);\n}\n\n.liveChat-help-collection:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-help-collection:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-help-collection-icon {\n flex-shrink: 0;\n width: 2.25rem;\n height: 2.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-help-collection-icon svg {\n width: 1.5rem;\n height: 1.5rem;\n display: block;\n flex-shrink: 0;\n}\n\n.liveChat-help-collection-icon iconify-icon {\n font-size: 1.5rem;\n width: 1em;\n height: 1em;\n display: block;\n flex-shrink: 0;\n}\n\n.liveChat-help-collection-content {\n flex: 1;\n min-width: 0;\n}\n\n.liveChat-help-collection-title {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: var(--line-height-snug);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-help-collection-desc {\n margin: 2px 0 var(--spacing-1);\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-normal);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-help-collection-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n margin-top: 2px;\n}\n\n.liveChat-help-collection-avatar {\n display: none;\n}\n\n.liveChat-help-collection-avatar--initials {\n display: none;\n line-height: 1;\n}\n\n.liveChat-help-collection-count {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-help-footer {\n padding: var(--spacing-4) var(--spacing-5);\n border-top: 1px solid var(--msg-border);\n text-align: center;\n}\n\n.liveChat-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(--msg-text);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--transition-base);\n}\n\n.liveChat-help-footer-link:hover {\n color: var(--color-primary);\n}\n\n/* ========================================\n CHANGELOG VIEW\n ======================================== */\n\n.liveChat-changelog-header {\n padding: var(--spacing-2) var(--spacing-5);\n border-bottom: 1px solid var(--msg-border);\n flex-shrink: 0;\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-changelog-header::before {\n content: '';\n position: absolute;\n top: -20px;\n left: -20px;\n width: 200px;\n height: 200px;\n background: var(--msg-bg-header-glow1);\n filter: blur(30px);\n pointer-events: none;\n}\n\n.liveChat-changelog-header::after {\n content: '';\n position: absolute;\n top: -10px;\n right: -20px;\n width: 150px;\n height: 150px;\n background: var(--msg-bg-header-glow2);\n filter: blur(25px);\n pointer-events: none;\n}\n\n.liveChat-changelog-header-top {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.liveChat-changelog-header-top h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-changelog-close-btn {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.liveChat-changelog-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.liveChat-changelog-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n padding: var(--spacing-4) var(--spacing-5);\n}\n\n.liveChat-changelog-card {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--msg-border);\n border-radius: 10px;\n overflow: hidden;\n cursor: pointer;\n transition: box-shadow var(--transition-base), transform var(--transition-base);\n}\n\n.liveChat-changelog-card:hover {\n box-shadow: var(--shadow-md);\n transform: translateY(-1px);\n}\n\n.liveChat-changelog-card:active {\n transform: translateY(0);\n transition-duration: 100ms;\n}\n\n.liveChat-changelog-content {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-1);\n padding: var(--spacing-3) var(--spacing-4);\n}\n\n.liveChat-changelog-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n flex-wrap: wrap;\n}\n\n.liveChat-changelog-date {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-changelog-tags {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-1);\n}\n\n.liveChat-changelog-tag {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--radius-full);\n font-size: 11px;\n font-weight: var(--font-weight-medium);\n line-height: 1.5;\n}\n\n.liveChat-changelog-title {\n margin: 0;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: var(--line-height-snug);\n}\n\n.liveChat-changelog-description {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-normal);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.liveChat-changelog-thumb {\n width: 100%;\n overflow: hidden;\n border-bottom: 1px solid var(--msg-border);\n}\n\n.liveChat-changelog-thumb img {\n width: 100%;\n height: 180px;\n display: block;\n object-fit: cover;\n}\n\n\n/* ========================================\n MESSAGES\n ======================================== */\n\n.liveChat-message {\n display: flex;\n gap: var(--spacing-2);\n max-width: 75%;\n}\n\n.liveChat-message-system {\n align-self: center;\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-2) 0;\n width: 100%;\n}\n\n.liveChat-message-system::before,\n.liveChat-message-system::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--msg-border);\n}\n\n.liveChat-message-system-text {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--msg-text-secondary);\n white-space: nowrap;\n padding: 0 var(--spacing-2);\n}\n\n/* Rich join/leave system event */\n.liveChat-message-system-event {\n align-self: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: var(--spacing-3) 0;\n width: 100%;\n text-align: center;\n}\n\n.liveChat-message-system-event-avatar {\n width: 3rem;\n height: 3rem;\n border-radius: var(--radius-full);\n border: 1px solid var(--msg-border);\n background: var(--msg-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.125rem;\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n overflow: hidden;\n flex-shrink: 0;\n margin-bottom: 4px;\n}\n\n.liveChat-message-system-event-avatar img {\n width: 60%;\n height: 60%;\n object-fit: contain;\n}\n\n.liveChat-message-system-event-name {\n font-size: 0.875rem;\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: 1.3;\n}\n\n.liveChat-message-system-event-action {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--msg-text-secondary);\n margin-top: -2px;\n}\n\n.liveChat-message-system-event-time {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-message-own {\n align-self: flex-end;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.liveChat-message-received {\n align-self: flex-start;\n flex-direction: column;\n}\n\n.liveChat-message-row {\n display: flex;\n align-items: flex-end;\n gap: var(--spacing-2);\n}\n\n.liveChat-message-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.liveChat-message-avatar {\n display: none;\n}\n\n.liveChat-message-sender {\n display: none;\n}\n\n.liveChat-message-bubble {\n padding: 7px 13px;\n border-radius: 1.125rem;\n word-wrap: break-word;\n max-width: 100%;\n}\n\n.liveChat-message-own .liveChat-message-bubble {\n background: var(--msg-bg-bubble-own);\n color: #111827;\n border-bottom-right-radius: 0.25rem;\n}\n\n.liveChat-message-received .liveChat-message-bubble {\n background: var(--msg-bg-bubble-received);\n color: #ffffff;\n border-bottom-left-radius: 0.25rem;\n}\n\n.liveChat-message-content {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: var(--line-height-relaxed);\n}\n\n.liveChat-message-content p {\n margin: 0 0 0.5rem;\n}\n\n.liveChat-message-content p:last-child {\n margin-bottom: 0;\n}\n\n.liveChat-message-time {\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n margin-top: 0.25rem;\n padding: 0 var(--spacing-1);\n}\n\n.liveChat-message-meta {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n margin-top: 0.25rem;\n padding: 0 var(--spacing-1);\n}\n\n.liveChat-message-meta-own {\n justify-content: flex-end;\n}\n\n.liveChat-message-sent-status {\n color: var(--msg-text-muted);\n}\n\n.liveChat-message-optimistic .liveChat-message-bubble {\n opacity: 0.7;\n}\n\n.liveChat-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.liveChat-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.liveChat-message-file:hover {\n background: var(--color-neutral-200);\n}\n\n.liveChat-file-download-icon {\n margin-left: auto;\n opacity: 0.5;\n flex-shrink: 0;\n}\n\n.liveChat-message-file:hover .liveChat-file-download-icon {\n opacity: 1;\n}\n\n.liveChat-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 SCROLL PILL & CONNECTION BANNER\n ======================================== */\n\n.liveChat-scroll-pill {\n position: absolute;\n bottom: 80px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n padding: 6px 14px;\n background: var(--color-primary);\n color: #ffffff;\n font-size: var(--font-size-xs);\n font-weight: 500;\n border-radius: var(--radius-full);\n cursor: pointer;\n box-shadow: var(--shadow-lg);\n z-index: 10;\n white-space: nowrap;\n}\n\n.liveChat-connection-banner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n padding: 6px var(--spacing-4);\n background: #fef3c7;\n color: #92400e;\n font-size: var(--font-size-xs);\n font-weight: 500;\n flex-shrink: 0;\n}\n\n.liveChat-widget.theme-dark .liveChat-connection-banner {\n background: rgba(245, 158, 11, 0.15);\n color: #fbbf24;\n}\n\n/* ========================================\n CHAT HEADER\n ======================================== */\n\n.liveChat-chat-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n border-bottom: 1px solid var(--msg-border);\n}\n\n.liveChat-chat-header-avatar {\n width: 2.25rem;\n height: 2.25rem;\n border-radius: var(--radius-lg);\n background: var(--msg-bg-surface);\n border: 1px solid var(--msg-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n padding: 4px;\n}\n\n.liveChat-chat-header-avatar img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n.liveChat-chat-header-avatar svg {\n width: 1.25rem;\n height: 1.25rem;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-chat-header-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0;\n min-width: 0;\n}\n\n.liveChat-chat-title {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: 1.4;\n}\n\n.liveChat-chat-subtitle {\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: 1.4;\n}\n\n.liveChat-chat-header-actions {\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n flex-shrink: 0;\n}\n\n.liveChat-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: var(--spacing-5) var(--spacing-4);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n}\n\n.liveChat-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.liveChat-chat-empty-avatars {\n margin-bottom: var(--spacing-4);\n}\n\n.liveChat-chat-empty-logo {\n width: 48px;\n height: 48px;\n border-radius: var(--radius-xl);\n overflow: hidden;\n margin-bottom: var(--spacing-4);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--msg-bg-surface);\n}\n\n.liveChat-chat-empty-logo img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n.liveChat-chat-empty h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n\n/* ========================================\n COMPOSE AREA\n ======================================== */\n\n/* ========================================\n EMOJI PICKER\n ======================================== */\n\n.liveChat-emoji-picker-container {\n padding: 0 var(--spacing-3) var(--spacing-2);\n}\n\n.liveChat-emoji-picker-container emoji-picker {\n width: 100%;\n height: 320px;\n border-radius: var(--radius-xl);\n border: 1px solid var(--msg-border);\n box-shadow: var(--shadow-lg);\n\n --background: var(--msg-bg);\n --border-color: var(--msg-border);\n --border-radius: 12px;\n --category-font-color: var(--msg-text-secondary);\n --category-font-size: 0.7rem;\n --emoji-size: 1.35rem;\n --emoji-padding: 0.3rem;\n --input-border-color: var(--msg-border);\n --input-border-radius: 8px;\n --input-font-color: var(--msg-text);\n --input-font-size: 0.8rem;\n --input-placeholder-color: var(--msg-text-tertiary);\n --input-padding: 0.375rem 0.625rem;\n --outline-color: var(--color-primary);\n --num-columns: 8;\n --indicator-color: var(--color-primary);\n --hover-background: var(--msg-bg-hover);\n}\n\n.liveChat-widget.theme-dark .liveChat-emoji-picker-container emoji-picker {\n --background: var(--msg-bg);\n --border-color: var(--msg-border);\n --category-font-color: var(--msg-text-secondary);\n --input-font-color: var(--msg-text);\n --input-placeholder-color: var(--msg-text-tertiary);\n --hover-background: var(--msg-bg-hover);\n}\n\n.liveChat-chat-compose {\n display: flex;\n flex-direction: column;\n padding: var(--spacing-3) var(--spacing-4);\n background: var(--msg-bg);\n margin: 0 var(--spacing-3) var(--spacing-3);\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-xl);\n}\n\n.liveChat-compose-input-wrapper {\n width: 100%;\n}\n\n.liveChat-compose-input {\n width: 100%;\n background: transparent;\n border: none;\n outline: none;\n color: var(--msg-text);\n font-size: var(--font-size-base);\n line-height: var(--line-height-relaxed);\n resize: none;\n max-height: 120px;\n font-family: inherit;\n padding: var(--spacing-1) 0;\n}\n\n.liveChat-compose-input::placeholder {\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-compose-input:focus {\n outline: none;\n}\n\n.liveChat-chat-compose:focus-within {\n border-color: var(--color-primary-border);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.liveChat-compose-bottom {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: var(--spacing-2);\n}\n\n.liveChat-compose-actions {\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n}\n\n.liveChat-compose-send {\n width: 2.25rem;\n height: 2.25rem;\n background: transparent;\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-full);\n color: var(--msg-text-secondary);\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.liveChat-compose-send:hover:not(:disabled) {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--msg-bg);\n}\n\n.liveChat-compose-send:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-compose-send:disabled {\n color: var(--color-neutral-300);\n border-color: var(--color-neutral-200);\n cursor: not-allowed;\n}\n\n.liveChat-compose-send svg {\n color: inherit;\n}\n\n.liveChat-compose-file-input {\n display: none;\n}\n\n.liveChat-compose-attach {\n width: 2rem;\n height: 2rem;\n flex-shrink: 0;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-compose-attach:hover {\n color: var(--msg-text);\n}\n\n.liveChat-compose-attach svg {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* ========================================\n TYPING INDICATOR\n ======================================== */\n\n.liveChat-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.liveChat-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.liveChat-typing-dots span {\n width: 6px;\n height: 6px;\n background: var(--color-neutral-400);\n border-radius: var(--radius-full);\n animation: liveChat-typing-bounce 1.4s infinite ease-in-out;\n}\n\n.liveChat-typing-dots span:nth-child(1) { animation-delay: -0.32s; }\n.liveChat-typing-dots span:nth-child(2) { animation-delay: -0.16s; }\n.liveChat-typing-dots span:nth-child(3) { animation-delay: 0s; }\n\n.liveChat-typing-text {\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n}\n\n/* ========================================\n NAVIGATION TABS\n ======================================== */\n\n.liveChat-panel-nav {\n border-top: 1px solid var(--msg-border);\n background: var(--msg-bg);\n}\n\n.liveChat-nav-tabs {\n display: flex;\n padding: var(--spacing-1) var(--spacing-2) 0;\n gap: var(--spacing-1);\n}\n\n.liveChat-nav-footer {\n padding: 2px var(--spacing-2) var(--spacing-2);\n text-align: center;\n}\n\n.liveChat-powered-by {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n color: var(--msg-text-tertiary);\n text-decoration: none;\n transition: color var(--transition-base);\n}\n\n.liveChat-powered-by:hover {\n color: var(--msg-text-secondary);\n}\n\n.liveChat-powered-by svg {\n width: 12px;\n height: 14px;\n}\n\n.liveChat-powered-by strong {\n font-weight: var(--font-weight-semibold);\n}\n\n.liveChat-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.liveChat-nav-tab:hover {\n background: transparent;\n}\n\n.liveChat-nav-tab:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-nav-tab:hover .liveChat-nav-icon,\n.liveChat-nav-tab:hover .liveChat-nav-label {\n color: var(--msg-text);\n}\n\n.liveChat-nav-icon {\n color: var(--msg-text-secondary);\n transition: color var(--transition-base);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n}\n\n.liveChat-nav-icon svg {\n width: 26px;\n height: 26px;\n display: block;\n}\n\n.liveChat-nav-label {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--msg-text-secondary);\n transition: color var(--transition-base);\n}\n\n.liveChat-nav-tab.active .liveChat-nav-icon,\n.liveChat-nav-tab.active .liveChat-nav-label {\n color: var(--color-primary);\n}\n\n.liveChat-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(--msg-bg);\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.liveChat-prechat-view {\n position: relative;\n}\n\n.liveChat-prechat-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.45);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n z-index: var(--z-popover);\n backdrop-filter: blur(2px);\n}\n\n.liveChat-prechat-card {\n background: var(--msg-bg);\n border-radius: var(--radius-xl);\n padding: var(--spacing-6) var(--spacing-6) var(--spacing-5);\n width: 100%;\n max-width: 320px;\n box-shadow: var(--shadow-xl);\n border: 1px solid var(--msg-border);\n text-align: center;\n}\n\n.liveChat-prechat-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 60px;\n height: 60px;\n border-radius: var(--radius-full);\n background: var(--color-primary-light);\n color: var(--color-primary);\n margin: 0 auto var(--spacing-4);\n}\n\n.liveChat-prechat-title {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-prechat-subtitle {\n margin: 0 0 var(--spacing-5);\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.liveChat-prechat-form {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2);\n}\n\n.liveChat-prechat-field {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-1);\n}\n\n.liveChat-prechat-input {\n width: 100%;\n padding: var(--spacing-2) var(--spacing-3);\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-family: inherit;\n background: var(--msg-bg-surface);\n color: var(--msg-text);\n outline: none;\n transition: border-color var(--transition-fast);\n box-sizing: border-box;\n}\n\n.liveChat-prechat-input::placeholder {\n color: var(--msg-text-secondary);\n}\n\n.liveChat-prechat-input:focus {\n border-color: var(--color-primary);\n}\n\n.liveChat-prechat-error {\n font-size: var(--font-size-xs);\n color: #dc2626;\n}\n\n.liveChat-prechat-submit {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-fast);\n border: none;\n width: 100%;\n background: var(--color-primary);\n color: #ffffff;\n margin-top: var(--spacing-1);\n}\n\n.liveChat-prechat-submit:hover {\n background: var(--color-primary-hover);\n}\n\n.liveChat-prechat-submit:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-prechat-submit:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n/* ========================================\n ATTACHMENTS\n ======================================== */\n.liveChat-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(--msg-border);\n background: var(--msg-bg);\n}\n\n.liveChat-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.liveChat-attachment-thumb {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.liveChat-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.liveChat-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.liveChat-attachment-remove:hover {\n background: var(--color-error);\n}\n\n/* ========================================\n EMAIL OVERLAY\n ======================================== */\n.liveChat-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.liveChat-email-card {\n width: 100%;\n animation: liveChat-slide-up 0.25s ease;\n}\n\n.liveChat-email-actions {\n display: flex;\n gap: var(--spacing-2);\n margin-top: var(--spacing-1);\n}\n\n/* ========================================\n EMPTY STATE\n ======================================== */\n.liveChat-empty-state {\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.liveChat-empty-state-icon {\n color: var(--msg-text-tertiary);\n margin-bottom: var(--spacing-4);\n}\n\n.liveChat-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.liveChat-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 liveChat-typing-bounce {\n 0%, 80%, 100% {\n transform: scale(0);\n }\n 40% {\n transform: scale(1);\n }\n}\n\n@keyframes liveChat-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 liveChat-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 .liveChat-prechat-overlay {\n padding: var(--spacing-4);\n }\n .liveChat-prechat-card {\n max-width: 100%;\n }\n}\n",document.head.appendChild(t),!document.querySelector("#product7-iconify")){const t=document.createElement("script");t.id="product7-iconify",t.src="https://cdn.jsdelivr.net/npm/iconify-icon@2/dist/iconify-icon.min.js",t.async=!0,document.head.appendChild(t)}}async init(){if(this.initialized)return{alreadyInitialized:!0};this._injectStyles();try{const t=await this.apiService.init(),e=t.config?{...t.config}:{};if(t.widgets){const n={...t.widgets};n.web_chat&&!n.liveChat&&(n.liveChat=n.web_chat,delete n.web_chat),e.widgets=n}Object.keys(e).length>0&&(this.config=k(e,this.config)),this.initialized=!0;const n=await this._syncConfiguredMetadataAfterInit();return this.eventBus.emit("sdk:initialized",{config:this.config,sessionToken:t.sessionToken}),{initialized:!0,config:t.config||{},sessionToken:t.sessionToken,expiresIn:t.expiresIn,identified:Boolean(n?.identified)}}catch(t){throw this.eventBus.emit("sdk:error",{error:t}),new p(`Failed to initialize SDK: ${t.message}`,t)}}createWidget(t="button",e={}){if(!this.initialized)throw new p("SDK must be initialized before creating widgets. Call init() first.");const n=t||"button",i=this._normalizeWidgetType(n),a=C("widget"),s=this._getWidgetTypeConfig(i),o=this._omitUndefined(this._normalizeWidgetOptions(i,e)),r=this._isWidgetEnabled(i,{...s,...o}),l={id:a,sdk:this,apiService:this.apiService,...this.config,...s,...o,enabled:r};try{const t=W.create(i,l);return this.widgets.set(a,t),this.eventBus.emit("widget:created",{widget:t,type:n,internalType:i}),t}catch(t){throw new p(`Failed to create widget: ${t.message}`,t)}}createFeedbackWidget(t={}){return this.createWidget("feedback",t)}createLiveChatWidget(t={}){return this.createWidget("liveChat",t)}createChangelogWidget(t={}){return this.createWidget("changelog",t)}createSurveyWidget(t={}){return this.createWidget("survey",t)}getWidget(t){return this.widgets.get(t)}async getActiveSurveys(t={}){if(!this.initialized)throw new p("SDK must be initialized before fetching surveys. Call init() first.");try{const e=((await this.apiService.getActiveSurveys(t)).data||[]).map(t=>this._normalizeSurveyConfig(t));return t.includeIneligible?e:e.filter(t=>this._isSurveyEligible(t))}catch(t){throw this.eventBus.emit("sdk:error",{error:t}),new p(`Failed to fetch active surveys: ${t.message}`,t)}}async showSurveyById(t,e={}){if(!this.initialized)throw new p("SDK must be initialized before showing surveys. Call init() first.");const{context:n={},...i}=e,a=(await this.getActiveSurveys({...n,includeEligibility:!0,includeIneligible:!0})).find(e=>e.surveyId===t||e.id===t);if(!a)throw new p(`Survey with ID '${t}' not found or not active`);return this._isSurveyEligible(a)?this.showSurvey({surveyId:a.id,surveyType:a.surveyType||a.type,title:a.title,description:a.description,lowLabel:a.lowLabel||a.low_label,highLabel:a.highLabel||a.high_label,ratingScale:a.ratingScale??a.rating_scale,showFeedbackInput:a.showFeedbackInput??a.show_feedback_input,showSubmitButton:a.showSubmitButton??a.show_submit_button,autoSubmitOnSelect:a.autoSubmitOnSelect??a.auto_submit_on_select,showTitle:a.showTitle??a.show_title,showDescription:a.showDescription??a.show_description,customQuestions:a.customQuestions||a.questions,pages:a.pages,thankYouConfig:a.thankYouConfig||a.thank_you_config||null,enabled:a.enabled,...i}):(this.eventBus.emit("survey:suppressed",{surveyId:t,reason:this._getSurveyIneligibilityReason(a),survey:a}),null)}showSurvey(t={}){if(!this.initialized)throw new p("SDK must be initialized before showing surveys. Call init() first.");if(!this._isSurveyEligible(t))return this.eventBus.emit("survey:suppressed",{surveyId:t.surveyId||t.id||null,reason:this._getSurveyIneligibilityReason(t),survey:t}),null;const e=this._normalizeSurveyConfig(t),n=this._getWidgetTypeConfig("survey"),i=this._isWidgetEnabled("survey",e);if(!i)return this.eventBus.emit("survey:suppressed",{surveyId:e.surveyId||e.id||t.id||null,reason:"disabled",survey:e}),null;const a=this.createSurveyWidget({surveyId:e.surveyId,surveyType:e.surveyType||e.type||"nps",position:e.position??n.position??this.config.position??"right",theme:e.theme??n.theme??this.config.theme??"light",title:e.title,description:e.description,lowLabel:e.lowLabel,highLabel:e.highLabel,ratingScale:e.ratingScale??e.scale,showFeedbackInput:e.showFeedbackInput,showSubmitButton:e.showSubmitButton,autoSubmitOnSelect:e.autoSubmitOnSelect,showTitle:e.showTitle,showDescription:e.showDescription,customQuestions:e.customQuestions,pages:e.pages,thankYouConfig:e.thankYouConfig,respondentId:e.respondentId,email:e.email,onSubmit:e.onSubmit,onDismiss:e.onDismiss,enabled:i});return a.mount(),a.show(),a}_isSurveyEligible(t={}){const e=this._getSurveyField(t,["shouldShow","should_show"]);if("boolean"==typeof e)return e;const n=this._getSurveyField(t.eligibility||{},["shouldShow","should_show"]);if("boolean"==typeof n)return n;const i=this._getSurveyField(t,["eligible","isEligible","is_eligible"]);if("boolean"==typeof i)return i;const a=this._getSurveyField(t,["isAnswered","is_answered"]);if("boolean"==typeof a)return!a;const s=this._getSurveyField(t.eligibility||{},["isAnswered","is_answered"]);return"boolean"!=typeof s||!s}_getSurveyIneligibilityReason(t={}){const e=this._getSurveyField(t,["reason","suppressionReason","suppression_reason"]);if(e)return e;const n=this._getSurveyField(t.eligibility||{},["reason","suppressionReason","suppression_reason"]);if(n)return n;return!0===this._getSurveyField(t,["isAnswered","is_answered"])?"already_answered":"ineligible"}_normalizeSurveyConfig(t={}){const e=Array.isArray(t.pages)&&t.pages.length>0?t.pages[0]:null,n=e&&(e.rating_config||e.ratingConfig)||{},i=t.surveyType||t.survey_type||t.type||this._inferSurveyTypeFromPage(e)||"nps";return{...t,surveyId:t.surveyId||t.survey_id||t.id||null,surveyType:t.surveyType||t.survey_type||i,type:t.type||t.survey_type||i,enabled:"boolean"==typeof t.enabled?t.enabled:void 0,should_show:t.should_show??(t.eligibility?t.eligibility.should_show:void 0),reason:t.reason||(t.eligibility?t.eligibility.reason:void 0),title:t.title||t.name||(e?e.title:null),description:t.description||(e?e.description:null),lowLabel:t.lowLabel||t.low_label||n.low_label||null,highLabel:t.highLabel||t.high_label||n.high_label||null,ratingScale:t.ratingScale??t.rating_scale??n.scale??null,showFeedbackInput:t.showFeedbackInput??t.show_feedback_input??null,showSubmitButton:t.showSubmitButton??t.show_submit_button??null,autoSubmitOnSelect:t.autoSubmitOnSelect??t.auto_submit_on_select??null,showTitle:t.showTitle??t.show_title??null,showDescription:t.showDescription??t.show_description??null,customQuestions:t.customQuestions||t.custom_questions||t.questions||[],thankYouConfig:t.thankYouConfig||t.thank_you_config||null,pages:this._normalizeSurveyPages(t.pages||[])}}_normalizeSurveyPages(t=[]){return Array.isArray(t)?t.map((t,e)=>({id:t.id||`page_${e}`,type:t.type||"rating",title:t.title||"",description:t.description||"",placeholder:t.placeholder||"",required:!0===t.required,position:t.position??e,ratingConfig:t.ratingConfig||t.rating_config||null,multipleChoiceConfig:t.multipleChoiceConfig||t.multiple_choice_config||null,linkConfig:t.linkConfig||t.link_config||null,afterThisPage:t.afterThisPage||t.after_this_page||null,thankYouConfig:t.thankYouConfig||t.thank_you_config||null})).sort((t,e)=>t.position-e.position):[]}_inferSurveyTypeFromPage(t){if(!t)return null;const e=t.rating_config||t.ratingConfig||{},n=e.scale,i=e.survey_type,a=(t.title||"").toLowerCase();if(11===n||"nps"===i)return"nps";const s=(e.low_label||"").toLowerCase();return"ces"===i||a.includes("effort")||a.includes("easy")||s.includes("difficult")?"ces":"csat"}_getSurveyField(t,e){for(const n of e)if(void 0!==t[n]&&null!==t[n])return t[n];return null}_getWidgetTypeConfig(t){const e=this._isPlainObject(this.config?.widgets)?this.config.widgets:{},n=this._getWidgetTypeAliases(t).reduce((t,n)=>k(t,k(this._isPlainObject(this.config?.[n])?this.config[n]:{},this._isPlainObject(e?.[n])?e[n]:{})),{});return this._toCamelCaseObject(n)}_getWidgetTypeAliases(t){return"button"===t?["button","feedback"]:[t]}_isWidgetEnabled(t,e={}){const n=this._getWidgetTypeConfig(t);return!1!==n.enabled&&("boolean"==typeof e.enabled?e.enabled:"boolean"!=typeof n.enabled||n.enabled)}_isPlainObject(t){return"[object Object]"===Object.prototype.toString.call(t)}_toCamelCaseKey(t){return t.replace(/_([a-z])/g,(t,e)=>e.toUpperCase())}_toCamelCaseObject(t){if(Array.isArray(t))return t.map(t=>this._toCamelCaseObject(t));if(!this._isPlainObject(t))return t;const e={};for(const[n,i]of Object.entries(t))e[this._toCamelCaseKey(n)]=this._toCamelCaseObject(i);return e}_normalizeWidgetType(t){return"feedback"===t?"button":t}_normalizeWidgetOptions(t,e={}){if(!this._isPlainObject(e))return e;const n={...e};return!0===n.headless&&void 0===n.trigger&&"survey"!==t&&(n.trigger=!1),n}_omitUndefined(t){return this._isPlainObject(t)?Object.fromEntries(Object.entries(t).filter(([,t])=>void 0!==t)):t}showChangelog(t={}){if(!this.initialized)throw new p("SDK must be initialized before showing changelog. Call init() first.");const e={position:this.config.position||"right",theme:this.config.theme||"light",title:"What's New",triggerText:"What's New",showBadge:!0,viewButtonText:"View Update",showBackdrop:!0},n=this._getWidgetTypeConfig("changelog"),i=this._omitUndefined(t),a=this._isWidgetEnabled("changelog",i);if(!a)return this.eventBus.emit("widget:suppressed",{type:"changelog",reason:"disabled"}),null;const s=this.createChangelogWidget({...e,...n,...i,enabled:a});return s.mount(),s.show(),s}async getChangelogs(t={}){if(!this.initialized)throw new p("SDK must be initialized before fetching changelogs. Call init() first.");try{return(await this.apiService.getChangelogs(t)).data||[]}catch(t){throw this.eventBus.emit("sdk:error",{error:t}),new p(`Failed to fetch changelogs: ${t.message}`,t)}}getAllWidgets(){return Array.from(this.widgets.values())}destroyWidget(t){const e=this.widgets.get(t);return!!e&&(e.destroy(),this.widgets.delete(t),this.eventBus.emit("widget:removed",{widgetId:t}),!0)}destroyAllWidgets(){for(const t of this.widgets.values())t.destroy();this.widgets.clear(),this.eventBus.emit("widgets:cleared")}updateConfig(t){const e={...this.config};this.config=this._validateAndMergeConfig(t,this.config);for(const t of this.widgets.values())t.handleConfigUpdate(this.config);this.eventBus.emit("config:updated",{oldConfig:e,newConfig:this.config})}setMetadata(t){t&&this._validateMetadata(t),this.config.metadata=t,this.apiService&&this.apiService.setMetadata(t),this.identified=!1,this.eventBus.emit("metadata:updated",{metadata:t})}getMetadata(){return this.config.metadata||(this.apiService?this.apiService.getMetadata():null)}async identify(t=this.config.metadata){if(!this.initialized)throw new p("SDK must be initialized before identifying users. Call init() first.");if(!t)throw new p("Identify requires metadata. Provide at least user_id or email.");this._validateMetadata(t),this.setMetadata(t);try{const e=await this.apiService.identify(t),n=this._extractIdentifyConfig(e);Object.keys(n).length>0&&this.updateConfig(n),this.identified=!0,this._applyIdentityToWidgets(t);const i={identified:!0,metadata:this.getMetadata(),response:e};return this.eventBus.emit("sdk:identified",i),i}catch(t){throw this.identified=!1,this.eventBus.emit("sdk:error",{error:t,phase:"identify"}),new p(`Failed to identify user: ${t.message}`,t)}}async reinitialize(t=null){return this.apiService.clearSession(),this.initialized=!1,this.identified=!1,null!==t&&this.setMetadata(t),this.init()}on(t,e){return this.eventBus.on(t,e),this}off(t,e){return this.eventBus.off(t,e),this}once(t,e){return this.eventBus.once(t,e),this}emit(t,e){return this.eventBus.emit(t,e),this}destroy(){this.destroyAllWidgets(),this.eventBus.emit("sdk:destroyed"),this.eventBus.clear(),this.apiService.clearSession(),this.initialized=!1,this.identified=!1}hasFeedbackBeenSubmitted(t=30){const e=24*t*60*60*1e3,n=Date.now();if(this.config.last_feedback_at)try{if(n-new Date(this.config.last_feedback_at).getTime()<e)return!0}catch(t){}try{const t=`feedback_submitted_${this.config.workspace}`,i=localStorage.getItem(t);if(!i)return!1;return n-JSON.parse(i).submittedAt<e}catch(t){return!1}}clearFeedbackSubmissionTracking(){try{const t=`feedback_submitted_${this.config.workspace}`;localStorage.removeItem(t),this.eventBus.emit("feedback:trackingCleared")}catch(t){console.warn("Failed to clear feedback tracking:",t)}}_detectEnvironment(){if("undefined"==typeof window)return"production";const t=window.location.hostname.toLowerCase(),e=window.location.port;return t.includes("staging")?"staging":"app.localhost"===t&&"3005"===e?"localstack":"production"}_validateAndMergeConfig(t,e={}){const n=k(k({apiUrl:null,workspace:null,metadata:null,position:"right",theme:"light",boardName:"feature-requests",autoShow:!0,debug:!1,mock:!1,env:this._detectEnvironment()},e),t);if(t.env||e.env||(n.env=this._detectEnvironment()),!n.workspace)throw new v("Missing required configuration: workspace");return n.metadata&&this._validateMetadata(n.metadata),n}_validateMetadata(t){if(!t.user_id&&!t.email)throw new v("Metadata must include at least user_id or email");const e={user_id:"string",email:"string",name:"string",custom_fields:"object",company:"object"};for(const[n,i]of Object.entries(e))if(t[n]&&typeof t[n]!==i)throw new v(`Metadata field '${n}' must be of type '${i}'`)}_bindMethods(){this.createWidget=this.createWidget.bind(this),this.createFeedbackWidget=this.createFeedbackWidget.bind(this),this.createLiveChatWidget=this.createLiveChatWidget.bind(this),this.createChangelogWidget=this.createChangelogWidget.bind(this),this.createSurveyWidget=this.createSurveyWidget.bind(this),this.destroyWidget=this.destroyWidget.bind(this),this.identify=this.identify.bind(this),this.updateConfig=this.updateConfig.bind(this)}static create(e){return new t(e)}static async createAndInit(e){const n=new t(e);return await n.init(),n}static extractMetadataFromAuth(t){return t?{user_id:t.sub||t.id||t.user_id,email:t.email,name:t.name||t.display_name||t.full_name,custom_fields:{role:t.role,plan:t.plan||t.subscription?.plan,...t.custom_fields||{}},company:t.company||t.organization?{id:t.company?.id||t.organization?.id,name:t.company?.name||t.organization?.name,monthly_spend:t.company?.monthly_spend}:void 0}:null}async _syncConfiguredMetadataAfterInit(){if(!this.config.metadata||this.apiService.identitySyncedToken===this.apiService.sessionToken)return null;try{return await this.identify(this.config.metadata)}catch(t){return this.config.debug&&console.warn("[Product7] Initial identify failed:",t),null}}_extractIdentifyConfig(t){const e=this._isPlainObject(t?.data)?t.data:t||{},n=this._isPlainObject(e.config)?e.config:{};return void 0!==e.last_feedback_at?n.last_feedback_at=e.last_feedback_at:void 0!==e.lastFeedbackAt&&(n.last_feedback_at=e.lastFeedbackAt),this._omitUndefined(n)}_applyIdentityToWidgets(t){for(const e of this.widgets.values())"function"==typeof e.applyIdentity&&e.applyIdentity(t)}};function Q(t){return Object.keys(t).forEach(e=>{void 0===t[e]&&delete t[e]}),t}async function Y(t){if(G._sdk&&t.organization&&G._sdk.config.workspace!==t.organization&&G.destroy(),G._sdk)return G._sdk;if(t.organization){const e=Q({workspace:t.organization,debug:t.debug,mock:t.mock,env:t.env,apiUrl:t.apiUrl}),n=new R(e);return await n.init(),G._sdk=n,G._organization=t.organization,n}return null}const G={_sdk:null,_identified:!1,_organization:null,_q:[],_feedbackWidget:null,_LiveChatWidget:null,_surveyWidget:null,version:"1.0.0",async identify(t={},e){try{const n=function(t){const{organization:e,email:n,name:i,userId:a,profilePicture:s,locale:o,companies:r,...l}=t,c={user_id:a,email:n,name:i,profile_picture:s},d=["organization","email","name","userId","profilePicture","locale","companies","debug","mock","env","apiUrl"],h={};for(const[t,e]of Object.entries(l))d.includes(t)||(h[t]=e);if(Object.keys(h).length>0&&(c.custom_fields=h),Array.isArray(r)&&r.length>0){const t=r[0];c.company={id:t.id,name:t.name,monthly_spend:t.monthlySpend,custom_fields:{}};const e=["id","name","monthlySpend","createdAt"];for(const[n,i]of Object.entries(t))e.includes(n)||(c.company.custom_fields[n]=i)}return{workspace:e,metadata:c,locale:o,debug:t.debug,mock:t.mock,env:t.env,apiUrl:t.apiUrl}}(t);G._organization=n.workspace||G._organization||null;const i=Q({workspace:G._organization,debug:n.debug,mock:n.mock,env:n.env,apiUrl:n.apiUrl});let a=G._sdk;(!a||i.workspace&&a.config.workspace!==i.workspace)&&(G._sdk&&(G.destroy(),G._organization=i.workspace||null),a=new R(i),G._sdk=a);const s=a.initialized?{alreadyInitialized:!0,sessionToken:a.apiService?.sessionToken}:await a.init(),o=function(t={}){return Object.values(t).some(t=>void 0!==t)}(n.metadata)?await a.identify(n.metadata):null;return G._identified=Boolean(o?.identified),G._flushQueue(),"undefined"!=typeof window&&"undefined"!=typeof CustomEvent&&window.dispatchEvent(new CustomEvent("Product7Ready",{detail:{sdk:a,config:a.config,initData:s,identifyData:o}})),"function"==typeof e&&e(null),{...s,identified:G._identified,identify:o}}catch(t){throw console.error("[Product7] Identify failed:",t),"undefined"!=typeof window&&"undefined"!=typeof CustomEvent&&window.dispatchEvent(new CustomEvent("Product7Error",{detail:{error:t,phase:"identify"}})),"function"==typeof e&&e(t),t}},async feedback(t={},e){const n=await Y(t);if(!n)return G._q.push(["feedback",t,e]),null;const i=Q({displayMode:t.displayMode||"panel",theme:t.theme||n.config.theme||"light",size:t.size||"medium",primaryColor:t.primaryColor,backgroundColor:t.backgroundColor,textColor:t.textColor,suppressAfterSubmission:t.suppressAfterSubmission,suppressionDays:t.suppressionDays,showBackdrop:!1!==t.showBackdrop,metadata:t.metadata});"right"===t.placement?i.position="right":"left"===t.placement?i.position="left":t.placement&&(i.position=t.placement),t.defaultBoard&&(i.boardName=t.defaultBoard),t.placement?(i.suppressAfterSubmission=!1,i.enabled=!0):(i.autoShow=!1,i.displayMode="modal",i.headless=!0);try{const a=n.createFeedbackWidget(i);return a.mount(),t.placement?a.show():a.hide(),G._feedbackWidget=a,"function"==typeof e&&(e({action:"widgetReady"}),n.eventBus.on("feedback:submitted",t=>{e({action:"feedbackSubmitted",post:t.feedback})}),n.eventBus.on("feedback:error",t=>{e({action:"feedbackError",error:t.error})})),G._setupAttributeTriggers(),G._setupPostMessageListener(),a}catch(t){return console.error("[Product7] Failed to initialize feedback widget:",t),"function"==typeof e&&e({action:"error",error:t}),null}},openFeedback(t={}){G._feedbackWidget&&(t.setBoard&&(G._feedbackWidget.options.boardName=t.setBoard),G._feedbackWidget.open())},closeFeedback(){G._feedbackWidget&&G._feedbackWidget.close()},destroyFeedback(){G._feedbackWidget&&(G._feedbackWidget.destroy(),G._feedbackWidget=null)},async liveChat(t={},e){const n=await Y(t);if(!n)return G._q.push(["liveChat",t,e]),null;const i=Q({theme:t.theme||n.config.theme||"light",primaryColor:t.primaryColor,backgroundColor:t.backgroundColor,textColor:t.textColor,logoUrl:t.logoUrl,teamName:t.teamName,teamAvatars:t.teamAvatars,greetingMessage:t.greetingMessage,welcomeMessage:t.welcomeMessage,enableHelp:t.enableHelp,enableChangelog:t.enableChangelog,enableNews:t.enableNews,autoLoadData:t.autoLoadData,initialView:t.initialView,featuredContent:t.featuredContent,feedbackUrl:t.feedbackUrl,changelogUrl:t.changelogUrl,helpUrl:t.helpUrl,roadmapUrl:t.roadmapUrl,previewData:t.previewData});"right"===t.placement?i.position="right":"left"===t.placement?i.position="left":t.placement&&(i.position=t.placement),i.suppressAfterSubmission=!1,i.enabled=!0;try{const t=n.createLiveChatWidget(i);return t.mount(),t.show(),G._LiveChatWidget=t,"function"==typeof e&&(e({action:"widgetReady"}),n.eventBus.on("liveChat:messageSent",t=>{e({action:"messageSent",message:t})}),n.eventBus.on("liveChat:opened",()=>{e({action:"liveChatOpened"})}),n.eventBus.on("liveChat:closed",()=>{e({action:"liveChatClosed"})})),G._setupLiveChatAttributeTriggers(),G._setupPostMessageListener(),t}catch(t){return console.error("[Product7] Failed to initialize web chat widget:",t),"function"==typeof e&&e({action:"error",error:t}),null}},openLiveChat(){G._LiveChatWidget&&(G._LiveChatWidget.open?.()||G._LiveChatWidget.openPanel?.())},closeLiveChat(){G._LiveChatWidget&&(G._LiveChatWidget.close?.()||G._LiveChatWidget.closePanel?.())},destroyLiveChat(){G._LiveChatWidget&&(G._LiveChatWidget.destroy(),G._LiveChatWidget=null)},async survey(t={},e){const n=await Y(t);if(!n)return G._q.push(["survey",t,e]),null;let i="right";"right"===t.placement?i="right":"left"===t.placement?i="left":"center"===t.placement?i="center":"bottom"===t.placement?i="bottom":t.placement&&(i=t.placement);const a=t.displayMode||"popover";"modal"!==a&&"fullscreen"!==a||(i="center");const s={onSubmit:t=>{"function"==typeof e&&e({action:"surveySubmitted",response:t})},onDismiss:()=>{"function"==typeof e&&e({action:"surveyDismissed"})}};"function"==typeof e&&(n.eventBus.on("survey:shown",t=>{e({action:"surveyShown",survey:t})}),n.eventBus.on("survey:questionAnswered",t=>{e({action:"questionAnswered",pageId:t.pageId,pageType:t.pageType,answer:t.answer})}),n.eventBus.on("survey:closed",()=>{e({action:"surveyClosed"})}));const o=t.displayMethod||"immediate",r=async()=>{try{let o;if(t.surveyId){const e={position:i,displayMode:a,theme:t.theme||n.config.theme||"light",showBackdrop:"modal"===a||"fullscreen"===a,...s};t.force&&(e.context={includeIneligible:!0}),o=await n.showSurveyById(t.surveyId,e)}else{const r=t.force?{includeIneligible:!0}:{},l=await n.getActiveSurveys(r);if(0===l.length)return"function"==typeof e&&e({action:"noSurveys"}),null;const c=l[0];o=n.showSurvey({surveyId:c.surveyId||c.id,surveyType:c.surveyType||c.type||"nps",position:i,displayMode:a,theme:t.theme||n.config.theme||"light",showBackdrop:"modal"===a||"fullscreen"===a,title:c.title,description:c.description,lowLabel:c.lowLabel,highLabel:c.highLabel,ratingScale:c.ratingScale,showFeedbackInput:c.showFeedbackInput,showSubmitButton:c.showSubmitButton,autoSubmitOnSelect:c.autoSubmitOnSelect,showTitle:c.showTitle,showDescription:c.showDescription,customQuestions:c.customQuestions,pages:c.pages,enabled:!!t.force||c.enabled,...s}),"function"==typeof e&&e({action:"surveyReady",survey:c})}return G._surveyWidget=o,o}catch(t){return console.error("[Product7] Failed to show survey:",t),"function"==typeof e&&e({action:"error",error:t}),null}};if("delayed"===o){const n=t.displayDelay||5e3;return G._surveyTimer=setTimeout(r,n),"function"==typeof e&&e({action:"surveyScheduled",delay:n}),null}if("exitIntent"===o){const t=e=>{e.clientY<=0&&(document.removeEventListener("mouseout",t),G._exitIntentHandler=null,r())};return G._exitIntentHandler=t,document.addEventListener("mouseout",t),"function"==typeof e&&e({action:"surveyScheduled",trigger:"exitIntent"}),null}if("onScroll"===o){const n=t.scrollPercentage||50,i=()=>{window.scrollY/(document.body.scrollHeight-window.innerHeight)*100>=n&&(window.removeEventListener("scroll",i),G._scrollHandler=null,r())};return G._scrollHandler=i,window.addEventListener("scroll",i,{passive:!0}),"function"==typeof e&&e({action:"surveyScheduled",trigger:"onScroll",scrollPercentage:n}),null}return r()},closeSurvey(){G._surveyWidget&&(G._surveyWidget.hide?.()||G._surveyWidget.closePanel?.())},destroySurvey(){G._surveyTimer&&(clearTimeout(G._surveyTimer),G._surveyTimer=null),G._exitIntentHandler&&(document.removeEventListener("mouseout",G._exitIntentHandler),G._exitIntentHandler=null),G._scrollHandler&&(window.removeEventListener("scroll",G._scrollHandler),G._scrollHandler=null),G._surveyWidget&&(G._surveyWidget.destroy(),G._surveyWidget=null)},async track(t,e={}){if(!G._sdk)return G._q.push(["track",t,e]),null;const n=G._sdk;if(!n.apiService?.sessionToken)return null;try{const i=await n.apiService._makeRequest("/widget/track",{method:"POST",body:JSON.stringify({event:t,properties:e,timestamp:(new Date).toISOString()}),headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.apiService.sessionToken}`}});return i?.survey&&G.survey({surveyId:i.survey.id||i.survey.survey_id,force:!0}),i}catch(t){return n.config.debug&&console.warn("[Product7] Track failed:",t),null}},getInstance:()=>G._sdk,isReady:()=>Boolean(G._sdk?.initialized),onReady(t){"undefined"!=typeof window&&(G.isReady()?t(G._sdk):window.addEventListener("Product7Ready",e=>t(e.detail.sdk,e.detail),{once:!0}))},onError(t){"undefined"!=typeof window&&window.addEventListener("Product7Error",e=>{t(e.detail.error,e.detail)})},destroy(){G.destroyFeedback(),G.destroyLiveChat(),G.destroySurvey(),G._sdk&&(G._sdk.destroy(),G._sdk=null),G._identified=!1,G._organization=null,G._q=[],G._feedbackListenerAttached=!1,G._liveChatListenerAttached=!1,G._postMessageListenerAttached=!1},_flushQueue(){const t=G._q.splice(0);for(const[e,...n]of t)"function"==typeof G[e]&&G[e](...n)},_setupAttributeTriggers(){"undefined"!=typeof document&&(G._feedbackListenerAttached||(G._feedbackListenerAttached=!0,document.addEventListener("click",t=>{t.target.closest("[data-product7-feedback]")&&(t.preventDefault(),G.openFeedback())})))},_setupLiveChatAttributeTriggers(){"undefined"!=typeof document&&(G._liveChatListenerAttached||(G._liveChatListenerAttached=!0,document.addEventListener("click",t=>{t.target.closest("[data-product7-liveChat]")&&(t.preventDefault(),G.openLiveChat())})))},_setupPostMessageListener(){"undefined"!=typeof window&&(G._postMessageListenerAttached||(G._postMessageListenerAttached=!0,window.addEventListener("message",t=>{if("Product7Widget"!==t.data?.target)return;const{action:e,setBoard:n}=t.data.data||{};switch(e){case"openFeedback":G.openFeedback({setBoard:n});break;case"closeFeedback":G.closeFeedback();break;case"openLiveChat":G.openLiveChat();break;case"closeLiveChat":G.closeLiveChat();break;case"closeSurvey":G.closeSurvey()}})))},Product7SDK:R,BaseWidget:q,ButtonWidget:S,ChangelogWidget:A,TabWidget:U,InlineWidget:E,SurveyWidget:H,LiveChatWidget:$,WidgetFactory:W,EventBus:w,APIService:y,SDKError:p,APIError:g,WidgetError:u,ConfigError:v,ValidationError:m,helpers:_};if("undefined"!=typeof window){const t=window.Product7?._q||[];window.Product7=G;for(const[e,...n]of t)"function"==typeof G[e]&&G[e](...n)}t.APIError=g,t.APIService=y,t.BaseWidget=q,t.ButtonWidget=S,t.ChangelogWidget=A,t.ConfigError=v,t.EventBus=w,t.InlineWidget=E,t.LiveChatWidget=$,t.Product7=R,t.SDKError=p,t.SurveyWidget=H,t.TabWidget=U,t.ValidationError=m,t.WidgetError=u,t.WidgetFactory=W,t.default=G,t.helpers=_,Object.defineProperty(t,"__esModule",{value:!0})});
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Product7={})}(this,function(t){"use strict";const e=[{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}}],i={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()}]},a=[{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:"#"}],s=[{id:"mock_nps_survey",name:"NPS Score",slug:"nps",status:"active",trigger_type:"manual",pages:[{id:"nps-page-1",type:"rating",title:"How likely are you to recommend us to a friend?",description:"",placeholder:"",rating_config:{scale:11,low_label:"Very unlikely",high_label:"Very likely",survey_type:"nps"},multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_csat_survey",name:"CSAT Survey",slug:"csat",status:"active",trigger_type:"manual",pages:[{id:"csat-page-1",type:"rating",title:"How satisfied are you with our service?",description:"",placeholder:"",rating_config:{scale:5,low_label:"Very dissatisfied",high_label:"Very satisfied",survey_type:"emoji"},multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_ces_survey",name:"Customer Effort Score",slug:"ces",status:"active",trigger_type:"manual",pages:[{id:"ces-page-1",type:"rating",title:"How easy was it to use our product?",description:"",placeholder:"",rating_config:{scale:5,low_label:"Very difficult",high_label:"Very easy",survey_type:"ces"},multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_open_question_survey",name:"Open Question",slug:"open-question",status:"active",trigger_type:"manual",pages:[{id:"open-page-1",type:"text",title:"What could we do better?",description:"Is there anything we could do to make our product better for you?",placeholder:"Type your answer here",rating_config:null,multiple_choice_config:null,link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_product_idea_poll_survey",name:"Product Idea Poll",slug:"product-idea-poll",status:"active",trigger_type:"manual",pages:[{id:"poll-page-1",type:"multiple_choice",title:"Which feature should we add next?",description:"Vote on the feature you would like to see next.",placeholder:"",rating_config:null,multiple_choice_config:{allow_multiple_selection:!1,survey_type:"regular",options:[{id:"opt1",label:"Better reporting"},{id:"opt2",label:"Mobile app"},{id:"opt3",label:"Integrations"},{id:"opt4",label:"AI features"}]},link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_pmf_survey",name:"Product Market Fit (PMF)",slug:"pmf",status:"active",trigger_type:"manual",pages:[{id:"pmf-page-1",type:"multiple_choice",title:"How would you feel if you could no longer use our product?",description:"",placeholder:"",rating_config:null,multiple_choice_config:{allow_multiple_selection:!1,survey_type:"regular",options:[{id:"very_disappointed",label:"Very disappointed"},{id:"somewhat_disappointed",label:"Somewhat disappointed"},{id:"not_disappointed",label:"Not disappointed"}]},link_config:null,after_this_page:{default:"end_survey",conditions:[]},required:!0}]},{id:"mock_user_interview_survey",name:"User Interview Request",slug:"user-interview",status:"active",trigger_type:"manual",pages:[{id:"interview-page-1",type:"link",title:"Would you like to hop on a quick demo?",description:"We would love to hear your thoughts and answer any questions you have.",placeholder:"",rating_config:null,multiple_choice_config:null,link_config:{button_text:"Book a demo",link_text:"",redirect_url:"https://example.com",open_in:"new_tab"},after_this_page:{default:"end_survey",conditions:[]},required:!0}]}],o=t=>new Promise(e=>setTimeout(e,t));function r(){if("undefined"==typeof navigator)return{device:null,browser:null,os:null};const t=navigator.userAgent;let e="desktop";/Mobi|Android/i.test(t)&&(e=/Tablet|iPad/i.test(t)?"tablet":"mobile");let n="unknown";t.includes("Firefox")?n="firefox":t.includes("Edg")?n="edge":t.includes("Chrome")?n="chrome":t.includes("Safari")?n="safari":(t.includes("Opera")||t.includes("OPR"))&&(n="opera");let i="unknown";return t.includes("Windows")?i="windows":t.includes("Mac")?i="macos":t.includes("Linux")?i="linux":t.includes("Android")?i="android":(t.includes("iPhone")||t.includes("iPad"))&&(i="ios"),{device:e,browser:n,os:i}}class l{constructor(t){this.api=t}async getChangelogs(t={}){return await this.api._ensureSession(),this.api.mock?(await o(300),{success:!0,data:e}):this.api._handleAuthRetry(async()=>{const e=this.api._getEndpointWithParams("/widget/changelogs",t);return await this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}}class c{constructor(t){this.api=t}async submitFeedback(t){if(await this.api._ensureSession(),this.api.mock)return await o(500),{success:!0,data:{id:"mock_post_"+Date.now(),title:t.title,content:t.content},message:"Feedback submitted successfully!"};const e=this.api.getContactIdentity(),n={board:t.board_id||t.board||t.boardName,title:t.title,content:t.content,attachments:t.attachments||[],...e?.contactId&&{contact_id:e.contactId,contact_email:e.contactEmail,contact_name:e.contactName}};return this.api._handleAuthRetry(async()=>await this.api._makeRequest("/widget/feedback",{method:"POST",body:JSON.stringify(n),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}}class d{constructor(t){this.api=t}async getHelpCollections(t={}){if(await this.api._ensureSession(),this.api.mock)return await o(200),{status:!0,data:a};const e=this.api._getEndpointWithParams("/widget/help/collections",t);return this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async searchHelpArticles(t,e={}){if(await this.api._ensureSession(),this.api.mock){await o(200);return{status:!0,data:a.filter(e=>e.title.toLowerCase().includes(t.toLowerCase())||e.description.toLowerCase().includes(t.toLowerCase()))}}const n={q:t,...e},i=this.api._getEndpointWithParams("/widget/help/search",n);return this.api._makeRequest(i,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}}class h{constructor(t){this.api=t}async getLiveChatSettings(){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/livechat/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",available_agents:[{full_name:"Sarah",picture:""},{full_name:"Tom",picture:""}]}}:this.api._makeRequest("/widget/livechat/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversations(t={}){if(await this.api._ensureSession(),this.api.mock)return await o(300),{status:!0,data:n,meta:{total:n.length,page:1,limit:20}};const e=this.api._getEndpointWithParams("/widget/livechat/conversations",t);return this.api._makeRequest(e,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getConversation(t){if(await this.api._ensureSession(),this.api.mock){await o(200);return{status:!0,data:{...n.find(e=>e.id===t),messages:i[t]||[]}}}return this.api._makeRequest(`/widget/livechat/conversations/${t}`,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async startConversation(t){if(await this.api._ensureSession(),this.api.mock){await o(300);const e={id:"conv_"+Date.now(),subject:t.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:t.message,sender_type:"customer",created_at:(new Date).toISOString(),attachments:t.attachments||[]}]};return n.unshift(e),i[e.id]=e.messages,{status:!0,data:e}}return this.api._makeRequest("/widget/livechat/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({message:t.message,subject:t.subject||"",attachments:t.attachments||[]})})}async sendMessage(t,e){if(await this.api._ensureSession(),this.api.mock){await o(200);const n={id:"msg_"+Date.now(),content:e.content,sender_type:"customer",created_at:(new Date).toISOString(),attachments:e.attachments||[]};return i[t]||(i[t]=[]),i[t].push(n),{status:!0,data:n}}return this.api._makeRequest(`/widget/livechat/conversations/${t}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({content:e.content,attachments:e.attachments||[]})})}async getUnreadCount(){if(await this.api._ensureSession(),this.api.mock){const t=n.reduce((t,e)=>t+(e.unread||0),0);return{status:!0,data:{unread_count:t,unread_conversations:t>0?1:0}}}return this.api._makeRequest("/widget/livechat/unread",{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async markConversationAsRead(t){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/livechat/conversations/${t}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async getMessages(t,e={}){if(await this.api._ensureSession(),this.api.mock)return await o(200),{status:!0,data:i[t]||[],meta:{total:0,page:1,limit:50}};const n={...e},a=this.api._getEndpointWithParams(`/widget/livechat/conversations/${t}/messages`,n);return this.api._makeRequest(a,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})}async uploadFile(t,e){return await this.api._ensureSession(),this.api.mock?(await o(300),{status:!0,url:`https://mock-cdn.example.com/${e}`}):this.api._makeRequest("/widget/livechat/upload",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({file:t,filename:e})})}async identifyContact(t){return this.api.identify(t)}async submitRating(t,e){return await this.api._ensureSession(),this.api.mock?{status:!0,data:{rated:!0}}:this.api._makeRequest(`/widget/livechat/conversations/${t}/rating`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify(e)})}async sendTypingIndicator(t,e){return await this.api._ensureSession(),this.api.mock?{status:!0}:this.api._makeRequest(`/widget/livechat/conversations/${t}/typing`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`},body:JSON.stringify({is_typing:e})})}}class p extends Error{constructor(t,e){super(t),this.name="SDKError",this.cause=e,Error.captureStackTrace&&Error.captureStackTrace(this,p)}}class g extends Error{constructor(t,e,n){super(e),this.name="APIError",this.status=t,this.response=n,Error.captureStackTrace&&Error.captureStackTrace(this,g)}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(t,e,n){super(t),this.name="WidgetError",this.widgetType=e,this.widgetId=n,Error.captureStackTrace&&Error.captureStackTrace(this,u)}}class v extends Error{constructor(t,e){super(t),this.name="ConfigError",this.configKey=e,Error.captureStackTrace&&Error.captureStackTrace(this,v)}}class m extends Error{constructor(t,e,n){super(t),this.name="ValidationError",this.field=e,this.value=n,Error.captureStackTrace&&Error.captureStackTrace(this,m)}}class f{constructor(t){this.api=t}async getActiveSurveys(t={}){if(await this.api._ensureSession(),this.api.mock)return await o(200),{success:!0,data:s};const e=this._getRespondentContext(t),n={url:t.url||("undefined"!=typeof window?window.location.href:""),...r(),...e.respondent_id&&{respondent_id:e.respondent_id},...e.email&&{email:e.email},...void 0!==t.includeEligibility&&{include_eligibility:t.includeEligibility},...t.userProperties&&{user_properties:t.userProperties}};return this.api._handleAuthRetry(async()=>{const t=this.api._getEndpointWithParams("/widget/surveys/active",n);return await this.api._makeRequest(t,{method:"GET",headers:{Authorization:`Bearer ${this.api.sessionToken}`}})})}_getRespondentContext(t={}){const e="function"==typeof this.api.getMetadata&&this.api.getMetadata()||{};return{respondent_id:t.respondentId||t.userId||e.user_id||null,email:t.email||e.email||null}}async submitSurveyResponse(t,e){if(!t)throw new g(400,"Survey ID is required");if(await this.api._ensureSession(),this.api.mock)return await o(300),{success:!0,data:{id:"mock_response_"+Date.now(),survey_id:t,...e},message:"Survey response submitted successfully!"};const n=this._getRespondentContext(e),i=this.api.getContactIdentity?.()||null,a={answers:Array.isArray(e.answers)?e.answers:[],...e.feedback&&{feedback:e.feedback},...n.respondent_id&&{respondent_id:n.respondent_id},...n.email&&{email:n.email},...i?.contactId&&{contact_id:i.contactId,contact_email:i.contactEmail,contact_name:i.contactName}};return this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${t}/responses`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.api.sessionToken}`}}))}async dismissSurvey(t){if(!t)throw new g(400,"Survey ID is required");return await this.api._ensureSession(),this.api.mock?(await o(100),{success:!0,message:"Survey dismissed successfully"}):this.api._handleAuthRetry(async()=>await this.api._makeRequest(`/widget/surveys/${t}/dismiss`,{method:"POST",headers:{Authorization:`Bearer ${this.api.sessionToken}`}}))}}class b{constructor(t={}){this.workspace=t.workspace,this.sessionToken=null,this.sessionExpiry=null,this.metadata=t.metadata||null,this.identitySyncedToken=null,this.mock=t.mock||!1,this.env=t.env||"production",this.baseURL=this._getBaseURL(t),this._loadStoredSession(),this._loadStoredMetadata(),this.isSessionValid()&&this.metadata&&(this.identitySyncedToken=this.sessionToken)}_getBaseURL(t){if(t.apiUrl)return t.apiUrl;const e={production:{base:"https://api.product7.io/api/v1",withWorkspace:t=>`https://${t}.api.product7.io/api/v1`},staging:{base:"https://staging.api.product7.io/api/v1",withWorkspace:t=>`https://${t}.staging.api.product7.io/api/v1`},localstack:{base:"http://localhost:1323/api/v1",withWorkspace:t=>`http://${t}.localhost:1323/api/v1`}};let n=this.env;if(!n||"production"===n){const t="undefined"!=typeof window&&window.location?.hostname||"",e="undefined"!=typeof window&&window.location?.port||"";t.includes("staging")?n="staging":"app.localhost"===t&&"3005"===e&&(n="localstack")}const i=e[n]||e.production;return this.workspace?i.withWorkspace(this.workspace):i.base}async init(t=void 0){if(void 0!==t&&this.setMetadata(t),this.isSessionValid())return{sessionToken:this.sessionToken};if(!this.workspace)throw new g(400,"Missing 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.identitySyncedToken=null,this._storeSession(),{sessionToken:this.sessionToken,config:{primaryColor:"#21244A",backgroundColor:"#ffffff",textColor:"#1F2937",boardName:"feature-requests",size:"medium",displayMode:"modal"},expiresIn:3600}}async _initRealSession(){const t={workspace:this.workspace};try{const e=await this._makeRequest("/widget/init",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}}),n=this._extractInitResponseData(e);return this.sessionToken=n.sessionToken,this.sessionExpiry=new Date(Date.now()+1e3*n.expiresIn),this.identitySyncedToken=null,this._storeSession(),{sessionToken:this.sessionToken,config:n.config,widgets:n.widgets,expiresIn:n.expiresIn,status:n.status,message:n.message,configVersion:n.configVersion}}catch(t){throw new g(t.status||500,`Failed to initialize widget: ${t.message}`,t.response)}}_extractInitResponseData(t){const e=t&&"object"==typeof t.data?t.data:t||{},n=e.config&&"object"==typeof e.config?e.config:{},i=e.session_token||e.sessionToken||n.session_token||n.sessionToken,a=Number(e.expires_in??e.expiresIn??n.expires_in??n.expiresIn);if(!i)throw new g(500,"Invalid init response: missing session_token");if(!Number.isFinite(a)||a<=0)throw new g(500,"Invalid init response: missing expires_in");return{sessionToken:i,expiresIn:a,config:n,widgets:e.widgets&&"object"==typeof e.widgets?e.widgets:null,configVersion:n.config_version??n.configVersion??e.config_version??e.configVersion??null,status:t?.status??e?.status??!0,message:t?.message??e?.message??null}}async _ensureSession(){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new g(401,"No valid session token available")}async _handleAuthRetry(t,...e){try{return await t.apply(this,e)}catch(n){if(401===n.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),await this._restoreIdentity(),await t.apply(this,e);throw n}}async identify(t=this.metadata){if(void 0!==t&&this.setMetadata(t),!this.metadata)throw new g(400,"Missing user context for identify");await this._ensureSession();const e=this._buildIdentifyPayload(this.metadata);if(this.mock)return this.identitySyncedToken=this.sessionToken,{status:!0,identified:!0,data:{user_id:e.user_id||null,email:e.email||null,name:e.name||null}};const n=await this._makeRequest("/widget/identify",{method:"POST",body:JSON.stringify(e),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`}});return this.identitySyncedToken=this.sessionToken,n}isSessionValid(){return this.sessionToken&&this.sessionExpiry&&new Date<this.sessionExpiry}setMetadata(t){this.metadata=t||null,this.identitySyncedToken=null,this.metadata?this._storeData("product7_metadata",this.metadata):this._removeData("product7_metadata")}getMetadata(){return this.metadata}clearSession(){this.sessionToken=null,this.sessionExpiry=null,this.identitySyncedToken=null,this.contactId=null,this.contactEmail=null,this.contactName=null,this._removeData("product7_session"),this._removeData("product7_metadata"),this._removeData("product7_contact")}_storeSession(){if("undefined"!=typeof localStorage)try{const t={token:this.sessionToken,expiry:this.sessionExpiry.toISOString(),workspace:this.workspace};this._storeData("product7_session",t)}catch(t){}}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const t=localStorage.getItem("product7_session");if(!t)return!1;const e=JSON.parse(t);return(e.token&&e.token.startsWith("mock_"))!==this.mock||this.workspace&&e.workspace&&e.workspace!==this.workspace?(localStorage.removeItem("product7_session"),!1):(this.sessionToken=e.token,this.sessionExpiry=new Date(e.expiry),this.isSessionValid())}catch(t){return!1}}_loadStoredMetadata(){if(this.metadata||"undefined"==typeof localStorage)return!1;try{const t=localStorage.getItem("product7_session");if(t){const e=JSON.parse(t);if(this.workspace&&e.workspace&&e.workspace!==this.workspace)return!1}const e=localStorage.getItem("product7_metadata");return!!e&&(this.metadata=JSON.parse(e),!0)}catch(t){return!1}}_storeData(t,e){"undefined"!=typeof localStorage&&localStorage.setItem(t,JSON.stringify(e))}_removeData(t){"undefined"!=typeof localStorage&&localStorage.removeItem(t)}async _makeRequest(t,e={}){const n=`${this.baseURL}${t}`;try{const t=await fetch(n,e);if(!t.ok){let e=`HTTP ${t.status}`,n=null;try{n=await t.json(),e=n.message||n.error||e}catch(n){e=await t.text()||e}throw new g(t.status,e,n)}const i=t.headers.get("content-type");return i&&i.includes("application/json")?await t.json():await t.text()}catch(t){if(t instanceof g)throw t;throw new g(0,t.message,null)}}_buildQueryParams(t){const e=new URLSearchParams;return Object.entries(t).forEach(([t,n])=>{null!=n&&e.append(t,"object"==typeof n?JSON.stringify(n):n)}),e.toString()}_getEndpointWithParams(t,e){const n=this._buildQueryParams(e);return`${t}${n?"?"+n:""}`}_buildIdentifyPayload(t={}){const e={user_id:t.user_id,email:t.email,name:t.name,avatar:t.profile_picture||t.avatar_url||t.avatar,attributes:t.custom_fields||{}};return t.company&&(e.company=t.company),e}async _restoreIdentity(){this.metadata&&this.sessionToken&&this.identitySyncedToken&&this.identitySyncedToken!==this.sessionToken&&await this.identify(this.metadata)}}class y extends b{constructor(t={}){super(t),this.feedback=new c(this),this.survey=new f(this),this.liveChat=new h(this),this.help=new d(this),this.changelog=new l(this)}async submitFeedback(t){return this.feedback.submitFeedback(t)}async getActiveSurveys(t){return this.survey.getActiveSurveys(t)}async submitSurveyResponse(t,e){return this.survey.submitSurveyResponse(t,e)}async dismissSurvey(t){return this.survey.dismissSurvey(t)}async getLiveChatSettings(){return this.liveChat.getLiveChatSettings()}async checkAgentsOnline(){return this.liveChat.checkAgentsOnline()}async getConversations(t){return this.liveChat.getConversations(t)}async getConversation(t){return this.liveChat.getConversation(t)}async getMessages(t,e){return this.liveChat.getMessages(t,e)}async startConversation(t){return this.liveChat.startConversation(t)}async sendMessage(t,e){return this.liveChat.sendMessage(t,e)}async uploadFile(t,e){return this.liveChat.uploadFile(t,e)}async sendTypingIndicator(t,e){return this.liveChat.sendTypingIndicator(t,e)}async markConversationAsRead(t){return this.liveChat.markConversationAsRead(t)}async getUnreadCount(){return this.liveChat.getUnreadCount()}async submitRating(t,e){return this.liveChat.submitRating(t,e)}async identify(t){if(await this._ensureSession(),this.mock){await new Promise(t=>setTimeout(t,300));const e={status:!0,data:{contact_id:"mock_contact_"+Date.now(),email:t.email||"",name:t.name||"",avatar:t.avatar||"",is_new:!0}};return this._storeContactIdentity(e.data,t),e}const e={};t.email&&(e.email=t.email),t.user_id&&(e.user_id=t.user_id),t.name&&(e.name=t.name),t.avatar&&(e.avatar=t.avatar),t.attributes&&(e.attributes=t.attributes),t.company&&(e.company=t.company);const n=await this._makeRequest("/widget/identify",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify(e)});return n?.status&&n?.data&&this._storeContactIdentity(n.data,t),n}_storeContactIdentity(t,e={}){this.contactId=t.contact_id||null,this.contactEmail=t.email||e.email||null,this.contactName=t.name||e.name||null;try{localStorage.setItem("product7_contact",JSON.stringify({contactId:this.contactId,contactEmail:this.contactEmail,contactName:this.contactName}))}catch(t){}}getContactIdentity(){if(this.contactId)return{contactId:this.contactId,contactEmail:this.contactEmail,contactName:this.contactName};try{const t=localStorage.getItem("product7_contact");if(t){const e=JSON.parse(t);return this.contactId=e.contactId,this.contactEmail=e.contactEmail,this.contactName=e.contactName,e}}catch(t){}return null}async identifyContact(t){return this.identify(t)}async getHelpCollections(t){return this.help.getHelpCollections(t)}async searchHelpArticles(t,e){return this.help.searchHelpArticles(t,e)}async getChangelogs(t){return this.changelog.getChangelogs(t)}}class w{constructor(){this.events=new Map}on(t,e){return this.events.has(t)||this.events.set(t,[]),this.events.get(t).push(e),()=>this.off(t,e)}off(t,e){const n=this.events.get(t);if(n){const t=n.indexOf(e);t>-1&&n.splice(t,1)}}emit(t,e){const n=this.events.get(t);n&&n.forEach(t=>{try{t(e)}catch(t){console.error("[Product7] Event callback error:",t)}})}once(t,e){const n=this.on(t,t=>{e(t),n()});return n}clear(){this.events.clear()}getListenerCount(t){const e=this.events.get(t);return e?e.length:0}}function C(t="feedback"){return`${t}_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}function k(t,e){const n={...t};for(const i in e)e.hasOwnProperty(i)&&(e[i]&&"object"==typeof e[i]&&!Array.isArray(e[i])?n[i]=k(t[i]||{},e[i]):n[i]=e[i]);return n}function x(){return"undefined"!=typeof window&&"undefined"!=typeof document}var _=Object.freeze({__proto__:null,debounce:function(t,e){let n;return function(...i){clearTimeout(n),n=setTimeout(()=>{clearTimeout(n),t(...i)},e)}},deepMerge:k,delay:function(t){return new Promise(e=>setTimeout(e,t))},escapeRegex:function(t){return t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},formatFileSize:function(t){if(0===t)return"0 Bytes";const e=Math.floor(Math.log(t)/Math.log(1024));return parseFloat((t/Math.pow(1024,e)).toFixed(2))+" "+["Bytes","KB","MB","GB"][e]},generateId:C,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(t,e,n=""){if(!t||!e)return n;try{return window.getComputedStyle(t).getPropertyValue(e)||n}catch(t){return n}},getCurrentTimestamp:function(){return(new Date).toISOString()},getNestedProperty:function(t,e,n=void 0){if(!t||!e)return n;const i=e.split(".");let a=t;for(const t of i){if(null==a||!(t in a))return n;a=a[t]}return a},isBrowser:x,isInViewport:function(t){if(!t)return!1;const e=t.getBoundingClientRect();return e.top>=0&&e.left>=0&&e.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&e.right<=(window.innerWidth||document.documentElement.clientWidth)},isMobile:function(){return!!x()&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<=768)},isValidEmail:function(t){return!(!t||"string"!=typeof t)&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(t.trim())},safeJsonParse:function(t,e=null){try{return JSON.parse(t)}catch(t){return e}},sanitizeHTML:function(t){if(!t||"string"!=typeof t)return"";const e=document.createElement("div");return e.textContent=t,e.innerHTML},scrollToElement:function(t,e={}){if(!t)return;t.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest",...e})},setNestedProperty:function(t,e,n){if(!t||!e)return t;const i=e.split("."),a=i.pop();let s=t;for(const t of i)t in s&&"object"==typeof s[t]||(s[t]={}),s=s[t];return s[a]=n,t},throttle:function(t,e){let n,i;return function(...a){i?(clearTimeout(n),n=setTimeout(()=>{Date.now()-i>=e&&(t(...a),i=Date.now())},e-(Date.now()-i))):(t(...a),i=Date.now())}},validateConfig:function(t,e=[]){const n=[];for(const i of e)t[i]||n.push(i);if(n.length>0)throw new Error(`Missing required configuration: ${n.join(", ")}`);return!0}});class q{static STORAGE_KEY="feedback_submitted";static DEFAULT_COOLDOWN_DAYS=30;constructor(t={}){this.id=t.id,this.sdk=t.sdk,this.apiService=t.apiService,this.type=t.type||"base",this.options={container:null,position:this.sdk.config.position,boardName:this.sdk.config.boardName,displayMode:t.displayMode||"panel",size:t.size||"medium",primaryColor:t.primaryColor||"#155EEF",backgroundColor:t.backgroundColor||"#ffffff",textColor:t.textColor||"#1F2937",autoShow:!1,showBackdrop:!0,customStyles:{},suppressAfterSubmission:!0,suppressionDays:q.DEFAULT_COOLDOWN_DAYS,trigger:!0,...t},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(t){if(this.mounted||this.destroyed)return this;if(!1===this.options.enabled)return this.sdk.eventBus.emit("widget:suppressed",{widget:this,type:this.type,reason:"disabled"}),this;if(this.options.suppressAfterSubmission&&this._hasRecentlySubmitted())return this.sdk.eventBus.emit("widget:suppressed",{widget:this,reason:"recently_submitted"}),this;if("string"==typeof t&&(t=document.querySelector(t)),t||(t=document.body),this.container=t,this.element=this._render(),this.container.appendChild(this.element),this.mounted=!0,this._attachEvents(),this.options.trigger&&!0!==this.options.trigger){const t="string"==typeof this.options.trigger?document.querySelector(this.options.trigger):this.options.trigger instanceof Element?this.options.trigger:null;t&&t.addEventListener("click",()=>this.open())}return 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,this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")})}_showLoadingModal(){this.state.isLoading=!0,this.options.showBackdrop&&(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&&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"),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()}async submitFeedback(){if(!this.state.isSubmitting){this._hideError();try{this.state.isSubmitting=!0,this._updateSubmitButton();const t={title:this.state.title||"Feedback",content:this.state.content,email:this.state.email,board_id:this.options.boardName,attachments:this.state.attachments};if(!this.state.title.trim())return void this._showError("Please enter a title.");if(!this.state.content.trim())return void this._showError("Please enter your feedback message.");const e=await this.apiService.submitFeedback(t);this._trackSubmission(),this._showSuccessInPanel(),this.sdk.eventBus.emit("feedback:submitted",{widget:this,feedback:e})}catch(t){this._showError("Failed to submit feedback. Please try again."),this.sdk.eventBus.emit("feedback:error",{widget:this,error:t})}finally{this.state.isSubmitting=!1,this._updateSubmitButton()}}}handleConfigUpdate(t){this.options.theme=t.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 t=this.sdk.config.workspace,e=`${q.STORAGE_KEY}_${t}`,n={submittedAt:Date.now(),boardName:this.options.boardName};localStorage.setItem(e,JSON.stringify(n))}catch(t){console.warn("Failed to track feedback submission:",t)}}_hasRecentlySubmitted(){const t=24*this.options.suppressionDays*60*60*1e3,e=Date.now();if(this.sdk.config.last_feedback_at)try{if(e-new Date(this.sdk.config.last_feedback_at).getTime()<t)return!0}catch(t){}try{const n=this.sdk.config.workspace,i=`${q.STORAGE_KEY}_${n}`,a=localStorage.getItem(i);if(!a)return!1;const s=JSON.parse(a);return e-s.submittedAt<t}catch(t){return!1}}clearSubmissionTracking(){try{const t=this.sdk.config.workspace,e=`${q.STORAGE_KEY}_${t}`;localStorage.removeItem(e)}catch(t){console.warn("Failed to clear submission tracking:",t)}}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 t="modal"===this.options.displayMode?"feedback-modal":"feedback-panel",e=`size-${this.options.size}`;this.panelElement=document.createElement("div");const n=`theme-${this.options.theme||"light"}`,i="feedback-panel"===t&&String(this.options.position).includes("left")?"panel-from-left":"";this.panelElement.className=`${t} ${e} ${n} ${i}`.trim(),this.panelElement.style.setProperty("--color-primary",this.options.primaryColor),this.panelElement.style.setProperty("--feedback-panel-bg",this.options.backgroundColor),this.panelElement.style.setProperty("--feedback-panel-text",this.options.textColor),this.panelElement.innerHTML=this._getPanelHTML(),document.body.appendChild(this.panelElement),this._attachPanelEvents();const a=this.panelElement.querySelector("input, textarea");a&&setTimeout(()=>a.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 <iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n </button>\n</div>\n <div class="feedback-panel-body">\n <form class="feedback-form">\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-title-${this.id}">Title <span class="sdk-required">*</span></label>\n <input \n type="text" \n id="feedback-title-${this.id}" \n name="title" \n class="sdk-input"\n placeholder="Brief description of your feedback"\n value="${this.state.title}"\n />\n </div>\n <div class="sdk-form-group">\n <label class="sdk-label" for="feedback-content-${this.id}">Message <span class="sdk-required">*</span></label>\n <textarea \n id="feedback-content-${this.id}" \n name="content" \n class="sdk-textarea"\n placeholder="Tell us what you think..."\n required\n >${this.state.content}</textarea>\n </div>\n <div class="feedback-error" role="alert"></div>\n <div class="feedback-form-actions">\n <button type="submit" class="sdk-btn-primary sdk-btn-block">\n ${this.state.isSubmitting?"Sending...":"Send Feedback"}\n </button>\n </div>\n </form>\n </div>\n </div>\n `}_attachPanelEvents(){const t=this.panelElement;t.querySelector(".sdk-close-btn").addEventListener("click",this.closePanel);t.querySelector(".feedback-form").addEventListener("submit",t=>{t.preventDefault(),this.submitFeedback()}),t.querySelector('input[name="title"]').addEventListener("input",t=>{this.state.title=t.target.value}),t.querySelector('textarea[name="content"]').addEventListener("input",t=>{this.state.content=t.target.value});const e=t=>{"Escape"===t.key&&(this.closePanel(),document.removeEventListener("keydown",e))};document.addEventListener("keydown",e)}_updateSubmitButton(){if(this.panelElement){const t=this.panelElement.querySelector(".sdk-btn-primary");t&&(t.disabled=this.state.isSubmitting,t.innerHTML=this.state.isSubmitting?'<iconify-icon icon="ph:circle-notch" width="16" height="16" style="animation: spin 0.8s linear infinite;"></iconify-icon> Sending...':"Send Feedback")}}_showError(t){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-error");e&&(e.textContent=t,e.classList.add("show"))}}_hideError(){if(this.panelElement){const t=this.panelElement.querySelector(".feedback-error");t&&t.classList.remove("show")}}_showSuccessInPanel(){if(!this.panelElement)return;const t=this.panelElement.querySelector(".feedback-panel-content");t&&(t.innerHTML='\n\t\t\t<div style="display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100%; padding: 40px 24px; text-align: center;">\n\t\t\t\t<div style="width: 56px; height: 56px; border-radius: 50%; background: #037F0C; display: flex; align-items: center; justify-content: center; margin-bottom: 20px;">\n\t\t\t\t\t<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="none" stroke="#ffffff" stroke-width="24" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 256 256">\n\t\t\t\t\t\t<polyline points="216,72 96,192 40,136"/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t\t<h3 style="margin: 0 0 8px; font-size: 1.25rem; font-weight: 600; color: var(--feedback-panel-text, #1d1d1f);">Thank you!</h3>\n\t\t\t\t<p style="margin: 0; font-size: 0.875rem; color: #6b7280; line-height: 1.5;">Your feedback has been submitted successfully.</p>\n\t\t\t</div>\n\t\t',setTimeout(()=>this.closePanel(),2e3))}_resetForm(){this.state.title="",this.state.content="",this.state.email="",this.state.errors={}}_updateTheme(){}open(){return this.openPanel(),this}close(){return this.closePanel(),this}toggle(){return this.state.isOpen?this.closePanel():this.openPanel(),this}openModal(){this.openPanel()}closeModal(){this.closePanel()}}class S extends q{constructor(t){super({...t,type:"button"}),this.isMinimized=!1,this._hiddenForOpenPanel=!1}_hasTrigger(){return!0===this.options.trigger||void 0===this.options.trigger}_render(){if(!this._hasTrigger()){const t=document.createElement("div");return t.style.display="none",t}const t=this.options.buttonText||this.options.triggerText||this.options.label||this.options.text||"Feedback",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" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="currentColor" viewBox="0 0 256 256">\n <path d="M224,48H32a8,8,0,0,0-8,8V192a16,16,0,0,0,16,16H216a16,16,0,0,0,16-16V56A8,8,0,0,0,224,48Zm-8,144H40V74.19l82.59,75.71a8,8,0,0,0,10.82,0L216,74.19V192Z"/>\n </svg>\n <span class="feedback-text">${t}</span>\n </button>\n `,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){if(!this._hasTrigger())return;const t=this.element.querySelector(".feedback-trigger-btn");t.addEventListener("click",()=>{this.openPanel()}),t.addEventListener("pointerup",t=>{"mouse"!==t.pointerType&&this.openPanel()})}openPanel(){this._hasTrigger()&&!this.state.isOpen&&(this._hiddenForOpenPanel=!0,this.hide()),super.openPanel()}closePanel(){const t=this._hiddenForOpenPanel;super.closePanel(),t&&setTimeout(()=>{this.destroyed||this.options._noTriggerButton||this.show(),this._hiddenForOpenPanel=!1},320)}mount(t){super.mount(t)}updateText(t){const e=this.element?.querySelector(".feedback-text");e&&(e.textContent=t)}updatePosition(t){this.options.position=t,this.element&&(this.element.className=this.element.className.replace(/position-\w+/,`position-${t}`))}}class A extends q{constructor(t){super({...t,type:"changelog"}),this.changelogs=[],this.isLoading=!1,this.modalElement=null,this.sidebarElement=null,this.listModalBackdropElement=null,this.currentIndex=0}_hasTrigger(){return!0===this.options.trigger||void 0===this.options.trigger}_render(){if(!this._hasTrigger()){const t=document.createElement("div");return t.style.display="none",t}const t=document.createElement("div");return t.className=`changelog-widget position-${this.options.position} changelog-theme-${this.options.theme||"light"}`,t.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(t.style,this.options.customStyles),t}_attachEvents(){if(!this._hasTrigger())return;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(){!1!==this.options.showBackdrop&&(this.backdropElement=document.createElement("div"),this.backdropElement.className=`changelog-modal-backdrop changelog-theme-${this.options.theme||"light"}`,document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this.closeModal())),this.modalElement=document.createElement("div"),this.modalElement.className=`changelog-modal changelog-theme-${this.options.theme||"light"}`,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">\n\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class="changelog-modal-content">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',document.body.appendChild(this.modalElement),this.modalElement.querySelector(".changelog-modal-container").addEventListener("click",t=>t.stopPropagation()),this.modalElement.querySelector(".changelog-modal-close").addEventListener("click",()=>this.closeModal()),this._escapeHandler=t=>{"Escape"===t.key&&this.closeModal()},document.addEventListener("keydown",this._escapeHandler)}async openSidebar(){this.listModalElement||(this.modalElement&&(this.closeModal(),await new Promise(t=>setTimeout(t,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 t=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA"],e=document.createElement("div");e.className="changelog-confetti-container",document.body.appendChild(e);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=t[Math.floor(Math.random()*t.length)],n.style.animationDelay=.5*Math.random()+"s",n.style.animationDuration=1*Math.random()+1.5+"s";const i=["circle","square","rectangle"],a=i[Math.floor(Math.random()*i.length)];"circle"===a?(n.style.borderRadius="50%",n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width):"rectangle"===a?(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),e.appendChild(n)}setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},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(){!1!==this.options.showBackdrop&&(this.listModalBackdropElement=document.createElement("div"),this.listModalBackdropElement.className=`changelog-list-modal-backdrop changelog-theme-${this.options.theme||"light"}`,document.body.appendChild(this.listModalBackdropElement),this.listModalBackdropElement.addEventListener("click",()=>this.closeSidebar())),this.listModalElement=document.createElement("div"),this.listModalElement.className=`changelog-list-modal changelog-theme-${this.options.theme||"light"}`,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\t<button class="changelog-list-modal-close" type="button" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="changelog-list-modal-body">\n\t\t\t\t\t<div class="changelog-loading">\n\t\t\t\t\t\t<div class="sdk-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,document.body.appendChild(this.listModalElement),this.listModalElement.querySelector(".changelog-list-modal-container").addEventListener("click",t=>t.stopPropagation()),this.listModalElement.querySelector(".changelog-list-modal-close").addEventListener("click",()=>this.closeSidebar()),this._listModalEscapeHandler=t=>{"Escape"===t.key&&this.closeSidebar()},document.addEventListener("keydown",this._listModalEscapeHandler)}_renderChangelogList(){const t=this.listModalElement.querySelector(".changelog-list-modal-body");this.isLoading||(0!==this.changelogs.length?(t.innerHTML=`\n\t\t\t<div class="changelog-list">\n\t\t\t\t${this.changelogs.map((t,e)=>this._renderChangelogListItem(t,e)).join("")}\n\t\t\t</div>\n\t\t`,t.querySelectorAll(".changelog-list-item").forEach((t,e)=>{t.addEventListener("click",()=>{this._handleViewUpdate(this.changelogs[e])})})):t.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(t,e){const n=t.cover_image||t.image,i=t.cover_image||t.image,a=t.published_at?this._formatDate(t.published_at):"",s=this._stripHtml(t.excerpt||t.description);return`\n\t\t\t<div class="changelog-list-item" data-index="${e}">\n\t\t\t\t<div class="changelog-list-item-content">\n\t\t\t\t\t<div class="changelog-list-item-meta">\n\t\t\t\t\t\t${a?`<span class="changelog-list-item-date">${a}</span>`:""}\n\t\t\t\t\t\t${t.labels&&t.labels.length>0?`<div class="changelog-list-item-labels">\n\t\t\t\t\t\t${t.labels.map(t=>`<span class="changelog-label" style="background-color: ${t.color||"#E5E7EB"}; color: ${this._getContrastColor(t.color||"#E5E7EB")}">${t.name}</span>`).join("")}\n\t\t\t\t\t</div>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3 class="changelog-list-item-title">${t.title}</h3>\n\t\t\t\t\t${s?`<p class="changelog-list-item-description">${s}</p>`:""}\n\t\t\t\t</div>\n\t\t\t\t${n?`<div class="changelog-list-item-image"><img src="${i}" alt="${t.title}" loading="lazy" /></div>`:""}\n\t\t\t\t<iconify-icon icon="ph:caret-right" class="changelog-list-item-arrow" width="16" height="16"></iconify-icon>\n\t\t\t</div>\n\t\t`}async _loadChangelogs(){this.isLoading=!0;try{const t=await this.apiService.getChangelogs();this.changelogs=t.data||[],this.sdk.eventBus.emit("changelog:loaded",{changelogs:this.changelogs})}catch(t){this.changelogs=[],this.sdk.eventBus.emit("changelog:error",{error:t})}finally{this.isLoading=!1}}_renderCurrentChangelog(){const t=this.modalElement.querySelector(".changelog-modal-content");if(this.isLoading)return;if(0===this.changelogs.length)return void(t.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 e=this.changelogs[this.currentIndex],n=e.cover_image||e.image,i=e.cover_image||e.image,a=this.changelogs.length>1,s=this._stripHtml(e.excerpt||e.description);t.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="${i}" alt="${e.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">${e.title}</h2>\n\t\t\t\t\t${s?`<p class="changelog-popup-description">${s}</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${a?`\n\t\t\t\t\t\t<div class="changelog-popup-dots">\n\t\t\t\t\t\t\t${this.changelogs.map((t,e)=>`\n\t\t\t\t\t\t\t\t<span class="changelog-dot ${e===this.currentIndex?"active":""}" data-index="${e}"></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<iconify-icon icon="ph:arrow-right" width="16" height="16"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,t.querySelector(".changelog-popup-btn").addEventListener("click",()=>{this._handleViewUpdate(e)}),t.querySelector(".changelog-view-all-btn").addEventListener("click",()=>{this.closeModal(),setTimeout(()=>this.openSidebar(),350)}),a&&t.querySelectorAll(".changelog-dot").forEach(t=>{t.addEventListener("click",t=>{this.currentIndex=parseInt(t.target.dataset.index,10),this._renderCurrentChangelog()})})}_handleViewUpdate(t){this.sdk.eventBus.emit("changelog:view",{changelog:t});const e=(this.options.changelogBaseUrl||"").replace(/\/$/,""),n=t.url||(t.slug&&e?`${e}/${t.slug}`:null)||e||null;n&&(!1!==this.options.openInNewTab?window.open(n,"_blank","noopener,noreferrer"):window.location.href=n),"function"==typeof this.options.onViewUpdate&&this.options.onViewUpdate(t)}_stripHtml(t){const e=document.createElement("div");return e.innerHTML=t,(e.textContent||e.innerText||"").trim()}_truncateDescription(t,e=120){if(!t)return"";const n=this._stripHtml(t);return n.length<=e?n:n.substring(0,e).trimEnd()+"..."}_formatDate(t){return new Date(t).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}_getContrastColor(t){const e=t.replace("#","");return(.299*parseInt(e.substr(0,2),16)+.587*parseInt(e.substr(2,2),16)+.114*parseInt(e.substr(4,2),16))/255>.5?"#1F2937":"#FFFFFF"}hideBadge(){const t=this.element?.querySelector(".changelog-badge");t&&(t.style.display="none")}showBadge(){const t=this.element?.querySelector(".changelog-badge");t&&(t.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()}open(){return this.openSidebar(),this}close(){return this.closeSidebar(),this}toggle(){return this.state.isOpen?this.closeSidebar():this.openSidebar(),this}mount(t){if(super.mount(t),this.options.trigger&&!0!==this.options.trigger){const t="string"==typeof this.options.trigger?document.querySelector(this.options.trigger):this.options.trigger instanceof Element?this.options.trigger:null;t&&t.addEventListener("click",()=>this.open())}}destroy(){this._escapeHandler&&document.removeEventListener("keydown",this._escapeHandler),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler),this.closeModal(),this.closeSidebar(),super.destroy()}}class E extends q{constructor(t){super({...t,type:"inline"})}_render(){const t=document.createElement("div");return t.className="feedback-widget feedback-widget-inline",t.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(t.style,this.options.customStyles),t}_attachEvents(){const t=this.element.querySelector(".feedback-inline-form");t.addEventListener("submit",t=>{t.preventDefault(),this.submitFeedback()}),t.querySelector('input[name="title"]').addEventListener("input",t=>{this.state.title=t.target.value}),t.querySelector('textarea[name="content"]').addEventListener("input",t=>{this.state.content=t.target.value}),t.querySelector('input[name="email"]').addEventListener("input",t=>{this.state.email=t.target.value})}openModal(){const t=this.element.querySelector('textarea[name="content"]');t&&t.focus()}closeModal(){}_showSuccessMessage(){const t=this.element.querySelector(".feedback-inline-content"),e=t.innerHTML;t.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 ';t.querySelector(".sdk-btn-primary").addEventListener("click",()=>{t.innerHTML=e,this._attachEvents(),this._resetForm()})}_showError(t){const e=this.element.querySelector(".feedback-error");e&&(e.textContent=t,e.classList.add("show"),setTimeout(()=>{e&&e.classList.remove("show")},5e3))}_updateSubmitButton(){const t=this.element.querySelector(".sdk-btn-primary");t&&(t.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",t.disabled=this.state.isSubmitting)}updateTitle(t){const e=this.element?.querySelector("h3");e&&(e.textContent=t)}setPlaceholder(t,e){const n=this.element?.querySelector(`[name="${t}"]`);n&&(n.placeholder=e)}}class I{constructor(t={}){this.baseURL=t.baseURL||"",this.workspace=t.workspace||"",this.sessionToken=t.sessionToken||null,this.mock=t.mock||!1,this.ws=null,this.reconnectAttempts=0,this.reconnectBaseDelay=1e3,this.reconnectMaxDelay=3e4,this.pingInterval=null,this.isConnected=!1,this.lastFrameAt=0,this.heartbeatTimeoutMs=9e4,this.heartbeatCheckIntervalMs=15e3,this.heartbeatInterval=null,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(t=null){if(t&&(this.sessionToken=t),!this.sessionToken)return void console.warn("[WebSocket] No session token provided");if(this._intentionallyClosed=!1,this.mock)return this.isConnected=!0,this._emit("connected",{}),void this._startMockResponses();const e="https:"===window.location.protocol?"wss:":"ws:";let n=this.baseURL.replace(/^https?:/,e);n=n.replace("/api/v1",""),n=`${n}/api/v1/widget/livechat/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(t){console.error("[WebSocket] Connection error:",t),this._scheduleReconnect()}}disconnect(){this.isConnected=!1,this._intentionallyClosed=!0,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._stopHeartbeat(),this.ws&&(this.ws.close(),this.ws=null),this._mockInterval&&(clearInterval(this._mockInterval),this._mockInterval=null)}_startHeartbeat(){this._stopHeartbeat(),this.lastFrameAt=Date.now(),this.heartbeatInterval=setInterval(()=>{if(Date.now()-this.lastFrameAt>this.heartbeatTimeoutMs&&(console.warn(`[WebSocket] No frames in ${this.heartbeatTimeoutMs}ms, forcing reconnect`),this._stopHeartbeat(),this.ws))try{this.ws.close()}catch(t){}},this.heartbeatCheckIntervalMs)}_stopHeartbeat(){this.heartbeatInterval&&(clearInterval(this.heartbeatInterval),this.heartbeatInterval=null)}on(t,e){return this._listeners.has(t)||this._listeners.set(t,new Set),this._listeners.get(t).add(e),()=>this._listeners.get(t).delete(e)}off(t,e){this._listeners.has(t)&&this._listeners.get(t).delete(e)}send(t,e={}){this.isConnected?this.mock?console.log("[WebSocket Mock] Sending:",t,e):this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:t,payload:e})):console.warn("[WebSocket] Not connected, cannot send message")}_onOpen(){console.log("[WebSocket] Connected"),this.isConnected=!0,this.reconnectAttempts=0,this._intentionallyClosed=!1,this._startHeartbeat(),this._emit("connected",{}),this.pingInterval=setInterval(()=>{this.send("ping",{})},3e4)}_onMessage(t){this.lastFrameAt=Date.now();try{const e=JSON.parse(t.data),{type:n,payload:i}=e;switch(n){case"message:new":this._emit("message",i);break;case"typing:started":this._emit("typing_started",i);break;case"typing:stopped":this._emit("typing_stopped",i);break;case"conversation:updated":this._emit("conversation_updated",i);break;case"conversation:closed":this._emit("conversation_closed",i);break;case"availability:changed":this._emit("availability_changed",i);break;case"pong":break;default:console.log("[WebSocket] Unknown event:",n,i)}}catch(t){console.error("[WebSocket] Failed to parse message:",t)}}_onClose(t){console.log("[WebSocket] Disconnected:",t.code,t.reason),this.isConnected=!1,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._stopHeartbeat(),this._emit("disconnected",{code:t.code,reason:t.reason}),this._intentionallyClosed||this._scheduleReconnect()}_onError(t){console.error("[WebSocket] Error:",t),this._emit("error",{error:t})}_scheduleReconnect(){if(this._intentionallyClosed)return;this.reconnectAttempts++;const t=Math.min(this.reconnectBaseDelay*Math.pow(2,this.reconnectAttempts-1),this.reconnectMaxDelay);console.log(`[WebSocket] Reconnecting in ${t}ms (attempt ${this.reconnectAttempts})`),setTimeout(()=>{this.connect()},t)}_emit(t,e){this._listeners.has(t)&&this._listeners.get(t).forEach(n=>{try{n(e)}catch(e){console.error(`[WebSocket] Error in ${t} handler:`,e)}})}_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(t,e){this.mock&&this._emit("message",{conversation_id:t,message:{id:"msg_"+Date.now(),content:e.content,sender_type:e.sender_type||"agent",sender_name:e.sender_name||"Support",sender_avatar:e.sender_avatar||null,created_at:(new Date).toISOString()}})}}function T(t={}){const{primaryColor:e="#155EEF",textColor:n="#1d1d1f",backgroundColor:i="#ffffff",theme:a="light"}=t;let s=document.getElementById("product7-liveChat-custom-styles");s||(s=document.createElement("style"),s.id="product7-liveChat-custom-styles",document.head.appendChild(s));const o=(t,e,n=1)=>{const i=String(t||"").trim();if(!/^#?[0-9a-fA-F]{6}$/.test(i))return i||"#000000";const a=parseInt(i.replace("#",""),16),s=Math.max(0,Math.min(255,(a>>16)+e)),o=Math.max(0,Math.min(255,(a>>8&255)+e)),r=Math.max(0,Math.min(255,(255&a)+e));return n<1?`rgba(${s}, ${o}, ${r}, ${n})`:"#"+(s<<16|o<<8|r).toString(16).padStart(6,"0")};o(i,12),o(i,20),o(i,34),s.textContent=`\n\t\t#product7-liveChat-widget {\n\t\t\t--color-primary: ${e} !important;\n\t\t\t--color-primary-hover: ${o(e,-10)} !important;\n\t\t}\n\n\t\t.liveChat-launcher-btn {\n\t\t\tbackground: ${e} !important;\n\t\t}\n\n\t\t.liveChat-launcher-btn:hover {\n\t\t\tbox-shadow: 0 8px 24px ${o(e,0,.3)} !important;\n\t\t}\n\n\t\t.sdk-btn-primary {\n\t\t\tbackground: ${e} !important;\n\t\t\tborder-color: ${e} !important;\n\t\t}\n\n\t\t.sdk-btn-primary:hover {\n\t\t\tbackground: ${o(e,-10)} !important;\n\t\t\tborder-color: ${o(e,-10)} !important;\n\t\t}\n\n\t\t.liveChat-compose-send:hover:not(:disabled) {\n\t\t\tbackground: ${e} !important;\n\t\t\tborder-color: ${e} !important;\n\t\t\tcolor: #FFFFFF !important;\n\t\t}\n\n\t\t.liveChat-nav-tab.active .liveChat-nav-icon,\n\t\t.liveChat-nav-tab.active .liveChat-nav-label {\n\t\t\tcolor: ${e} !important;\n\t\t}\n\n\t\t.liveChat-home-view::before {\n\t\t\tbackground: radial-gradient(circle, ${o(e,0,.08)} 0%, transparent 70%) !important;\n\t\t}\n\n\t\t${"#ffffff"!==i?`\n\t\t.liveChat-panel-content {\n\t\t\tbackground: ${i} !important;\n\t\t}\n\t\t`:""}\n\n\t\t${"#1d1d1f"!==n?`\n\t\t.liveChat-panel-content,\n\t\t.liveChat-view {\n\t\t\tcolor: ${n} !important;\n\t\t}\n\t\t`:""}\n\n\t\t/* Dark theme is now handled by CSS custom properties in liveChat-core.js */\n\t`,console.log("✅ Custom web chat styles applied:",{primaryColor:e,theme:a})}class L{constructor({soundUrl:t="data:audio/mpeg;base64,SUQzBAAAAAAAGFRTU0UAAAAOAAADTGF2ZjUyLjExMS4wAP/7MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhpbmcAAAAHAAAAHAAAIwgAHBwcNDQ0ND4+PlNTU1NfX190dHR0gICAioqKipSUlJSdnZ2oqKiosrKyu7u7u8bGxs7Ozs7X19fX3d3d4uLi4uXl5ejo6Ojr6+vu7u7u8fHx8fT09Pf39/f6+vr9/f39////AAAAAP/70GQAAAFZANHlBAAIMYAaXaCAARjV1Un5yIIKOJpo/zmAASTQWo7TdQAWD5toISgIYPg/lAQBCJw/+XP/UcKHFg++oEPwQ5c/9Rz+IAwCUm47pbZVAAROD4fBAEAQBAEw+XB8HwQBAEAQwffDHBM//Ln/iAEKwf/Lv9QIHPhjQAUrwgq4irMio5s5BUEAAAHCSeMAiNK062DzEZqDg43EwYIywBjGwcFiG8BeOXiQFAASMAAQRyHqBtpfAbggmYC5BhCyQyoANAEQsoSiRAZEc4oichtjvICKXDpy4bpkNJoXw1xzCLEwPouEsQMiZPjoEBDw4iZJUeSdNEFEoQIkCCEabjjJgrk0meMVGdJJOmx8qGxECcKZfTZRsmaIPdlysyZxRui91rqp7sv1TUwupJd/+3//onkM66K0mzVX//////8ydhEqptEMhmJZZVf3aRpEAAAFKRxTJQBaadeApgkSDQ1AQCpFGDFQEHQVfpsrtV+/z1gdSkjncSxSCceMSpHAuhKaWPxiG37ZjEW2o3XkG+6+pX+cZU6F6MX4s6EapLF/LL6lLZp7tWQWPj09HaTdNeltynw7jc3nu3P0FJAmeu43JqrUlcwr/Rydbmn1F/KqZXIAEAMkdbRou7ktcejaANCJAAlFZ4FRga9Rg2UNPqzFDTK/JF4lEjEo09F7NRDDECs5Y4DAY5JvN/EzKTZIIwMRRtNOGDSgk4VhBxa1pu4MJi04KIDFh4IcgcWJhmICJatIxBYWBQMALceRMFi67EvgcGbdmIRFOaG2VtPzccu+XJHgMtokMrl75iGZ3G5K8J+RxS8Dg9HtYBSsMAUSwEANxhuzTQ1Cqt6ksWXUqzytzNW3UHWwvRrk3bschmMwmaprXYvWkd+Uw/fj8rfyUu/EYHfySRV33Dh7Vret67qZ3S4f/9y/eWPxStez5n9vDd4LAwxk7/8LmlRxAAAgBVaDWNKCECikAADaBkbyhTdJ9AwALxiACrkxlRgIBqGRIrDGVBEw43AaJGBAGcJAQGiiAQQQOCr06EM9ZMDClaUEIiAodogZokISAGAhg8OEiMUYkQn1LVTI6dSJZctRJxCmZpW7TTWqe3hJJ6H/+9BktoAH0FVUfm9gAOeLaj/NaAAN/QFl/YWAIVwK7H+wMAT5bMWYy48/uaf7KZ7zn/moAlUj6Y0GW9Wcj5YyjU3q3W7vdmKb64D4wQv5UkdeWT0mrdLLbEq1v6kxhUy/95u5Bb9v/HoEfyP5Ou7Fa/VxwlXfq1eYfr/////xvZ4WJufl9THHPDLCmy/63aXYSWj/C4g//qb7VwAARXIiQR0NbJZURqcJH54mvNKXZpmUbACzEJJcteXbANB2YSXLL73w1zH6LbkPaRYbpNt7OO2W7rj6fui4t0Pjq43Q/v/+adzVcOdDr28f9w2Wdy5RPWXNmqKlHtZMnhYYBU/+txproyhDW/HJ/K6gAO2kkQA7v4IOiMyRrjYWrjxOU3Dk3DmefQiXGdNjEVgADik2LDDOCBcWMsNfVrEZwHGjfEw8NA0eBpYw80kkQi1KFKaGUKepd+3/0DK7EDnbt7U1XNeQEAVHf9kqBLzjxchaDngEDJaeEpfJ9oegJMJNIEqM0SUDozTc5R/85vvqZWKAgIUMfrSOzzpzjBdoTOJBsKgu4FhYGSRVY1Z5Sv8kVAoiFjQMBV36Hq+xJ/rIAADtXe63ACLsC0EudKI+PvNYWozM2vT+MFighxHKtMkGLP9V3n2v4OsZ/+i5WNZ5AbMuzfVnVq5VdiolNpio6q3tfysZRKgJwqWIhoekJp/6Ku5UQADPT2xtM6skVsL6KlTcpIeUOZk7hODETSqZzJfApYpusk8SP94xv+PLP/gmKT4DkuZUkmxnl9I+KZBZYc1IsY0FrTpqfaPJIvDCgg2SKsIpVStst3hvu9r6qP+ui/jlUQFF+3sjYO5OmwqbpxT1eFpa43QKABtkdSai5slNSzq0r6lDMJC0a4ZTymh555BgUPgZzQ4VBWKhy13G2VhsCH5R4OMsTWzV3+nobKeCAAZ997I3CudEoCwlmso4tZRVajMqeGWnRiTuKxkFdJug655kFnkj9JZ1cv3po1roaF1qQ9ZmBCAAaSKjTGLsrqSFwSeD7TQ5BeaJKOtqtegdfu08KKta9TmppaKVKbNRgAAdr/tXGB6CSCPl1Lelt7XW7T01ifVk2zjE1bLW839346gs//uAZPGAAtMh2Hn4GlhT52rfPeJdDAirVe28aaE2Dmr9tY0siLho4mUCDpWMFgQGgu42pLnLawWb/bpWNprQxluj9TNaXJSgOIMS1KzM0TRIAAAABFakEh3cgBQEGVwwSAstoCBiYpGhkVAplAwJmPAkYLCBkEDgYHpEhgdJRk+AeYkqaA6eReiyrxNIvmnxxStER14EjE2/9hljaO2siCoAhzKnpuRt269O0veD7Pq/uNbdzt6jfydzch/Kkpf1/dcqV6ta/y3Y1MWIft8iMqtZzUahrWPO71nqvG43fsROXu5Y3KZJGnRZbEH1clnOWX//OZ/+2WTnxeAH4ZfTSxQdl7ovLbXkoM0tW5UzXqqe3b9bPWP/+H7q59vrHa/P1WVuvIHDdeijc/LKqG114l3Joq5VSQSsRUcUBhEnmWs49v5f///////////////y/mff///////////////3Ad21LEZyZxNSU0SUaZb/+8Bk6AADBiBVfWGgCEbieq+nmAEjzhFJ+cyQBEdCKT85gkCgwCAAAAA6AP0AywXlGoy0hpYVBKCMGkNVAtKWyXWFQkQg10C3jJ4dCWsMS6ezji0j3yF6W6MVa5lLJbaXvIFSNMi8Vdp4aejr0kYgJ/IpLXJpq0lmN4S38scPty+3K4brc1En1pL+vzx/k/bwt3IYllNldscl0R/HlzH9/zJ2IEd+3kzt34vWlVWVWqbn5Z/njz8O/+aXAXCHDZovNNc0AZypebBMlXypavJwV2u4yFL1vG4qA//93+9d/ff/Fg5dCKWEFHZcd41TwOim499QNk7qNZnHhm2uvA4NA5XIelTssq//5////////////////KFL24Op////////////////I3ifN9VM55RBBXv+tQAA8aAYzpLaSOxTi1EgJ6SJFPyUphVqcwGS1LvW/Hx+27zX1/f7Y2w5rdPTwuJkLERYGnMZHg0LksCgqGoKvEWkqYTKtOnRLvoGgFPadXgqdiKxbu2ws92sNCIOHN0xkAtG+saAAuK4rNZxyl0v8x2rfuXaCm7ruwZLSEFAQkKru7B2WMZy0qeUZjNZr5eXDP+8VVSOR/5cly6S3120bi5SXY5P/1/UrllfUiyZj+qtq/Gz6oCQis9gNG1u21A0eEUXlKZgMvvdIkmDwsbcNCBMVljFm2IIcE8ACMnAIqJ5o4ovJhYfY7tmbWsu4ZKGwoGj1xMcMFgkXCSxoCoYgLnHOeXrZ732rlR3aaea7yj3pmotxSf7xyc1Dh+5TFr0wqwIVP21sSQbmXDVCyWUShytfMIk5hICPrNcf8gAU0jNh7zmBR7zKBdJnMh5iGmKwCw2AhFFLET9V5UhXa9tKeiboUnWpVnXt+hNyqNSCo/9lbTHi4JEl8E7XYjqAVkytmTqv480FwBHphkz+gCImRlt/l+zgEGBYUUwqFASIlSa4kDqXSQjZP/7kGTXgAMhHFV/PMAIZMpqf+yMAQuYW1PtMMchLYiqfYeY5BKRPlwyPGm0h57mTRatw8sKFSxJ6Qkii3cxr7t2npUe5jiBHD36yNAFjaTGCLBODkTI8F3rOs3tJq5ibOTHBB/1e77vxB9BcDBRj1iri4ZU1tWpYCaAHxVLR88FRh8YzNlFoqoARURTEfrZ7RoAkQhVlVWs7kJoNAICEvqiYTnEAh83wMwqBEKljl/QAQUBzQU23VCwbQiboHCIi7pAGW0gucKh1qaVodzUER3Dg1yo+yGHJ6G1rvqj2zdBAmDJmdP5O0copn7ffNlat8dijhMpej6btfn+oPJ4otdnkPadqff53u42cq/fnIcll53LGayZdEXZjbsvb/OfzuH+/E3F5unzldfBurLXidmAHmijdn7/+c7zm8d/lc5v6naliUUlNv/y3W+rlvmv/X6/f4frncYcoaOnjfX7tWOzF6knJa/stjkZlU1Wl0rpsqGXRX/73////////////////s4D//40JO7lCKrIQMosxW5slIAgAAHEwqUBMBpIRP/7wGTdgALpEdV9YSAISyJ6j6eYAR9V1U35zJID5kInvzkwAAUOswQKYfbgRGMcAS2mShYBtVW+/ZQGTCYcC3krCfxeBuQDTFYiw7QDkA3ALgAuFESiPhMeycGTD1BC4g8ghGjIkcXDdMqkiLGaGZUctjNFMTaKKtSkETR3WZuX0lHTh0mK0a7pEmUCQIITjD2QIZYS8cQyouH/RJwzNzM3l84gMaLhGeGVFcE5jmCkhX0mb/OEUYihiZrL58g5wVsOsaJASAkYRUuECJoXN21Mv8qEUPG54m3J9SB8ihoRA6LWOcLJGUEJR9E0WCLF8ZYiYuUY0dv////m6Zu////5HEyUi2pay7VlQCu/lSLHr5UCnC3EtWSFFyPmU41ejDtVSXOUIxUVBqppIkDQKAaU8ccc4zuLqKthvPFLw59cO5bp17S1EFlKlQyBT6abQESjyoKuDoVd3//lnthVblKF/drhqpZv7hlUE//+scGe4n4Q4lSGBcEogF3elPhZTsZ2coDNmWOCtBE3fZz7SILsNB1AkWdqmlMDZI1BUBCNQ1Iul4GD7Rc2DjR0iapBWDVosxqlte1v20vfURLf/pa7ynUzMPtbFGA3zySgiGps6D5zr7ODoUF4smCtcWz3bTaasLlq0xTAYpCLC6X0UmU3depWpSj6zqy8PFHhQHgfEa1PKElkGbaF8UFai7TQooacDSXjrTaPFcUSauGYzQNfJEyAKhWG8FcP8viIFAa50N5ND2W0Mc2JVsuY1Txq2OTWnDBSlV9tXD6X6t1yaCwkHB087asUePLgy425hNiFnUtG7LhWCzwEscEpuWlXf30a6hqLdiEjBKRtEAf6BBmCnAObOEnDlBUeEIBjAyhrUkE5q9kUgpSmOAgBgbI32T2TCCG4o0FgXINWfFCixcmUMXEXMbKg0oLIcr1pa0Vz//qS7y4YGU5LZGUAf7FhhZpvYfa4mE4zyQA0//uQROqAAvohVP89AAhaQlq/55gBC1hzT+wxqWFgDOm896zkkHhHC3zY4TW6KxZeeKijTMT7x9fOHdIcBkxmlbM0I12nnqZs5Z+/n5nMqWbjMfLM7/+hX3X+saipUxAhEkciIGjzqgQ8URCgNZstVheWBmVAKBo+ftWTNXCKebWrP24SjE0YX29v5rH72d81aRJL/w6Z0nn0YzJaxpb+fnhAsI6ApelH2Mtp9vt1DCwzABAL11QSiX4mGFSvLH3+axdogBgOu+7zpu1mf4VhdI8PSi0IpwO5p3mbT4DLsWT1tw4JllrCREqdrljZZEIzFEvOGBZjkNfTS51Skl3dSgiYVDETG66kCUJWoGUHMHITiA/JzUAURQYJzmIRmFM19h5usH9KQ60PYKShp//ufqhGRKRKlKNjkJjUkwezNAFODQxo04gu0SBwnWFXlnpE7iuLatTZf/7nt1hDw7qKoTkjbaAK1DTUZhRnskXFHIsWikTJ5qGF7W51ruOMyXzpaqqJ6kSTRDD0RBYsKMYxjTlQsA5rchxBj6GiUY1kPfrt//uAZPKAAnoa0nnsEchPRppfYQNdCnTRQ+wka4FHked5hY0oc39Zo0OZGBFVMoHsnkrloTUGaFvYGZA8gFU6wcxWSli08ad1Lrv5C433TW+XUieWDO1yB8LTvTBlaWe5n4KVy2dEBtMkBIJWBlbp6ieU0VS6BUkmtFibBzJb/ctv+xIv6WqiTUciSKAt2D0DUKllO0vVsrMZw5hcotN206zXfvums4xvL1c+cvHmt+PuVuP20DNmRpsP2P2KG7zFDa1RVy7atP/vmglphUU0P/+kRHjQjPDpb2fTSipOIQpCAyNjl45Ep59YxWDiLcUo54i9geA4cNCdZ0QhJQTACBANNBoPJaRIhxBahgVS6hSSYCYXFFPmXCwrqJJ83dTejV/0Vf0H+9txKlVAK4QEiqv5c6amObwOV9meA8s3x3bC/lGMJIS9SgtJpbzPgRetZcsOXbRGt5cfMu61n9Se1QS0w0OjHLJHEwDzhE3/+4Bk9QCC1SVPcewaUEkDqg89Y0oL9Ks5zLBpgQ8OZ7WHmSjE0DOWD1UB6x2selkCOsgsdBIhQ0fIGHnQ4AT4fUBlOE5sGSQ0MBdoEcKhaSFQK5iKC7T0hLGj5oiYWbQcclKOlnYV4rqssFEC6vDOpIbcaSAAWlmLGECRI+zfOsT4gSrqN0lxgvDzj73j2xaLJn42lK0jKPmSqSzF7G5gxSGgeLkBtj3RVifNmRnZFXiFv/VVmHh3RDM42okgDg8ewcCjcCIB0JSwqFjEyQ2L8IuzGm8YVQnVfFrhVQGCYcHoED0LtuDgCLBkPrWgNH0MYEBebFrnCNgTeGgmpuoeU1n8HxQqw1Udq9O3+iea3JIfWIB/ZGr8taNAbzQw+0BT8VNDEHASHaccmmny+p+pvUJQ2exjvPOVk/GnY7JHrfu+Qz3uOOGBY+CYy9r311KaFqhZZJyjHRf0e7+pau7/q0n2ldaUKQIBzXwCEv/7cGT2AALbEE9zDBnAOsI5vGHjOAqoM0HnvSTBHw6nPPeNKJ4wSnnL3Pfd0nkVIfx3OCLRicV7A+zrEd7BzqJbZZ9dkRpMxNApobQLtadQYMAUPBtalBgIBk0YOFix6y01dsQSQxAoj+3bb/P19nq8w6RdlrttScROZCmzUN6vAN+s/1SGFiAeZhiCx6whRcskuRZaViO4OBIIBr6vq4qvOtRQqJ6tnSd1Kczt//Rr/f//6ChnZlVVORpJAgpIloYiZQpciVtOkowTmgIBk0sJxk+ZPLaMyJ9zT3rTRVH5MzmrZ5KgIgciJWFDp95c5Dx2IRUyMIEUCoKqwyYAwoLoI7/0e6N010Q/+hd366xSNkhAH1CvSYD9yiZrYQzAIrgxeWh9ViBA7AoZ6bTtZ5ywmoQBWBohn6D/+4Bk5oASwhHO+68ZwFOEeZxtZkoLcHE3rTxpQQMO5rW0DShLNF0HMvMgw1KeroR/++t/5IVDj9u1jaqaUDUVzxaodFpuUs0SJRNxbDxbFw4rhYiPI1MQAnbTE2bbpkfjT/Oyc8c5yj4jU55x70An0AeJoKHGi0AkZNrWGEzhCJlUXub230ep32f6mbKTttrHF/cAAjJcXiXKZlY2UkK2ISVhcgeynDULl55lV9lCtdjnmgpfjUGrH1B96Tp0KCwUAd4mRPElrkf7f//6agiHdXVlRxJIAAXC5SiMAwSeHlBKGPPAiIRwTqhgmRAi5TtLq7Op6lv14pszASS/+hUic05F4WUCt7c/UuglYV9KXd2n5dAv2K29teToHq5/8N4Eu8RKxDW2SIAANEw6hD6sj16yu8O0AD5J7LqnGmDtxa7Xq7SIexnpFZKdht54Z4Oj1E2y0QGJxJBHZNEzYYFLKd/G/divLiNrJZYr/v/7gGTnAAK6Gc57KTHAQSOpvWGDSgrEXzWMPMcBAg7msPSNKAQFBtAIyBJkLlvLzVSrYwJxwewpn8lp6s223beynSZ0IneseWpnmooQHg6KFgOJgkPUCACALkIQeCQq++iu7c/bDdlNOK4sRGKaw0zpZc+38vkQiIeImIb/Wk1cZLK7EB43TskkqRG0FhHduBqDZHDdKisxWGAZN5ple7KJuBXtLQ1p7l0b+NPdj5Kb/57v4ZrqkbMbaDwAM6rBajuLsj4Ud2RICsnXF2PxsK2tSiX8diXI1qQ1JigPjaFs8zr2oEK8K336e4xbnJcH47+f79qLDdyD/+V+3tqWm5e1D2v+X5vvP398v/9od95G6lX656mgdnhndmVyRogABpch8ohZhELgTFMkSISHhFpFyyFSe+MiIj9wJhMqeBxCcGhyhCk8YOE2LF01ul93eOVG0j267bOVyNgAATvEkEaOaidgMSH4qyPgUbFy//twZPQAEpEsTnnpGmpHRHn/PYNLSwRzM4wwaUD8ieg9hIzlVAbKoTUn/3D7LGpKCUdiZUPlNrbOoOUDAXBqRPDGgmFVtTZWH3OeOn6hHOdChrv99rYmwI7UdNMzqbakgHB6wqihck19DBtNwP4pQ7NMgx/+1EDOb2C5vMbrmiQp32Mb/0NyRpstUrAB+y02vpp7I7EAQ9MW04wMDj01ikpOXWVnDNiw9K6jYgGh8Pmf3S8+pOab1sihfCWIrIoQSizTah9rDondc6MYcUX6WrGhj6lHPfa+i7vQ1hWpFA6SGlmroBNdnSZWrVLRV+MUQAgXJ6OGnhBrOaWi5oxeVypErF0q6rlTBQVvMngOGQcclwfoYLrizqkvTAos7ePFyviz5XXrGFWdC9mLe91XV4tnMqoAeBNrD//7gGTmABL8F0rZ7BnCPWHZ3z0mJwjseTWnpGlA0o6nNPQJLbTse1HtTVAsiGnwADAQIM7GGcgCw0iUCxE68DAUXOgcHA4gSgcdckYeWgCAiQD14HWYDzww8Vtzlr0FrKh+t+3FEaarPoa8lCqj1aShkASbSlk64mSs7XS7zNsOfjErzKEEhaJxczc5LuxHRpS7TJ7mR0RmCTg1TRFnjmk6fz8hbahvY1KF/////o/61fftqpUAEJSosR2aohuAyWwgO4P0Nshk1pZpUw9zMHCo5RFIGccjRqlgAuLHlC5ZHffCdO0s8eold5tIxaw7z6EZZ9wzffr2baG7hVjljWRSS2NtAAAK1xFubUtCh1rnrEKMFfztMiFchUPMrEfp0QrU4K8rB5qBiyEzLyCrUymqjdLAyPAiX8U5VZVi3NKwqFA+LhAsDwdB1YfDpNQKsOPDg9JLLgEMVC1TRy7dGlTmFz6lNQpDUXJTW6tJ//twZP4AEtgrSuNJGmBOo6k4aMNKCsA5KSwkRMD+jqUxkxUoWjcnetr3ossDa0aH0L3kmq/CJJtG2joTVrFHEQzo4DGAI2Ql56ZEDaaXMWv/JJtdZRP/2bP//tfZq//0qrEyUkn/wAHcC0113Nq8luMSKgQIkJlUNEcgT1erIi5L2mSZjUmbYdCAbi6ljBom3/bR2f/bZ///p3ej+hsQlptHIAAsz9aja4E1e7h5a3d6KUmRKHuCokDY6405AoEK0oak9UqZGJqoCM3qXEai7IfdVGqwYVNgAoPBprDLgbnKTDRZccx3/+5/yW27/6v//s//6hRIbmgHpoQlYp81tSaKCweNpfT3OQ4QEyLRqUmkuFbWVKAACNmhlQQJFBRB3abC/DhKBDY26rMLy/9qff7Wd1Hf7l/7///7cGTogRJpE8pJ6BHALUP5nTxiSwnkOScnmGTAupClJPCNKP/+vYloJAA4ZFjoWBXEhWPsCTyrPkf/VSrTEEk22LwIs0qCJVR4ChMPygSAPknFIoJtQTH/AQJecQ5IDGuj/2y1TEFNRTMuOTkuNVVVVVVVVVVVVVVVVVVVpAAAgAAAPiQJHPs/5FKgoQCgAABUiS+nyxsaAadglwQFUlUrmUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVcQAAAAIy8NYgAAAHlp56ACNuQRQWWUqTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrgAAFNcQgc0AAAC14AAlbgmdVMQU1FMy45OS41VVVVVVX/+1Bk9oER4htK4yEZwCfBeVw9AycF4CEnLCRigHsA5WUAgARVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVgAAAS6HUNUxBTUUzLjk5LjVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVKTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//swZPOBEUQESTIJGAAXYLk4YEMSA1AHLYwEACAxASTU8QAEqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQRPAHMH0BycjpAAgK4Dk4QSABQIgFJqWAACgZAGUVAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqTEFNRTMuOTkuNaqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xBk6QdwQAFJweAACgYgOSUwIAHAsAcnB4QAKAoA5ECwAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqpMQU1FMy45OS41qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EGTmh3A7Asop4RAOBGAZNRQAAUB8AyahAAAoBwCjwLAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqkxBTUUzLjk5LjWqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQZOEH8CYBSajgAAwAAA/wAAABACwBKAAAACABgGVAEAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xBk3g/wAwDJgCAACAAAD/AAAAEAAAH+AAAAIAAAP8AAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EETdj/AAAH+AAAAIAAAP8AAAAQAAAf4AAAAgAAA/wAAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQZN2P8AAAf4AAAAgAAA/wAAABAAAB/gAAACAAAD/AAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqr/+xBk3Y/wAAB/gAAACAAAD/AAAAEAAAH+AAAAIAAAP8AAAASqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqv/7EETdj/AAAH+AAAAIAAAP8AAAAQAAAf4AAAAgAAA/wAAABKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq//sQZN2P8AAAf4AAAAgAAA/wAAABAAABpAAAACAAADSAAAAEqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqo=",volume:e=.4}={}){this._soundUrl=t,this._volume=Math.min(1,Math.max(0,e)),this._enabled=!0,this._audioCtx=null,this._audioBuffer=null,this._loadPromise=null,t&&(this._loadPromise=this._loadAudioFile(t))}setEnabled(t){this._enabled=Boolean(t)}setVolume(t){this._volume=Math.min(1,Math.max(0,t))}async play(){if(this._enabled&&"undefined"!=typeof window)try{this._soundUrl?await this._playFile():await this._playSynthetic()}catch{}}_getAudioContext(){if(!this._audioCtx||"closed"===this._audioCtx.state){const t=window.AudioContext||window.webkitAudioContext;if(!t)return null;this._audioCtx=new t}return this._audioCtx}async _playSynthetic(){const t=this._getAudioContext();if(!t)return;"suspended"===t.state&&await t.resume();const e=t.currentTime,n=this._volume;[{freq:880,start:0,end:.08},{freq:1100,start:.06,end:.16}].forEach(({freq:i,start:a,end:s})=>{const o=t.createOscillator(),r=t.createGain();o.type="sine",o.frequency.value=i,r.gain.setValueAtTime(0,e+a),r.gain.linearRampToValueAtTime(n,e+a+.01),r.gain.linearRampToValueAtTime(0,e+s),o.connect(r),r.connect(t.destination),o.start(e+a),o.stop(e+s+.01)})}async _loadAudioFile(t){try{const e=this._getAudioContext();if(!e)return;const n=await fetch(t),i=await n.arrayBuffer();this._audioBuffer=await e.decodeAudioData(i)}catch{this._soundUrl=null}}async _playFile(){if(this._loadPromise&&(await this._loadPromise,this._loadPromise=null),!this._audioBuffer)return void this._playSynthetic();const t=this._getAudioContext();if(!t)return;"suspended"===t.state&&await t.resume();const e=t.createBufferSource(),n=t.createGain();e.buffer=this._audioBuffer,n.gain.value=this._volume,e.connect(n),n.connect(t.destination),e.start()}}class M{constructor(t={}){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=t.teamName||"Support",this.teamAvatars=t.teamAvatars||[],this.greetingMessage=t.greetingMessage||"Hi there 👋",this.welcomeMessage=t.welcomeMessage||"How can we help?",this.startButtonText=t.startButtonText||"Send us a message",this.showAvatars=!1!==t.showAvatars,this.metadata=t.metadata||null,this.isIdentified=!1,this.pendingMessage=null,this.enableHelp=!1!==t.enableHelp,this.enableChangelog=!1!==t.enableChangelog,this.homeModuleEnabled=!1!==t.homeModuleEnabled,this.messagesModuleEnabled=!1!==t.messagesModuleEnabled,this.requireEmailBeforeChat=t.requireEmailBeforeChat||!1,this.allowAttachments=!1!==t.allowAttachments,this.allowEmoji=!1!==t.allowEmoji,this.showReplyTime=!1!==t.showReplyTime,this.agentsOnline=!1,this.onlineCount=0,this.onlineMessage=t.onlineMessage||"We're online now",this.responseTime=t.responseTime||"We typically reply within a few minutes",this.businessHoursState=t.businessHoursState||null,this.nextOpenAt=t.nextOpenAt||null,this.holidayName=t.holidayName||null,this.typingUsers={},this.isLoading=!1,this.isLoadingMessages=!1,this.urls=t.urls||{feedback:null,changelog:null,help:null,roadmap:null},this._listeners=new Set}subscribe(t){return this._listeners.add(t),()=>this._listeners.delete(t)}_notify(t,e){this._listeners.forEach(n=>n(t,e,this))}setView(t){const e=this.currentView;this.currentView=t,this._notify("viewChange",{previousView:e,currentView:t})}setOpen(t){this.isOpen=t,this._notify("openChange",{isOpen:t})}setActiveConversation(t){const e=this.activeConversationId;this.activeConversationId=t,this._notify("conversationChange",{conversationId:t,previousConversationId:e})}setIdentified(t,e=null){this.isIdentified=t,e&&(this.metadata={...this.metadata,...e}),this._notify("identificationChange",{isIdentified:t,metadata:e})}setConversations(t){this.conversations=t,this._updateUnreadCount(),this._notify("conversationsUpdate",{conversations:t})}addConversation(t){this.conversations.unshift(t),this._updateUnreadCount(),this._notify("conversationAdded",{conversation:t})}setMessages(t,e){this.messages[t]=e,this._notify("messagesUpdate",{conversationId:t,messages:e})}_getMessageAttachmentsSignature(t){return Array.isArray(t?.attachments)&&0!==t.attachments.length?t.attachments.map(t=>`${t?.type||""}:${t?.name||""}`).join("|"):""}_findOptimisticMatchIndex(t,e,n){const i=this.messages[t]||[],a=Date.parse(e.timestamp),s=this._getMessageAttachmentsSignature(e);for(let t=i.length-1;t>=0;t--){const o=i[t];if(!o?.isOptimistic||!o?.isOwn)continue;if((o.content||"")!==(e.content||""))continue;if(this._getMessageAttachmentsSignature(o)!==s)continue;const r=Date.parse(o.timestamp);if(Number.isNaN(a)||Number.isNaN(r)||Math.abs(a-r)<=n)return t}return-1}_updateConversationFromMessage(t,e,n){const i=this.conversations.find(e=>e.id===t);i&&(i.lastMessage=e.content,i.lastMessageTime=e.timestamp,n&&!e.isOwn&&(i.unread=(i.unread||0)+1,this._updateUnreadCount()))}upsertMessage(t,e,n={}){this.messages[t]||(this.messages[t]=[]);const i=!0===n.reconcileOwnOptimistic,a=n.optimisticMatchWindowMs||3e4,s=this.messages[t],o=null!=e?.id?s.findIndex(t=>t?.id===e.id):-1;if(-1!==o)return s[o]={...s[o],...e,isOptimistic:!1},this._updateConversationFromMessage(t,s[o],!1),this._notify("messagesUpdate",{conversationId:t,messages:[...s]}),s[o];if(i&&e?.isOwn){const n=this._findOptimisticMatchIndex(t,e,a);if(-1!==n)return s[n]={...s[n],...e,isOptimistic:!1},this._updateConversationFromMessage(t,s[n],!1),this._notify("messagesUpdate",{conversationId:t,messages:[...s]}),s[n]}const r={...e,isOptimistic:Boolean(e?.isOptimistic)};return s.push(r),this._updateConversationFromMessage(t,r,!0),this._notify("messageAdded",{conversationId:t,message:r}),r}addMessage(t,e){return this.upsertMessage(t,e)}updateConversation(t,e){const n=this.conversations.find(e=>e.id===t);return n?(Object.assign(n,e),this._notify("conversationUpdated",{conversationId:t,conversation:n}),n):null}markAsRead(t){const e=this.conversations.find(e=>e.id===t);e&&e.unread>0&&(e.unread=0,this._updateUnreadCount(),this._notify("conversationRead",{conversationId:t}))}_updateUnreadCount(){this.unreadCount=this.conversations.reduce((t,e)=>t+(e.unread||0),0),this._notify("unreadCountChange",{count:this.unreadCount})}setHelpArticles(t){this.helpArticles=t,this._notify("helpArticlesUpdate",{articles:t})}setHelpSearchQuery(t){this.helpSearchQuery=t,this._notify("helpSearchChange",{query:t})}setHomeChangelogItems(t){this.homeChangelogItems=t,this._notify("homeChangelogUpdate",{items:t})}setChangelogItems(t){this.changelogItems=t,this._notify("changelogUpdate",{items:t})}getActiveConversation(){return this.conversations.find(t=>t.id===this.activeConversationId)}getActiveMessages(){return this.messages[this.activeConversationId]||[]}setTeamAvatarsFromAgents(t){t&&0!==t.length&&(this.teamAvatars=t.map(t=>t.picture?t.picture:t.full_name||"?"),this._notify("teamAvatarsUpdate",{teamAvatars:this.teamAvatars}))}getFilteredHelpArticles(){if(!this.helpSearchQuery)return this.helpArticles;const t=this.helpSearchQuery.toLowerCase();return this.helpArticles.filter(e=>e.title.toLowerCase().includes(t)||e.description&&e.description.toLowerCase().includes(t))}reset(){const t=this.currentView;this.currentView="home",this.activeConversationId=null,this.helpSearchQuery="","home"!==t&&this._notify("viewChange",{previousView:t,currentView:"home"}),this._notify("reset",{})}}class O{constructor(t,e={}){this.state=t,this.options={position:e.position||"right",primaryColor:e.primaryColor||"#155EEF",...e},this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className=`liveChat-launcher liveChat-launcher-${this.options.position}`,this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe((t,e)=>{"openChange"===t&&this._updateIcon(),"unreadCountChange"===t&&this._updateBadge()}),this.element}_updateContent(){const t=this.state.unreadCount>0?`<span class="liveChat-launcher-badge">${this.state.unreadCount>9?"9+":this.state.unreadCount}</span>`:"";this.element.innerHTML=`\n <button class="liveChat-launcher-btn" aria-label="Open live chat">\n <span class="liveChat-launcher-icon liveChat-launcher-icon-chat">\n <iconify-icon icon="ph:chats-circle" width="24" height="24"></iconify-icon>\n </span>\n <span class="liveChat-launcher-icon liveChat-launcher-icon-close" style="display: none;">\n <iconify-icon icon="ph:caret-down-bold" width="22" height="22"></iconify-icon>\n </span>\n ${t}\n </button>\n `;const e=this.element.querySelector(".liveChat-launcher-btn");e&&this.options.primaryColor&&e.style.setProperty("background",this.options.primaryColor,"important")}_attachEvents(){this.element.querySelector(".liveChat-launcher-btn").addEventListener("click",()=>{this.state.setOpen(!this.state.isOpen)})}_updateIcon(){const t=this.element.querySelector(".liveChat-launcher-icon-chat"),e=this.element.querySelector(".liveChat-launcher-icon-close");this.state.isOpen?(t.style.display="none",e.style.display="flex",this.element.classList.add("liveChat-launcher-open")):(t.style.display="flex",e.style.display="none",this.element.classList.remove("liveChat-launcher-open"))}_updateBadge(){const t=this.element.querySelector(".liveChat-launcher-badge");if(t&&t.remove(),this.state.unreadCount>0&&!this.state.isOpen){const t=document.createElement("span");t.className="liveChat-launcher-badge",t.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,this.element.querySelector(".liveChat-launcher-btn").appendChild(t)}}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 z{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-panel-nav",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(t=>{"viewChange"===t||"unreadCountChange"===t?this._updateActiveTab():"settingsUpdate"===t&&(this._updateContent(),this._updateActiveTab())}),this.element}_getTabs(){const t=[];return!1!==this.state.homeModuleEnabled&&t.push({id:"home",label:"Home",icon:"ph:house-simple"}),!1!==this.state.messagesModuleEnabled&&t.push({id:"messages",label:"Messages",icon:"ph:chats",badge:this.state.unreadCount}),this.state.enableHelp&&t.push({id:"help",label:"Help",icon:"ph:books"}),this.state.enableChangelog&&t.push({id:"changelog",label:"Updates",icon:"ph:megaphone"}),t}_updateContent(){const t=this._getTabs().map(t=>{const e=this.state.currentView===t.id,n=t.badge&&t.badge>0?`<span class="liveChat-nav-badge">${t.badge>9?"9+":t.badge}</span>`:"";return`\n\t\t\t\t\t<button class="liveChat-nav-tab ${e?"active":""}" data-tab="${t.id}">\n\t\t\t\t\t\t<span class="liveChat-nav-icon">\n\t\t\t\t\t\t\t<iconify-icon icon="${t.icon}" width="22" height="22"></iconify-icon>\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span class="liveChat-nav-label">${t.label}</span>\n\t\t\t\t\t\t${n}\n\t\t\t\t\t</button>\n\t\t\t\t`}).join("");this.element.innerHTML=`\n\t\t\t<div class="liveChat-nav-tabs">\n\t\t\t\t${t}\n\t\t\t</div>\n\t\t\t<div class="liveChat-nav-footer">\n\t\t\t\t<a href="https://product7.io" target="_blank" rel="noopener noreferrer" class="liveChat-powered-by">\n\t\t\t\t\t<svg width="12" height="14" viewBox="0 0 28 32" fill="none" xmlns="http://www.w3.org/2000/svg">\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.0615 5.28044C8.5161 4.42949 3.30825 11.1456 5.89967 17.6588C6.9321 20.2538 9.06268 22.2644 11.8777 23.1968C16.2682 24.6507 18.4038 22.3222 19.0483 23.9691C19.4055 24.8894 18.7282 25.3209 17.988 25.4938C10.9146 27.15 5.15304 22.7566 3.5869 17.5531C1.52205 10.6941 5.98684 4.6667 11.3483 3.41065C17.8801 1.88094 24.0325 6.19355 24.3926 12.7175C24.7448 19.0921 18.6217 24.5978 11.927 22.2036C10.8789 21.8285 8.8419 20.6682 8.46823 19.858C8.06026 18.9727 8.80261 18.1725 9.68285 18.3576C10.2223 18.4726 10.3116 18.8706 11.3161 19.5372C14.4549 21.6213 19.1276 20.6132 21.2046 17.0972C23.991 12.3817 21.0481 6.05351 15.06 5.27758L15.0615 5.28044Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.2492 2.19833C11.944 1.71463 8.88819 3.07214 6.91479 4.49682C2.27067 7.85488 0.76169 14.5038 3.49672 19.8731C4.08535 21.0096 4.84379 22.0497 5.7459 22.9576L7.16343 24.2515C7.67214 24.9131 7.27203 25.7176 6.64115 25.9269C5.13502 26.4271 2.0499 21.8172 1.42044 20.5383C0.0872204 17.8297 -0.312889 14.9047 0.242977 11.503C1.66908 2.77063 11.221 -2.51652 19.7197 1.21021C27.7548 4.73331 30.2733 15.4555 23.9351 22.0773C23.3107 22.7296 21.6352 24.4823 20.6278 23.8907C20.0076 23.5263 19.8933 22.6446 20.5192 22.1238C21.0301 21.6986 21.4759 21.435 21.9896 20.9734C23.6665 19.4688 25.2562 16.8752 25.3477 13.5636C25.4427 10.2055 24.1266 7.5848 22.3904 5.74859C20.6392 3.89665 18.6751 2.69919 15.2456 2.19691L15.2492 2.19833Z" fill="#F69F06"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M8.48332 27.2217C7.93817 26.265 8.89987 25.3776 10.1352 25.8641C15.5653 27.9926 18.3081 25.5269 19.0255 27.0823C19.2655 27.6039 19.0448 28.1619 18.7354 28.3863C17.9895 28.9257 14.82 28.9343 13.9262 28.8714C12.9071 28.8053 11.897 28.6377 10.9111 28.3713C10.0888 28.1348 8.88057 27.9247 8.48189 27.2281L8.48332 27.2217Z" fill="#21244A"/>\n\t\t\t\t\t\t<path fill-rule="evenodd" clip-rule="evenodd" d="M15.8722 31.0607C15.7765 32.1381 14.579 32.0331 13.5766 31.9545C12.5742 31.8759 11.5203 31.8502 11.601 30.7013C11.6789 29.5882 12.8035 29.7532 13.8274 29.8332C14.4425 29.8811 15.9951 29.681 15.8722 31.0607Z" fill="#21244A"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\tPowered by <strong>Product7</strong>\n\t\t\t\t</a>\n\t\t\t</div>\n\t\t`}_attachEvents(){this.element.addEventListener("click",t=>{const e=t.target.closest(".liveChat-nav-tab");if(e){const t=e.dataset.tab;this.state.setView(t)}})}_updateActiveTab(){this.element.querySelectorAll(".liveChat-nav-tab").forEach(t=>{const e=t.dataset.tab===this.state.currentView;if(t.classList.toggle("active",e),"messages"===t.dataset.tab){const e=t.querySelector(".liveChat-nav-badge");if(e&&e.remove(),this.state.unreadCount>0){const e=document.createElement("span");e.className="liveChat-nav-badge",e.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,t.appendChild(e)}}})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class V{constructor(t,e={}){this.state=t,this.options={position:e.position||"right",...e},this.element=null,this.navigationTabs=null,this.currentViewComponent=null,this.viewRegistry={},this._unsubscribe=null,this._expanded=!1}registerView(t,e){this.viewRegistry[t]=e}render(){this.element=document.createElement("div"),this.element.className=`liveChat-panel liveChat-panel-${this.options.position}`,this.element.innerHTML='\n\t\t\t<div class="liveChat-panel-content">\n\t\t\t\t<div class="liveChat-panel-views"></div>\n\t\t\t\t<div class="liveChat-panel-nav"></div>\n\t\t\t</div>\n\t\t',this.options.onToggleExpand=()=>this._toggleExpand(),this.options.isExpanded=()=>this._expanded,this.navigationTabs=new z(this.state,this.options);return this.element.querySelector(".liveChat-panel-nav").appendChild(this.navigationTabs.render()),this._renderCurrentView(),this._unsubscribe=this.state.subscribe(t=>{"viewChange"===t&&this._renderCurrentView()}),this.element}_toggleExpand(){this._expanded=!this._expanded,this.element.classList.toggle("liveChat-panel-expanded",this._expanded);const t=this.element.querySelector(".liveChat-expand-window-btn iconify-icon"),e=this.element.querySelector(".liveChat-expand-window-btn span");t&&t.setAttribute("icon",this._expanded?"ph:arrows-in":"ph:arrows-out"),e&&(e.textContent=this._expanded?"Collapse window":"Expand window")}_renderCurrentView(){const t=this.element.querySelector(".liveChat-panel-views"),e=this.element.querySelector(".liveChat-panel-nav");this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),t.innerHTML="","chat"!==this.state.currentView&&this._expanded&&(this._expanded=!1,this.element.classList.remove("liveChat-panel-expanded"));const n=this.viewRegistry[this.state.currentView];if(n?(this.currentViewComponent=new n(this.state,this.options),t.appendChild(this.currentViewComponent.render())):t.innerHTML=`<div class="liveChat-empty-state">\n\t\t\t\t<p>View not found: ${this.state.currentView}</p>\n\t\t\t</div>`,e){const t="chat"===this.state.currentView||"prechat"===this.state.currentView||"feedback"===this.state.currentView;e.style.display=t?"none":""}}show(){this.element&&requestAnimationFrame(()=>{this.element.classList.add("open")})}hide(){this.element&&this.element.classList.remove("open")}setHeader(t){const e=this.element.querySelector(".liveChat-panel-header");e&&(e.innerHTML=t)}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 F{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null,this._headerBg="linear-gradient(180deg, #f0f4ff 0%, #ffffff 100%)"}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-changelog-view",this._updateContent(),this._unsubscribe=this.state.subscribe(t=>{"changelogUpdate"===t&&this._updateChangelogList()}),this.element}_updateContent(){this.element.innerHTML='\n\t\t\t<div class="liveChat-changelog-header">\n\t\t\t\t<div class="liveChat-changelog-header-top">\n\t\t\t\t\t<h2>Latest Updates</h2>\n\t\t\t\t\t<button class="sdk-close-btn liveChat-changelog-close-btn liveChat-mobile-close-btn" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-changelog-body">\n\t\t\t\t<div class="liveChat-changelog-list"></div>\n\t\t\t</div>\n\t\t',this._updateChangelogList(),this._attachEvents()}_updateChangelogList(){const t=this.element.querySelector(".liveChat-changelog-list"),e=this.state.changelogItems;0!==e.length?(t.innerHTML=e.map(t=>this._renderChangelogCard(t)).join(""),this._attachChangelogEvents()):t.innerHTML=this._renderEmptyState()}_stripHtml(t){if(!t)return"";const e=document.createElement("div");return e.innerHTML=t,(e.textContent||e.innerText||"").trim()}_renderChangelogCard(t){return`\n\t\t\t<div class="liveChat-changelog-card" data-changelog-id="${t.id}">\n\t\t\t\t${t.coverImage?`<div class="liveChat-changelog-thumb"><img src="${t.coverImage}" alt="${t.title}" onerror="this.parentElement.style.display='none';" /></div>`:""}\n\t\t\t\t<div class="liveChat-changelog-content">\n\t\t\t\t\t<h3 class="liveChat-changelog-title">${t.title}</h3>\n\t\t\t\t\t${t.description?`<p class="liveChat-changelog-description">${this._stripHtml(t.description)}</p>`:""}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_getContrastColor(t){const e=t.replace("#","");return(.299*parseInt(e.substring(0,2),16)+.587*parseInt(e.substring(2,4),16)+.114*parseInt(e.substring(4,6),16))/255>.5?"#374151":"#ffffff"}_renderEmptyState(){return'\n\t\t\t<div class="liveChat-empty-state">\n\t\t\t\t<div class="liveChat-empty-state-icon">\n\t\t\t\t\t<iconify-icon icon="ph:megaphone" width="48" height="48"></iconify-icon>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t'}_formatDate(t){if(!t)return"";return new Date(t).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}_truncateText(t,e){return t?t.length<=e?t:t.substring(0,e).trim()+"...":""}_attachEvents(){const t=this.element.querySelector(".liveChat-changelog-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)}),this._attachChangelogEvents()}_attachChangelogEvents(){this.element.querySelectorAll(".liveChat-changelog-card").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.changelogId,n=this.state.changelogItems.find(t=>t.id===e);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 P{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null,this._typingTimeout=null,this._isTyping=!1,this._typingIndicator=null,this._isConversationClosed=!1,this._pendingAttachments=[],this._emojiPickerOpen=!1,this._emojiOutsideHandler=null,this._menuOutsideHandler=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-chat-view",this._updateContent(),this._unsubscribe=this.state.subscribe((t,e)=>{if("connectionChange"===t){const t=this.element?.querySelector(".liveChat-connection-banner");return void(t&&(t.style.display=e.connected?"none":"flex"))}"messageAdded"===t&&e.conversationId===this.state.activeConversationId?(this._hideTypingIndicator(),this._appendMessage(e.message)):"typingStarted"===t&&e.conversationId===this.state.activeConversationId?this._showTypingIndicator(e.userName):"typingStopped"===t&&e.conversationId===this.state.activeConversationId?this._hideTypingIndicator():("conversationUpdated"===t&&e.conversationId===this.state.activeConversationId||"messagesUpdate"===t&&e.conversationId===this.state.activeConversationId||"settingsUpdate"===t)&&this._updateContent()}),this.element}_updateContent(){const t=this.state.getActiveConversation(),e=this.state.getActiveMessages(),n=!this.state.activeConversationId,i=!n&&"closed"===t?.status;this._isConversationClosed=i;const a=0===e.length?this._renderEmptyState(n):this._renderGroupedMessages(e),s=this.options.composePlaceholder||"Write a message...",o=n?this.options.composePlaceholder||"Start typing your message...":i?"Conversation closed":s,r=this.options.logoUrl,l=this.state.teamName||"Support",c=r?`<img src="${this._escapeHtml(r)}" alt="${this._escapeHtml(l)}" />`:'<iconify-icon icon="ph:chats-circle" width="20" height="20"></iconify-icon>',d=this.options.isExpanded?.()??!1,h=d?"ph:arrows-in":"ph:arrows-out",p=d?"Collapse window":"Expand window";this.element.innerHTML=`\n\t\t\t<div class="liveChat-chat-header">\n\t\t\t\t<button class="sdk-btn-icon liveChat-back-btn" aria-label="Back">\n\t\t\t\t\t<iconify-icon icon="ph:arrow-left" width="20" height="20"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<div class="liveChat-chat-header-avatar">\n\t\t\t\t\t${c}\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-chat-header-info">\n\t\t\t\t\t<span class="liveChat-chat-title">${this._escapeHtml(l)}</span>\n\t\t\t\t\t${i||!1!==this.state.showReplyTime?`<span class="liveChat-chat-subtitle">${i?"Conversation resolved":this.state.responseTime||"Typically replies within minutes"}</span>`:""}\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-chat-header-actions">\n\t\t\t\t\t<div class="liveChat-chat-menu-wrapper">\n\t\t\t\t\t\t<button class="sdk-btn-icon liveChat-chat-menu-btn" aria-label="Options">\n\t\t\t\t\t\t\t<iconify-icon icon="ph:dots-three" width="20" height="20"></iconify-icon>\n\t\t\t\t\t\t</button>\n\t\t\t\t\t\t<div class="liveChat-chat-menu-dropdown">\n\t\t\t\t\t\t\t<button class="liveChat-chat-menu-item liveChat-expand-window-btn">\n\t\t\t\t\t\t\t\t<iconify-icon icon="${h}" width="16" height="16"></iconify-icon>\n\t\t\t\t\t\t\t\t<span>${p}</span>\n\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="sdk-btn-icon sdk-close-btn liveChat-mobile-close-btn" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-connection-banner" style="display:none;">\n\t\t\t\t<iconify-icon icon="ph:wifi-slash" width="14" height="14"></iconify-icon>\n\t\t\t\t<span>Reconnecting…</span>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-chat-messages">\n\t\t\t\t${a}\n\t\t\t\t${i?'\n\t\t\t\t<div class="liveChat-closed-banner">\n\t\t\t\t\t<iconify-icon icon="ph:check-circle" width="18" height="18"></iconify-icon>\n\t\t\t\t\t<span>This conversation has been resolved</span>\n\t\t\t\t</div>\n\t\t\t\t':""}\n\t\t\t\t<div class="liveChat-typing-indicator">\n\t\t\t\t\t<div class="liveChat-typing-dots">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class="liveChat-typing-text"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="liveChat-scroll-pill" style="display:none;">\n\t\t\t\t<iconify-icon icon="ph:arrow-down" width="14" height="14"></iconify-icon>\n\t\t\t\t<span>New message</span>\n\t\t\t</div>\n\n\t\t\t${i?"":`\n\t\t\t<div class="liveChat-compose-attachments-preview"></div>\n\n\t\t\t<div class="liveChat-chat-compose">\n\t\t\t\t<div class="liveChat-compose-input-wrapper">\n\t\t\t\t\t<textarea class="liveChat-compose-input" placeholder="${o}" rows="1"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-compose-bottom">\n\t\t\t\t\t<div class="liveChat-compose-actions">\n\t\t\t\t\t\t${!1!==this.state.allowAttachments?'<button class="sdk-btn-icon liveChat-compose-attach" aria-label="Attach file"><iconify-icon icon="ph:paperclip" width="20" height="20"></iconify-icon></button>':""}\n\t\t\t\t\t\t${!1!==this.state.allowEmoji?'<button class="sdk-btn-icon liveChat-emoji-btn" aria-label="Emoji"><iconify-icon icon="ph:smiley" width="20" height="20"></iconify-icon></button>':""}\n\t\t\t\t\t</div>\n\t\t\t\t\t<button class="liveChat-compose-send" aria-label="Send" disabled>\n\t\t\t\t\t\t<iconify-icon icon="ph:paper-plane-right" width="20" height="20"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t${!1!==this.state.allowAttachments?'<input type="file" class="liveChat-compose-file-input" multiple accept="image/*,.pdf,.doc,.docx,.xls,.xlsx,.txt,.zip" />':""}\n\t\t\t</div>\n\t\t\t`}\n\t\t`,this._typingIndicator=this.element.querySelector(".liveChat-typing-indicator"),this._attachEvents(),this._scrollToBottom(),this._renderAttachmentPreviews(),this._setupScrollPill()}_renderEmptyState(t=!1){const e=this.options.logoUrl;return`\n\t\t\t<div class="liveChat-chat-empty">\n\t\t\t\t${e?`<div class="liveChat-chat-empty-logo"><img src="${this._escapeHtml(e)}" alt="${this._escapeHtml(this.state.teamName)}" /></div>`:""}\n\t\t\t\t<h3>${t?"Start a new conversation":"Start the conversation"}</h3>\n\t\t\t</div>\n\t\t`}_renderMessageAttachments(t){return t&&0!==t.length?t.map(t=>"image"===t.type?`<img class="liveChat-message-image" src="${this._escapeHtml(t.url)}" alt="${this._escapeHtml(t.name||"image")}" data-url="${this._escapeHtml(t.url)}" />`:`<a class="liveChat-message-file" href="${this._escapeHtml(t.url)}" data-url="${this._escapeHtml(t.url)}" data-name="${this._escapeHtml(t.name||"file")}">\n\t\t\t\t<iconify-icon icon="ph:file" width="18" height="18"></iconify-icon>\n\t\t\t\t<span>${this._escapeHtml(t.name||"file")}</span>\n\t\t\t\t<iconify-icon icon="ph:download-simple" width="16" height="16" class="liveChat-file-download-icon"></iconify-icon>\n\t\t\t</a>`).join(""):""}_renderMessage(t,e=!0){if(t.isSystem)return this._renderSystemMessage(t);const n=t.isOwn,i=n?"liveChat-message-own":"liveChat-message-received",a=e?this._formatMessageTime(t.timestamp):"",s=this._renderMessageAttachments(t.attachments),o=t.isOptimistic,r=t.content?`<div class="liveChat-message-content">${this._formatMessageContent(t.content)}</div>`:"",l=r?`<div class="liveChat-message-bubble">${r}</div>`:"";if(n){return`\n\t\t\t\t<div class="liveChat-message ${i}${o?" liveChat-message-optimistic":""}">\n\t\t\t\t\t${l}\n\t\t\t\t\t${s}\n\t\t\t\t\t${e?`<div class="liveChat-message-meta liveChat-message-meta-own">\n\t\t\t\t\t\t${o?'<span class="liveChat-message-sent-status">Sending…</span>':'<span class="liveChat-message-sent-status">Sent</span>'}\n\t\t\t\t\t\t${a?`<span>·</span><span>${a}</span>`:""}\n\t\t\t\t\t</div>`:""}\n\t\t\t\t</div>\n\t\t\t`}return`\n\t\t\t<div class="liveChat-message ${i}">\n\t\t\t\t<div class="liveChat-message-row">\n\t\t\t\t\t<div class="liveChat-message-avatar">${this._renderSenderAvatar(t.sender)}</div>\n\t\t\t\t\t<div class="liveChat-message-wrapper">\n\t\t\t\t\t\t${l}\n\t\t\t\t\t\t${s}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${a?`<div class="liveChat-message-meta"><span>${a}</span></div>`:""}\n\t\t\t</div>\n\t\t`}_renderSystemMessage(t){const e=t.content||"";if((e.includes("joined the chat")||e.includes("left the chat")||e.includes("joined the conversation")||e.includes("left the conversation"))&&t.sender){const n=t.sender.name||"",i=n.split(" ").map(t=>t.charAt(0).toUpperCase()+t.slice(1)).join(" "),a=this.options.logoUrl,s=a?`<img src="${this._escapeHtml(a)}" alt="logo" />`:i.charAt(0).toUpperCase(),o=this._formatMessageTime(t.timestamp),r=e.replace(n,"").trim(),l=r.charAt(0).toUpperCase()+r.slice(1);return`\n\t\t\t\t<div class="liveChat-message-system-event">\n\t\t\t\t\t<div class="liveChat-message-system-event-avatar">${s}</div>\n\t\t\t\t\t<span class="liveChat-message-system-event-name">${this._escapeHtml(i)}</span>\n\t\t\t\t\t<span class="liveChat-message-system-event-action">${this._escapeHtml(l)}</span>\n\t\t\t\t\t${o?`<span class="liveChat-message-system-event-time">${o}</span>`:""}\n\t\t\t\t</div>\n\t\t\t`}const n=this.state.teamName||"Support",i=this.options.logoUrl,a=i?`<div class="sdk-avatar sdk-avatar-sm"><img src="${this._escapeHtml(i)}" alt="${this._escapeHtml(n)}" /></div>`:`<div class="sdk-avatar sdk-avatar-sm">${n.charAt(0).toUpperCase()}</div>`,s=this._formatMessageTime(t.timestamp);return`\n\t\t\t<div class="liveChat-message liveChat-message-received">\n\t\t\t\t<div class="liveChat-message-row">\n\t\t\t\t\t<div class="liveChat-message-avatar">${a}</div>\n\t\t\t\t\t<div class="liveChat-message-wrapper">\n\t\t\t\t\t\t<div class="liveChat-message-bubble">\n\t\t\t\t\t\t\t<div class="liveChat-message-content">${this._formatMessageContent(e)}</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t${s?`<div class="liveChat-message-meta"><span>${s}</span></div>`:""}\n\t\t\t</div>\n\t\t`}_renderSenderAvatar(t){if(t?.avatarUrl)return`<div class="sdk-avatar sdk-avatar-sm"><img src="${t.avatarUrl}" alt="${t.name}" /></div>`;return`<div class="sdk-avatar sdk-avatar-sm">${(t?.name||"S").charAt(0).toUpperCase()}</div>`}_renderTeamAvatars(){const t=this.state.teamAvatars;if(!t||0===t.length)return"";return`<div class="liveChat-avatar-stack">${t.slice(0,3).map(t=>"string"==typeof t&&t.startsWith("http")?`<div class="sdk-avatar sdk-avatar-md"><img src="${t}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-md">${t.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_formatMessageTime(t){if(!t)return"";const e=new Date(t);return`${e.toLocaleDateString("en-GB",{day:"2-digit",month:"short",year:"numeric"})}, ${e.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit",hour12:!1})}`}_formatMessageContent(t){return t?t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/\n/g,"<br>"):""}_appendMessage(t){const e=this.element.querySelector(".liveChat-chat-messages"),n=e.querySelector(".liveChat-chat-empty");n&&n.remove();const i=this._renderMessage(t),a=document.createElement("div");a.innerHTML=i,e.appendChild(a.firstElementChild);if(e.scrollHeight-e.scrollTop-e.clientHeight<80)this._scrollToBottom();else if(!t.isOwn){const t=this.element.querySelector(".liveChat-scroll-pill");t&&(t.style.display="flex")}}_scrollToBottom(){const t=this.element.querySelector(".liveChat-chat-messages");t&&setTimeout(()=>{t.scrollTop=t.scrollHeight},50)}_setupScrollPill(){const t=this.element.querySelector(".liveChat-chat-messages"),e=this.element.querySelector(".liveChat-scroll-pill");t&&e&&(e.addEventListener("click",()=>{this._scrollToBottom(),e.style.display="none"}),t.addEventListener("scroll",()=>{t.scrollHeight-t.scrollTop-t.clientHeight<80&&(e.style.display="none")}))}_renderGroupedMessages(t){let e="";return t.forEach((n,i)=>{const a=i===t.length-1,s=t[i+1],o=n.timestamp?new Date(n.timestamp).getTime():0,r=s?.timestamp?new Date(s.timestamp).getTime():null,l=n.isSystem?"system":n.isOwn?"own":n.sender?.name||"agent",c=s?s.isSystem?"system":s.isOwn?"own":s.sender?.name||"agent":null,d=a||r&&r-o>3e5||s&&l!==c;e+=this._renderMessage(n,d)}),e}_updateSendButtonState(){const t=this.element.querySelector(".liveChat-compose-input"),e=this.element.querySelector(".liveChat-compose-send");t&&e&&(e.disabled=!t.value.trim()&&0===this._pendingAttachments.length)}_renderAttachmentPreviews(){const t=this.element.querySelector(".liveChat-compose-attachments-preview");if(t){if(0===this._pendingAttachments.length)return t.innerHTML="",void(t.style.display="none");t.style.display="flex",t.innerHTML=this._pendingAttachments.map((t,e)=>`\n\t\t\t\t<div class="liveChat-attachment-preview" data-index="${e}">\n\t\t\t\t\t${t.type.startsWith("image")?`<img class="liveChat-attachment-thumb" src="${t.preview}" alt="${this._escapeHtml(t.file.name)}" />`:'<div class="liveChat-attachment-thumb liveChat-attachment-file-icon"><iconify-icon icon="ph:file" width="24" height="24"></iconify-icon></div>'}\n\t\t\t\t\t<button class="liveChat-attachment-remove" data-index="${e}" aria-label="Remove">×</button>\n\t\t\t\t</div>\n\t\t\t`).join(""),t.querySelectorAll(".liveChat-attachment-remove").forEach(t=>{t.addEventListener("click",t=>{const e=parseInt(t.currentTarget.dataset.index,10);this._pendingAttachments.splice(e,1),this._renderAttachmentPreviews(),this._updateSendButtonState()})})}}_attachEvents(){this.element.querySelector(".liveChat-back-btn").addEventListener("click",()=>{this.state.setView("messages")});const t=this.element.querySelector(".liveChat-mobile-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".liveChat-chat-menu-btn"),n=this.element.querySelector(".liveChat-chat-menu-dropdown");e&&n&&e.addEventListener("click",t=>{t.stopPropagation(),n.classList.toggle("open"),n.classList.contains("open")&&null===this._menuOutsideHandler&&(this._menuOutsideHandler=t=>{n.contains(t.target)||e.contains(t.target)||(n.classList.remove("open"),document.removeEventListener("click",this._menuOutsideHandler),this._menuOutsideHandler=null)},setTimeout(()=>document.addEventListener("click",this._menuOutsideHandler),0))});const i=this.element.querySelector(".liveChat-expand-window-btn");i&&n&&i.addEventListener("click",()=>{n.classList.remove("open"),this._menuOutsideHandler&&(document.removeEventListener("click",this._menuOutsideHandler),this._menuOutsideHandler=null),this.options.onToggleExpand?.()});const a=this.element.querySelector(".liveChat-compose-input"),s=this.element.querySelector(".liveChat-compose-send");a&&s&&(a.addEventListener("input",()=>{a.style.height="auto",a.style.height=Math.min(a.scrollHeight,120)+"px",this._updateSendButtonState(),a.value.trim()&&this._startTyping()}),a.addEventListener("keydown",t=>{"Enter"!==t.key||t.shiftKey||(t.preventDefault(),this._sendMessage())}),s.addEventListener("click",()=>{this._sendMessage()}));const o=this.element.querySelector(".liveChat-emoji-btn");o&&o.addEventListener("click",t=>{t.stopPropagation(),this._toggleEmojiPicker()});const r=this.element.querySelector(".liveChat-compose-attach"),l=this.element.querySelector(".liveChat-compose-file-input");r&&l&&(r.addEventListener("click",()=>{l.click()}),l.addEventListener("change",t=>{const e=t.target.files;e&&(Array.from(e).forEach(t=>{const e=new FileReader;e.onload=e=>{this._pendingAttachments.push({file:t,preview:e.target.result,type:t.type}),this._renderAttachmentPreviews(),this._updateSendButtonState()},e.readAsDataURL(t)}),l.value="")}));const c=this.element.querySelector(".liveChat-chat-messages");c&&c.addEventListener("click",t=>{const e=t.target.closest(".liveChat-message-file");if(e){t.preventDefault();const n=e.dataset.url,i=e.dataset.name;return void this._downloadFile(n,i)}const n=t.target.closest(".liveChat-message-image");if(n){const t=n.dataset.url||n.src;window.open(t,"_blank")}})}async _downloadFile(t,e){try{const n=await fetch(t),i=await n.blob(),a=URL.createObjectURL(i),s=document.createElement("a");s.href=a,s.download=e||"download",s.style.display="none",document.body.appendChild(s),s.click(),document.body.removeChild(s),URL.revokeObjectURL(a)}catch{window.open(t,"_blank")}}_escapeHtml(t){return t?t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):""}async _sendMessage(){if(this._isConversationClosed)return;const t=this.element.querySelector(".liveChat-compose-input"),e=t.value.trim(),n=this._pendingAttachments.length>0;if(!e&&!n)return;this._stopTyping();const i=[...this._pendingAttachments];if(!this.state.activeConversationId)this.options.onStartConversation&&this.options.onStartConversation(e,i);else{const t={id:"msg_"+Date.now(),content:e,isOwn:!0,isOptimistic:!0,timestamp:(new Date).toISOString(),attachments:i.map(t=>({url:t.preview,type:t.type.startsWith("image")?"image":"file",name:t.file.name}))};this.state.addMessage(this.state.activeConversationId,t),this.options.onSendMessage&&this.options.onSendMessage(this.state.activeConversationId,t,i)}t.value="",t.style.height="auto",this._pendingAttachments=[],this._renderAttachmentPreviews(),this._updateSendButtonState()}_loadEmojiPicker(){return document.querySelector("#product7-emoji-picker-script")?Promise.resolve():new Promise((t,e)=>{const n=document.createElement("script");n.id="product7-emoji-picker-script",n.type="module",n.src="https://cdn.jsdelivr.net/npm/emoji-picker-element@1/index.js",n.onload=t,n.onerror=e,document.head.appendChild(n)})}async _toggleEmojiPicker(){const t=this.element.querySelector(".liveChat-emoji-picker-container");if(t)return t.remove(),this._emojiPickerOpen=!1,void(this._emojiOutsideHandler&&(document.removeEventListener("click",this._emojiOutsideHandler),this._emojiOutsideHandler=null));try{await this._loadEmojiPicker()}catch{return}const e=document.createElement("div");e.className="liveChat-emoji-picker-container";const n=document.createElement("emoji-picker");e.appendChild(n);const i=this.element.querySelector(".liveChat-chat-compose");i.parentNode.insertBefore(e,i),this._emojiPickerOpen=!0,n.addEventListener("emoji-click",t=>{this._insertEmoji(t.detail.unicode),e.remove(),this._emojiPickerOpen=!1,this._emojiOutsideHandler&&(document.removeEventListener("click",this._emojiOutsideHandler),this._emojiOutsideHandler=null)}),this._emojiOutsideHandler=t=>{e.contains(t.target)||t.target.closest(".liveChat-emoji-btn")||(e.remove(),this._emojiPickerOpen=!1,document.removeEventListener("click",this._emojiOutsideHandler),this._emojiOutsideHandler=null)},setTimeout(()=>document.addEventListener("click",this._emojiOutsideHandler),0)}_insertEmoji(t){const e=this.element.querySelector(".liveChat-compose-input");if(!e)return;const n=e.selectionStart,i=e.selectionEnd;e.value=e.value.slice(0,n)+t+e.value.slice(i),e.selectionStart=e.selectionEnd=n+t.length,e.focus(),e.dispatchEvent(new Event("input"))}_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(t){if(this._typingIndicator){this._typingIndicator.style.display="flex";const e=this._typingIndicator.querySelector(".liveChat-typing-text");e&&(e.textContent=`${t||"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._emojiOutsideHandler&&document.removeEventListener("click",this._emojiOutsideHandler),this._menuOutsideHandler&&document.removeEventListener("click",this._menuOutsideHandler),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class B{constructor(t,e={}){this.state=t,this.options=e,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="liveChat-view liveChat-conversations-view",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(t=>{"conversationsUpdate"!==t&&"conversationAdded"!==t&&"conversationRead"!==t&&"conversationUpdated"!==t||this._updateContent()}),this.element}_getAvatarColor(t){const e=(t||"S").charCodeAt(0);return this.avatarColors[e%this.avatarColors.length]}_updateContent(){const t=this.state.conversations;let e;e=0===t.length?'\n <div class="liveChat-empty-state">\n <div class="liveChat-empty-state-icon">\n <iconify-icon icon="ph:chat-circle" width="48" height="48"></iconify-icon>\n </div>\n <h3>No conversations yet</h3>\n <p>Start a new conversation with our team</p>\n </div>\n ':`\n <div class="liveChat-conversations-list">\n ${t.map(t=>this._renderConversationItem(t)).join("")}\n </div>\n `,this.element.innerHTML=`\n <div class="liveChat-conversations-header">\n <h2>Messages</h2>\n <button class="sdk-close-btn liveChat-mobile-close-btn" aria-label="Close">\n <iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n</button>\n </div>\n\n <div class="liveChat-conversations-body">\n ${e}\n </div>\n\n <div class="liveChat-conversations-footer">\n <button class="liveChat-new-message-btn">\n <iconify-icon icon="ph:pencil-simple" width="16" height="16" style="flex-shrink: 0; color: var(--msg-text-secondary);"></iconify-icon>\n <span style="flex: 1;">New conversation</span>\n <iconify-icon icon="ph:caret-right" width="16" height="16" style="flex-shrink: 0; color: var(--msg-text-tertiary);"></iconify-icon>\n </button>\n </div>\n `,this._attachEvents()}_renderConversationItem(t){const e="closed"===t.status,n=t.unread>0?"unread":"",i=e?"closed":"",a=this._formatTimeAgo(t.lastMessageTime),s=this._renderConversationAvatars(t.participants);return`\n\t\t\t<div class="liveChat-conversation-item ${n} ${i}" data-conversation-id="${t.id}">\n\t\t\t\t<div class="liveChat-conversation-avatars">\n\t\t\t\t\t${s}\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-conversation-content">\n\t\t\t\t\t<div class="liveChat-conversation-header">\n\t\t\t\t\t\t<span class="liveChat-conversation-title">${t.title||"Chat with team"}</span>\n\t\t\t\t\t\t<span class="liveChat-conversation-time">${a}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="liveChat-conversation-preview">\n\t\t\t\t\t\t${t.unread>0?'<span class="liveChat-unread-dot"></span>':""}\n\t\t\t\t\t\t${e?'<span class="liveChat-conversation-resolved-badge">Resolved</span>':""}\n\t\t\t\t\t\t<span class="liveChat-conversation-message">${this._truncateMessage(t.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderConversationAvatars(t){if(!t||0===t.length){return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor("S")};">S</div>`}const e=t[0];if(e.avatarUrl)return`<div class="sdk-avatar sdk-avatar-md"><img src="${e.avatarUrl}" alt="${e.name}" /></div>`;const n=(e.name||"S").charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-md" style="background-color: ${this._getAvatarColor(e.name)};">${n}</div>`}_renderAvatarStack(){const t=this.state.teamAvatars;if(!t||0===t.length){return`\n\t\t\t\t<div class="liveChat-avatar-stack">\n\t\t\t\t\t<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${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="liveChat-avatar-stack">${t.slice(0,2).map(t=>{if("string"==typeof t&&t.startsWith("http"))return`<div class="sdk-avatar sdk-avatar-sm"><img src="${t}" alt="Team member" /></div>`;const e=t.charAt(0).toUpperCase();return`<div class="sdk-avatar sdk-avatar-sm" style="background-color: ${this._getAvatarColor(t)};">${e}</div>`}).join("")}</div>`}_formatTimeAgo(t){if(!t)return"";const e=new Date(t),n=new Date-e,i=Math.floor(n/6e4),a=Math.floor(n/36e5),s=Math.floor(n/864e5);return i<1?"now":i<60?`${i}m`:a<24?`${a}h`:s<7?`${s}d`:e.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_truncateMessage(t){if(!t)return"No messages yet";return t.length<=50?t:t.substring(0,50)+"..."}_attachEvents(){const t=this.element.querySelector(".sdk-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelectorAll(".liveChat-conversation-item").forEach(t=>{t.addEventListener("click",()=>{const e=t.dataset.conversationId;this.state.setActiveConversation(e),this.state.markAsRead(e),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(e)})});const e=this.element.querySelector(".liveChat-new-message-btn");e&&e.addEventListener("click",()=>{this._startNewConversation()})}_startNewConversation(){const t=this.state.conversations.find(t=>"open"===t.status);t?(this.state.setActiveConversation(t.id),this.state.markAsRead(t.id),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t.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 D{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-help-view",this._updateContent(),this._unsubscribe=this.state.subscribe(t=>{"helpArticlesUpdate"!==t&&"helpSearchChange"!==t||this._updateCollectionsList()}),this.element}_updateContent(){const t=this.state.helpSearchQuery||"";this.element.innerHTML=`\n\t\t\t<div class="liveChat-help-header">\n\t\t\t\t<div class="liveChat-help-header-top">\n\t\t\t\t\t<h2>Help</h2>\n\t\t\t\t\t<button class="sdk-close-btn liveChat-help-close-btn liveChat-mobile-close-btn" aria-label="Close">\n\t\t\t\t\t\t<iconify-icon icon="ph:x" width="18" height="18"></iconify-icon>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="liveChat-help-search-wrap">\n\t\t\t\t\t<span class="liveChat-help-search-icon">\n\t\t\t\t\t\t<iconify-icon icon="ph:magnifying-glass" width="16" height="16"></iconify-icon>\n\t\t\t\t\t</span>\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\tclass="liveChat-help-search-input"\n\t\t\t\t\t\tplaceholder="Search for help..."\n\t\t\t\t\t\tvalue="${t}"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class="liveChat-help-body">\n\t\t\t\t<div class="liveChat-help-collections"></div>\n\t\t\t</div>\n\t\t`,this._updateCollectionsList(),this._attachEvents()}_updateCollectionsList(){const t=this.element.querySelector(".liveChat-help-collections"),e=(this.state.helpArticles||[]).filter(t=>(t.articleCount||0)>0),n=(this.state.helpSearchQuery||"").toLowerCase(),i=n?e.filter(t=>t.title.toLowerCase().includes(n)||t.description&&t.description.toLowerCase().includes(n)):e;0!==i.length?(t.innerHTML=i.map(t=>this._renderCollectionItem(t)).join(""),this._attachCollectionEvents()):t.innerHTML=this._renderEmptyState()}_avatarColors=[{bg:"#EF4444",text:"#FFFFFF"},{bg:"#F97316",text:"#FFFFFF"},{bg:"#F59E0B",text:"#FFFFFF"},{bg:"#10B981",text:"#FFFFFF"},{bg:"#06B6D4",text:"#FFFFFF"},{bg:"#3B82F6",text:"#FFFFFF"},{bg:"#8B5CF6",text:"#FFFFFF"},{bg:"#EC4899",text:"#FFFFFF"}];_getAvatarColor(t){const e=t.split("").reduce((t,e)=>t+e.charCodeAt(0),0);return this._avatarColors[e%this._avatarColors.length]}_getInitials(t){return t?t.split(" ").map(t=>t[0]).join("").toUpperCase().slice(0,2):"A"}_renderAuthorAvatar(t){if(t.author?.picture)return`<img\n\t\t\t\tsrc="${t.author.picture}"\n\t\t\t\talt="${t.author.name||""}"\n\t\t\t\tclass="liveChat-help-collection-avatar"\n\t\t\t\ttitle="${t.author.name||""}"\n\t\t\t/>`;const{bg:e,text:n}=this._getAvatarColor(t.id),i=t.author?.name?this._getInitials(t.author.name):"A";return`<span\n\t\t\tclass="liveChat-help-collection-avatar liveChat-help-collection-avatar--initials"\n\t\t\tstyle="background-color: ${e}; color: ${n};"\n\t\t\ttitle="${t.author?.name||"Author"}"\n\t\t>${i}</span>`}_resolveCollectionIcon(t){return t?t.trimStart().startsWith("<")?`<span class="liveChat-help-collection-icon">${t}</span>`:t.startsWith("ph:")?`<span class="liveChat-help-collection-icon">\n\t\t\t\t<iconify-icon icon="${t}"></iconify-icon>\n\t\t\t</span>`:this._defaultCollectionIcon():this._defaultCollectionIcon()}_defaultCollectionIcon(){return'<span class="liveChat-help-collection-icon">\n\t\t\t<iconify-icon icon="ph:book-open"></iconify-icon>\n\t\t</span>'}_renderCollectionItem(t){const e=t.articleCount||0;return`\n\t\t\t<div class="liveChat-help-collection" data-collection-id="${t.id}">\n\t\t\t\t${this._resolveCollectionIcon(t.icon)}\n\t\t\t\t<div class="liveChat-help-collection-content">\n\t\t\t\t\t<div class="liveChat-help-collection-title">${t.title}</div>\n\t\t\t\t\t${t.description?`<p class="liveChat-help-collection-desc">${t.description}</p>`:""}\n\t\t\t\t\t<div class="liveChat-help-collection-meta">\n\t\t\t\t\t\t${this._renderAuthorAvatar(t)}\n\t\t\t\t\t\t<span class="liveChat-help-collection-count">\n\t\t\t\t\t\t\t${e} ${1===e?"article":"articles"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderEmptyState(){return this.state.helpSearchQuery?'\n\t\t\t\t<div class="liveChat-empty-state">\n\t\t\t\t\t<div class="liveChat-empty-state-icon">\n\t\t\t\t\t\t<iconify-icon icon="ph:magnifying-glass" width="48" height="48"></iconify-icon>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t':'\n\t\t\t<div class="liveChat-empty-state">\n\t\t\t\t<div class="liveChat-empty-state-icon">\n\t\t\t\t\t<iconify-icon icon="ph:books" width="48" height="48"></iconify-icon>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t'}_attachEvents(){const t=this.element.querySelector(".liveChat-help-close-btn");t&&t.addEventListener("click",()=>{this.state.setOpen(!1)});let e;this.element.querySelector(".liveChat-help-search-input").addEventListener("input",t=>{clearTimeout(e),e=setTimeout(()=>{this.state.setHelpSearchQuery(t.target.value)},300)}),this._attachCollectionEvents()}_attachCollectionEvents(){this.element.querySelectorAll(".liveChat-help-collection").forEach(t=>{t.addEventListener("click",()=>{const e=this.state.helpArticles.find(e=>e.id===t.dataset.collectionId);e?.url?window.open(e.url,"_blank"):this.options.onArticleClick&&this.options.onArticleClick(e)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element?.parentNode&&this.element.parentNode.removeChild(this.element)}}class N{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-home-view",this._updateContent(),this._unsubscribe=this.state.subscribe(t=>{"homeChangelogUpdate"!==t&&"conversationsUpdate"!==t&&"availabilityUpdate"!==t&&"settingsUpdate"!==t||this._updateContent()}),this.element}_updateContent(){const t="offline"===this.state.businessHoursState||"away"===this.state.businessHoursState,e=this.state.showAvatars&&!t?this._renderAvatarStack():"",n=this._renderRecentChangelog(),i=this._renderAvailabilityStatus();this.element.innerHTML=`\n\t\t\t<div class="liveChat-home-scroll">\n\t\t\t\t<div class="liveChat-home-header">\n\t\t\t\t\t<div class="liveChat-home-header-top">\n\t\t\t\t\t\t<div class="liveChat-home-logo">\n\t\t\t\t\t\t\t${this.options.logoUrl?`<img src="${this.options.logoUrl}" alt="${this.state.teamName}" />`:""}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="liveChat-home-avatars">${e||i}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="liveChat-home-welcome">\n\t\t\t\t\t\t<span class="liveChat-home-greeting">${this.state.greetingMessage}</span>\n\t\t\t\t\t\t<span class="liveChat-home-question">${this.state.welcomeMessage}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class="liveChat-home-body">\n\t\t\t\t\t${this._renderMessageButton()}\n\t\t\t\t\t${this._renderFeaturedCard()}\n\t\t\t\t\t${n}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderAvatarStack(){const t=this.state.teamAvatars,e=["#5856d6","#007aff","#34c759","#ff9500"];if(!t||0===t.length)return"";return`<div class="liveChat-avatar-stack">${t.slice(0,4).map((t,n)=>"string"==typeof t&&t.startsWith("http")?`<div class="sdk-avatar sdk-avatar-lg"><img src="${t}" alt="Team member" /></div>`:`<div class="sdk-avatar sdk-avatar-lg" style="background: ${e[n%e.length]};">${t.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderAvailabilityStatus(){const t=this.state.businessHoursState;if("offline"===t){let t="We're currently closed";if(this.state.holidayName)t=`Closed for ${this.state.holidayName}`;else if(this.state.nextOpenAt){const e=new Date(this.state.nextOpenAt),n=new Date,i=Math.round((e-n)/36e5);t=i<24?`Opens in ${i}h`:`Opens ${e.toLocaleDateString("en-US",{weekday:"short",hour:"numeric",hour12:!0})}`}return`\n\t\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-away"></span>\n\t\t\t\t\t<span class="liveChat-availability-text">${t}</span>\n\t\t\t\t</div>\n\t\t\t`}return"away"===t?'\n\t\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-away"></span>\n\t\t\t\t\t<span class="liveChat-availability-text">We\'re currently away</span>\n\t\t\t\t</div>\n\t\t\t':this.state.agentsOnline?`\n\t\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-online"></span>\n\t\t\t\t\t<span class="liveChat-availability-text">${this.state.onlineMessage}</span>\n\t\t\t\t</div>\n\t\t\t`:`\n\t\t\t<div class="liveChat-home-availability">\n\t\t\t\t<span class="liveChat-availability-dot liveChat-availability-away"></span>\n\t\t\t\t<span class="liveChat-availability-text">${this.state.responseTime}</span>\n\t\t\t</div>\n\t\t`}_renderMessageButton(){const t=this.state.conversations.find(t=>"open"===t.status),e="offline"===this.state.businessHoursState||"away"===this.state.businessHoursState,n=e?"Leave us a message":this.state.startButtonText,i=e?"We'll get back to you when we're back":this.state.responseTime||"We typically reply within a few minutes";return`\n\t\t\t${t?this._renderRecentMessageCard(t):""}\n\t\t\t<button class="liveChat-home-message-btn">\n\t\t\t\t<div class="liveChat-home-continue-info">\n\t\t\t\t\t<span class="liveChat-home-continue-label">${n}</span>\n\t\t\t\t\t<span class="liveChat-home-message-subtext">${i}</span>\n\t\t\t\t</div>\n\t\t\t\t<iconify-icon icon="ph:paper-plane-right" width="20" height="20" style="flex-shrink: 0;"></iconify-icon>\n\t\t\t</button>\n\t\t\t<button class="liveChat-home-message-btn liveChat-feedback-btn" data-action="feedback">\n\t\t\t\t<span>Leave us feedback</span>\n\t\t\t\t<iconify-icon icon="ph:caret-right" width="20" height="20" style="flex-shrink: 0;"></iconify-icon>\n\t\t\t</button>\n\t\t`}_renderRecentMessageCard(t){const e=this.options.logoUrl,n=this.state.teamName||"Support",i=e?`<div class="liveChat-home-recent-avatar liveChat-home-recent-avatar-logo"><img src="${e}" alt="${n}" /></div>`:`<div class="liveChat-home-recent-avatar" style="background: var(--color-primary);">${n.charAt(0).toUpperCase()}</div>`,a=t.title||n,s=this._formatTimeAgo(t.lastMessageTime),o=t.lastMessage?t.lastMessage.substring(0,48)+(t.lastMessage.length>48?"...":""):"",r=t.unread>0;return`\n\t\t\t<div class="liveChat-home-recent-card" data-conversation-id="${t.id}">\n\t\t\t\t<div class="liveChat-home-recent-card-label">Recent message</div>\n\t\t\t\t<div class="liveChat-home-recent-card-row">\n\t\t\t\t\t${i}\n\t\t\t\t\t<div class="liveChat-home-recent-card-content">\n\t\t\t\t\t\t<div class="liveChat-home-recent-card-header">\n\t\t\t\t\t\t\t<span class="liveChat-home-recent-card-name">${a}</span>\n\t\t\t\t\t\t\t<span class="liveChat-home-recent-card-time">${s}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="liveChat-home-recent-card-preview">\n\t\t\t\t\t\t\t<span class="liveChat-home-recent-card-message">${o}</span>\n\t\t\t\t\t\t\t${r?'<span class="liveChat-home-recent-unread-dot"></span>':""}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_formatTimeAgo(t){if(!t)return"";const e=new Date(t),n=new Date-e,i=Math.floor(n/6e4),a=Math.floor(n/36e5),s=Math.floor(n/864e5);return i<1?"now":i<60?`${i}m`:a<24?`${a}h`:s<7?`${s}d`:e.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_renderFeaturedCard(){if(!this.options.featuredContent)return"";const{title:t,description:e,imageUrl:n,action:i}=this.options.featuredContent;return`\n\t\t\t<div class="liveChat-home-featured">\n\t\t\t\t${n?`<img src="${n}" alt="${t}" class="liveChat-home-featured-image" onerror="this.style.display='none';" />`:""}\n\t\t\t\t<div class="liveChat-home-featured-divider"></div>\n\t\t\t\t<div class="liveChat-home-featured-content">\n\t\t\t\t\t<h3>${t}</h3>\n\t\t\t\t\t${e?`<p>${e}</p>`:""}\n\t\t\t\t\t${i?`<button class="sdk-btn sdk-btn-primary liveChat-home-featured-btn" data-action="${i.type}" data-value="${i.value}">${i.label}</button>`:""}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderRecentChangelog(){const t=this.state.homeChangelogItems;if(0===t.length)return"";return`\n\t\t\t<div class="liveChat-home-changelog-section">\n\t\t\t\t${t.map(t=>`\n\t\t\t<div class="liveChat-home-changelog-card" data-changelog-id="${t.id}">\n\t\t\t\t${t.coverImage?`\n\t\t\t\t\t<div class="liveChat-home-changelog-cover">\n\t\t\t\t\t\t<img src="${t.coverImage}" alt="${t.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t\t${t.coverText?`<span class="liveChat-home-changelog-cover-text">${t.coverText}</span>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="liveChat-home-changelog-card-content">\n\t\t\t\t\t<h4 class="liveChat-home-changelog-card-title">${t.title}</h4>\n\t\t\t\t\t<p class="liveChat-home-changelog-card-desc">${this._stripHtml(t.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`}_stripHtml(t){if(!t)return"";const e=document.createElement("div");return e.innerHTML=t,(e.textContent||e.innerText||"").trim()}_formatDate(t){if(!t)return"";const e=new Date(t),n=new Date,i=Math.floor((n-e)/864e5);return 0===i?"Today":1===i?"Yesterday":i<7?`${i}d ago`:e.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_attachEvents(){const t=this.element.querySelector(".liveChat-home-recent-card");t&&t.addEventListener("click",()=>{const e=t.dataset.conversationId;this.state.setActiveConversation(e),this.state.markAsRead(e),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(e)});const e=this.element.querySelector(".liveChat-home-message-btn:not(.liveChat-feedback-btn)");e&&e.addEventListener("click",()=>{this.state.setActiveConversation(null),this.state.setView("chat")});const n=this.element.querySelector(".liveChat-feedback-btn");n&&n.addEventListener("click",()=>{this.state.setView("feedback")}),this.element.querySelectorAll(".liveChat-home-changelog-card").forEach(t=>{t.addEventListener("click",()=>{const e=this.state.homeChangelogItems.find(e=>e.id===t.dataset.changelogId);e?.url?window.open(e.url,"_blank"):this.state.setView("changelog")})});const i=this.element.querySelector(".liveChat-home-changelog-all");i&&i.addEventListener("click",()=>{this.state.setView("changelog")});const a=this.element.querySelector(".liveChat-home-featured-btn");a&&a.addEventListener("click",()=>{const t=a.dataset.action,e=a.dataset.value;"url"===t?window.open(e,"_blank"):"view"===t&&this.state.setView(e)})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class j{constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._isSubmitting=!1,this._selectedRating=null}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-feedback-view",this._renderForm(),this.element}_renderForm(){this.element.innerHTML='\n\t\t\t<div class="liveChat-feedback-header">\n\t\t\t\t<button class="sdk-btn-icon liveChat-feedback-back-btn">\n\t\t\t\t\t<iconify-icon icon="ph:arrow-left" width="20" height="20"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<span class="liveChat-feedback-title">Leave us feedback</span>\n\t\t\t</div>\n\t\t\t<div class="liveChat-feedback-body">\n\t\t\t\t<p class="liveChat-feedback-prompt">Share your thoughts with us. We read every message.</p>\n\t\t\t\t<input\n\t\t\t\t\ttype="text"\n\t\t\t\t\tclass="liveChat-feedback-input"\n\t\t\t\t\tplaceholder="Title"\n\t\t\t\t/>\n\t\t\t\t<textarea\n\t\t\t\t\tclass="liveChat-feedback-textarea"\n\t\t\t\t\tplaceholder="Your feedback..."\n\t\t\t\t\trows="5"\n\t\t\t\t></textarea>\n\t\t\t\t<button class="liveChat-feedback-submit">Send feedback</button>\n\t\t\t</div>\n\t\t',this._attachEvents()}_renderThankYou(){this.element.innerHTML='\n\t\t\t<div class="liveChat-feedback-header">\n\t\t\t\t<button class="sdk-btn-icon liveChat-feedback-back-btn">\n\t\t\t\t\t<iconify-icon icon="ph:arrow-left" width="20" height="20"></iconify-icon>\n\t\t\t\t</button>\n\t\t\t\t<span class="liveChat-feedback-title">Leave us feedback</span>\n\t\t\t</div>\n\t\t\t<div class="liveChat-feedback-thankyou">\n\t\t\t\t<span class="liveChat-feedback-thankyou-emoji">🙏</span>\n\t\t\t\t<h3>Thanks for your feedback!</h3>\n\t\t\t\t<p>We appreciate you taking the time to share your thoughts.</p>\n\t\t\t\t<button class="liveChat-feedback-done-btn">Done</button>\n\t\t\t</div>\n\t\t',this.element.querySelector(".liveChat-feedback-back-btn").addEventListener("click",()=>{this.state.setView("home")}),this.element.querySelector(".liveChat-feedback-done-btn").addEventListener("click",()=>{this.state.setView("home")})}_attachEvents(){this.element.querySelector(".liveChat-feedback-back-btn").addEventListener("click",()=>{this.state.setView("home")});this.element.querySelector(".liveChat-feedback-submit").addEventListener("click",async()=>{if(this._isSubmitting)return;const t=this.element.querySelector(".liveChat-feedback-input").value.trim(),e=this.element.querySelector(".liveChat-feedback-textarea").value.trim();await this._submit(t,e)})}async _submit(t,e){this._isSubmitting=!0;const n=this.element.querySelector(".liveChat-feedback-submit");n&&(n.disabled=!0,n.textContent="Sending...");try{this.options.onSubmitFeedback&&await this.options.onSubmitFeedback({title:t,message:e})}catch(t){console.warn("[FeedbackFormView] Submit error:",t)}this._renderThankYou()}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class ${constructor(t,e={}){this.state=t,this.options=e,this.element=null,this._isSubmitting=!1}render(){return this.element=document.createElement("div"),this.element.className="liveChat-view liveChat-prechat-view",this._updateContent(),this.element}_updateContent(){this.element.innerHTML='\n\t\t\t<div class="liveChat-prechat-overlay">\n\t\t\t\t<div class="liveChat-prechat-card">\n\t\t\t\t\t<h4 class="liveChat-prechat-title">Before we continue</h4>\n\t\t\t\t\t<p class="liveChat-prechat-subtitle">Enter your details so we can get back to you.</p>\n\t\t\t\t\t<form class="liveChat-prechat-form" novalidate>\n\t\t\t\t\t\t<div class="liveChat-prechat-field">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\t\t\tname="name"\n\t\t\t\t\t\t\t\tclass="liveChat-prechat-input"\n\t\t\t\t\t\t\t\tplaceholder="Your name"\n\t\t\t\t\t\t\t\tautocomplete="name"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class="liveChat-prechat-field">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype="email"\n\t\t\t\t\t\t\t\tname="email"\n\t\t\t\t\t\t\t\tclass="liveChat-prechat-input"\n\t\t\t\t\t\t\t\tplaceholder="Your email address"\n\t\t\t\t\t\t\t\tautocomplete="email"\n\t\t\t\t\t\t\t\trequired\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span class="liveChat-prechat-error" style="display:none;"></span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<button type="submit" class="liveChat-prechat-submit">\n\t\t\t\t\t\t\tStart chat\n\t\t\t\t\t\t</button>\n\t\t\t\t\t</form>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',this._attachEvents()}_attachEvents(){this.element.querySelector(".liveChat-prechat-form").addEventListener("submit",async t=>{t.preventDefault(),await this._handleSubmit()})}async _handleSubmit(){if(this._isSubmitting)return;const t=this.element.querySelector('input[name="email"]'),e=this.element.querySelector('input[name="name"]'),n=this.element.querySelector(".liveChat-prechat-error"),i=this.element.querySelector(".liveChat-prechat-submit"),a=t.value.trim(),s=e.value.trim();if(!a||!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(a))return n.textContent="Please enter a valid email address.",n.style.display="block",void t.focus();n.style.display="none",this._isSubmitting=!0,i.disabled=!0,i.innerHTML='\n\t\t\t<iconify-icon icon="ph:circle-notch" width="16" height="16" style="animation: spin 0.8s linear infinite;"></iconify-icon>\n\t\t\tJust a moment...\n\t\t';try{this.options.onIdentifyContact&&await this.options.onIdentifyContact({name:s||void 0,email:a}),this.state.setIdentified(!0,{name:s,email:a});const t=this.state.pendingMessage;t&&this.options.onStartConversation?(this.state.pendingMessage=null,this.state.setView("chat"),await this.options.onStartConversation(t.content,t.attachments)):this.state.setView("chat")}catch(t){console.error("[PreChatFormView] Error:",t),n.textContent="Something went wrong. Please try again.",n.style.display="block",this._isSubmitting=!1,i.disabled=!1,i.textContent="Start chat"}}destroy(){this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class H extends q{constructor(t){super({...t,type:"liveChat"}),this._explicitOptions=t||{};const e=t.theme||"light",n=Object.prototype.hasOwnProperty.call(t,"textColor"),i=Object.prototype.hasOwnProperty.call(t,"backgroundColor"),a="dark"===e?"#E2E8F0":"#1d1d1f",s="dark"===e?"#0F172A":"#ffffff",o="boolean"==typeof t.enableChangelog?t.enableChangelog:!1!==t.enableNews;this.liveChatOptions={position:t.position||"right",theme:e,primaryColor:t.primaryColor||"#155EEF",textColor:n?t.textColor:a,backgroundColor:i?t.backgroundColor:s,logoUrl:t.logoUrl||"https://product7.io/p7logo.svg",teamName:t.teamName||"Support",teamAvatars:t.teamAvatars||[],greetingMessage:t.greetingMessage||"Hi there 👋",welcomeMessage:t.welcomeMessage||"How can we help?",onlineMessage:t.onlineMessage||"We're online now",responseTime:t.responseTime||"We typically reply within a few minutes",enableHelp:!1!==t.enableHelp,enableChangelog:o,autoLoadData:!1!==t.autoLoadData,initialView:t.initialView||"home",previewData:t.previewData||null,featuredContent:t.featuredContent||null,feedbackBoardName:t.feedbackBoardName||null,feedbackUrl:t.feedbackUrl||null,changelogUrl:t.changelogUrl||null,helpUrl:t.helpUrl||null,roadmapUrl:t.roadmapUrl||null,composePlaceholder:t.composePlaceholder||null,onSendMessage:t.onSendMessage||null,onFeedbackClick:t.onFeedbackClick||null,onArticleClick:t.onArticleClick||null,onChangelogClick:t.onChangelogClick||null};const r=this.sdk?.apiService?.getMetadata()||null;this.LiveChatState=new M({teamName:this.liveChatOptions.teamName,teamAvatars:this.liveChatOptions.teamAvatars,greetingMessage:this.liveChatOptions.greetingMessage,welcomeMessage:this.liveChatOptions.welcomeMessage,onlineMessage:this.liveChatOptions.onlineMessage,responseTime:this.liveChatOptions.responseTime,enableHelp:this.liveChatOptions.enableHelp,enableChangelog:this.liveChatOptions.enableChangelog,metadata:r,urls:{feedback:this.liveChatOptions.feedbackUrl,changelog:this.liveChatOptions.changelogUrl,help:this.liveChatOptions.helpUrl,roadmap:this.liveChatOptions.roadmapUrl}}),this.sdk?.identified&&r&&(this.LiveChatState.isIdentified=!0),this.launcher=null,this.panel=null,this.wsService=null,this._wsUnsubscribers=[],this._feedbackWidget=null;const l=void 0===t.notificationSound||t.notificationSound;this._notificationSound=new L({soundUrl:"string"==typeof l?l:void 0,volume:t.notificationVolume??.4}),!1===l&&this._notificationSound.setEnabled(!1),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)}_hasTrigger(){return!0===this.options.trigger||void 0===this.options.trigger}_createInternalFeedbackWidget(){try{const t=this.sdk.createWidget("button",{trigger:!1,displayMode:"modal",boardName:this.liveChatOptions.feedbackBoardName||this.sdk.config.boardName,primaryColor:this.liveChatOptions.primaryColor,theme:this.liveChatOptions.theme});return t.mount(),t}catch(t){return console.warn("[LiveChat] Could not create internal feedback widget:",t),null}}_render(){const t=document.createElement("div");return t.className=`liveChat-widget theme-${this.liveChatOptions.theme}`,t.style.zIndex="999999",t.style.setProperty("--liveChat-h-padding",`${this.liveChatOptions.horizontalPadding??20}px`),t.style.setProperty("--liveChat-v-padding",`${this.liveChatOptions.verticalPadding??20}px`),this._widgetContainer=t,T({primaryColor:this.liveChatOptions.primaryColor,textColor:this.liveChatOptions.textColor,backgroundColor:this.liveChatOptions.backgroundColor,theme:this.liveChatOptions.theme}),this.liveChatOptions.onFeedbackClick||(this._feedbackWidget=this._createInternalFeedbackWidget()),this._hasTrigger()&&(this.launcher=new O(this.LiveChatState,{position:this.liveChatOptions.position,primaryColor:this.liveChatOptions.primaryColor}),t.appendChild(this.launcher.render())),this.panel=new V(this.LiveChatState,{position:this.liveChatOptions.position,theme:this.liveChatOptions.theme,primaryColor:this.liveChatOptions.primaryColor,logoUrl:this.liveChatOptions.logoUrl,featuredContent:this.liveChatOptions.featuredContent,onSendMessage:this.liveChatOptions.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.liveChatOptions.onFeedbackClick||(this._feedbackWidget?()=>this._feedbackWidget.open():null),onArticleClick:this.liveChatOptions.onArticleClick,onChangelogClick:this.liveChatOptions.onChangelogClick}),this.panel.registerView("home",N),this.panel.registerView("messages",B),this.panel.registerView("chat",P),this.panel.registerView("prechat",$),this.panel.registerView("feedback",j),this.panel.registerView("help",D),this.panel.registerView("changelog",F),t.appendChild(this.panel.render()),this.panel.hide(),t}_attachEvents(){this._stateUnsubscribe=this.LiveChatState.subscribe((t,e)=>{"openChange"===t&&this._handleOpenChange(e.isOpen),"conversationChange"===t&&this._handleActiveConversationChange(e.conversationId,e.previousConversationId)})}_handleOpenChange(t){t?(this.panel.show(),this.sdk.eventBus.emit("liveChat:opened",{widget:this})):(this.panel.hide(),this.LiveChatState.reset(),this.sdk.eventBus.emit("liveChat:closed",{widget:this}))}_handleActiveConversationChange(t,e){e&&this.wsService&&this.wsService.send("conversation:unsubscribe",{conversation_id:e}),t&&this.wsService&&this.wsService.send("conversation:subscribe",{conversation_id:t})}async _handleStartConversation(t,e){try{if(this.LiveChatState.requireEmailBeforeChat&&!this.LiveChatState.isIdentified)return this.LiveChatState.pendingMessage={content:t,attachments:e},this.LiveChatState.setView("prechat"),null;const n=this.LiveChatState.conversations.find(t=>"open"===t.status);return n?(this.LiveChatState.setActiveConversation(n.id),await this._handleSendMessage(n.id,{content:t},e),n):await this.startNewConversation(t,"",e)}catch(t){return console.error("[LiveChatWidget] Failed to start conversation:",t),null}}async _handleSelectConversation(t){try{await this.fetchMessages(t)}catch(t){console.error("[LiveChatWidget] Failed to fetch messages:",t)}}_handleNewConversationClick(){const t=this.LiveChatState.conversations.find(t=>"open"===t.status);t?(this.LiveChatState.setActiveConversation(t.id),this.LiveChatState.setView("chat"),this._handleSelectConversation(t.id)):(this.LiveChatState.setActiveConversation(null),this.LiveChatState.setView("chat"))}async _handleIdentifyContact(t){try{return await this.sdk.identify({email:t.email,name:t.name})}catch(t){throw console.error("[LiveChatWidget] Failed to identify contact:",t),t}}markAsIdentified(t,e){this.applyIdentity({name:t,email:e})}applyIdentity(t={}){this.LiveChatState.setIdentified(!0,t),this.apiService?.sessionToken&&!this.wsService?.isConnected&&this._initWebSocket()}async _handleUploadFile(t,e){try{const n=await this.apiService.uploadFile(t,e);if(n.status&&n.url)return n.url;throw new Error("Upload failed")}catch(t){throw console.error("[LiveChatWidget] Failed to upload file:",t),t}}async _uploadPendingAttachments(t){if(!t||0===t.length)return[];const e=[];for(const n of t)try{const t=await this._handleUploadFile(n.preview,n.file.name);e.push({url:t,type:n.type.startsWith("image")?"image":"file",name:n.file.name})}catch(t){console.error("[LiveChatWidget] Skipping failed attachment upload:",n.file.name,t)}return e}async _handleSendMessage(t,e,n){this.sdk.eventBus.emit("liveChat:messageSent",{widget:this,conversationId:t,message:e});try{const i=await this._uploadPendingAttachments(n),a=await this.apiService.sendMessage(t,{content:e.content,attachments:i});if(a.status&&a.data){const e=a.data;let n=[];if(e.attachments)try{n="string"==typeof e.attachments?JSON.parse(e.attachments):e.attachments}catch(t){n=[]}this.LiveChatState.upsertMessage(t,{id:e.id,content:e.content,isOwn:!0,timestamp:e.created_at,attachments:Array.isArray(n)&&n.length>0?n:void 0},{reconcileOwnOptimistic:!0,optimisticMatchWindowMs:6e4})}this.apiService?.mock&&setTimeout(()=>{const e={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.LiveChatState.addMessage(t,e)},1500)}catch(t){console.error("[LiveChatWidget] Failed to send message:",t)}}_handleWebSocketMessage(t){const{conversation_id:e,message:n}=t;let i=[];if(n.attachments)try{i="string"==typeof n.attachments?JSON.parse(n.attachments):n.attachments}catch(t){}const a={id:n.id,content:n.content,isOwn:"customer"===n.sender_type,isSystem:"system"===n.sender_type,timestamp:n.created_at,attachments:i.length>0?i:void 0,sender:{name:n.sender_name||"Support",avatarUrl:n.sender_avatar||null}};this.LiveChatState.upsertMessage(e,a,{reconcileOwnOptimistic:!0,optimisticMatchWindowMs:3e4});!("customer"===n.sender_type)&&this.LiveChatState.isIdentified&&this._notificationSound.play(),this.LiveChatState.isOpen&&this.LiveChatState.activeConversationId===e||this._updateUnreadCount()}_handleTypingStarted(t){t.is_agent&&this.LiveChatState._notify("typingStarted",{conversationId:t.conversation_id,userName:t.user_name})}_handleTypingStopped(t){this.LiveChatState._notify("typingStopped",{conversationId:t.conversation_id})}_handleConversationClosed(t){const e=t?.conversation_id||t?.id||t?.conversation?.id;e&&this.LiveChatState.updateConversation(e,{status:"closed"})}async _updateUnreadCount(){try{const t=await this.apiService.getUnreadCount();t.status&&t.data&&(this.LiveChatState.unreadCount=t.data.unread_count||0,this.LiveChatState._notify("unreadCountChange",{count:this.LiveChatState.unreadCount}))}catch(t){console.error("[LiveChatWidget] Failed to get unread count:",t)}}_initWebSocket(){this.wsService&&this.wsService.disconnect(),this.wsService=new I({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));let t=!1;this._wsUnsubscribers.push(this.wsService.on("connected",()=>{console.log("[LiveChatWidget] WebSocket connected");const e=t;t=!0,this.LiveChatState.activeConversationId&&(this.wsService.send("conversation:subscribe",{conversation_id:this.LiveChatState.activeConversationId}),e&&this.fetchMessages(this.LiveChatState.activeConversationId).catch(t=>{console.error("[LiveChatWidget] Failed to backfill messages on reconnect:",t)}))})),this._wsUnsubscribers.push(this.wsService.on("disconnected",()=>{console.log("[LiveChatWidget] WebSocket disconnected"),this.LiveChatState._notify("connectionChange",{connected:!1})})),this._wsUnsubscribers.push(this.wsService.on("connected",()=>{this.LiveChatState._notify("connectionChange",{connected:!0})})),this.wsService.connect()}open(){this.LiveChatState.setOpen(!0)}close(){this.LiveChatState.setOpen(!1)}toggle(){this.LiveChatState.setOpen(!this.LiveChatState.isOpen)}navigateTo(t){this.LiveChatState.setView(t),this.LiveChatState.isOpen||this.open()}setConversations(t){this.LiveChatState.setConversations(t)}addMessage(t,e){this.LiveChatState.addMessage(t,e)}setHelpArticles(t){this.LiveChatState.setHelpArticles(t)}setHomeChangelogItems(t){this.LiveChatState.setHomeChangelogItems(t)}setChangelogItems(t){this.LiveChatState.setChangelogItems(t)}setUnreadCount(t){this.LiveChatState.unreadCount=t,this.LiveChatState._notify("unreadCountChange",{count:t})}getState(){return{isOpen:this.LiveChatState.isOpen,currentView:this.LiveChatState.currentView,unreadCount:this.LiveChatState.unreadCount,conversations:this.LiveChatState.conversations}}_applyPreviewData(){const t=this.liveChatOptions.previewData;if(t&&"object"==typeof t){if(Array.isArray(t.conversations)&&this.LiveChatState.setConversations(t.conversations),Array.isArray(t.helpArticles)&&this.LiveChatState.setHelpArticles(t.helpArticles),Array.isArray(t.homeChangelogItems)&&this.LiveChatState.setHomeChangelogItems(t.homeChangelogItems),Array.isArray(t.changelogItems)&&this.LiveChatState.setChangelogItems(t.changelogItems),"number"==typeof t.unreadCount&&this.setUnreadCount(t.unreadCount),t.availability&&"object"==typeof t.availability){const e=t.availability;this.LiveChatState.agentsOnline=Boolean(e.agentsOnline??e.agents_online??e.is_online),this.LiveChatState.onlineCount=e.onlineCount??e.online_count??0,this.LiveChatState.responseTime=e.responseTime??e.response_time??this.LiveChatState.responseTime,this.LiveChatState._notify("availabilityUpdate",e)}"string"==typeof t.currentView&&this.LiveChatState.setView(t.currentView)}}async loadInitialData(){try{const t=await this._fetchConversations();this.LiveChatState.setConversations(t)}catch(t){console.error("[LiveChatWidget] Failed to load conversations:",t)}if(this.liveChatOptions.enableHelp)try{const t=await this._fetchHelpArticles();this.LiveChatState.setHelpArticles(t)}catch(t){console.error("[LiveChatWidget] Failed to load help articles:",t)}if(this.liveChatOptions.enableChangelog)try{const{homeItems:t,changelogItems:e}=await this._fetchChangelog();this.LiveChatState.setHomeChangelogItems(t),this.LiveChatState.setChangelogItems(e)}catch(t){console.error("[LiveChatWidget] Failed to load changelog:",t)}}async _fetchConversations(){try{const t=await this.apiService.getConversations();return t.status&&t.data?t.data.map(t=>({id:t.id,title:t.subject||`Chat with ${t.assigned_user?.name||"Support"}`,participants:t.assigned_user?[{name:t.assigned_user.name,avatarUrl:t.assigned_user.avatar}]:[{name:"Support",avatarUrl:null}],lastMessage:t.preview||t.snippet||"",lastMessageTime:t.last_message_at,unread:t.unread||0,status:t.status})):[]}catch(t){return console.error("[LiveChatWidget] Failed to fetch conversations:",t),[]}}async _fetchHelpArticles(){try{const t=await this.apiService.getHelpCollections();if(t.success&&t.data){const e=t.data.collections||t.data,n=(this.liveChatOptions.helpUrl||"").replace(/\/$/,"");return[...e].sort((t,e)=>(t.order??0)-(e.order??0)).map(t=>({id:t.id,title:t.title,description:t.description||"",articleCount:t.article_count||0,icon:t.icon||null,author:t.author||null,url:t.url_slug&&n?`${n}/collections/${t.url_slug}`:n||null}))}return[]}catch(t){return console.error("[LiveChatWidget] Failed to fetch help articles:",t),[]}}async fetchMessages(t){try{const e=await this.apiService.getConversation(t);if(e.status&&e.data){const n=(e.data.messages||[]).map(t=>{let e;if(t.attachments)try{e="string"==typeof t.attachments?JSON.parse(t.attachments):t.attachments}catch(t){}return{id:t.id,content:t.content,isOwn:"customer"===t.sender_type,isSystem:"system"===t.sender_type,timestamp:t.created_at,attachments:e&&e.length>0?e:void 0,sender:{name:t.sender_name||("customer"===t.sender_type?"You":"Support"),avatarUrl:t.sender_avatar||null}}});return this.LiveChatState.setMessages(t,n),await this.apiService.markConversationAsRead(t),this.LiveChatState.markAsRead(t),n}return[]}catch(t){return console.error("[LiveChatWidget] Failed to fetch messages:",t),[]}}async startNewConversation(t,e="",n=[]){try{const i=await this._uploadPendingAttachments(n),a=await this.apiService.startConversation({message:t,subject:e,attachments:i});if(a.status&&a.data){const e=a.data,n={id:e.id,title:e.subject||"New conversation",participants:[{name:"Support",avatarUrl:null}],lastMessage:t,lastMessageTime:e.created_at||(new Date).toISOString(),unread:0,status:"open"};this.LiveChatState.addConversation(n);const i=[{id:"msg_"+Date.now(),content:t,isOwn:!0,timestamp:(new Date).toISOString()}];return i.push({id:"system_rt_"+Date.now(),content:this.LiveChatState.agentsOnline?"One of our customer support agents will be with you shortly.":this.LiveChatState.responseTime,isSystem:!0,timestamp:(new Date).toISOString()}),this.LiveChatState.setMessages(e.id,i),this.LiveChatState.setActiveConversation(e.id),this.LiveChatState.setView("chat"),e}return null}catch(t){return console.error("[LiveChatWidget] Failed to start conversation:",t),null}}async sendTypingIndicator(t,e){try{await this.apiService.sendTypingIndicator(t,e)}catch(t){}}async _fetchAndApplySettings(){try{const t=await this.apiService.getLiveChatSettings();if(!t?.status||!t?.data)return;const e=t.data;let n=!1;if(e.team_name&&!this._hasExplicitOption("teamName")&&(this.liveChatOptions.teamName=e.team_name,this.LiveChatState.teamName=e.team_name),e.logo_url&&!this._hasExplicitOption("logoUrl")&&(this.liveChatOptions.logoUrl=e.logo_url),e.greeting_message&&!this._hasExplicitOption("greetingMessage")&&(this.LiveChatState.greetingMessage=e.greeting_message),e.welcome_message&&!this._hasExplicitOption("welcomeMessage")&&(this.LiveChatState.welcomeMessage=e.welcome_message),e.response_time&&!this._hasExplicitOption("responseTime")&&(this.LiveChatState.responseTime=e.response_time),Array.isArray(e.team_avatars)&&e.team_avatars.length>0&&!this._hasExplicitOption("teamAvatars")&&(this.LiveChatState.teamAvatars=e.team_avatars),e.primary_color&&!this._hasExplicitOption("primaryColor")&&(this.liveChatOptions.primaryColor=e.primary_color,n=!0),e.background_color&&!this._hasExplicitOption("backgroundColor")&&(this.liveChatOptions.backgroundColor=e.background_color,n=!0),e.text_color&&!this._hasExplicitOption("textColor")&&(this.liveChatOptions.textColor=e.text_color,n=!0),e.theme&&!this._hasExplicitOption("theme")&&(this.liveChatOptions.theme=e.theme,n=!0),n&&T({primaryColor:this.liveChatOptions.primaryColor,textColor:this.liveChatOptions.textColor,backgroundColor:this.liveChatOptions.backgroundColor,theme:this.liveChatOptions.theme}),e.launcher_position&&!this._hasExplicitOption("position")){const t=e.launcher_position.split("-");this.liveChatOptions.position=t[t.length-1]||"right"}"number"!=typeof e.horizontal_padding||this._hasExplicitOption("horizontalPadding")||(this.liveChatOptions.horizontalPadding=e.horizontal_padding),"number"!=typeof e.vertical_padding||this._hasExplicitOption("verticalPadding")||(this.liveChatOptions.verticalPadding=e.vertical_padding),this._widgetContainer&&(this._widgetContainer.style.setProperty("--liveChat-h-padding",`${this.liveChatOptions.horizontalPadding??20}px`),this._widgetContainer.style.setProperty("--liveChat-v-padding",`${this.liveChatOptions.verticalPadding??20}px`)),"boolean"!=typeof e.home_module_enabled||this._hasExplicitOption("homeModuleEnabled")||(this.LiveChatState.homeModuleEnabled=e.home_module_enabled,e.home_module_enabled||"home"!==this.LiveChatState.currentView||(this.LiveChatState.currentView=!1!==this.LiveChatState.messagesModuleEnabled?"messages":"help")),"boolean"!=typeof e.messages_module_enabled||this._hasExplicitOption("messagesModuleEnabled")||(this.LiveChatState.messagesModuleEnabled=e.messages_module_enabled,e.messages_module_enabled||"messages"!==this.LiveChatState.currentView||(this.LiveChatState.currentView=!1!==this.LiveChatState.homeModuleEnabled?"home":"help")),"boolean"!=typeof e.show_avatars||this._hasExplicitOption("showAvatars")||(this.LiveChatState.showAvatars=e.show_avatars),e.start_button_text&&!this._hasExplicitOption("startButtonText")&&(this.LiveChatState.startButtonText=e.start_button_text),"boolean"!=typeof e.require_email_before_chat||this._hasExplicitOption("requireEmailBeforeChat")||(this.LiveChatState.requireEmailBeforeChat=e.require_email_before_chat),"boolean"!=typeof e.allow_attachments||this._hasExplicitOption("allowAttachments")||(this.LiveChatState.allowAttachments=e.allow_attachments),"boolean"!=typeof e.allow_emoji||this._hasExplicitOption("allowEmoji")||(this.LiveChatState.allowEmoji=e.allow_emoji),"boolean"!=typeof e.show_reply_time||this._hasExplicitOption("showReplyTime")||(this.LiveChatState.showReplyTime=e.show_reply_time),e.feedback_url&&!this._hasExplicitOption("feedbackUrl")&&(this.liveChatOptions.feedbackUrl=e.feedback_url,this.LiveChatState.urls.feedback=e.feedback_url),e.help_url&&!this._hasExplicitOption("helpUrl")&&(this.liveChatOptions.helpUrl=e.help_url,this.LiveChatState.urls.help=e.help_url),e.changelog_url&&!this._hasExplicitOption("changelogUrl")&&(this.liveChatOptions.changelogUrl=e.changelog_url,this.LiveChatState.urls.changelog=e.changelog_url),e.roadmap_url&&!this._hasExplicitOption("roadmapUrl")&&(this.liveChatOptions.roadmapUrl=e.roadmap_url,this.LiveChatState.urls.roadmap=e.roadmap_url),e.availability&&"object"==typeof e.availability&&(this.LiveChatState.businessHoursState=e.availability.state||null,this.LiveChatState.nextOpenAt=e.availability.next_open_at||null,this.LiveChatState.holidayName=e.availability.holiday_name||null),this.LiveChatState._notify("settingsUpdate",{})}catch(t){}}_hasExplicitOption(t){return Object.prototype.hasOwnProperty.call(this._explicitOptions||{},t)}async checkAgentAvailability(){try{const t=await this.apiService.checkAgentsOnline();return t.status&&t.data?(this.LiveChatState.agentsOnline=t.data.agents_online??t.data.is_online??!1,this.LiveChatState.onlineCount=t.data.online_count||0,this.LiveChatState.responseTime=t.data.response_time||"",t.data.available_agents&&!1!==this.LiveChatState.showAvatars&&this.LiveChatState.setTeamAvatarsFromAgents(t.data.available_agents),this.LiveChatState._notify("availabilityUpdate",t.data),t.data):{agents_online:!1,online_count:0}}catch(t){return console.error("[LiveChatWidget] Failed to check availability:",t),{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.",labels:[{name:"Integration",color:"#dbeafe"}],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.",labels:[{name:"New feature",color:"#dcfce7"},{name:"AI",color:"#f3e8ff"}],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.",labels:[{name:"Report",color:"#fef9c3"}],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.",labels:[{name:"Analytics",color:"#fce7f3"}],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.",labels:[{name:"New feature",color:"#dcfce7"},{name:"AI",color:"#f3e8ff"}],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 t=await this.apiService.getChangelogs({limit:20});if(t.success&&t.data){const e=Array.isArray(t.data)?t.data:[],n=(this.liveChatOptions.changelogUrl||"").replace(/\/$/,""),i=e.map(t=>({id:t.id,title:t.title,description:t.excerpt||t.description||"",labels:t.labels||[],coverImage:t.cover_image||null,publishedAt:t.published_at,url:t.slug&&n?`${n}/${t.slug}`:n||null}));return{homeItems:i.slice(0,3),changelogItems:i}}return{homeItems:[],changelogItems:[]}}catch(t){return console.error("[LiveChatWidget] Failed to fetch changelog:",t),{homeItems:[],changelogItems:[]}}}async onMount(){this._applyPreviewData(),this.liveChatOptions.autoLoadData&&(this._fetchAndApplySettings(),this.loadInitialData(),this.apiService?.sessionToken&&this._initWebSocket(),this.checkAgentAvailability(),this._availabilityInterval=setInterval(()=>{this.checkAgentAvailability()},6e4)),this.liveChatOptions.initialView&&this.liveChatOptions.initialView!==this.LiveChatState.currentView&&this.LiveChatState.setView(this.liveChatOptions.initialView)}onDestroy(){this._stateUnsubscribe&&this._stateUnsubscribe(),this.wsService&&this.wsService.disconnect(),this._wsUnsubscribers.forEach(t=>t()),this._wsUnsubscribers=[],this._availabilityInterval&&clearInterval(this._availabilityInterval)}destroy(){!function(){const t=document.getElementById("product7-liveChat-custom-styles");t&&t.parentNode&&t.parentNode.removeChild(t)}(),this.launcher&&this.launcher.destroy(),this.panel&&this.panel.destroy(),this.onDestroy(),super.destroy()}}class U extends q{constructor(t){super({...t,type:"survey"}),this.surveyOptions={surveyId:t.surveyId||null,surveyType:t.surveyType||"nps",position:t.position||"center",theme:t.theme||"light",enabled:"boolean"==typeof t.enabled?t.enabled:void 0,title:t.title||null,description:t.description||null,lowLabel:t.lowLabel||null,highLabel:t.highLabel||null,ratingScale:t.ratingScale||t.scale||null,showFeedbackInput:"boolean"==typeof t.showFeedbackInput?t.showFeedbackInput:null,showSubmitButton:"boolean"==typeof t.showSubmitButton?t.showSubmitButton:null,autoSubmitOnSelect:"boolean"==typeof t.autoSubmitOnSelect?t.autoSubmitOnSelect:null,showTitle:"boolean"==typeof t.showTitle?t.showTitle:null,showDescription:"boolean"==typeof t.showDescription?t.showDescription:null,customQuestions:t.customQuestions||[],pages:Array.isArray(t.pages)?t.pages:[],thankYouConfig:t.thankYouConfig||t.thank_you_config||null,respondentId:t.respondentId||null,email:t.email||null,onSubmit:t.onSubmit||null,onDismiss:t.onDismiss||null},this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1}}static removeDanglingElements(){"undefined"!=typeof document&&document.querySelectorAll(".feedback-survey, .feedback-survey-backdrop, .feedback-survey-success, .product7-notification").forEach(t=>{t&&t.parentNode&&t.parentNode.removeChild(t)})}_render(){const t=document.createElement("div");return t.className="feedback-survey-container",t}_attachEvents(){}show(){return!1===this.options.enabled||!1===this.surveyOptions.enabled?(this.sdk.eventBus.emit("survey:suppressed",{widget:this,surveyId:this.surveyOptions.surveyId,reason:"disabled"}),this):(U.removeDanglingElements(),this._renderSurvey(),this.state.isOpen=!0,this.surveyState.isVisible=!0,this.sdk.eventBus.emit("survey:shown",{widget:this,type:this.surveyOptions.surveyType}),this)}hide(){return this.state.isOpen=!1,this._closeSurvey(),this}_renderSurvey(){this._closeSurvey(!1);const t=this._getSurveyConfig();if(!t)return;const e=this._isMultiPageSurvey(),n=this._isLastPage(),i=this._shouldShowFeedbackInput(),a=this._shouldShowActions(),s=this._shouldShowTitle(t),o=this._shouldShowDescription(t),r=e?Math.round((this.surveyState.currentPageIndex+1)/this.surveyOptions.pages.length*100):0,l=e&&!n?"Next":"Submit",c=e&&this.surveyState.currentPageIndex>0?'<button class="feedback-survey-back"><iconify-icon icon="ph:arrow-left" width="16" height="16"></iconify-icon> Back</button>':"";"center"===this.surveyOptions.position&&(this.backdropElement=document.createElement("div"),this.backdropElement.className=`feedback-survey-backdrop feedback-survey-backdrop-${this.surveyOptions.theme}`,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} feedback-survey-theme-${this.surveyOptions.theme}${o&&!s?" feedback-survey-description-primary":""}`,this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close"><iconify-icon icon="ph:x" width="16" height="16"></iconify-icon></button>\n\t\t\t${s?`<h3 class="feedback-survey-title">${t.title}</h3>`:""}\n\t\t\t${o?`<p class="feedback-survey-description">${t.description}</p>`:""}\n\t\t\t${e&&this.surveyOptions.pages.length>1?`<div class="feedback-survey-progress"><div class="feedback-survey-progress-track"><div class="feedback-survey-progress-fill" style="width:${r}%"></div></div></div>`:""}\n\t\t\t<div class="feedback-survey-content">${t.html}</div>\n\t\t\t${i?`<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${a?`<div class="feedback-survey-actions">\n\t\t\t\t${c}\n\t\t\t\t<button class="feedback-survey-submit">${l} <iconify-icon icon="ph:arrow-right" width="16" height="16"></iconify-icon></button>\n\t\t\t</div>`:""}\n\t\t`,document.body.appendChild(this.surveyElement),this._attachSurveyEvents(),requestAnimationFrame(()=>{this.surveyElement&&(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 t=this._getNPSScale(),e=t.values.length<=7,n=e?"feedback-survey-ces feedback-survey-rating-scale":"feedback-survey-nps",i=e?"feedback-survey-nps-btn feedback-survey-ces-btn feedback-survey-rating-scale-btn":"feedback-survey-nps-btn",a=this.surveyOptions.lowLabel||(0===t.start?"Not likely":"Strongly Disagree"),s=this.surveyOptions.highLabel||(0===t.start?"Very likely":"Strongly Agree"),o=this.surveyOptions.description||this.surveyOptions.title||"How likely are you to recommend us?",r=this.surveyOptions.description||this.surveyOptions.title||"How satisfied are you?",l=this.surveyOptions.description||this.surveyOptions.title||"How easy was it?";return{nps:{title:this.surveyOptions.title||"",description:o,html:`\n\t\t\t\t\t<div class="${n}">\n\t\t\t\t\t\t${t.values.map(t=>`\n\t\t\t\t\t\t\t<button class="${i}" data-score="${t}">${t}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t${this._renderScaleLabels(a,s)}\n\t\t\t\t`},csat:{title:this.surveyOptions.title||"",description:r,html:`\n\t\t\t\t\t<div class="feedback-survey-csat">\n\t\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((t,e)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-csat-btn" data-score="${e+1}">${t}</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-list">\n\t\t\t\t\t\t${["Very Difficult","Difficult","Neutral","Easy","Very Easy"].map((t,e)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-ces-btn feedback-survey-ces-list-btn" data-score="${e+1}">${t}</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()}}[this.surveyOptions.surveyType]||null}_getNPSScale(){const t=Number(this.surveyOptions.ratingScale),e=Number.isFinite(t)&&t>=2?t:5,n=11===e?0:1;return{scale:e,start:n,values:Array.from({length:e},(t,e)=>n+e)}}_renderScaleLabels(t,e){const n=t||"",i=e||"";return n||i?`\n\t\t\t<div class="feedback-survey-labels">\n\t\t\t\t<span>${n}</span>\n\t\t\t\t<span>${i}</span>\n\t\t\t</div>\n\t\t`:""}_isRatingSurveyType(t=this.surveyOptions.surveyType){return"nps"===t||"csat"===t||"ces"===t}_shouldShowTitle(t){return!(!t||!t.title)&&("boolean"==typeof this.surveyOptions.showTitle?this.surveyOptions.showTitle:!(!this._isMultiPageSurvey()&&this._isRatingSurveyType())||!t.description)}_shouldShowDescription(t){return"boolean"==typeof this.surveyOptions.showDescription?this.surveyOptions.showDescription:!this._isMultiPageSurvey()&&this._isRatingSurveyType()?Boolean(t&&(t.description||t.title)):Boolean(t&&t.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 t=this._getCurrentPage();return t?{title:t.title||"",description:t.description||"",html:this._renderSurveyPage(t)}:null}_renderSurveyPage(t){switch(t.type){case"rating":return this._renderRatingPage(t);case"multiple_choice":return this._renderMultipleChoicePage(t);case"text":return this._renderTextPage(t);default:return""}}_renderRatingPage(t){const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=t.rating_config||t.ratingConfig||{},i=Number(n.scale)||5,a=n.survey_type||"number",s=(this.surveyState.pageAnswers[e]||{}).rating,o={nps:11===i?["Not likely","Very likely"]:["Strongly Disagree","Strongly Agree"],emoji:["Very dissatisfied","Very satisfied"],number:["Poor","Excellent"],star:["Poor","Excellent"]},[r,l]=o[a]||["",""],c=n.low_label||r,d=n.high_label||l,h=this._renderScaleLabels(c,d);if("nps"===a){const t=Number.isFinite(i)&&i>=2?i:11,n=11===t?0:1,a=Array.from({length:t},(t,e)=>n+e);return`\n\t\t\t\t<div class="feedback-survey-nps" data-page-id="${e}">\n\t\t\t\t\t${a.map(t=>`<button class="feedback-survey-page-rating-btn feedback-survey-nps-btn feedback-survey-nps-score-${t}${s===t?" selected":""}" data-page-id="${e}" data-score="${t}">${t}</button>`).join("")}\n\t\t\t\t</div>\n\t\t\t\t${h}\n\t\t\t`}if("emoji"===a){const t=["😞","😕","😐","🙂","😄"],n=Number.isFinite(i)&&i>=2?Math.min(i,5):5;return`\n\t\t\t\t<div class="feedback-survey-csat" data-page-id="${e}">\n\t\t\t\t\t${t.slice(0,n).map((t,n)=>{const i=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-csat-btn${s===i?" selected":""}" data-page-id="${e}" data-score="${i}">${t}</button>`}).join("")}\n\t\t\t\t</div>\n\t\t\t\t${h}\n\t\t\t`}if("star"===a){const t=Number.isFinite(i)&&i>=2?i:5;return`\n\t\t\t\t<div class="feedback-survey-stars" data-page-id="${e}">\n\t\t\t\t\t${Array.from({length:t},(t,n)=>{const i=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-star-btn${"number"==typeof s&&s>=i?" filled":""}" data-page-id="${e}" data-score="${i}"><iconify-icon icon="ph:star" width="32" height="32" style="pointer-events:none;"></iconify-icon></button>`}).join("")}\n\t\t\t\t</div>\n\t\t\t\t${h}\n\t\t\t`}const p=Number.isFinite(i)&&i>=2?i:5;return`\n\t\t\t<div class="feedback-survey-rating-scale" data-page-id="${e}">\n\t\t\t\t${Array.from({length:p},(t,n)=>{const i=n+1;return`<button class="feedback-survey-page-rating-btn feedback-survey-rating-scale-btn${s===i?" selected":""}" data-page-id="${e}" data-score="${i}">${i}</button>`}).join("")}\n\t\t\t</div>\n\t\t\t${h}\n\t\t`}_renderMultipleChoicePage(t){const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=t.multipleChoiceConfig||t.multiple_choice_config||{},i=Array.isArray(n.options)?n.options:[],a=!0===n.allow_multiple||!0===n.multiple||!0===n.allow_multiple_selection,s=this.surveyState.pageAnswers[e]||{},o=Array.isArray(s.values)?s.values:s.value?[s.value]:[];return`\n\t\t\t<div class="feedback-survey-multiple-choice" data-page-id="${e}" data-multiple="${a}">\n\t\t\t\t${i.map((t,n)=>{const i=t.value||t.id||t.key||`option_${n}`,a=t.label||t.text||String(i);return`<button class="feedback-survey-page-choice-btn${o.includes(i)?" selected":""}" data-page-id="${e}" data-value="${i}">${a}</button>`}).join("")}\n\t\t\t</div>\n\t\t`}_renderTextPage(t){const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=(this.surveyState.pageAnswers[e]||{}).text||"";return`\n\t\t\t<div class="feedback-survey-text-page" data-page-id="${e}">\n\t\t\t\t<textarea class="feedback-survey-page-textarea" data-page-id="${e}" placeholder="${t.placeholder||"Type your answer..."}">${n}</textarea>\n\t\t\t</div>\n\t\t`}_renderCustomQuestions(){return this.surveyOptions.customQuestions&&0!==this.surveyOptions.customQuestions.length?this.surveyOptions.customQuestions.map((t,e)=>`\n\t\t\t<div class="sdk-form-group">\n\t\t\t\t<label class="sdk-label">${t.label}</label>\n\t\t\t\t${this._renderQuestionInput(t,e)}\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(t=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-freq-btn" data-freq="${t}">${t}</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(t,e){switch(t.type){case"select":return`\n\t\t\t\t\t<select class="feedback-survey-select" data-question="${t.id||e}">\n\t\t\t\t\t\t<option value="">${t.placeholder||"Select an option"}</option>\n\t\t\t\t\t\t${t.options.map(t=>`<option value="${t.value}">${t.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="${t.id||e}" placeholder="${t.placeholder||""}">\n\t\t\t\t`;default:return""}}_attachSurveyEvents(){if(!this.surveyElement)return;this.surveyElement.querySelector(".feedback-survey-close").addEventListener("click",()=>this._handleDismiss());const t=this.surveyElement.querySelector(".feedback-survey-submit");t&&t.addEventListener("click",()=>this._handleSubmit());const e=this.surveyElement.querySelector(".feedback-survey-back");e&&e.addEventListener("click",()=>this._handleBack());const n=this.surveyElement.querySelector(".feedback-survey-textarea");n&&n.addEventListener("input",t=>{this.surveyState.feedback=t.target.value}),this._attachTypeSpecificEvents(),this._escapeHandler=t=>{"Escape"===t.key&&this._handleDismiss()},document.addEventListener("keydown",this._escapeHandler)}_attachTypeSpecificEvents(){if(this._isMultiPageSurvey())return void this._attachCurrentPageEvents();const t=this.surveyOptions.surveyType;"nps"===t&&this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(t=>{t.addEventListener("click",()=>this._selectNPS(parseInt(t.dataset.score)))}),"csat"===t&&this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(t=>{t.addEventListener("click",()=>this._selectCSAT(parseInt(t.dataset.score)))}),"ces"===t&&this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(t=>{t.addEventListener("click",()=>this._selectCES(parseInt(t.dataset.score)))}),"custom"===t&&(this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(t=>{t.addEventListener("click",()=>this._selectFrequency(t.dataset.freq))}),this.surveyElement.querySelectorAll(".feedback-survey-select").forEach(t=>{t.addEventListener("change",e=>{this.surveyState.customAnswers[t.dataset.question]=e.target.value})}),this.surveyElement.querySelectorAll(".feedback-survey-input").forEach(t=>{t.addEventListener("input",e=>{this.surveyState.customAnswers[t.dataset.question]=e.target.value})}))}_attachCurrentPageEvents(){const t=this._getCurrentPage();if(!t||!this.surveyElement)return;const e=t.id||`page_${this.surveyState.currentPageIndex}`;if("rating"===t.type){const t=!!this.surveyElement.querySelector(".feedback-survey-star-btn");if(this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(n=>{n.addEventListener("click",()=>{const i=parseInt(n.dataset.score);Number.isNaN(i)||(this._setPageAnswer(e,{rating:i}),t?this.surveyElement.querySelectorAll(".feedback-survey-star-btn").forEach(t=>{const e=parseInt(t.dataset.score);t.classList.toggle("filled",e<=i)}):(this.surveyElement.querySelectorAll(".feedback-survey-page-rating-btn").forEach(t=>t.classList.remove("selected")),n.classList.add("selected")))}),t&&n.addEventListener("mouseenter",()=>{const t=parseInt(n.dataset.score);this.surveyElement.querySelectorAll(".feedback-survey-star-btn").forEach(e=>{const n=parseInt(e.dataset.score);e.classList.toggle("hovered",n<=t)})})}),t){const t=this.surveyElement.querySelector(".feedback-survey-stars");t&&t.addEventListener("mouseleave",()=>{this.surveyElement.querySelectorAll(".feedback-survey-star-btn").forEach(t=>t.classList.remove("hovered"))})}}if("multiple_choice"===t.type){const t=this.surveyElement.querySelector(".feedback-survey-multiple-choice"),n=!!t&&"true"===t.dataset.multiple;this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(t=>{t.addEventListener("click",()=>{const i=t.dataset.value;if(!i)return;const a=this.surveyState.pageAnswers[e]||{},s=Array.isArray(a.values)?a.values:a.value?[a.value]:[];let o=[];if(n){o=s.includes(i)?s.filter(t=>t!==i):[...s,i]}else o=[i];this._setPageAnswer(e,{value:o[0]||null,values:o}),n||this.surveyElement.querySelectorAll(".feedback-survey-page-choice-btn").forEach(t=>t.classList.remove("selected")),t.classList.toggle("selected",o.includes(i))})})}if("text"===t.type){const t=this.surveyElement.querySelector(".feedback-survey-page-textarea");t&&t.addEventListener("input",t=>{this._setPageAnswer(e,{text:t.target.value})})}}_selectNPS(t){this.surveyState.score=t,this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(e=>{const n=parseInt(e.dataset.score);e.classList.toggle("selected",n===t)}),this._maybeAutoSubmit()}_selectCSAT(t){this.surveyState.score=t,this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(e=>{const n=parseInt(e.dataset.score);e.classList.toggle("selected",n===t)}),this._maybeAutoSubmit()}_maybeAutoSubmit(){this._shouldAutoSubmitOnSelect()&&this._handleSubmit()}_setSubmitLoading(t){const e=this.surveyElement?.querySelector(".feedback-survey-submit");e&&(e.disabled=t,e.innerHTML=t?'<iconify-icon icon="ph:circle-notch" width="16" height="16" style="animation: spin 0.8s linear infinite;"></iconify-icon> Submitting...':'Submit <iconify-icon icon="ph:arrow-right" width="16" height="16"></iconify-icon>')}async _handleSubmit(){const t=this.surveyOptions.surveyType;if(this.surveyState.isSubmitting)return;if(this._isMultiPageSurvey()){if(!this._validateCurrentPage())return;const t=this._getNextPageIndex();if(-1!==t&&t!==this.surveyState.currentPageIndex)return this.surveyState.currentPageIndex=t,void this._renderSurvey()}if(!this._isMultiPageSurvey()&&("nps"===t||"csat"===t||"ces"===t)&&null===this.surveyState.score)return void this._showError("Please select a rating");this.surveyState.isSubmitting=!0,this._setSubmitLoading(!0);const e=this._getRespondentContext(),n={answers:this._normalizePageAnswersForSubmit(),...this.surveyState.feedback&&{feedback:this.surveyState.feedback},...e.respondentId&&{respondentId:e.respondentId},...e.email&&{email:e.email}},i={type:t,answers:n.answers,feedback:this.surveyState.feedback,timestamp:(new Date).toISOString()};try{const e=this.surveyOptions.surveyId||`local_${t}_${Date.now()}`;await this.apiService.submitSurveyResponse(e,n),this.sdk.eventBus.emit("survey:submitted",{widget:this,response:i}),this._showThankYouScreen(()=>{this.surveyOptions.onSubmit&&this.surveyOptions.onSubmit(i)})}catch(t){console.error("[SurveyWidget] Failed to submit survey:",t),this._showError("Something went wrong. Please try again.")}finally{this.surveyState.isSubmitting=!1,this._setSubmitLoading(!1)}}_handleBack(){this._isMultiPageSurvey()&&(this.surveyState.currentPageIndex<=0||(this.surveyState.currentPageIndex-=1,this._renderSurvey()))}_setPageAnswer(t,e){if(!t)return;this.surveyState.pageAnswers[t]={...this.surveyState.pageAnswers[t]||{},...e};const n=this._getCurrentPage();this.sdk.eventBus.emit("survey:questionAnswered",{widget:this,pageId:t,pageType:n?.type,answer:this.surveyState.pageAnswers[t]})}_validateCurrentPage(){const t=this._getCurrentPage();if(!t||!0!==t.required)return!0;const e=t.id||`page_${this.surveyState.currentPageIndex}`,n=this.surveyState.pageAnswers[e]||{};if("rating"===t.type&&"number"!=typeof n.rating)return this._showError("Please select a rating"),!1;if("multiple_choice"===t.type){if(!(Boolean(n.value)||Array.isArray(n.values)&&n.values.length>0))return this._showError("Please select an option"),!1}return!!("text"!==t.type||n.text&&String(n.text).trim())||(this._showError("Please enter an answer"),!1)}_getNextPageIndex(){if(!this._isMultiPageSurvey())return-1;const t=this._getCurrentPage(),e=this.surveyOptions.pages.length,n=this.surveyState.currentPageIndex,i=n+1<e?n+1:-1,a=t?t.after_this_page||t.afterThisPage:null;if(!a)return i;const s=Array.isArray(a.conditions)?a.conditions:[],o=t.id||`page_${n}`,r=this.surveyState.pageAnswers[o]||{};for(const n of s)if(this._evaluateCondition(n,t,r))return this._resolvePageTarget(n.go_to,e,i);return this._resolvePageTarget(a.default,e,i)}_evaluateCondition(t,e,n){const{operator:i,values:a}=t;if(!i||!Array.isArray(a))return!1;let s=null;if("rating"===e.type?s="number"==typeof n.rating?n.rating:null:"multiple_choice"===e.type?s=n.value||(Array.isArray(n.values)?n.values[0]:null):"text"===e.type&&(s=n.text||null),"is_empty"===i)return null===s||""===s;if("not_empty"===i)return null!==s&&""!==s;if(null===s)return!1;const[o,r]=a;switch(i){case"equals":return String(s)===String(o);case"greater_than":return Number(s)>Number(o);case"less_than":return Number(s)<Number(o);case"between":return Number(s)>=Number(o)&&Number(s)<=Number(r);case"contains":return String(s).includes(String(o));default:return!1}}_resolvePageTarget(t,e,n){if(!t)return n;if("end_survey"===t)return-1;if("next_page"===t||"next"===t)return n;if("number"==typeof t)return t>=0&&t<e?t:n;if("string"==typeof t){const e=t.replace(/^page:/,""),i=this.surveyOptions.pages.findIndex(t=>t.id===e);return i>=0?i:n}return n}_getSubmissionRating(){if("number"==typeof this.surveyState.score)return this.surveyState.score;if(!this._isMultiPageSurvey())return null;for(const t of this.surveyOptions.pages){const e=t.id||`page_${this.surveyOptions.pages.indexOf(t)}`,n=this.surveyState.pageAnswers[e];if(n&&"number"==typeof n.rating)return n.rating}return null}_normalizePageAnswersForSubmit(){if(!this._isMultiPageSurvey())return"number"==typeof this.surveyState.score?[{page_id:"p1",value:this.surveyState.score}]:[];const t=[];for(const e of this.surveyOptions.pages){const n=e.id||`page_${this.surveyOptions.pages.indexOf(e)}`,i=this.surveyState.pageAnswers[n];if(null==i)continue;let a=null;if("rating"===e.type&&"number"==typeof i.rating)a=i.rating;else if("multiple_choice"===e.type){const t=e.multipleChoiceConfig||e.multiple_choice_config||{};(!0===t.allow_multiple||!0===t.multiple||!0===t.allow_multiple_selection)&&Array.isArray(i.values)&&i.values.length>0?a=i.values:null!=i.value&&""!==i.value&&(a=i.value)}else"text"===e.type&&"string"==typeof i.text&&i.text.trim()?a=i.text.trim():"link"===e.type&&"boolean"==typeof i.clicked&&(a=i.clicked);null!==a&&t.push({page_id:n,value:a})}return t}_getRespondentContext(){const t="function"==typeof this.sdk.getMetadata&&this.sdk.getMetadata()||{},e=this.apiService&&"function"==typeof this.apiService.getMetadata&&this.apiService.getMetadata()||{},n=this.options.metadata||{};return{respondentId:this.surveyOptions.respondentId||n.user_id||t.user_id||e.user_id||null,email:this.surveyOptions.email||n.email||t.email||e.email||null}}async _handleDismiss(){if(this.surveyOptions.surveyId)try{await this.apiService.dismissSurvey(this.surveyOptions.surveyId)}catch(t){console.error("[SurveyWidget] Failed to dismiss survey:",t)}this.surveyOptions.onDismiss&&this.surveyOptions.onDismiss(),this.sdk.eventBus.emit("survey:dismissed",{widget:this}),this._closeSurvey()}_showError(t){const e=this.surveyElement.querySelector(".feedback-survey-error");e&&e.remove();const n=document.createElement("div");n.className="feedback-survey-error",n.innerHTML=`<iconify-icon icon="ph:warning" width="15" height="15"></iconify-icon><span>${t}</span>`,this.surveyElement.prepend(n),setTimeout(()=>n.remove(),3e3)}_showThankYouScreen(t){if(!this.surveyElement)return;const e=this.surveyOptions.pages||[],n=e[this.surveyState.currentPageIndex]||e[e.length-1]||null,i=n?.thankYouConfig||null,a=this.surveyOptions.thankYouConfig||null,s=(i?.title?i:null)||(a?.title?a:null)||{},o=s.title||"Thanks for your feedback!",r=s.button_text||null,l=s.button_url||"",c=l?/^https?:\/\//i.test(l)?l:`https://${l}`:"#";this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null),this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close"><iconify-icon icon="ph:x" width="16" height="16"></iconify-icon></button>\n\t\t\t<div class="feedback-survey-thankyou">\n\t\t\t\t<iconify-icon icon="ph:check-circle" width="48" height="48" class="feedback-survey-thankyou-icon"></iconify-icon>\n\t\t\t\t<h3 class="feedback-survey-thankyou-title">${o}</h3>\n\t\t\t\t${r?`\n\t\t\t\t\t<a class="feedback-survey-thankyou-btn" href="${c}" target="_blank" rel="noopener noreferrer">\n\t\t\t\t\t\t${r}\n\t\t\t\t\t\t<iconify-icon icon="ph:arrow-square-out" width="15" height="15" style="pointer-events:none;"></iconify-icon>\n\t\t\t\t\t</a>`:""}\n\t\t\t</div>\n\t\t`;const d=this.surveyElement.querySelector(".feedback-survey-close");d&&d.addEventListener("click",()=>this._closeSurvey()),setTimeout(()=>{this.surveyElement&&this._closeSurvey(),t&&t()},r?6e3:3500)}_closeSurvey(t=!0,e=!1){this.state.isOpen=!1,this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null);const n=this.surveyElement,i=this.backdropElement;if(n){n.style.opacity="0";const t=this.surveyOptions.position;n.style.transform="center"===t?"translate(-50%, -50%) scale(0.95)":"bottom"===t?"translateY(100%)":"translateY(10px)",e?n.parentNode&&n.parentNode.removeChild(n):setTimeout(()=>{n&&n.parentNode&&n.parentNode.removeChild(n)},300),this.surveyElement=null}i&&(i.style.opacity="0",e?i.parentNode&&i.parentNode.removeChild(i):setTimeout(()=>{i&&i.parentNode&&i.parentNode.removeChild(i)},300),this.backdropElement=null),t&&(this.surveyState={score:null,feedback:"",customAnswers:{},pageAnswers:{},currentPageIndex:0,isSubmitting:!1,isVisible:!1}),this.sdk.eventBus.emit("survey:closed",{widget:this})}open(){return this.show()}close(){return this.hide()}toggle(){return this.surveyState.isVisible?this.hide():this.show()}destroy(){this._closeSurvey(!0,!0),super.destroy()}}class W extends q{constructor(t){super({...t,type:"tab"})}_render(){const t=document.createElement("div");return t.className=`feedback-widget feedback-widget-tab position-${this.options.position}`,t.innerHTML='\n <div class="feedback-tab-trigger">\n <span class="feedback-tab-text">Feedback</span>\n </div>\n ',this.options.customStyles&&Object.assign(t.style,this.options.customStyles),t}_attachEvents(){this.element.querySelector(".feedback-tab-trigger").addEventListener("click",this.openModal)}updateText(t){const e=this.element?.querySelector(".feedback-tab-text");e&&(e.textContent=t)}updatePosition(t){this.options.position=t,this.element&&(this.element.className=this.element.className.replace(/position-\w+/,`position-${t}`))}}class R{static widgets=new Map([["button",S],["tab",W],["inline",E],["survey",U],["liveChat",H],["changelog",A]]);static register(t,e){if("string"!=typeof t||!t.trim())throw new p("Widget type must be a non-empty string");if("function"!=typeof e)throw new p("Widget class must be a constructor function");this.widgets.set(t,e)}static create(t,e={}){const n=this.widgets.get(t);if(!n){const e=Array.from(this.widgets.keys()).join(", ");throw new p(`Unknown widget type: ${t}. Available types: ${e}`)}try{return new n(e)}catch(e){throw new p(`Failed to create widget of type '${t}': ${e.message}`,e)}}static getAvailableTypes(){return Array.from(this.widgets.keys())}static isTypeRegistered(t){return this.widgets.has(t)}static unregister(t){return this.widgets.delete(t)}static clear(){this.widgets.clear()}static getWidgetClass(t){return this.widgets.get(t)}}let Q=class t{constructor(t={}){this.config=this._validateAndMergeConfig(t),this.initialized=!1,this.identified=!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,metadata:this.config.metadata,mock:this.config.mock,debug:this.config.debug,env:this.config.env}),this._bindMethods()}_injectStyles(){if("undefined"==typeof document)return;if(document.querySelector("#product7-styles"))return;const t=document.createElement("style");if(t.id="product7-styles",t.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 /* Web Chat semantic tokens (light defaults) */\n --msg-bg: #FFFFFF;\n --msg-bg-surface: #F3F4F6;\n --msg-bg-elevated: #FFFFFF;\n --msg-bg-hover: #F9FAFB;\n --msg-bg-input: rgba(255, 255, 255, 0.7);\n --msg-bg-bubble-own: #F3F4F6;\n --msg-bg-bubble-received: #155EEF;\n --msg-bg-header-gradient: linear-gradient(180deg, #e0e7ff 0%, #f0f4ff 35%, #FFFFFF 65%);\n --msg-bg-header-glow1: radial-gradient(circle, rgba(21, 94, 239, 0.08) 0%, transparent 70%);\n --msg-bg-header-glow2: radial-gradient(circle, rgba(139, 92, 246, 0.05) 0%, transparent 70%);\n --msg-text: #111827;\n --msg-text-secondary: #4B5563;\n --msg-text-tertiary: #6B7280;\n --msg-text-muted: #9CA3AF;\n --msg-border: #E5E7EB;\n --msg-border-bubble: transparent;\n --msg-shadow-card: rgba(9, 30, 66, 0.25) 0px 1px 1px, rgba(9, 30, 66, 0.13) 0px 0px 1px 1px;\n --msg-shadow-card-hover: rgba(9, 30, 66, 0.3) 0px 2px 2px, rgba(9, 30, 66, 0.18) 0px 0px 1px 1px;\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: 0.75rem;\n --font-size-sm: 0.8125rem;\n --font-size-base: 0.875rem;\n --font-size-md: 0.9375rem;\n --font-size-lg: 1rem;\n --font-size-xl: 1.125rem;\n --font-size-2xl: 1.25rem;\n --font-size-3xl: 1.5rem;\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.liveChat-widget,\n.changelog-widget,\n.feedback-survey,\n.feedback-panel,\n.feedback-modal,\n.changelog-modal,\n.changelog-list-modal,\n.product7-notification {\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.liveChat-widget *,\n.liveChat-widget *::before,\n.liveChat-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.feedback-panel *,\n.feedback-panel *::before,\n.feedback-panel *::after,\n.feedback-modal *,\n.feedback-modal *::before,\n.feedback-modal *::after,\n.changelog-modal *,\n.changelog-modal *::before,\n.changelog-modal *::after,\n.changelog-list-modal *,\n.changelog-list-modal *::before,\n.changelog-list-modal *::after {\n box-sizing: border-box;\n}\n\n@media (prefers-reduced-motion: reduce) {\n .feedback-widget *,\n .liveChat-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 .liveChat-widget,\n .liveChat-launcher,\n .liveChat-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 display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\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 font-family: inherit;\n cursor: pointer;\n height: 40px;\n padding: 8px 18px;\n transition: all var(--transition-base);\n}\n\n.sdk-btn-primary:disabled {\n opacity: 0.6;\n cursor: not-allowed;\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 transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.sdk-btn-secondary {\n background: transparent;\n color: var(--color-neutral-600);\n border: 1px solid var(--color-border);\n height: 40px;\n padding: 8px 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-secondary:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\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-ghost:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\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: rgba(128, 128, 128, 0.12);\n color: var(--color-text-primary);\n}\n\n.sdk-btn-icon:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.sdk-btn-icon:focus-visible {\n outline: 2px solid var(--color-primary);\n outline-offset: 2px;\n}\n\n.sdk-input {\n width: 100%;\n height: 40px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 8px 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: 40px;\n border-radius: 8px;\n border: 1px solid var(--color-border);\n padding: 8px 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-required {\n color: var(--color-error, #D13212);\n margin-left: 1px;\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: 28px;\n height: 28px;\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: rgba(128, 128, 128, 0.12);\n color: var(--color-text-primary);\n}\n\n.sdk-close-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.feedback-widget-button.position-left {\n bottom: 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: #ffffff;\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 box-shadow: var(--shadow-lg);\n}\n\n.feedback-trigger-btn:active:not(:disabled) {\n transform: translateY(1px);\n box-shadow: var(--shadow-md);\n transition-duration: 100ms;\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.feedback-modal {\n box-sizing: border-box;\n}\n\n.feedback-panel *,\n.feedback-panel *::before,\n.feedback-panel *::after,\n.feedback-modal *,\n.feedback-modal *::before,\n.feedback-modal *::after {\n box-sizing: border-box;\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 border-radius: 12px;\n overflow: hidden;\n opacity: 0;\n transform: translateX(calc(100% + 24px));\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.2s ease;\n font-family: inherit;\n box-shadow: var(--shadow-lg);\n}\n\n.feedback-panel.open {\n transform: translateX(0);\n opacity: 1;\n}\n\n.feedback-panel.panel-from-left {\n right: auto;\n left: var(--spacing-6);\n transform: translateX(calc(-100% - 24px));\n}\n\n.feedback-panel.panel-from-left.open {\n transform: translateX(0);\n}\n\n.feedback-modal {\n position: fixed;\n top: 50%;\n left: 50%;\n border-radius: 12px;\n overflow: hidden;\n opacity: 0;\n transform: translate(-50%, -50%) scale(0.96);\n width: min(460px, calc(100vw - (var(--spacing-5) * 2)));\n max-height: min(560px, calc(100vh - (var(--spacing-6) * 2)));\n z-index: var(--z-popover);\n transition: transform var(--transition-slow), opacity var(--transition-slow);\n font-family: inherit;\n box-shadow: var(--shadow-xl);\n}\n\n.feedback-modal.open {\n transform: translate(-50%, -50%) scale(1);\n opacity: 1;\n}\n\n.feedback-panel-content {\n background: var(--feedback-panel-bg, var(--color-white));\n color: var(--feedback-panel-text, var(--color-text-primary));\n height: 100%;\n display: flex;\n flex-direction: column;\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(--feedback-panel-text, var(--color-text-primary));\n}\n\n.feedback-panel-body {\n flex: 1;\n overflow-y: auto;\n overflow-x: hidden;\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: #ffffff;\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: #D13212;\n border-radius: var(--radius-md);\n display: none;\n}\n\n.feedback-error.show {\n display: block;\n}\n\n/* ========================================\n DARK THEME — scoped variable overrides\n ======================================== */\n\n.feedback-panel.theme-dark,\n.feedback-modal.theme-dark {\n /* Aligned with web chat dark theme */\n --color-white: #0f1317;\n --color-background: #0f1317;\n --color-surface: #1a1e24;\n --color-border: #232930;\n --color-neutral-50: #1a1e24;\n --color-neutral-100: #1a1e24;\n --color-neutral-200: #232930;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-neutral-900: #e8e8e8;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\n --feedback-panel-bg: #1a1e24;\n --feedback-panel-text: #e8e8e8;\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-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.panel-from-left {\n right: auto;\n left: var(--spacing-4);\n transform: translateX(calc(-100% - 24px));\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-right {\n bottom: var(--spacing-5);\n right: var(--spacing-5);\n}\n\n.changelog-widget.position-left {\n bottom: 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: #ffffff;\n background: var(--color-primary);\n box-shadow: var(--shadow-md);\n width: fit-content;\n}\n\n.changelog-trigger-btn:hover {\n box-shadow: var(--shadow-lg);\n}\n\n.changelog-trigger-btn:active {\n transform: translateY(1px);\n box-shadow: var(--shadow-md);\n transition-duration: 100ms;\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-backdrop,\n.changelog-list-modal-backdrop {\n position: fixed;\n inset: 0;\n background: rgba(0, 0, 0, 0.5);\n opacity: 0;\n pointer-events: none;\n transition: opacity var(--transition-slow);\n z-index: var(--z-modal-backdrop);\n}\n\n.changelog-modal-backdrop.show,\n.changelog-list-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\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: 480px;\n max-height: 90vh;\n background: var(--color-white);\n border-radius: 12px;\n overflow: hidden;\n box-shadow: var(--shadow-xl);\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: 28px;\n height: 28px;\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:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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: 1px solid var(--color-border);\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-text-primary);\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-text-secondary);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\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: #ffffff;\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 height: 40px;\n}\n\n.changelog-popup-btn:hover:not(:disabled) {\n background: var(--color-primary-hover);\n}\n\n.changelog-popup-btn:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\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-neutral-300);\n cursor: pointer;\n transition: all var(--transition-base);\n}\n\n.changelog-dot:hover {\n background: var(--color-neutral-400);\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:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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: 12px;\n overflow: hidden;\n box-shadow: var(--shadow-lg);\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}\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: 28px;\n height: 28px;\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:hover {\n background: var(--color-neutral-100);\n color: var(--color-neutral-900);\n}\n\n.changelog-list-modal-close:active {\n transform: translateY(1px);\n transition-duration: 100ms;\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 gap: var(--spacing-3);\n padding: var(--spacing-4) 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-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.changelog-list-item-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n flex-wrap: wrap;\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}\n\n.changelog-label {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--radius-full);\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n line-height: 1.5;\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 white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\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-image {\n width: 64px;\n height: 64px;\n flex-shrink: 0;\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: 100%;\n display: block;\n object-fit: cover;\n}\n\n.changelog-list-item-arrow {\n flex-shrink: 0;\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 DARK THEME — scoped variable overrides\n ======================================== */\n\n.changelog-theme-dark.changelog-widget .changelog-trigger-btn {\n background: #1a1e24;\n color: #e8e8e8;\n border: 1px solid #232930;\n}\n\n.changelog-theme-dark.changelog-modal-backdrop,\n.changelog-theme-dark.changelog-list-modal-backdrop {\n background: rgba(2, 6, 23, 0.72);\n}\n\n.changelog-theme-dark .changelog-modal-container,\n.changelog-theme-dark .changelog-list-modal-container {\n --color-white: #1a1e24;\n --color-border: #232930;\n --color-neutral-50: #232930;\n --color-neutral-100: #2d343c;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-neutral-900: #e8e8e8;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\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-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: 12px;\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: 12px;\n }\n\n .changelog-list-item {\n padding: var(--spacing-3) var(--spacing-4);\n }\n\n .changelog-list-item-image {\n width: 56px;\n height: 56px;\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.4);\n z-index: var(--z-modal-backdrop);\n animation: fadeIn var(--transition-slow);\n}\n\n.feedback-survey-backdrop-dark {\n background: rgba(2, 6, 23, 0.65);\n}\n\n/* ========================================\n SURVEY CARD\n ======================================== */\n\n.feedback-survey {\n position: fixed;\n z-index: var(--z-modal);\n background: var(--color-white);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-xl);\n box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);\n padding: var(--spacing-6);\n min-width: 320px;\n max-width: 400px;\n font-family: inherit;\n overflow: hidden;\n opacity: 0;\n transition: opacity 200ms ease, transform 240ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* ========================================\n DARK THEME\n ======================================== */\n\n.feedback-survey-theme-dark {\n --color-white: #0f1317;\n --color-background: #0f1317;\n --color-surface: #1a1e24;\n --color-border: #232930;\n --color-neutral-50: #1a1e24;\n --color-neutral-100: #1a1e24;\n --color-neutral-200: #232930;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-neutral-900: #e8e8e8;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\n --color-primary-light: rgba(21, 94, 239, 0.18);\n --color-primary-border: rgba(21, 94, 239, 0.4);\n --color-error-light: rgba(239, 68, 68, 0.15);\n --color-error-border: rgba(239, 68, 68, 0.25);\n --color-error-dark: #fca5a5;\n}\n\n/* ========================================\n POSITION VARIANTS + ENTRANCE STATES\n ======================================== */\n\n.feedback-survey-right {\n bottom: var(--spacing-6);\n right: var(--spacing-6);\n transform: translateY(10px);\n}\n\n.feedback-survey-left {\n bottom: var(--spacing-6);\n left: var(--spacing-6);\n transform: translateY(10px);\n}\n\n.feedback-survey-center {\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%) scale(0.97);\n}\n\n/* ========================================\n CLOSE BUTTON\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: 4px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--radius-md);\n transition: all var(--transition-base);\n}\n\n.feedback-survey-close iconify-icon {\n display: block;\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/* ========================================\n TYPOGRAPHY\n ======================================== */\n\n.feedback-survey-title {\n margin: 0 0 var(--spacing-3) 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: 36px;\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-base);\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: 36px;\n}\n\n.feedback-survey-content {\n margin-bottom: var(--spacing-3);\n}\n\n/* ========================================\n PROGRESS BAR\n ======================================== */\n\n.feedback-survey-progress {\n margin-bottom: var(--spacing-4);\n}\n\n.feedback-survey-progress-track {\n height: 3px;\n background: var(--color-neutral-200);\n border-radius: var(--radius-full);\n overflow: hidden;\n}\n\n.feedback-survey-progress-fill {\n height: 100%;\n background: var(--color-primary);\n border-radius: var(--radius-full);\n transition: width 320ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n/* ========================================\n NPS — individual colored buttons\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 flex: 1;\n height: 40px;\n min-height: unset;\n border-radius: 6px;\n cursor: pointer;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: #ffffff;\n border: 1px solid transparent;\n transition: filter var(--transition-fast), transform var(--transition-fast);\n font-family: inherit;\n}\n\n.feedback-survey-nps-btn:hover {\n filter: brightness(1.12);\n}\n\n.feedback-survey-nps-btn.selected {\n filter: brightness(0.82);\n box-shadow: inset 0 0 0 2px rgba(0, 0, 0, 0.25);\n}\n\n.feedback-survey-nps-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* NPS score colors */\n.feedback-survey-nps-score-0 { background: #dc2626; border-color: #dc2626; }\n.feedback-survey-nps-score-1 { background: #ef4444; border-color: #ef4444; }\n.feedback-survey-nps-score-2 { background: #f97316; border-color: #f97316; }\n.feedback-survey-nps-score-3 { background: #fb923c; border-color: #fb923c; }\n.feedback-survey-nps-score-4 { background: #fdba74; border-color: #fdba74; }\n.feedback-survey-nps-score-5 { background: #fbbf24; border-color: #fbbf24; }\n.feedback-survey-nps-score-6 { background: #fde047; border-color: #fde047; color: #171717; }\n.feedback-survey-nps-score-7 { background: #e5e7eb; border-color: #e5e7eb; color: #374151; }\n.feedback-survey-nps-score-8 { background: #e5e7eb; border-color: #e5e7eb; color: #374151; }\n.feedback-survey-nps-score-9 { background: #4ade80; border-color: #4ade80; }\n.feedback-survey-nps-score-10 { background: #16a34a; border-color: #16a34a; }\n\n/* ========================================\n CSAT — emoji row\n ======================================== */\n\n.feedback-survey-csat {\n display: flex;\n justify-content: space-between;\n gap: var(--spacing-3);\n padding: var(--spacing-2) 0;\n}\n\n.feedback-survey-csat-btn {\n background: none;\n border: none;\n cursor: pointer;\n font-size: 32px;\n transition: transform var(--transition-fast), opacity var(--transition-fast);\n padding: var(--spacing-2) var(--spacing-1);\n min-width: 44px;\n min-height: 44px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: var(--radius-lg);\n line-height: 1;\n}\n\n.feedback-survey-csat-btn:hover {\n transform: scale(1.15);\n}\n\n.feedback-survey-csat-btn.selected {\n transform: scale(1.2);\n}\n\n.feedback-survey-csat:has(.selected) .feedback-survey-csat-btn:not(.selected) {\n transform: scale(0.85);\n opacity: 0.3;\n}\n\n.feedback-survey-csat-btn:active {\n transform: scale(1.05) translateY(1px);\n transition-duration: 100ms;\n}\n\n.feedback-survey-csat-btn.selected:active {\n transform: scale(1.2) translateY(1px);\n}\n\n/* ========================================\n NUMBER RATING (segmented scale)\n ======================================== */\n\n.feedback-survey-rating-scale {\n display: flex;\n overflow: hidden;\n border: 1px solid var(--color-neutral-200);\n border-radius: 6px;\n background: var(--color-white);\n}\n\n.feedback-survey-rating-scale-btn {\n flex: 1;\n height: 40px;\n padding: 0;\n border: 0;\n border-right: 1px solid var(--color-neutral-200);\n border-radius: 0;\n background: var(--color-white);\n cursor: pointer;\n font-size: clamp(14px, 3vw, 18px);\n font-weight: var(--font-weight-medium);\n color: #374151;\n transition: background var(--transition-fast), color var(--transition-fast);\n font-family: inherit;\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-primary-light);\n color: var(--color-primary);\n}\n\n.feedback-survey-rating-scale-btn:focus-visible {\n outline: none;\n z-index: 1;\n box-shadow: inset 0 0 0 2px 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-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* ========================================\n STARS\n ======================================== */\n\n.feedback-survey-stars {\n display: flex;\n gap: var(--spacing-2);\n justify-content: center;\n}\n\n.feedback-survey-star-btn {\n background: none;\n border: none;\n cursor: pointer;\n padding: 4px;\n width: 40px;\n height: 40px;\n flex-shrink: 0;\n line-height: 1;\n color: var(--color-neutral-300);\n transition: color var(--transition-fast), transform var(--transition-fast);\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.feedback-survey-star-btn iconify-icon {\n display: block;\n pointer-events: none;\n flex-shrink: 0;\n}\n\n.feedback-survey-star-btn.filled,\n.feedback-survey-star-btn.hovered {\n color: #f59e0b;\n}\n\n.feedback-survey-star-btn:hover {\n color: #f59e0b;\n}\n\n.feedback-survey-star-btn:active {\n transform: scale(0.9);\n transition-duration: 100ms;\n}\n\n/* ========================================\n SCALE LABELS\n ======================================== */\n\n.feedback-survey-labels {\n display: flex;\n justify-content: space-between;\n margin-top: var(--spacing-2);\n padding: 0 var(--spacing-1);\n font-size: var(--font-size-xs);\n color: var(--color-text-tertiary);\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: vertical;\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/* ========================================\n MULTI-PAGE TEXT INPUT\n ======================================== */\n\n.feedback-survey-page-textarea {\n width: 100%;\n min-height: 120px;\n padding: var(--spacing-3);\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-family: inherit;\n background: var(--color-white);\n color: var(--color-text-primary);\n box-sizing: border-box;\n resize: vertical;\n outline: none;\n transition: border-color var(--transition-base);\n}\n\n.feedback-survey-page-textarea::placeholder {\n color: var(--color-text-tertiary);\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 MULTIPLE CHOICE\n ======================================== */\n\n.feedback-survey-multiple-choice {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-page-choice-btn {\n width: 100%;\n height: 40px;\n padding: 0 var(--spacing-4);\n border: 1px solid var(--color-neutral-200);\n border-radius: var(--radius-md);\n background: var(--color-white);\n color: #374151;\n text-align: left;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n display: flex;\n align-items: center;\n justify-content: space-between;\n transition: all var(--transition-fast);\n}\n\n.feedback-survey-page-choice-btn::after {\n content: '';\n width: 18px;\n height: 18px;\n border-radius: 50%;\n border: 1.5px solid #D1D5DB;\n flex-shrink: 0;\n display: flex;\n align-items: center;\n justify-content: center;\n background: transparent;\n transition: all var(--transition-fast);\n}\n\n.feedback-survey-page-choice-btn:hover {\n border-color: var(--color-primary);\n background: var(--color-primary-light);\n color: var(--color-primary);\n}\n\n.feedback-survey-page-choice-btn:hover::after {\n border-color: var(--color-primary);\n}\n\n.feedback-survey-page-choice-btn.selected {\n border-color: var(--color-primary);\n background: var(--color-primary-light);\n color: var(--color-primary-active);\n}\n\n.feedback-survey-page-choice-btn.selected::after {\n content: '✓';\n color: #ffffff;\n font-size: 11px;\n font-weight: 700;\n border-color: var(--color-primary);\n background-color: var(--color-primary);\n}\n\n.feedback-survey-page-choice-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* ========================================\n ACTIONS\n ======================================== */\n\n.feedback-survey-actions {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n margin-top: var(--spacing-4);\n}\n\n.feedback-survey-back {\n padding: 0 var(--spacing-4);\n min-height: 40px;\n border: 1px solid var(--color-border);\n border-radius: var(--radius-md);\n background: var(--color-white);\n color: var(--color-text-secondary);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n transition: all var(--transition-fast);\n flex: 1;\n white-space: nowrap;\n}\n\n.feedback-survey-back:hover {\n background: var(--color-neutral-100);\n border-color: var(--color-neutral-300);\n color: var(--color-text-primary);\n}\n\n.feedback-survey-back:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n/* ========================================\n SUBMIT BUTTON\n ======================================== */\n\n.feedback-survey-submit {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n min-height: 40px;\n padding: 0 var(--spacing-4);\n background: var(--color-primary);\n color: #ffffff;\n border: 1px solid var(--color-primary);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n font-family: inherit;\n text-align: center;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-submit:hover:not(:disabled) {\n background: var(--color-primary-hover);\n border-color: var(--color-primary-hover);\n}\n\n.feedback-survey-submit:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.feedback-survey-submit:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.feedback-survey-submit iconify-icon,\n.feedback-survey-back iconify-icon {\n flex-shrink: 0;\n}\n\n/* ========================================\n ERROR\n ======================================== */\n\n.feedback-survey-error {\n margin-bottom: var(--spacing-3);\n background: #D13212;\n border-radius: var(--radius-md);\n color: #ffffff;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n padding: var(--spacing-3) var(--spacing-4);\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.feedback-survey-error iconify-icon {\n flex-shrink: 0;\n}\n\n/* ========================================\n THANK YOU SCREEN\n ======================================== */\n\n.feedback-survey-thankyou {\n display: flex;\n flex-direction: column;\n align-items: center;\n text-align: center;\n padding: var(--spacing-6) 0;\n}\n\n.feedback-survey-thankyou-icon {\n color: #10b981;\n margin-bottom: var(--spacing-4);\n display: block;\n}\n\n.feedback-survey-thankyou-title {\n margin: 0;\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-text-primary);\n}\n\n.feedback-survey-thankyou-btn {\n margin-top: var(--spacing-5);\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n height: 40px;\n padding: 0 var(--spacing-6);\n background: var(--color-primary);\n color: #ffffff;\n border: 1px solid var(--color-primary);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n text-decoration: none;\n transition: all var(--transition-base);\n}\n\n.feedback-survey-thankyou-btn:hover {\n background: var(--color-primary-hover);\n border-color: var(--color-primary-hover);\n color: #ffffff;\n text-decoration: none;\n}\n\n/* ========================================\n DARK MODE — SELECTED STATE OVERRIDES\n ======================================== */\n\n.feedback-survey-theme-dark .feedback-survey-page-choice-btn.selected,\n.feedback-survey-theme-dark .feedback-survey-rating-scale-btn.selected,\n.feedback-survey-theme-dark .feedback-survey-nps-btn.selected {\n color: var(--color-text-primary);\n}\n\n/* ========================================\n NOTIFICATION TOASTS\n ======================================== */\n\n.product7-notification {\n position: fixed;\n top: var(--spacing-6);\n right: var(--spacing-6);\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 color: #fff;\n}\n\n.product7-notification > div {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.product7-notification svg {\n width: 18px;\n height: 18px;\n flex-shrink: 0;\n}\n\n.product7-notification-success { background: #037F0C; }\n.product7-notification-error { background: #D13212; }\n.product7-notification-warning { background: #FF9900; color: #000; }\n.product7-notification-info { background: #0972D3; }\n\n/* ========================================\n RESPONSIVE\n ======================================== */\n\n@media (max-width: 768px) {\n .feedback-survey {\n min-width: 288px;\n padding: var(--spacing-5);\n }\n\n .feedback-survey-nps-btn {\n font-size: var(--font-size-xs);\n }\n\n .feedback-survey-csat-btn {\n font-size: 28px;\n min-width: 40px;\n min-height: 40px;\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 font-size: clamp(13px, 5vw, 16px);\n }\n}\n\n\n.liveChat-widget * {\n font-weight: 500;\n}\n\n.liveChat-launcher {\n position: fixed;\n z-index: var(--z-modal);\n}\n\n.liveChat-launcher-right {\n bottom: var(--liveChat-v-padding, var(--spacing-5));\n right: var(--liveChat-h-padding, var(--spacing-5));\n}\n\n.liveChat-launcher-left {\n bottom: var(--liveChat-v-padding, var(--spacing-5));\n left: var(--liveChat-h-padding, var(--spacing-5));\n}\n\n.liveChat-launcher-btn {\n width: 60px;\n height: 60px;\n border-radius: var(--radius-full);\n border: none;\n background: var(--color-primary);\n color: #ffffff;\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.liveChat-launcher-btn:hover {\n box-shadow: var(--shadow-xl);\n}\n\n.liveChat-launcher-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-launcher-badge {\n position: absolute;\n top: -3px;\n right: -3px;\n min-width: 22px;\n height: 22px;\n background: #ef4444;\n color: #ffffff;\n font-size: 11px;\n font-weight: 700;\n border-radius: var(--radius-full);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n border: 2.5px solid #ffffff;\n box-shadow: 0 2px 6px rgb(239 68 68 / 0.45);\n letter-spacing: -0.2px;\n line-height: 1;\n}\n\n.liveChat-panel {\n position: fixed;\n z-index: var(--z-popover);\n width: 400px;\n height: 720px;\n max-height: calc(100vh - 100px);\n opacity: 0;\n visibility: hidden;\n pointer-events: none;\n transform: translateY(8px) scale(0.97);\n transition:\n opacity 160ms cubic-bezier(0.4, 0, 1, 1),\n transform 180ms cubic-bezier(0.4, 0, 1, 1),\n visibility 0s linear 180ms,\n width 300ms cubic-bezier(0.16, 1, 0.3, 1),\n height 300ms cubic-bezier(0.16, 1, 0.3, 1),\n max-height 300ms cubic-bezier(0.16, 1, 0.3, 1);\n}\n\n.liveChat-panel.open {\n opacity: 1;\n visibility: visible;\n pointer-events: auto;\n transform: translateY(0) scale(1);\n transition:\n opacity 220ms cubic-bezier(0.16, 1, 0.3, 1),\n transform 300ms cubic-bezier(0.16, 1, 0.3, 1),\n visibility 0s linear 0s;\n}\n\n.liveChat-panel-right {\n bottom: calc(var(--liveChat-v-padding, var(--spacing-5)) + 70px);\n right: var(--liveChat-h-padding, var(--spacing-5));\n transform-origin: bottom right;\n}\n\n.liveChat-panel-left {\n bottom: calc(var(--liveChat-v-padding, var(--spacing-5)) + 70px);\n left: var(--liveChat-h-padding, var(--spacing-5));\n transform-origin: bottom left;\n}\n\n.liveChat-panel-content {\n background: var(--msg-bg);\n height: 100%;\n border-radius: var(--radius-2xl);\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: var(--shadow-xl);\n border: 1px solid var(--msg-border);\n}\n\n.liveChat-panel-content *::-webkit-scrollbar {\n display: none;\n}\n\n.liveChat-panel-content * {\n scrollbar-width: none;\n}\n\n.liveChat-panel-views {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.liveChat-view {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n position: relative;\n}\n\n.liveChat-avatar-stack {\n display: flex;\n align-items: center;\n}\n\n.liveChat-avatar-stack .sdk-avatar {\n margin-left: -8px;\n}\n\n.liveChat-avatar-stack .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n.liveChat-avatar-stack-tiny .sdk-avatar {\n margin-left: -6px;\n}\n\n.liveChat-avatar-stack-tiny .sdk-avatar:first-child {\n margin-left: 0;\n}\n\n.liveChat-mobile-close-btn {\n display: none;\n}\n\n.liveChat-panel.liveChat-panel-expanded {\n width: 720px;\n height: 88vh;\n max-height: 88vh;\n}\n\n.liveChat-chat-menu-wrapper {\n position: relative;\n}\n\n.liveChat-chat-menu-dropdown {\n position: absolute;\n top: calc(100% + 6px);\n right: 0;\n background: var(--color-white, #ffffff);\n border: 1px solid var(--color-border, #e5e7eb);\n border-radius: var(--radius-lg);\n box-shadow: 0 4px 16px rgba(0,0,0,0.12);\n min-width: 190px;\n z-index: 20;\n overflow: hidden;\n opacity: 0;\n visibility: hidden;\n transform: translateY(-4px);\n transition: opacity 140ms ease, transform 140ms ease, visibility 0s linear 140ms;\n}\n\n.liveChat-chat-menu-dropdown.open {\n opacity: 1;\n visibility: visible;\n transform: translateY(0);\n transition: opacity 140ms ease, transform 140ms ease, visibility 0s linear 0s;\n}\n\n.liveChat-chat-menu-item {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 14px;\n background: none;\n border: none;\n cursor: pointer;\n font-size: 13px;\n font-weight: 500;\n color: var(--color-text-primary, #111827);\n text-align: left;\n transition: background 120ms;\n}\n\n.liveChat-chat-menu-item:hover {\n background: var(--color-neutral-50, #f9fafb);\n}\n\n.liveChat-chat-menu-item iconify-icon {\n color: var(--color-text-secondary, #6b7280);\n flex-shrink: 0;\n}\n\n@media (max-width: 480px) {\n .liveChat-mobile-close-btn {\n display: flex;\n }\n .liveChat-chat-menu-wrapper {\n display: none;\n }\n .liveChat-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 transform-origin: bottom center;\n transform: translateY(12px) scale(0.98);\n }\n\n .liveChat-panel.open {\n transform: translateY(0) scale(1);\n }\n\n .liveChat-panel-content {\n border-radius: 0;\n }\n\n .liveChat-launcher {\n bottom: var(--spacing-4);\n right: var(--spacing-4);\n }\n\n .liveChat-launcher-left {\n left: var(--spacing-4);\n }\n}\n\n/* ========================================\n DARK THEME — token overrides only\n ======================================== */\n\n.liveChat-widget.theme-dark {\n /* Web Chat semantic tokens */\n --msg-bg: #0f1317;\n --msg-bg-surface: #1a1e24;\n --msg-bg-elevated: #232930;\n --msg-bg-hover: #232930;\n --msg-bg-input: #1a1e24;\n --msg-bg-bubble-own: #1e2330;\n --msg-bg-bubble-received: #1D4ED8;\n --msg-bg-header-gradient: linear-gradient(180deg, #1a1e2e 0%, #141720 50%, #0f1317 100%);\n --msg-bg-header-glow1: radial-gradient(circle, rgba(21, 94, 239, 0.07) 0%, transparent 70%);\n --msg-bg-header-glow2: radial-gradient(circle, rgba(139, 92, 246, 0.05) 0%, transparent 70%);\n --msg-text: #e8e8e8;\n --msg-text-secondary: #999999;\n --msg-text-tertiary: #666666;\n --msg-text-muted: #555555;\n --msg-border: #232930;\n --msg-border-bubble: #3a4255;\n --msg-shadow-card: none;\n --msg-shadow-card-hover: none;\n\n /* Override base design tokens within web chat scope */\n --color-white: #0f1317;\n --color-background: #0f1317;\n --color-surface: #1a1e24;\n --color-neutral-50: #1a1e24;\n --color-neutral-100: #1a1e24;\n --color-neutral-200: #232930;\n --color-neutral-300: #2d343c;\n --color-neutral-400: #555555;\n --color-neutral-500: #777777;\n --color-border: #232930;\n --color-text-primary: #e8e8e8;\n --color-text-secondary: #999999;\n --color-text-tertiary: #666666;\n --color-success-light: rgba(16, 185, 129, 0.15);\n --color-success-dark: #34d399;\n --color-error: #f87171;\n --color-error-light: rgba(239, 68, 68, 0.15);\n --color-error-dark: #fca5a5;\n}\n\n/* ========================================\n HOME VIEW\n ======================================== */\n\n.liveChat-home-view {\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-home-view::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 600px;\n height: 600px;\n background: var(--msg-bg-header-glow1);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.liveChat-home-view::after {\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 500px;\n height: 500px;\n background: var(--msg-bg-header-glow2);\n filter: blur(60px);\n pointer-events: none;\n z-index: 1;\n}\n\n.liveChat-home-scroll {\n flex: 1;\n overflow-y: auto;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.liveChat-home-header {\n padding: var(--spacing-6) var(--spacing-5);\n position: relative;\n z-index: 2;\n flex-shrink: 0;\n}\n\n.liveChat-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.liveChat-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.liveChat-home-logo img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n border-radius: var(--radius-lg);\n}\n\n.liveChat-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.liveChat-home-avatars:empty {\n display: none;\n}\n\n.liveChat-home-welcome {\n display: flex;\n flex-direction: column;\n text-align: left;\n position: relative;\n z-index: 2;\n}\n\n.liveChat-home-greeting {\n font-size: clamp(22px, 8vw, 34px);\n font-weight: var(--font-weight-bold);\n color: var(--msg-text);\n line-height: var(--line-height-tight);\n word-break: break-word;\n}\n\n.liveChat-home-question {\n font-size: clamp(18px, 6.5vw, 28px);\n font-weight: var(--font-weight-bold);\n color: var(--msg-text);\n line-height: var(--line-height-tight);\n word-break: break-word;\n}\n\n.liveChat-home-body {\n flex: 1;\n padding: 0 var(--spacing-5) var(--spacing-5);\n position: relative;\n z-index: 2;\n}\n\n.liveChat-home-recent-card {\n background: var(--msg-bg);\n border: 1px solid var(--msg-border);\n border-radius: 10px;\n padding: var(--spacing-3) var(--spacing-4);\n margin-bottom: var(--spacing-2);\n cursor: pointer;\n transition: background var(--transition-base);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.liveChat-home-recent-card:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-home-recent-card-label {\n font-size: 0.875rem;\n font-weight: 600;\n color: var(--msg-text-tertiary);\n margin-bottom: var(--spacing-2);\n}\n\n.liveChat-home-recent-card-row {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n}\n\n.liveChat-home-recent-avatar {\n width: 36px;\n height: 36px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\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 color: #ffffff;\n overflow: hidden;\n}\n\n.liveChat-home-recent-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.liveChat-home-recent-avatar-logo {\n background: var(--msg-bg-surface);\n border: 1px solid var(--msg-border);\n padding: 4px;\n}\n\n.liveChat-home-recent-avatar-logo img {\n object-fit: contain;\n}\n\n.liveChat-home-recent-card-content {\n flex: 1;\n min-width: 0;\n}\n\n.liveChat-home-recent-card-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-2);\n margin-bottom: 2px;\n}\n\n.liveChat-home-recent-card-name {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-home-recent-card-time {\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n flex-shrink: 0;\n}\n\n.liveChat-home-recent-card-preview {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-2);\n}\n\n.liveChat-home-recent-card-message {\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-home-recent-unread-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--color-primary);\n flex-shrink: 0;\n}\n\n.liveChat-home-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-3) var(--spacing-5);\n background: var(--msg-bg-surface);\n border: 1px solid var(--msg-border);\n border-radius: 8px;\n color: var(--msg-text);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n cursor: pointer;\n transition: all var(--transition-base);\n margin-bottom: var(--spacing-2);\n font-family: inherit;\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.liveChat-home-message-btn:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-home-message-btn:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-home-continue-btn {\n flex-direction: row;\n align-items: center;\n justify-content: space-between;\n gap: var(--spacing-3);\n}\n\n.liveChat-home-continue-btn > svg {\n flex-shrink: 0;\n}\n\n.liveChat-home-continue-info {\n display: flex;\n flex-direction: column;\n gap: 2px;\n text-align: left;\n flex: 1;\n}\n\n.liveChat-home-continue-label {\n font-size: 0.875rem;\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-home-message-subtext {\n font-size: var(--font-size-xs);\n font-weight: 400;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-home-continue-preview {\n font-size: var(--font-size-sm);\n opacity: 0.6;\n font-weight: var(--font-weight-normal);\n}\n\n.liveChat-home-featured {\n background: var(--msg-bg);\n border-radius: var(--radius-xl);\n overflow: hidden;\n margin-bottom: var(--spacing-5);\n box-shadow: var(--msg-shadow-card);\n}\n\n.liveChat-home-featured-image {\n width: 100%;\n height: 160px;\n object-fit: cover;\n display: block;\n}\n\n.liveChat-home-featured-divider {\n height: 1px;\n background: var(--msg-border);\n}\n\n.liveChat-home-featured-content {\n padding: var(--spacing-4) var(--spacing-5);\n}\n\n.liveChat-home-featured-content 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(--msg-text);\n line-height: var(--line-height-normal);\n}\n\n.liveChat-home-featured-content p {\n margin: 0;\n font-size: var(--font-size-base);\n color: var(--msg-text-tertiary);\n line-height: var(--line-height-relaxed);\n}\n\n.liveChat-home-featured-btn {\n margin-top: var(--spacing-3);\n}\n\n.liveChat-home-changelog-section {\n margin-top: var(--spacing-5);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n}\n\n.liveChat-home-changelog-card {\n background: var(--msg-bg-surface);\n border-radius: 8px;\n overflow: hidden;\n cursor: pointer;\n border: 1px solid var(--msg-border);\n transition: all var(--transition-base);\n box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);\n}\n\n.liveChat-home-changelog-card:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-home-changelog-card:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-home-changelog-cover {\n width: 100%;\n height: 140px;\n overflow: hidden;\n position: relative;\n}\n\n.liveChat-home-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.liveChat-home-changelog-cover-text {\n position: absolute;\n bottom: var(--spacing-3);\n left: var(--spacing-3);\n right: var(--spacing-3);\n color: #ffffff;\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.liveChat-home-changelog-card-content {\n padding: var(--spacing-4);\n border-top: 1px solid var(--msg-border);\n}\n\n.liveChat-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(--msg-text);\n line-height: var(--line-height-snug);\n}\n\n.liveChat-home-changelog-card-desc {\n margin: 0;\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-normal);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-relaxed);\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.liveChat-home-availability,\n.liveChat-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(--msg-text-secondary);\n}\n\n.liveChat-availability-dot {\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n flex-shrink: 0;\n align-self: center;\n display: block;\n}\n\n.liveChat-availability-online {\n background: var(--color-success);\n box-shadow: 0 0 0 2px var(--color-success-light);\n}\n\n.liveChat-availability-away {\n background: var(--color-neutral-400);\n}\n\n.liveChat-availability-text {\n opacity: 0.9;\n}\n\n/* ========================================\n CONVERSATIONS VIEW\n ======================================== */\n\n.liveChat-conversations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: var(--spacing-3) var(--spacing-5);\n border-bottom: 1px solid var(--msg-border);\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-conversations-header h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n text-align: center;\n flex: 1;\n}\n\n.liveChat-conversations-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.liveChat-conversations-list {\n display: flex;\n flex-direction: column;\n}\n\n.liveChat-conversation-item + .liveChat-conversation-item {\n border-top: 1px solid var(--msg-border);\n}\n\n.liveChat-conversation-item {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: 10px var(--spacing-4);\n cursor: pointer;\n transition: background var(--transition-base);\n}\n\n.liveChat-conversation-item:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-conversation-item:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-conversation-avatars {\n flex-shrink: 0;\n display: flex;\n align-items: center;\n align-self: stretch;\n}\n\n.liveChat-conversation-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.liveChat-conversation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 2px;\n gap: var(--spacing-3);\n}\n\n.liveChat-conversation-title {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: 1.4;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-conversation-time {\n font-size: var(--font-size-sm);\n color: var(--msg-text-tertiary);\n flex-shrink: 0;\n}\n\n.liveChat-conversation-preview {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n}\n\n.liveChat-conversation-message {\n font-size: var(--font-size-sm);\n font-weight: 400;\n color: var(--msg-text-secondary);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.4;\n}\n\n.liveChat-conversation-item.unread .liveChat-conversation-message {\n color: var(--msg-text);\n font-weight: 500;\n}\n\n.liveChat-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.liveChat-conversation-item.closed .liveChat-conversation-title,\n.liveChat-conversation-item.closed .liveChat-conversation-message {\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-conversation-resolved-badge {\n font-size: 0.6875rem;\n font-weight: 500;\n color: var(--color-success-dark);\n background: var(--color-success-light);\n border-radius: var(--radius-full);\n padding: 1px 7px;\n flex-shrink: 0;\n}\n\n.liveChat-conversations-footer {\n border-top: 1px solid var(--msg-border);\n}\n\n.liveChat-new-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: 12px var(--spacing-4);\n background: transparent;\n border: none;\n color: var(--msg-text);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n cursor: pointer;\n transition: background var(--transition-base);\n font-family: inherit;\n text-align: left;\n}\n\n.liveChat-new-message-btn:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-new-message-btn:active {\n transform: translateX(4px) translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-new-message-btn span {\n flex: 1;\n text-align: left;\n}\n\n/* ========================================\n HELP VIEW\n ======================================== */\n\n.liveChat-help-header {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-5) var(--spacing-3);\n border-bottom: 1px solid var(--msg-border);\n flex-shrink: 0;\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-help-header::before {\n content: '';\n position: absolute;\n top: -20px;\n left: -20px;\n width: 200px;\n height: 200px;\n background: var(--msg-bg-header-glow1);\n filter: blur(30px);\n pointer-events: none;\n}\n\n.liveChat-help-header::after {\n content: '';\n position: absolute;\n top: -10px;\n right: -20px;\n width: 150px;\n height: 150px;\n background: var(--msg-bg-header-glow2);\n filter: blur(25px);\n pointer-events: none;\n}\n\n.liveChat-help-header-top {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.liveChat-help-header-top h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-help-close-btn {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.liveChat-help-search-wrap {\n position: relative;\n width: 100%;\n}\n\n.liveChat-help-search-icon {\n position: absolute;\n left: var(--spacing-3);\n top: 50%;\n transform: translateY(-50%);\n color: var(--msg-text-tertiary);\n display: flex;\n align-items: center;\n pointer-events: none;\n}\n\n.liveChat-help-search-input {\n width: 100%;\n background: var(--msg-bg-input);\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-md);\n padding: var(--spacing-2) var(--spacing-3) var(--spacing-2) calc(var(--spacing-3) + 16px + var(--spacing-2));\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-normal);\n color: var(--msg-text);\n font-family: inherit;\n outline: none;\n transition: border-color var(--transition-base), background var(--transition-base);\n box-sizing: border-box;\n}\n\n.liveChat-help-search-input:focus {\n border-color: var(--color-primary);\n background: var(--msg-bg);\n}\n\n.liveChat-help-search-input::placeholder {\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-help-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.liveChat-help-collections-header {\n display: none;\n}\n\n.liveChat-help-collections {\n padding: 0;\n}\n\n.liveChat-help-collection {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: var(--spacing-3) var(--spacing-5);\n cursor: pointer;\n transition: background var(--transition-base);\n border-bottom: 1px solid var(--msg-border);\n}\n\n.liveChat-help-collection:hover {\n background: var(--msg-bg-hover);\n}\n\n.liveChat-help-collection:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-help-collection-icon {\n flex-shrink: 0;\n width: 2.25rem;\n height: 2.25rem;\n display: flex;\n align-items: center;\n justify-content: center;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-help-collection-icon svg {\n width: 1.5rem;\n height: 1.5rem;\n display: block;\n flex-shrink: 0;\n}\n\n.liveChat-help-collection-icon iconify-icon {\n font-size: 1.5rem;\n width: 1em;\n height: 1em;\n display: block;\n flex-shrink: 0;\n}\n\n.liveChat-help-collection-content {\n flex: 1;\n min-width: 0;\n}\n\n.liveChat-help-collection-title {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: var(--line-height-snug);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-help-collection-desc {\n margin: 2px 0 var(--spacing-1);\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-normal);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n.liveChat-help-collection-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n margin-top: 2px;\n}\n\n.liveChat-help-collection-avatar {\n display: none;\n}\n\n.liveChat-help-collection-avatar--initials {\n display: none;\n line-height: 1;\n}\n\n.liveChat-help-collection-count {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-help-footer {\n padding: var(--spacing-4) var(--spacing-5);\n border-top: 1px solid var(--msg-border);\n text-align: center;\n}\n\n.liveChat-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(--msg-text);\n text-decoration: none;\n cursor: pointer;\n transition: color var(--transition-base);\n}\n\n.liveChat-help-footer-link:hover {\n color: var(--color-primary);\n}\n\n/* ========================================\n CHANGELOG VIEW\n ======================================== */\n\n.liveChat-changelog-header {\n padding: var(--spacing-2) var(--spacing-5);\n border-bottom: 1px solid var(--msg-border);\n flex-shrink: 0;\n background: var(--msg-bg-header-gradient);\n position: relative;\n overflow: hidden;\n}\n\n.liveChat-changelog-header::before {\n content: '';\n position: absolute;\n top: -20px;\n left: -20px;\n width: 200px;\n height: 200px;\n background: var(--msg-bg-header-glow1);\n filter: blur(30px);\n pointer-events: none;\n}\n\n.liveChat-changelog-header::after {\n content: '';\n position: absolute;\n top: -10px;\n right: -20px;\n width: 150px;\n height: 150px;\n background: var(--msg-bg-header-glow2);\n filter: blur(25px);\n pointer-events: none;\n}\n\n.liveChat-changelog-header-top {\n display: flex;\n align-items: center;\n justify-content: center;\n position: relative;\n}\n\n.liveChat-changelog-header-top h2 {\n margin: 0;\n font-size: var(--font-size-xl);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-changelog-close-btn {\n position: absolute;\n right: 0;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.liveChat-changelog-body {\n flex: 1;\n overflow-y: auto;\n}\n\n.liveChat-changelog-list {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-3);\n padding: var(--spacing-4) var(--spacing-5);\n}\n\n.liveChat-changelog-card {\n display: flex;\n flex-direction: column;\n border: 1px solid var(--msg-border);\n border-radius: 10px;\n overflow: hidden;\n cursor: pointer;\n transition: box-shadow var(--transition-base), transform var(--transition-base);\n}\n\n.liveChat-changelog-card:hover {\n box-shadow: var(--shadow-md);\n transform: translateY(-1px);\n}\n\n.liveChat-changelog-card:active {\n transform: translateY(0);\n transition-duration: 100ms;\n}\n\n.liveChat-changelog-content {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-1);\n padding: var(--spacing-3) var(--spacing-4);\n}\n\n.liveChat-changelog-meta {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n flex-wrap: wrap;\n}\n\n.liveChat-changelog-date {\n font-size: var(--font-size-xs);\n font-weight: var(--font-weight-medium);\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-changelog-tags {\n display: flex;\n flex-wrap: wrap;\n gap: var(--spacing-1);\n}\n\n.liveChat-changelog-tag {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: var(--radius-full);\n font-size: 11px;\n font-weight: var(--font-weight-medium);\n line-height: 1.5;\n}\n\n.liveChat-changelog-title {\n margin: 0;\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: var(--line-height-snug);\n}\n\n.liveChat-changelog-description {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-normal);\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.liveChat-changelog-thumb {\n width: 100%;\n overflow: hidden;\n border-bottom: 1px solid var(--msg-border);\n}\n\n.liveChat-changelog-thumb img {\n width: 100%;\n height: 180px;\n display: block;\n object-fit: cover;\n}\n\n\n/* ========================================\n MESSAGES\n ======================================== */\n\n.liveChat-message {\n display: flex;\n gap: var(--spacing-2);\n max-width: 75%;\n}\n\n.liveChat-message-system {\n align-self: center;\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-2) 0;\n width: 100%;\n}\n\n.liveChat-message-system::before,\n.liveChat-message-system::after {\n content: '';\n flex: 1;\n height: 1px;\n background: var(--msg-border);\n}\n\n.liveChat-message-system-text {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--msg-text-secondary);\n white-space: nowrap;\n padding: 0 var(--spacing-2);\n}\n\n/* Rich join/leave system event */\n.liveChat-message-system-event {\n align-self: center;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: var(--spacing-3) 0;\n width: 100%;\n text-align: center;\n}\n\n.liveChat-message-system-event-avatar {\n width: 3rem;\n height: 3rem;\n border-radius: var(--radius-full);\n border: 1px solid var(--msg-border);\n background: var(--msg-bg);\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 1.125rem;\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n overflow: hidden;\n flex-shrink: 0;\n margin-bottom: 4px;\n}\n\n.liveChat-message-system-event-avatar img {\n width: 60%;\n height: 60%;\n object-fit: contain;\n}\n\n.liveChat-message-system-event-name {\n font-size: 0.875rem;\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: 1.3;\n}\n\n.liveChat-message-system-event-action {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--msg-text-secondary);\n margin-top: -2px;\n}\n\n.liveChat-message-system-event-time {\n font-size: 0.875rem;\n font-weight: 500;\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-message-own {\n align-self: flex-end;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.liveChat-message-received {\n align-self: flex-start;\n flex-direction: column;\n}\n\n.liveChat-message-row {\n display: flex;\n align-items: flex-end;\n gap: var(--spacing-2);\n}\n\n.liveChat-message-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.liveChat-message-avatar {\n display: none;\n}\n\n.liveChat-message-sender {\n display: none;\n}\n\n.liveChat-message-bubble {\n padding: 7px 13px;\n border-radius: 1.125rem;\n word-wrap: break-word;\n max-width: 100%;\n}\n\n.liveChat-message-own .liveChat-message-bubble {\n background: var(--msg-bg-bubble-own);\n color: #111827;\n border-bottom-right-radius: 0.25rem;\n}\n\n.liveChat-message-received .liveChat-message-bubble {\n background: var(--msg-bg-bubble-received);\n color: #ffffff;\n border-bottom-left-radius: 0.25rem;\n}\n\n.liveChat-message-content {\n font-size: 0.875rem;\n font-weight: 500;\n line-height: var(--line-height-relaxed);\n}\n\n.liveChat-message-content p {\n margin: 0 0 0.5rem;\n}\n\n.liveChat-message-content p:last-child {\n margin-bottom: 0;\n}\n\n.liveChat-message-time {\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n margin-top: 0.25rem;\n padding: 0 var(--spacing-1);\n}\n\n.liveChat-message-meta {\n display: flex;\n align-items: center;\n gap: 0.375rem;\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n margin-top: 0.25rem;\n padding: 0 var(--spacing-1);\n}\n\n.liveChat-message-meta-own {\n justify-content: flex-end;\n}\n\n.liveChat-message-sent-status {\n color: var(--msg-text-muted);\n}\n\n.liveChat-message-optimistic .liveChat-message-bubble {\n opacity: 0.7;\n}\n\n.liveChat-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.liveChat-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.liveChat-message-file:hover {\n background: var(--color-neutral-200);\n}\n\n.liveChat-file-download-icon {\n margin-left: auto;\n opacity: 0.5;\n flex-shrink: 0;\n}\n\n.liveChat-message-file:hover .liveChat-file-download-icon {\n opacity: 1;\n}\n\n.liveChat-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 SCROLL PILL & CONNECTION BANNER\n ======================================== */\n\n.liveChat-scroll-pill {\n position: absolute;\n bottom: 80px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n padding: 6px 14px;\n background: var(--color-primary);\n color: #ffffff;\n font-size: var(--font-size-xs);\n font-weight: 500;\n border-radius: var(--radius-full);\n cursor: pointer;\n box-shadow: var(--shadow-lg);\n z-index: 10;\n white-space: nowrap;\n}\n\n.liveChat-connection-banner {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n padding: 6px var(--spacing-4);\n background: #fef3c7;\n color: #92400e;\n font-size: var(--font-size-xs);\n font-weight: 500;\n flex-shrink: 0;\n}\n\n.liveChat-widget.theme-dark .liveChat-connection-banner {\n background: rgba(245, 158, 11, 0.15);\n color: #fbbf24;\n}\n\n/* ========================================\n CHAT HEADER\n ======================================== */\n\n.liveChat-chat-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-2);\n padding: var(--spacing-3) var(--spacing-4);\n border-bottom: 1px solid var(--msg-border);\n}\n\n.liveChat-chat-header-avatar {\n width: 2.25rem;\n height: 2.25rem;\n border-radius: var(--radius-lg);\n background: var(--msg-bg-surface);\n border: 1px solid var(--msg-border);\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n overflow: hidden;\n padding: 4px;\n}\n\n.liveChat-chat-header-avatar img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n.liveChat-chat-header-avatar svg {\n width: 1.25rem;\n height: 1.25rem;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-chat-header-info {\n flex: 1;\n display: flex;\n flex-direction: column;\n gap: 0;\n min-width: 0;\n}\n\n.liveChat-chat-title {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n line-height: 1.4;\n}\n\n.liveChat-chat-subtitle {\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: 1.4;\n}\n\n.liveChat-chat-header-actions {\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n flex-shrink: 0;\n}\n\n.liveChat-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: var(--spacing-5) var(--spacing-4);\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n}\n\n.liveChat-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.liveChat-chat-empty-avatars {\n margin-bottom: var(--spacing-4);\n}\n\n.liveChat-chat-empty-logo {\n width: 48px;\n height: 48px;\n border-radius: var(--radius-xl);\n overflow: hidden;\n margin-bottom: var(--spacing-4);\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--msg-bg-surface);\n}\n\n.liveChat-chat-empty-logo img {\n width: 100%;\n height: 100%;\n object-fit: contain;\n}\n\n.liveChat-chat-empty h3 {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n\n/* ========================================\n COMPOSE AREA\n ======================================== */\n\n/* ========================================\n EMOJI PICKER\n ======================================== */\n\n.liveChat-emoji-picker-container {\n padding: 0 var(--spacing-3) var(--spacing-2);\n}\n\n.liveChat-emoji-picker-container emoji-picker {\n width: 100%;\n height: 320px;\n border-radius: var(--radius-xl);\n border: 1px solid var(--msg-border);\n box-shadow: var(--shadow-lg);\n\n --background: var(--msg-bg);\n --border-color: var(--msg-border);\n --border-radius: 12px;\n --category-font-color: var(--msg-text-secondary);\n --category-font-size: 0.7rem;\n --emoji-size: 1.35rem;\n --emoji-padding: 0.3rem;\n --input-border-color: var(--msg-border);\n --input-border-radius: 8px;\n --input-font-color: var(--msg-text);\n --input-font-size: 0.8rem;\n --input-placeholder-color: var(--msg-text-tertiary);\n --input-padding: 0.375rem 0.625rem;\n --outline-color: var(--color-primary);\n --num-columns: 8;\n --indicator-color: var(--color-primary);\n --hover-background: var(--msg-bg-hover);\n}\n\n.liveChat-widget.theme-dark .liveChat-emoji-picker-container emoji-picker {\n --background: var(--msg-bg);\n --border-color: var(--msg-border);\n --category-font-color: var(--msg-text-secondary);\n --input-font-color: var(--msg-text);\n --input-placeholder-color: var(--msg-text-tertiary);\n --hover-background: var(--msg-bg-hover);\n}\n\n.liveChat-chat-compose {\n display: flex;\n flex-direction: column;\n padding: var(--spacing-3) var(--spacing-4);\n background: var(--msg-bg);\n margin: 0 var(--spacing-3) var(--spacing-3);\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-xl);\n}\n\n.liveChat-compose-input-wrapper {\n width: 100%;\n}\n\n.liveChat-compose-input {\n width: 100%;\n background: transparent;\n border: none;\n outline: none;\n color: var(--msg-text);\n font-size: var(--font-size-base);\n line-height: var(--line-height-relaxed);\n resize: none;\n max-height: 120px;\n font-family: inherit;\n padding: var(--spacing-1) 0;\n}\n\n.liveChat-compose-input::placeholder {\n color: var(--msg-text-tertiary);\n}\n\n.liveChat-compose-input:focus {\n outline: none;\n}\n\n.liveChat-chat-compose:focus-within {\n border-color: var(--color-primary-border);\n box-shadow: 0 0 0 3px var(--color-primary-light);\n}\n\n.liveChat-compose-bottom {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-top: var(--spacing-2);\n}\n\n.liveChat-compose-actions {\n display: flex;\n align-items: center;\n gap: var(--spacing-1);\n}\n\n.liveChat-compose-send {\n width: 2.25rem;\n height: 2.25rem;\n background: transparent;\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-full);\n color: var(--msg-text-secondary);\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.liveChat-compose-send:hover:not(:disabled) {\n background: var(--color-primary);\n border-color: var(--color-primary);\n color: var(--msg-bg);\n}\n\n.liveChat-compose-send:active:not(:disabled) {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-compose-send:disabled {\n color: var(--color-neutral-300);\n border-color: var(--color-neutral-200);\n cursor: not-allowed;\n}\n\n.liveChat-compose-send svg {\n color: inherit;\n}\n\n.liveChat-compose-file-input {\n display: none;\n}\n\n.liveChat-compose-attach {\n width: 2rem;\n height: 2rem;\n flex-shrink: 0;\n color: var(--msg-text-secondary);\n}\n\n.liveChat-compose-attach:hover {\n color: var(--msg-text);\n}\n\n.liveChat-compose-attach svg {\n width: 1.25rem;\n height: 1.25rem;\n}\n\n/* ========================================\n TYPING INDICATOR\n ======================================== */\n\n.liveChat-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.liveChat-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.liveChat-typing-dots span {\n width: 6px;\n height: 6px;\n background: var(--color-neutral-400);\n border-radius: var(--radius-full);\n animation: liveChat-typing-bounce 1.4s infinite ease-in-out;\n}\n\n.liveChat-typing-dots span:nth-child(1) { animation-delay: -0.32s; }\n.liveChat-typing-dots span:nth-child(2) { animation-delay: -0.16s; }\n.liveChat-typing-dots span:nth-child(3) { animation-delay: 0s; }\n\n.liveChat-typing-text {\n font-size: var(--font-size-xs);\n color: var(--msg-text-tertiary);\n}\n\n/* ========================================\n NAVIGATION TABS\n ======================================== */\n\n.liveChat-panel-nav {\n border-top: 1px solid var(--msg-border);\n background: var(--msg-bg);\n}\n\n.liveChat-nav-tabs {\n display: flex;\n padding: var(--spacing-1) var(--spacing-2) 0;\n gap: var(--spacing-1);\n}\n\n.liveChat-nav-footer {\n padding: 2px var(--spacing-2) var(--spacing-2);\n text-align: center;\n}\n\n.liveChat-powered-by {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 10px;\n color: var(--msg-text-tertiary);\n text-decoration: none;\n transition: color var(--transition-base);\n}\n\n.liveChat-powered-by:hover {\n color: var(--msg-text-secondary);\n}\n\n.liveChat-powered-by svg {\n width: 12px;\n height: 14px;\n}\n\n.liveChat-powered-by strong {\n font-weight: var(--font-weight-semibold);\n}\n\n.liveChat-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.liveChat-nav-tab:hover {\n background: transparent;\n}\n\n.liveChat-nav-tab:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-nav-tab:hover .liveChat-nav-icon,\n.liveChat-nav-tab:hover .liveChat-nav-label {\n color: var(--msg-text);\n}\n\n.liveChat-nav-icon {\n color: var(--msg-text-secondary);\n transition: color var(--transition-base);\n display: flex;\n align-items: center;\n justify-content: center;\n width: 26px;\n height: 26px;\n}\n\n.liveChat-nav-icon svg {\n width: 26px;\n height: 26px;\n display: block;\n}\n\n.liveChat-nav-label {\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n color: var(--msg-text-secondary);\n transition: color var(--transition-base);\n}\n\n.liveChat-nav-tab.active .liveChat-nav-icon,\n.liveChat-nav-tab.active .liveChat-nav-label {\n color: var(--color-primary);\n}\n\n.liveChat-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(--msg-bg);\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.liveChat-prechat-view {\n position: relative;\n}\n\n.liveChat-prechat-overlay {\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.45);\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-5);\n z-index: var(--z-popover);\n backdrop-filter: blur(2px);\n}\n\n.liveChat-prechat-card {\n background: var(--msg-bg);\n border-radius: var(--radius-xl);\n padding: var(--spacing-6) var(--spacing-6) var(--spacing-5);\n width: 100%;\n max-width: 320px;\n box-shadow: var(--shadow-xl);\n border: 1px solid var(--msg-border);\n text-align: center;\n}\n\n.liveChat-prechat-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 60px;\n height: 60px;\n border-radius: var(--radius-full);\n background: var(--color-primary-light);\n color: var(--color-primary);\n margin: 0 auto var(--spacing-4);\n}\n\n.liveChat-prechat-title {\n margin: 0 0 var(--spacing-2);\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--msg-text);\n}\n\n.liveChat-prechat-subtitle {\n margin: 0 0 var(--spacing-5);\n font-size: var(--font-size-sm);\n color: var(--msg-text-secondary);\n line-height: var(--line-height-relaxed);\n}\n\n.liveChat-prechat-form {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-2);\n}\n\n.liveChat-prechat-field {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-1);\n}\n\n.liveChat-prechat-input {\n width: 100%;\n padding: var(--spacing-2) var(--spacing-3);\n border: 1px solid var(--msg-border);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-family: inherit;\n background: var(--msg-bg-surface);\n color: var(--msg-text);\n outline: none;\n transition: border-color var(--transition-fast);\n box-sizing: border-box;\n}\n\n.liveChat-prechat-input::placeholder {\n color: var(--msg-text-secondary);\n}\n\n.liveChat-prechat-input:focus {\n border-color: var(--color-primary);\n}\n\n.liveChat-prechat-error {\n font-size: var(--font-size-xs);\n color: #dc2626;\n}\n\n.liveChat-prechat-submit {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-3);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n transition: all var(--transition-fast);\n border: none;\n width: 100%;\n background: var(--color-primary);\n color: #ffffff;\n margin-top: var(--spacing-1);\n}\n\n.liveChat-prechat-submit:hover {\n background: var(--color-primary-hover);\n}\n\n.liveChat-prechat-submit:active {\n transform: translateY(1px);\n transition-duration: 100ms;\n}\n\n.liveChat-prechat-submit:disabled {\n opacity: 0.7;\n cursor: not-allowed;\n}\n\n/* ========================================\n FEEDBACK FORM VIEW\n ======================================== */\n\n.liveChat-feedback-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n}\n\n.liveChat-feedback-header {\n display: flex;\n align-items: center;\n gap: var(--spacing-3);\n padding: var(--spacing-4) var(--spacing-4);\n border-bottom: 1px solid var(--border-color);\n flex-shrink: 0;\n}\n\n.liveChat-feedback-title {\n font-size: var(--font-size-base);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.liveChat-feedback-body {\n display: flex;\n flex-direction: column;\n gap: var(--spacing-4);\n padding: var(--spacing-5) var(--spacing-4);\n flex: 1;\n overflow-y: auto;\n}\n\n.liveChat-feedback-prompt {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n}\n\n\n.liveChat-feedback-input {\n width: 100%;\n border: 1px solid var(--border-color);\n border-radius: var(--radius-md);\n padding: var(--spacing-3);\n font-size: var(--font-size-sm);\n font-family: inherit;\n color: var(--text-primary);\n background: var(--msg-bg);\n box-sizing: border-box;\n transition: border-color var(--transition-fast);\n}\n\n.liveChat-feedback-input::placeholder {\n color: var(--msg-text-secondary);\n}\n\n.liveChat-feedback-input:focus {\n outline: none;\n border-color: var(--color-primary);\n}\n\n.liveChat-feedback-textarea {\n width: 100%;\n resize: none;\n border: 1px solid var(--border-color);\n border-radius: var(--radius-md);\n padding: var(--spacing-3);\n font-size: var(--font-size-sm);\n font-family: inherit;\n color: var(--text-primary);\n background: var(--msg-bg);\n box-sizing: border-box;\n transition: border-color var(--transition-fast);\n}\n\n.liveChat-feedback-textarea::placeholder {\n color: var(--msg-text-secondary);\n}\n\n.liveChat-feedback-textarea:focus {\n outline: none;\n border-color: var(--color-primary);\n}\n\n.liveChat-feedback-submit {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: var(--spacing-3);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n border: none;\n background: var(--color-primary);\n color: #ffffff;\n transition: all var(--transition-fast);\n}\n\n.liveChat-feedback-submit:hover:not(:disabled) {\n background: var(--color-primary-hover);\n}\n\n.liveChat-feedback-submit:disabled {\n opacity: 0.5;\n cursor: not-allowed;\n}\n\n.liveChat-feedback-thankyou {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n padding: var(--spacing-6) var(--spacing-4);\n text-align: center;\n gap: var(--spacing-3);\n}\n\n.liveChat-feedback-thankyou-emoji {\n font-size: 48px;\n line-height: 1;\n}\n\n.liveChat-feedback-thankyou h3 {\n margin: 0;\n font-size: var(--font-size-lg);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.liveChat-feedback-thankyou p {\n margin: 0;\n font-size: var(--font-size-sm);\n color: var(--text-secondary);\n}\n\n.liveChat-feedback-done-btn {\n margin-top: var(--spacing-2);\n padding: var(--spacing-2) var(--spacing-5);\n border-radius: var(--radius-md);\n font-size: var(--font-size-sm);\n font-weight: var(--font-weight-medium);\n font-family: inherit;\n cursor: pointer;\n border: 1px solid var(--border-color);\n background: transparent;\n color: var(--text-primary);\n transition: all var(--transition-fast);\n}\n\n.liveChat-feedback-done-btn:hover {\n background: var(--bg-secondary);\n}\n\n/* ========================================\n ATTACHMENTS\n ======================================== */\n.liveChat-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(--msg-border);\n background: var(--msg-bg);\n}\n\n.liveChat-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.liveChat-attachment-thumb {\n width: 100%;\n height: 100%;\n object-fit: cover;\n display: block;\n}\n\n.liveChat-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.liveChat-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.liveChat-attachment-remove:hover {\n background: var(--color-error);\n}\n\n/* ========================================\n EMAIL OVERLAY\n ======================================== */\n.liveChat-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.liveChat-email-card {\n width: 100%;\n animation: liveChat-slide-up 0.25s ease;\n}\n\n.liveChat-email-actions {\n display: flex;\n gap: var(--spacing-2);\n margin-top: var(--spacing-1);\n}\n\n/* ========================================\n EMPTY STATE\n ======================================== */\n.liveChat-empty-state {\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.liveChat-empty-state-icon {\n color: var(--msg-text-tertiary);\n margin-bottom: var(--spacing-4);\n}\n\n.liveChat-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.liveChat-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 liveChat-typing-bounce {\n 0%, 80%, 100% {\n transform: scale(0);\n }\n 40% {\n transform: scale(1);\n }\n}\n\n@keyframes liveChat-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 liveChat-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 .liveChat-prechat-overlay {\n padding: var(--spacing-4);\n }\n .liveChat-prechat-card {\n max-width: 100%;\n }\n}\n",document.head.appendChild(t),!document.querySelector("#product7-iconify")){const t=document.createElement("script");t.id="product7-iconify",t.src="https://cdn.jsdelivr.net/npm/iconify-icon@2/dist/iconify-icon.min.js",t.async=!0,document.head.appendChild(t)}}async init(){if(this.initialized)return{alreadyInitialized:!0};this._injectStyles();try{const t=await this.apiService.init(),e=t.config?{...t.config}:{};if(t.widgets){const n={...t.widgets};n.web_chat&&!n.liveChat&&(n.liveChat=n.web_chat,delete n.web_chat),e.widgets=n}Object.keys(e).length>0&&(this.config=k(e,this.config)),this.initialized=!0;const n=await this._syncConfiguredMetadataAfterInit();return this.eventBus.emit("sdk:initialized",{config:this.config,sessionToken:t.sessionToken}),{initialized:!0,config:t.config||{},sessionToken:t.sessionToken,expiresIn:t.expiresIn,identified:Boolean(n?.identified)}}catch(t){throw this.eventBus.emit("sdk:error",{error:t}),new p(`Failed to initialize SDK: ${t.message}`,t)}}createWidget(t="button",e={}){if(!this.initialized)throw new p("SDK must be initialized before creating widgets. Call init() first.");const n=t||"button",i=this._normalizeWidgetType(n),a=C("widget"),s=this._getWidgetTypeConfig(i),o=this._omitUndefined(this._normalizeWidgetOptions(i,e)),r=this._isWidgetEnabled(i,{...s,...o}),l={id:a,sdk:this,apiService:this.apiService,...this.config,...s,...o,enabled:r};try{const t=R.create(i,l);return this.widgets.set(a,t),this.eventBus.emit("widget:created",{widget:t,type:n,internalType:i}),t}catch(t){throw new p(`Failed to create widget: ${t.message}`,t)}}createFeedbackWidget(t={}){return this.createWidget("feedback",t)}createLiveChatWidget(t={}){return this.createWidget("liveChat",t)}createChangelogWidget(t={}){return this.createWidget("changelog",t)}createSurveyWidget(t={}){return this.createWidget("survey",t)}getWidget(t){return this.widgets.get(t)}async getActiveSurveys(t={}){if(!this.initialized)throw new p("SDK must be initialized before fetching surveys. Call init() first.");try{const e=((await this.apiService.getActiveSurveys(t)).data||[]).map(t=>this._normalizeSurveyConfig(t));return t.includeIneligible?e:e.filter(t=>this._isSurveyEligible(t))}catch(t){throw this.eventBus.emit("sdk:error",{error:t}),new p(`Failed to fetch active surveys: ${t.message}`,t)}}async showSurveyById(t,e={}){if(!this.initialized)throw new p("SDK must be initialized before showing surveys. Call init() first.");const{context:n={},...i}=e,a=(await this.getActiveSurveys({...n,includeEligibility:!0,includeIneligible:!0})).find(e=>e.surveyId===t||e.id===t);if(!a)throw new p(`Survey with ID '${t}' not found or not active`);return this._isSurveyEligible(a)?this.showSurvey({surveyId:a.id,surveyType:a.surveyType||a.type,title:a.title,description:a.description,lowLabel:a.lowLabel||a.low_label,highLabel:a.highLabel||a.high_label,ratingScale:a.ratingScale??a.rating_scale,showFeedbackInput:a.showFeedbackInput??a.show_feedback_input,showSubmitButton:a.showSubmitButton??a.show_submit_button,autoSubmitOnSelect:a.autoSubmitOnSelect??a.auto_submit_on_select,showTitle:a.showTitle??a.show_title,showDescription:a.showDescription??a.show_description,customQuestions:a.customQuestions||a.questions,pages:a.pages,thankYouConfig:a.thankYouConfig||a.thank_you_config||null,enabled:a.enabled,...i}):(this.eventBus.emit("survey:suppressed",{surveyId:t,reason:this._getSurveyIneligibilityReason(a),survey:a}),null)}showSurvey(t={}){if(!this.initialized)throw new p("SDK must be initialized before showing surveys. Call init() first.");if(!this._isSurveyEligible(t))return this.eventBus.emit("survey:suppressed",{surveyId:t.surveyId||t.id||null,reason:this._getSurveyIneligibilityReason(t),survey:t}),null;const e=this._normalizeSurveyConfig(t),n=this._getWidgetTypeConfig("survey"),i=this._isWidgetEnabled("survey",e);if(!i)return this.eventBus.emit("survey:suppressed",{surveyId:e.surveyId||e.id||t.id||null,reason:"disabled",survey:e}),null;const a=this.createSurveyWidget({surveyId:e.surveyId,surveyType:e.surveyType||e.type||"nps",position:e.position??n.position??this.config.position??"right",theme:e.theme??n.theme??this.config.theme??"light",title:e.title,description:e.description,lowLabel:e.lowLabel,highLabel:e.highLabel,ratingScale:e.ratingScale??e.scale,showFeedbackInput:e.showFeedbackInput,showSubmitButton:e.showSubmitButton,autoSubmitOnSelect:e.autoSubmitOnSelect,showTitle:e.showTitle,showDescription:e.showDescription,customQuestions:e.customQuestions,pages:e.pages,thankYouConfig:e.thankYouConfig,respondentId:e.respondentId,email:e.email,onSubmit:e.onSubmit,onDismiss:e.onDismiss,enabled:i});return a.mount(),a.show(),a}_isSurveyEligible(t={}){const e=this._getSurveyField(t,["shouldShow","should_show"]);if("boolean"==typeof e)return e;const n=this._getSurveyField(t.eligibility||{},["shouldShow","should_show"]);if("boolean"==typeof n)return n;const i=this._getSurveyField(t,["eligible","isEligible","is_eligible"]);if("boolean"==typeof i)return i;const a=this._getSurveyField(t,["isAnswered","is_answered"]);if("boolean"==typeof a)return!a;const s=this._getSurveyField(t.eligibility||{},["isAnswered","is_answered"]);return"boolean"!=typeof s||!s}_getSurveyIneligibilityReason(t={}){const e=this._getSurveyField(t,["reason","suppressionReason","suppression_reason"]);if(e)return e;const n=this._getSurveyField(t.eligibility||{},["reason","suppressionReason","suppression_reason"]);if(n)return n;return!0===this._getSurveyField(t,["isAnswered","is_answered"])?"already_answered":"ineligible"}_normalizeSurveyConfig(t={}){const e=Array.isArray(t.pages)&&t.pages.length>0?t.pages[0]:null,n=e&&(e.rating_config||e.ratingConfig)||{},i=t.surveyType||t.survey_type||t.type||this._inferSurveyTypeFromPage(e)||"nps";return{...t,surveyId:t.surveyId||t.survey_id||t.id||null,surveyType:t.surveyType||t.survey_type||i,type:t.type||t.survey_type||i,enabled:"boolean"==typeof t.enabled?t.enabled:void 0,should_show:t.should_show??(t.eligibility?t.eligibility.should_show:void 0),reason:t.reason||(t.eligibility?t.eligibility.reason:void 0),title:t.title||t.name||(e?e.title:null),description:t.description||(e?e.description:null),lowLabel:t.lowLabel||t.low_label||n.low_label||null,highLabel:t.highLabel||t.high_label||n.high_label||null,ratingScale:t.ratingScale??t.rating_scale??n.scale??null,showFeedbackInput:t.showFeedbackInput??t.show_feedback_input??null,showSubmitButton:t.showSubmitButton??t.show_submit_button??null,autoSubmitOnSelect:t.autoSubmitOnSelect??t.auto_submit_on_select??null,showTitle:t.showTitle??t.show_title??null,showDescription:t.showDescription??t.show_description??null,customQuestions:t.customQuestions||t.custom_questions||t.questions||[],thankYouConfig:t.thankYouConfig||t.thank_you_config||null,pages:this._normalizeSurveyPages(t.pages||[])}}_normalizeSurveyPages(t=[]){return Array.isArray(t)?t.map((t,e)=>({id:t.id||`page_${e}`,type:t.type||"rating",title:t.title||"",description:t.description||"",placeholder:t.placeholder||"",required:!0===t.required,position:t.position??e,ratingConfig:t.ratingConfig||t.rating_config||null,multipleChoiceConfig:t.multipleChoiceConfig||t.multiple_choice_config||null,linkConfig:t.linkConfig||t.link_config||null,afterThisPage:t.afterThisPage||t.after_this_page||null,thankYouConfig:t.thankYouConfig||t.thank_you_config||null})).sort((t,e)=>t.position-e.position):[]}_inferSurveyTypeFromPage(t){if(!t)return null;const e=t.rating_config||t.ratingConfig||{},n=e.scale,i=e.survey_type,a=(t.title||"").toLowerCase();if(11===n||"nps"===i)return"nps";const s=(e.low_label||"").toLowerCase();return"ces"===i||a.includes("effort")||a.includes("easy")||s.includes("difficult")?"ces":"csat"}_getSurveyField(t,e){for(const n of e)if(void 0!==t[n]&&null!==t[n])return t[n];return null}_getWidgetTypeConfig(t){const e=this._isPlainObject(this.config?.widgets)?this.config.widgets:{},n=this._getWidgetTypeAliases(t).reduce((t,n)=>k(t,k(this._isPlainObject(this.config?.[n])?this.config[n]:{},this._isPlainObject(e?.[n])?e[n]:{})),{});return this._toCamelCaseObject(n)}_getWidgetTypeAliases(t){return"button"===t?["button","feedback"]:[t]}_isWidgetEnabled(t,e={}){const n=this._getWidgetTypeConfig(t);return!1!==n.enabled&&("boolean"==typeof e.enabled?e.enabled:"boolean"!=typeof n.enabled||n.enabled)}_isPlainObject(t){return"[object Object]"===Object.prototype.toString.call(t)}_toCamelCaseKey(t){return t.replace(/_([a-z])/g,(t,e)=>e.toUpperCase())}_toCamelCaseObject(t){if(Array.isArray(t))return t.map(t=>this._toCamelCaseObject(t));if(!this._isPlainObject(t))return t;const e={};for(const[n,i]of Object.entries(t))e[this._toCamelCaseKey(n)]=this._toCamelCaseObject(i);return e}_normalizeWidgetType(t){return"feedback"===t?"button":t}_normalizeWidgetOptions(t,e={}){if(!this._isPlainObject(e))return e;const n={...e};return!0===n.headless&&void 0===n.trigger&&"survey"!==t&&(n.trigger=!1),n}_omitUndefined(t){return this._isPlainObject(t)?Object.fromEntries(Object.entries(t).filter(([,t])=>void 0!==t)):t}showChangelog(t={}){if(!this.initialized)throw new p("SDK must be initialized before showing changelog. Call init() first.");const e={position:this.config.position||"right",theme:this.config.theme||"light",title:"What's New",triggerText:"What's New",showBadge:!0,viewButtonText:"View Update",showBackdrop:!0},n=this._getWidgetTypeConfig("changelog"),i=this._omitUndefined(t),a=this._isWidgetEnabled("changelog",i);if(!a)return this.eventBus.emit("widget:suppressed",{type:"changelog",reason:"disabled"}),null;const s=this.createChangelogWidget({...e,...n,...i,enabled:a});return s.mount(),s.show(),s}async getChangelogs(t={}){if(!this.initialized)throw new p("SDK must be initialized before fetching changelogs. Call init() first.");try{return(await this.apiService.getChangelogs(t)).data||[]}catch(t){throw this.eventBus.emit("sdk:error",{error:t}),new p(`Failed to fetch changelogs: ${t.message}`,t)}}getAllWidgets(){return Array.from(this.widgets.values())}destroyWidget(t){const e=this.widgets.get(t);return!!e&&(e.destroy(),this.widgets.delete(t),this.eventBus.emit("widget:removed",{widgetId:t}),!0)}destroyAllWidgets(){for(const t of this.widgets.values())t.destroy();this.widgets.clear(),this.eventBus.emit("widgets:cleared")}updateConfig(t){const e={...this.config};this.config=this._validateAndMergeConfig(t,this.config);for(const t of this.widgets.values())t.handleConfigUpdate(this.config);this.eventBus.emit("config:updated",{oldConfig:e,newConfig:this.config})}setMetadata(t){t&&this._validateMetadata(t),this.config.metadata=t,this.apiService&&this.apiService.setMetadata(t),this.identified=!1,this.eventBus.emit("metadata:updated",{metadata:t})}getMetadata(){return this.config.metadata||(this.apiService?this.apiService.getMetadata():null)}async identify(t=this.config.metadata){if(!this.initialized)throw new p("SDK must be initialized before identifying users. Call init() first.");if(!t)throw new p("Identify requires metadata. Provide at least user_id or email.");this._validateMetadata(t),this.setMetadata(t);try{const e=await this.apiService.identify(t),n=this._extractIdentifyConfig(e);Object.keys(n).length>0&&this.updateConfig(n),this.identified=!0,this._applyIdentityToWidgets(t);const i={identified:!0,metadata:this.getMetadata(),response:e};return this.eventBus.emit("sdk:identified",i),i}catch(t){throw this.identified=!1,this.eventBus.emit("sdk:error",{error:t,phase:"identify"}),new p(`Failed to identify user: ${t.message}`,t)}}async reinitialize(t=null){return this.apiService.clearSession(),this.initialized=!1,this.identified=!1,null!==t&&this.setMetadata(t),this.init()}on(t,e){return this.eventBus.on(t,e),this}off(t,e){return this.eventBus.off(t,e),this}once(t,e){return this.eventBus.once(t,e),this}emit(t,e){return this.eventBus.emit(t,e),this}destroy(){this.destroyAllWidgets(),this.eventBus.emit("sdk:destroyed"),this.eventBus.clear(),this.apiService.clearSession(),this.initialized=!1,this.identified=!1}hasFeedbackBeenSubmitted(t=30){const e=24*t*60*60*1e3,n=Date.now();if(this.config.last_feedback_at)try{if(n-new Date(this.config.last_feedback_at).getTime()<e)return!0}catch(t){}try{const t=`feedback_submitted_${this.config.workspace}`,i=localStorage.getItem(t);if(!i)return!1;return n-JSON.parse(i).submittedAt<e}catch(t){return!1}}clearFeedbackSubmissionTracking(){try{const t=`feedback_submitted_${this.config.workspace}`;localStorage.removeItem(t),this.eventBus.emit("feedback:trackingCleared")}catch(t){console.warn("Failed to clear feedback tracking:",t)}}_detectEnvironment(){if("undefined"==typeof window)return"production";const t=window.location.hostname.toLowerCase(),e=window.location.port;return t.includes("staging")?"staging":"app.localhost"===t&&"3005"===e?"localstack":"production"}_validateAndMergeConfig(t,e={}){const n=k(k({apiUrl:null,workspace:null,metadata:null,position:"right",theme:"light",boardName:"feature-requests",autoShow:!0,debug:!1,mock:!1,env:this._detectEnvironment()},e),t);if(t.env||e.env||(n.env=this._detectEnvironment()),!n.workspace)throw new v("Missing required configuration: workspace");return n.metadata&&this._validateMetadata(n.metadata),n}_validateMetadata(t){if(!t.user_id&&!t.email)throw new v("Metadata must include at least user_id or email");const e={user_id:"string",email:"string",name:"string",custom_fields:"object",company:"object"};for(const[n,i]of Object.entries(e))if(t[n]&&typeof t[n]!==i)throw new v(`Metadata field '${n}' must be of type '${i}'`)}_bindMethods(){this.createWidget=this.createWidget.bind(this),this.createFeedbackWidget=this.createFeedbackWidget.bind(this),this.createLiveChatWidget=this.createLiveChatWidget.bind(this),this.createChangelogWidget=this.createChangelogWidget.bind(this),this.createSurveyWidget=this.createSurveyWidget.bind(this),this.destroyWidget=this.destroyWidget.bind(this),this.identify=this.identify.bind(this),this.updateConfig=this.updateConfig.bind(this)}static create(e){return new t(e)}static async createAndInit(e){const n=new t(e);return await n.init(),n}static extractMetadataFromAuth(t){return t?{user_id:t.sub||t.id||t.user_id,email:t.email,name:t.name||t.display_name||t.full_name,custom_fields:{role:t.role,plan:t.plan||t.subscription?.plan,...t.custom_fields||{}},company:t.company||t.organization?{id:t.company?.id||t.organization?.id,name:t.company?.name||t.organization?.name,monthly_spend:t.company?.monthly_spend}:void 0}:null}async _syncConfiguredMetadataAfterInit(){if(!this.config.metadata||this.apiService.identitySyncedToken===this.apiService.sessionToken)return null;try{return await this.identify(this.config.metadata)}catch(t){return this.config.debug&&console.warn("[Product7] Initial identify failed:",t),null}}_extractIdentifyConfig(t){const e=this._isPlainObject(t?.data)?t.data:t||{},n=this._isPlainObject(e.config)?e.config:{};return void 0!==e.last_feedback_at?n.last_feedback_at=e.last_feedback_at:void 0!==e.lastFeedbackAt&&(n.last_feedback_at=e.lastFeedbackAt),this._omitUndefined(n)}_applyIdentityToWidgets(t){for(const e of this.widgets.values())"function"==typeof e.applyIdentity&&e.applyIdentity(t)}};function Y(t){return Object.keys(t).forEach(e=>{void 0===t[e]&&delete t[e]}),t}async function G(t){if(Z._sdk&&t.organization&&Z._sdk.config.workspace!==t.organization&&Z.destroy(),Z._sdk)return Z._sdk;if(t.organization){const e=Y({workspace:t.organization,debug:t.debug,mock:t.mock,env:t.env,apiUrl:t.apiUrl}),n=new Q(e);return await n.init(),Z._sdk=n,Z._organization=t.organization,n}return null}const Z={_sdk:null,_identified:!1,_organization:null,_q:[],_feedbackWidget:null,_LiveChatWidget:null,_surveyWidget:null,version:"1.0.0",async identify(t={},e){try{const n=function(t){const{organization:e,email:n,name:i,userId:a,profilePicture:s,locale:o,companies:r,...l}=t,c={user_id:a,email:n,name:i,profile_picture:s},d=["organization","email","name","userId","profilePicture","locale","companies","debug","mock","env","apiUrl"],h={};for(const[t,e]of Object.entries(l))d.includes(t)||(h[t]=e);if(Object.keys(h).length>0&&(c.custom_fields=h),Array.isArray(r)&&r.length>0){const t=r[0];c.company={id:t.id,name:t.name,monthly_spend:t.monthlySpend,custom_fields:{}};const e=["id","name","monthlySpend","createdAt"];for(const[n,i]of Object.entries(t))e.includes(n)||(c.company.custom_fields[n]=i)}return{workspace:e,metadata:c,locale:o,debug:t.debug,mock:t.mock,env:t.env,apiUrl:t.apiUrl}}(t);Z._organization=n.workspace||Z._organization||null;const i=Y({workspace:Z._organization,debug:n.debug,mock:n.mock,env:n.env,apiUrl:n.apiUrl});let a=Z._sdk;(!a||i.workspace&&a.config.workspace!==i.workspace)&&(Z._sdk&&(Z.destroy(),Z._organization=i.workspace||null),a=new Q(i),Z._sdk=a);const s=a.initialized?{alreadyInitialized:!0,sessionToken:a.apiService?.sessionToken}:await a.init(),o=function(t={}){return Object.values(t).some(t=>void 0!==t)}(n.metadata)?await a.identify(n.metadata):null;return Z._identified=Boolean(o?.identified),Z._flushQueue(),"undefined"!=typeof window&&"undefined"!=typeof CustomEvent&&window.dispatchEvent(new CustomEvent("Product7Ready",{detail:{sdk:a,config:a.config,initData:s,identifyData:o}})),"function"==typeof e&&e(null),{...s,identified:Z._identified,identify:o}}catch(t){throw console.error("[Product7] Identify failed:",t),"undefined"!=typeof window&&"undefined"!=typeof CustomEvent&&window.dispatchEvent(new CustomEvent("Product7Error",{detail:{error:t,phase:"identify"}})),"function"==typeof e&&e(t),t}},async feedback(t={},e){const n=await G(t);if(!n)return Z._q.push(["feedback",t,e]),null;const i=Y({displayMode:t.displayMode||"panel",theme:t.theme||n.config.theme||"light",size:t.size||"medium",primaryColor:t.primaryColor,backgroundColor:t.backgroundColor,textColor:t.textColor,suppressAfterSubmission:t.suppressAfterSubmission,suppressionDays:t.suppressionDays,showBackdrop:!1!==t.showBackdrop,metadata:t.metadata});"right"===t.placement?i.position="right":"left"===t.placement?i.position="left":t.placement&&(i.position=t.placement),t.defaultBoard&&(i.boardName=t.defaultBoard),t.placement?(i.suppressAfterSubmission=!1,i.enabled=!0):(i.autoShow=!1,i.displayMode="modal",i.headless=!0);try{const a=n.createFeedbackWidget(i);return a.mount(),t.placement?a.show():a.hide(),Z._feedbackWidget=a,"function"==typeof e&&(e({action:"widgetReady"}),n.eventBus.on("feedback:submitted",t=>{e({action:"feedbackSubmitted",post:t.feedback})}),n.eventBus.on("feedback:error",t=>{e({action:"feedbackError",error:t.error})})),Z._setupAttributeTriggers(),Z._setupPostMessageListener(),a}catch(t){return console.error("[Product7] Failed to initialize feedback widget:",t),"function"==typeof e&&e({action:"error",error:t}),null}},openFeedback(t={}){Z._feedbackWidget&&(t.setBoard&&(Z._feedbackWidget.options.boardName=t.setBoard),Z._feedbackWidget.open())},closeFeedback(){Z._feedbackWidget&&Z._feedbackWidget.close()},destroyFeedback(){Z._feedbackWidget&&(Z._feedbackWidget.destroy(),Z._feedbackWidget=null)},async liveChat(t={},e){const n=await G(t);if(!n)return Z._q.push(["liveChat",t,e]),null;const i=Y({theme:t.theme||n.config.theme||"light",primaryColor:t.primaryColor,backgroundColor:t.backgroundColor,textColor:t.textColor,logoUrl:t.logoUrl,teamName:t.teamName,teamAvatars:t.teamAvatars,greetingMessage:t.greetingMessage,welcomeMessage:t.welcomeMessage,enableHelp:t.enableHelp,enableChangelog:t.enableChangelog,enableNews:t.enableNews,autoLoadData:t.autoLoadData,initialView:t.initialView,featuredContent:t.featuredContent,feedbackUrl:t.feedbackUrl,changelogUrl:t.changelogUrl,helpUrl:t.helpUrl,roadmapUrl:t.roadmapUrl,previewData:t.previewData});"right"===t.placement?i.position="right":"left"===t.placement?i.position="left":t.placement&&(i.position=t.placement),i.suppressAfterSubmission=!1,i.enabled=!0;try{const t=n.createLiveChatWidget(i);return t.mount(),t.show(),Z._LiveChatWidget=t,"function"==typeof e&&(e({action:"widgetReady"}),n.eventBus.on("liveChat:messageSent",t=>{e({action:"messageSent",message:t})}),n.eventBus.on("liveChat:opened",()=>{e({action:"liveChatOpened"})}),n.eventBus.on("liveChat:closed",()=>{e({action:"liveChatClosed"})})),Z._setupLiveChatAttributeTriggers(),Z._setupPostMessageListener(),t}catch(t){return console.error("[Product7] Failed to initialize web chat widget:",t),"function"==typeof e&&e({action:"error",error:t}),null}},openLiveChat(){Z._LiveChatWidget&&(Z._LiveChatWidget.open?.()||Z._LiveChatWidget.openPanel?.())},closeLiveChat(){Z._LiveChatWidget&&(Z._LiveChatWidget.close?.()||Z._LiveChatWidget.closePanel?.())},destroyLiveChat(){Z._LiveChatWidget&&(Z._LiveChatWidget.destroy(),Z._LiveChatWidget=null)},async survey(t={},e){const n=await G(t);if(!n)return Z._q.push(["survey",t,e]),null;let i="right";"right"===t.placement?i="right":"left"===t.placement?i="left":"center"===t.placement?i="center":"bottom"===t.placement?i="bottom":t.placement&&(i=t.placement);const a=t.displayMode||"popover";"modal"!==a&&"fullscreen"!==a||(i="center");const s={onSubmit:t=>{"function"==typeof e&&e({action:"surveySubmitted",response:t})},onDismiss:()=>{"function"==typeof e&&e({action:"surveyDismissed"})}};"function"==typeof e&&(n.eventBus.on("survey:shown",t=>{e({action:"surveyShown",survey:t})}),n.eventBus.on("survey:questionAnswered",t=>{e({action:"questionAnswered",pageId:t.pageId,pageType:t.pageType,answer:t.answer})}),n.eventBus.on("survey:closed",()=>{e({action:"surveyClosed"})}));const o=t.displayMethod||"immediate",r=async()=>{try{let o;if(t.surveyId){const e={position:i,displayMode:a,theme:t.theme||n.config.theme||"light",showBackdrop:"modal"===a||"fullscreen"===a,...s};t.force&&(e.context={includeIneligible:!0}),o=await n.showSurveyById(t.surveyId,e)}else{const r=t.force?{includeIneligible:!0}:{},l=await n.getActiveSurveys(r);if(0===l.length)return"function"==typeof e&&e({action:"noSurveys"}),null;const c=l[0];o=n.showSurvey({surveyId:c.surveyId||c.id,surveyType:c.surveyType||c.type||"nps",position:i,displayMode:a,theme:t.theme||n.config.theme||"light",showBackdrop:"modal"===a||"fullscreen"===a,title:c.title,description:c.description,lowLabel:c.lowLabel,highLabel:c.highLabel,ratingScale:c.ratingScale,showFeedbackInput:c.showFeedbackInput,showSubmitButton:c.showSubmitButton,autoSubmitOnSelect:c.autoSubmitOnSelect,showTitle:c.showTitle,showDescription:c.showDescription,customQuestions:c.customQuestions,pages:c.pages,enabled:!!t.force||c.enabled,...s}),"function"==typeof e&&e({action:"surveyReady",survey:c})}return Z._surveyWidget=o,o}catch(t){return console.error("[Product7] Failed to show survey:",t),"function"==typeof e&&e({action:"error",error:t}),null}};if("delayed"===o){const n=t.displayDelay||5e3;return Z._surveyTimer=setTimeout(r,n),"function"==typeof e&&e({action:"surveyScheduled",delay:n}),null}if("exitIntent"===o){const t=e=>{e.clientY<=0&&(document.removeEventListener("mouseout",t),Z._exitIntentHandler=null,r())};return Z._exitIntentHandler=t,document.addEventListener("mouseout",t),"function"==typeof e&&e({action:"surveyScheduled",trigger:"exitIntent"}),null}if("onScroll"===o){const n=t.scrollPercentage||50,i=()=>{window.scrollY/(document.body.scrollHeight-window.innerHeight)*100>=n&&(window.removeEventListener("scroll",i),Z._scrollHandler=null,r())};return Z._scrollHandler=i,window.addEventListener("scroll",i,{passive:!0}),"function"==typeof e&&e({action:"surveyScheduled",trigger:"onScroll",scrollPercentage:n}),null}return r()},closeSurvey(){Z._surveyWidget&&(Z._surveyWidget.hide?.()||Z._surveyWidget.closePanel?.())},destroySurvey(){Z._surveyTimer&&(clearTimeout(Z._surveyTimer),Z._surveyTimer=null),Z._exitIntentHandler&&(document.removeEventListener("mouseout",Z._exitIntentHandler),Z._exitIntentHandler=null),Z._scrollHandler&&(window.removeEventListener("scroll",Z._scrollHandler),Z._scrollHandler=null),Z._surveyWidget&&(Z._surveyWidget.destroy(),Z._surveyWidget=null)},async track(t,e={}){if(!Z._sdk)return Z._q.push(["track",t,e]),null;const n=Z._sdk;if(!n.apiService?.sessionToken)return null;try{const i=await n.apiService._makeRequest("/widget/track",{method:"POST",body:JSON.stringify({event:t,properties:e,timestamp:(new Date).toISOString()}),headers:{"Content-Type":"application/json",Authorization:`Bearer ${n.apiService.sessionToken}`}});return i?.survey&&Z.survey({surveyId:i.survey.id||i.survey.survey_id,force:!0}),i}catch(t){return n.config.debug&&console.warn("[Product7] Track failed:",t),null}},getInstance:()=>Z._sdk,isReady:()=>Boolean(Z._sdk?.initialized),onReady(t){"undefined"!=typeof window&&(Z.isReady()?t(Z._sdk):window.addEventListener("Product7Ready",e=>t(e.detail.sdk,e.detail),{once:!0}))},onError(t){"undefined"!=typeof window&&window.addEventListener("Product7Error",e=>{t(e.detail.error,e.detail)})},destroy(){Z.destroyFeedback(),Z.destroyLiveChat(),Z.destroySurvey(),Z._sdk&&(Z._sdk.destroy(),Z._sdk=null),Z._identified=!1,Z._organization=null,Z._q=[],Z._feedbackListenerAttached=!1,Z._liveChatListenerAttached=!1,Z._postMessageListenerAttached=!1},_flushQueue(){const t=Z._q.splice(0);for(const[e,...n]of t)"function"==typeof Z[e]&&Z[e](...n)},_setupAttributeTriggers(){"undefined"!=typeof document&&(Z._feedbackListenerAttached||(Z._feedbackListenerAttached=!0,document.addEventListener("click",t=>{t.target.closest("[data-product7-feedback]")&&(t.preventDefault(),Z.openFeedback())})))},_setupLiveChatAttributeTriggers(){"undefined"!=typeof document&&(Z._liveChatListenerAttached||(Z._liveChatListenerAttached=!0,document.addEventListener("click",t=>{t.target.closest("[data-product7-liveChat]")&&(t.preventDefault(),Z.openLiveChat())})))},_setupPostMessageListener(){"undefined"!=typeof window&&(Z._postMessageListenerAttached||(Z._postMessageListenerAttached=!0,window.addEventListener("message",t=>{if("Product7Widget"!==t.data?.target)return;const{action:e,setBoard:n}=t.data.data||{};switch(e){case"openFeedback":Z.openFeedback({setBoard:n});break;case"closeFeedback":Z.closeFeedback();break;case"openLiveChat":Z.openLiveChat();break;case"closeLiveChat":Z.closeLiveChat();break;case"closeSurvey":Z.closeSurvey()}})))},Product7SDK:Q,BaseWidget:q,ButtonWidget:S,ChangelogWidget:A,TabWidget:W,InlineWidget:E,SurveyWidget:U,LiveChatWidget:H,WidgetFactory:R,EventBus:w,APIService:y,SDKError:p,APIError:g,WidgetError:u,ConfigError:v,ValidationError:m,helpers:_};if("undefined"!=typeof window){const t=window.Product7?._q||[];window.Product7=Z;for(const[e,...n]of t)"function"==typeof Z[e]&&Z[e](...n)}t.APIError=g,t.APIService=y,t.BaseWidget=q,t.ButtonWidget=S,t.ChangelogWidget=A,t.ConfigError=v,t.EventBus=w,t.InlineWidget=E,t.LiveChatWidget=H,t.Product7=Q,t.SDKError=p,t.SurveyWidget=U,t.TabWidget=W,t.ValidationError=m,t.WidgetError=u,t.WidgetFactory=R,t.default=Z,t.helpers=_,Object.defineProperty(t,"__esModule",{value:!0})});
|
|
2
2
|
//# sourceMappingURL=product7-js.min.js.map
|