@product7/feedback-sdk 1.2.6 → 1.2.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.
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FeedbackSDK={})}(this,function(e){"use strict";class t extends Error{constructor(e,n){super(e),this.name="SDKError",this.cause=n,Error.captureStackTrace&&Error.captureStackTrace(this,t)}}class n extends Error{constructor(e,t,s){super(t),this.name="APIError",this.status=e,this.response=s,Error.captureStackTrace&&Error.captureStackTrace(this,n)}isNetworkError(){return 0===this.status}isClientError(){return this.status>=400&&this.status<500}isServerError(){return this.status>=500&&this.status<600}}class s extends Error{constructor(e,t,n){super(e),this.name="WidgetError",this.widgetType=t,this.widgetId=n,Error.captureStackTrace&&Error.captureStackTrace(this,s)}}class i extends Error{constructor(e,t){super(e),this.name="ConfigError",this.configKey=t,Error.captureStackTrace&&Error.captureStackTrace(this,i)}}class a extends Error{constructor(e,t,n){super(e),this.name="ValidationError",this.field=t,this.value=n,Error.captureStackTrace&&Error.captureStackTrace(this,a)}}const o={primaryColor:"#21244A",backgroundColor:"#ffffff",textColor:"#1F2937",boardId:"feature-requests",size:"medium",displayMode:"modal"},r=[{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"}],l=[{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}}],c={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()}]},d=[{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:"#"}],h=[{id:"mock_nps_survey",type:"nps",title:"How likely are you to recommend us?",description:"Your feedback helps us improve",low_label:"Not likely",high_label:"Very likely",trigger:"manual",status:"active"},{id:"mock_csat_survey",type:"csat",title:"How satisfied are you?",description:"Rate your experience with our product",trigger:"manual",status:"active"},{id:"mock_ces_survey",type:"ces",title:"How easy was it?",description:"Rate the ease of completing your task",low_label:"Very difficult",high_label:"Very easy",trigger:"manual",status:"active"}],g={production:{base:"https://api.product7.io/api/v1",withWorkspace:e=>`https://${e}.api.product7.io/api/v1`},staging:{base:"https://staging.api.product7.io/api/v1",withWorkspace:e=>`https://${e}.staging.api.product7.io/api/v1`}};class p{constructor(e={}){if(this.workspace=e.workspace,this.sessionToken=null,this.sessionExpiry=null,this.userContext=e.userContext||null,this.mock=e.mock||!1,this.env=e.env||"production",e.apiUrl)this.baseURL=e.apiUrl;else{const e=g[this.env]||g.production;this.baseURL=this.workspace?e.withWorkspace(this.workspace):e.base}this._loadStoredSession()}async init(e=null){if(e&&(this.userContext=e),this.isSessionValid())return{sessionToken:this.sessionToken};if(!this.userContext||!this.workspace){const e=`Missing ${this.workspace?"user context":"workspace"} for initialization`;throw new n(400,e)}if(this.mock)return this.sessionToken="mock_session_"+Date.now(),this.sessionExpiry=new Date(Date.now()+36e5),this._storeSession(),{sessionToken:this.sessionToken,config:o,expiresIn:3600};const t={workspace:this.workspace,user:this.userContext};try{const e=await this._makeRequest("/widget/init",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}});return this.sessionToken=e.session_token,this.sessionExpiry=new Date(Date.now()+1e3*e.expires_in),this._storeSession(),{sessionToken:this.sessionToken,config:e.config||{},expiresIn:e.expires_in}}catch(e){throw new n(e.status||500,`Failed to initialize widget: ${e.message}`,e.response)}}async submitFeedback(e){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(this.mock)return await new Promise(e=>setTimeout(e,500)),{success:!0,data:{id:"mock_post_"+Date.now(),title:e.title,content:e.content},message:"Feedback submitted successfully!"};const t={board:e.board_id||e.board||e.boardId,title:e.title,content:e.content,attachments:e.attachments||[]};try{return await this._makeRequest("/widget/feedback",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.submitFeedback(e);throw new n(t.status||500,`Failed to submit feedback: ${t.message}`,t.response)}}async getActiveSurveys(e={}){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(this.mock)return await new Promise(e=>setTimeout(e,200)),{success:!0,data:h};try{const t=new URLSearchParams,n=e.url||("undefined"!=typeof window?window.location.href:"");n&&t.append("url",n);const s=this._getDeviceInfo();s.device&&t.append("device",s.device),s.browser&&t.append("browser",s.browser),s.os&&t.append("os",s.os),e.userProperties&&t.append("user_properties",JSON.stringify(e.userProperties));const i="/widget/surveys/active"+(t.toString()?"?"+t.toString():"");return await this._makeRequest(i,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.getActiveSurveys(e);throw new n(t.status||500,`Failed to get active surveys: ${t.message}`,t.response)}}_getDeviceInfo(){if("undefined"==typeof navigator)return{device:null,browser:null,os:null};const e=navigator.userAgent;let t="desktop";/Mobi|Android/i.test(e)&&(t=/Tablet|iPad/i.test(e)?"tablet":"mobile");let n="unknown";e.includes("Firefox")?n="firefox":e.includes("Edg")?n="edge":e.includes("Chrome")?n="chrome":e.includes("Safari")?n="safari":(e.includes("Opera")||e.includes("OPR"))&&(n="opera");let s="unknown";return e.includes("Windows")?s="windows":e.includes("Mac")?s="macos":e.includes("Linux")?s="linux":e.includes("Android")?s="android":(e.includes("iPhone")||e.includes("iPad"))&&(s="ios"),{device:t,browser:n,os:s}}async submitSurveyResponse(e,t){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(!e)throw new n(400,"Survey ID is required");if(this.mock)return await new Promise(e=>setTimeout(e,300)),{success:!0,data:{id:"mock_response_"+Date.now(),survey_id:e,...t},message:"Survey response submitted successfully!"};const s={rating:t.rating,feedback:t.feedback||"",answers:t.answers||{}};try{return await this._makeRequest(`/widget/surveys/${e}/responses`,{method:"POST",body:JSON.stringify(s),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`}})}catch(s){if(401===s.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.submitSurveyResponse(e,t);throw new n(s.status||500,`Failed to submit survey response: ${s.message}`,s.response)}}async dismissSurvey(e){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(!e)throw new n(400,"Survey ID is required");if(this.mock)return await new Promise(e=>setTimeout(e,100)),{success:!0,message:"Survey dismissed successfully"};try{return await this._makeRequest(`/widget/surveys/${e}/dismiss`,{method:"POST",headers:{Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.dismissSurvey(e);throw new n(t.status||500,`Failed to dismiss survey: ${t.message}`,t.response)}}async getMessengerSettings(){return this.isSessionValid()||await this.init(),this.mock?{status:!0,data:{enabled:!0,greeting_message:"Hi there! How can we help you today?",team_name:"Support Team",response_time:"Usually replies within a few minutes"}}:this._makeRequest("/widget/messenger/settings",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async checkAgentsOnline(){return this.isSessionValid()||await this.init(),this.mock?{status:!0,data:{agents_online:!0,online_count:2,response_time:"Usually replies within a few minutes"}}:this._makeRequest("/widget/messenger/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getConversations(e={}){if(this.isSessionValid()||await this.init(),this.mock)return await new Promise(e=>setTimeout(e,300)),{status:!0,data:l,meta:{total:l.length,page:1,limit:20}};const t=new URLSearchParams;e.page&&t.append("page",e.page),e.limit&&t.append("limit",e.limit);const n="/widget/messenger/conversations"+(t.toString()?"?"+t.toString():"");return this._makeRequest(n,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getConversation(e){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));return{status:!0,data:{...l.find(t=>t.id===e),messages:c[e]||[]}}}return this._makeRequest(`/widget/messenger/conversations/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getMessages(e,t={}){if(this.isSessionValid()||await this.init(),this.mock)return await new Promise(e=>setTimeout(e,200)),{status:!0,data:c[e]||[]};const n=new URLSearchParams;t.page&&n.append("page",t.page),t.limit&&n.append("limit",t.limit);const s=`/widget/messenger/conversations/${e}/messages${n.toString()?"?"+n.toString():""}`;return this._makeRequest(s,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async startConversation(e){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,300));const t={id:"conv_"+Date.now(),subject:e.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:e.message,sender_type:"customer",created_at:(new Date).toISOString()}]};return l.unshift(t),c[t.id]=t.messages,{status:!0,data:t}}return this._makeRequest("/widget/messenger/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({message:e.message,subject:e.subject||""})})}async sendMessage(e,t){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));const n={id:"msg_"+Date.now(),content:t.content,sender_type:"customer",created_at:(new Date).toISOString()};return c[e]||(c[e]=[]),c[e].push(n),{status:!0,data:n}}return this._makeRequest(`/widget/messenger/conversations/${e}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({content:t.content})})}async sendTypingIndicator(e,t){return this.isSessionValid()||await this.init(),this.mock?{status:!0}:this._makeRequest(`/widget/messenger/conversations/${e}/typing`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({is_typing:t})})}async markConversationAsRead(e){return this.isSessionValid()||await this.init(),this.mock?{status:!0}:this._makeRequest(`/widget/messenger/conversations/${e}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getUnreadCount(){if(this.isSessionValid()||await this.init(),this.mock){const e=l.reduce((e,t)=>e+(t.unread||0),0);return{status:!0,data:{unread_count:e,unread_conversations:e>0?1:0}}}return this._makeRequest("/widget/messenger/unread",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async submitRating(e,t){return this.isSessionValid()||await this.init(),this.mock?{status:!0,message:"Thank you for your feedback!"}:this._makeRequest(`/widget/messenger/conversations/${e}/rate`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({rating:t.rating,comment:t.comment||""})})}async identifyContact(e){return this.isSessionValid()||await this.init(),this.mock?{status:!0,message:"Contact identified"}:this._makeRequest("/widget/messenger/identify",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify(e)})}async getHelpCollections(e={}){if(this.isSessionValid()||await this.init(),this.mock)return await new Promise(e=>setTimeout(e,200)),{status:!0,data:d};const t=new URLSearchParams;e.limit&&t.append("limit",e.limit);const n="/widget/help/collections"+(t.toString()?"?"+t.toString():"");return this._makeRequest(n,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async searchHelpArticles(e,t={}){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));return{status:!0,data:d.filter(t=>t.title.toLowerCase().includes(e.toLowerCase())||t.description.toLowerCase().includes(e.toLowerCase()))}}const n=new URLSearchParams({q:e});return t.limit&&n.append("limit",t.limit),this._makeRequest(`/widget/help/search?${n.toString()}`,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getChangelogs(e={}){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(this.mock)return await new Promise(e=>setTimeout(e,300)),{success:!0,data:r};try{const t=new URLSearchParams;e.limit&&t.append("limit",e.limit),e.offset&&t.append("offset",e.offset);const n="/widget/changelogs"+(t.toString()?"?"+t.toString():"");return await this._makeRequest(n,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.getChangelogs(e);throw new n(t.status||500,`Failed to get changelogs: ${t.message}`,t.response)}}isSessionValid(){return this.sessionToken&&this.sessionExpiry&&new Date<this.sessionExpiry}setUserContext(e){this.userContext=e,"undefined"!=typeof localStorage&&localStorage.setItem("feedbackSDK_userContext",JSON.stringify(e))}getUserContext(){return this.userContext}clearSession(){this.sessionToken=null,this.sessionExpiry=null,"undefined"!=typeof localStorage&&(localStorage.removeItem("feedbackSDK_session"),localStorage.removeItem("feedbackSDK_userContext"))}_storeSession(){if("undefined"!=typeof localStorage)try{const e={token:this.sessionToken,expiry:this.sessionExpiry.toISOString(),workspace:this.workspace};localStorage.setItem("feedbackSDK_session",JSON.stringify(e))}catch(e){}}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const e=localStorage.getItem("feedbackSDK_session");if(!e)return!1;const t=JSON.parse(e);return this.sessionToken=t.token,this.sessionExpiry=new Date(t.expiry),this.isSessionValid()}catch(e){return!1}}async _makeRequest(e,t={}){const s=`${this.baseURL}${e}`;try{const e=await fetch(s,t);if(!e.ok){let t=`HTTP ${e.status}`,s=null;try{s=await e.json(),t=s.message||s.error||t}catch(n){t=await e.text()||t}throw new n(e.status,t,s)}const i=e.headers.get("content-type");return i&&i.includes("application/json")?await e.json():await e.text()}catch(e){if(e instanceof n)throw e;throw new n(0,e.message,null)}}}class m{constructor(){this.events=new Map}on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(n){const e=n.indexOf(t);e>-1&&n.splice(e,1)}}emit(e,t){const n=this.events.get(e);n&&n.forEach(e=>{try{e(t)}catch(e){console.error("[FeedbackSDK] Event callback error:",e)}})}once(e,t){const n=this.on(e,e=>{t(e),n()});return n}clear(){this.events.clear()}getListenerCount(e){const t=this.events.get(e);return t?t.length:0}}function u(e="feedback"){return`${e}_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}function b(e,t){const n={...e};for(const s in t)t.hasOwnProperty(s)&&(t[s]&&"object"==typeof t[s]&&!Array.isArray(t[s])?n[s]=b(e[s]||{},t[s]):n[s]=t[s]);return n}function f(){return"undefined"!=typeof window&&"undefined"!=typeof document}var v=Object.freeze({__proto__:null,debounce:function(e,t){let n;return function(...s){clearTimeout(n),n=setTimeout(()=>{clearTimeout(n),e(...s)},t)}},deepMerge:b,delay:function(e){return new Promise(t=>setTimeout(t,e))},escapeRegex:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},formatFileSize:function(e){if(0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["Bytes","KB","MB","GB"][t]},generateId:u,getBrowserInfo:function(){return{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language||navigator.userLanguage,cookieEnabled:navigator.cookieEnabled,screenResolution:`${screen.width}x${screen.height}`,windowSize:`${window.innerWidth}x${window.innerHeight}`,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}},getCSSProperty:function(e,t,n=""){if(!e||!t)return n;try{return window.getComputedStyle(e).getPropertyValue(t)||n}catch(e){return n}},getCurrentTimestamp:function(){return(new Date).toISOString()},getNestedProperty:function(e,t,n=void 0){if(!e||!t)return n;const s=t.split(".");let i=e;for(const e of s){if(null==i||!(e in i))return n;i=i[e]}return i},isBrowser:f,isInViewport:function(e){if(!e)return!1;const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)},isMobile:function(){return!!f()&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<=768)},isValidEmail:function(e){return!(!e||"string"!=typeof e)&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.trim())},safeJsonParse:function(e,t=null){try{return JSON.parse(e)}catch(e){return t}},sanitizeHTML:function(e){if(!e||"string"!=typeof e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML},scrollToElement:function(e,t={}){if(!e)return;e.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest",...t})},setNestedProperty:function(e,t,n){if(!e||!t)return e;const s=t.split("."),i=s.pop();let a=e;for(const e of s)e in a&&"object"==typeof a[e]||(a[e]={}),a=a[e];return a[i]=n,e},throttle:function(e,t){let n,s;return function(...i){s?(clearTimeout(n),n=setTimeout(()=>{Date.now()-s>=t&&(e(...i),s=Date.now())},t-(Date.now()-s))):(e(...i),s=Date.now())}},validateConfig:function(e,t=[]){const n=[];for(const s of t)e[s]||n.push(s);if(n.length>0)throw new Error(`Missing required configuration: ${n.join(", ")}`);return!0}});class y{static STORAGE_KEY="feedback_submitted";static DEFAULT_COOLDOWN_DAYS=30;constructor(e={}){this.id=e.id,this.sdk=e.sdk,this.apiService=e.apiService,this.type=e.type||"base",this.options={container:null,position:this.sdk.config.position,boardId:this.sdk.config.boardId,displayMode:e.displayMode||"panel",size:e.size||"medium",primaryColor:e.primaryColor||"#21244A",backgroundColor:e.backgroundColor||"#ffffff",textColor:e.textColor||"#1F2937",autoShow:!1,showBackdrop:!0,customStyles:{},suppressAfterSubmission:!0,suppressionDays:y.DEFAULT_COOLDOWN_DAYS,...e},this.element=null,this.panelElement=null,this.backdropElement=null,this.mounted=!1,this.destroyed=!1,this.state={isOpen:!1,isLoading:!1,isSubmitting:!1,title:"",content:"",email:"",attachments:[],errors:{}},this._bindMethods()}mount(e){return this.mounted||this.destroyed?this:this.options.suppressAfterSubmission&&this._hasRecentlySubmitted()?(this.sdk.eventBus.emit("widget:suppressed",{widget:this,reason:"recently_submitted"}),this):("string"==typeof e&&(e=document.querySelector(e)),e||(e=document.body),this.container=e,this.element=this._render(),this.container.appendChild(this.element),this.mounted=!0,this._attachEvents(),this.onMount(),this.options.autoShow&&this.show(),this.sdk.eventBus.emit("widget:mounted",{widget:this}),this)}show(){return this.element&&(this.element.style.display="block"),this}hide(){return this.element&&(this.element.style.display="none"),this}openPanel(){this.state.isOpen=!0,"modal"===this.options.displayMode?(this._showLoadingModal(),setTimeout(()=>{this._hideLoadingModal(),this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")})},600)):(this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}_showLoadingModal(){this.state.isLoading=!0,this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-panel-backdrop",document.body.appendChild(this.backdropElement),this.loadingElement=document.createElement("div"),this.loadingElement.className=`feedback-loading-modal theme-${this.options.theme}`,this.loadingElement.innerHTML='\n\t\t\t<div class="feedback-loading-spinner"></div>\n\t\t',document.body.appendChild(this.loadingElement),requestAnimationFrame(()=>{this.backdropElement.classList.add("show"),this.loadingElement.classList.add("show")})}_hideLoadingModal(){this.state.isLoading=!1,this.loadingElement&&(this.loadingElement.remove(),this.loadingElement=null)}closePanel(){this.panelElement&&this.panelElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.panelElement&&this.panelElement.parentNode&&(this.panelElement.parentNode.removeChild(this.panelElement),this.panelElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null),this._resetForm()},300)}async submitFeedback(){if(!this.state.isSubmitting){this._hideError();try{this.state.isSubmitting=!0,this._updateSubmitButton();const e={title:this.state.title||"Feedback",content:this.state.content,email:this.state.email,board_id:this.options.boardId,attachments:this.state.attachments};if(!this.state.content.trim())return void this._showError("Please enter your feedback message.");const t=await this.apiService.submitFeedback(e);this._trackSubmission(),this._showSuccessMessage(),this.closePanel(),this.sdk.eventBus.emit("feedback:submitted",{widget:this,feedback:t})}catch(e){this._showError("Failed to submit feedback. Please try again."),this.sdk.eventBus.emit("feedback:error",{widget:this,error:e})}finally{this.state.isSubmitting=!1,this._updateSubmitButton()}}}handleConfigUpdate(e){this.options.theme=e.theme,this.element&&this._updateTheme()}destroy(){this.destroyed||(this.onDestroy(),this.closePanel(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.destroyed=!0,this.mounted=!1,this.sdk.eventBus.emit("widget:destroyed",{widget:this}))}onMount(){}onDestroy(){}_trackSubmission(){try{const e=this.sdk.config.workspace,t=`${y.STORAGE_KEY}_${e}`,n={submittedAt:Date.now(),boardId:this.options.boardId};localStorage.setItem(t,JSON.stringify(n))}catch(e){console.warn("Failed to track feedback submission:",e)}}_hasRecentlySubmitted(){const e=24*this.options.suppressionDays*60*60*1e3,t=Date.now();if(this.sdk.config.last_feedback_at)try{if(t-new Date(this.sdk.config.last_feedback_at).getTime()<e)return!0}catch(e){}try{const n=this.sdk.config.workspace,s=`${y.STORAGE_KEY}_${n}`,i=localStorage.getItem(s);if(!i)return!1;const a=JSON.parse(i);return t-a.submittedAt<e}catch(e){return!1}}clearSubmissionTracking(){try{const e=this.sdk.config.workspace,t=`${y.STORAGE_KEY}_${e}`;localStorage.removeItem(t)}catch(e){console.warn("Failed to clear submission tracking:",e)}}shouldShow(){return!this.options.suppressAfterSubmission||!this._hasRecentlySubmitted()}_render(){throw new Error("_render() must be implemented by concrete widget")}_attachEvents(){}_bindMethods(){this.openPanel=this.openPanel.bind(this),this.closePanel=this.closePanel.bind(this),this.submitFeedback=this.submitFeedback.bind(this)}_renderPanel(){if(this.panelElement)return;this.options.showBackdrop&&!this.backdropElement&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-panel-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",this.closePanel));const e="modal"===this.options.displayMode?"feedback-modal":"feedback-panel",t=`size-${this.options.size}`;this.panelElement=document.createElement("div"),this.panelElement.className=`${e} ${t}`,this.panelElement.style.setProperty("--primary-color",this.options.primaryColor),this.panelElement.style.setProperty("--bg-color",this.options.backgroundColor),this.panelElement.style.setProperty("--text-color",this.options.textColor),this.panelElement.innerHTML=this._getPanelHTML(),document.body.appendChild(this.panelElement),this._attachPanelEvents();const n=this.panelElement.querySelector("input, textarea");n&&setTimeout(()=>n.focus(),350)}_getPanelHTML(){return`\n <div class="feedback-panel-content">\n <div class="feedback-panel-header">\n <h3>Send Feedback</h3>\n <button class="feedback-panel-close" type="button" aria-label="Close">&times;</button>\n </div>\n <div class="feedback-panel-body">\n <form class="feedback-form">\n <div class="feedback-form-group">\n <label for="feedback-title-${this.id}">Title (optional)</label>\n <input \n type="text" \n id="feedback-title-${this.id}" \n name="title" \n placeholder="Brief description of your feedback"\n value="${this.state.title}"\n />\n </div>\n <div class="feedback-form-group">\n <label for="feedback-content-${this.id}">Message *</label>\n <textarea \n id="feedback-content-${this.id}" \n name="content" \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="feedback-btn feedback-btn-submit">\n ${this.state.isSubmitting?"Sending...":"Send Feedback"}\n </button>\n </div>\n </form>\n </div>\n </div>\n `}_attachPanelEvents(){const e=this.panelElement;e.querySelector(".feedback-panel-close").addEventListener("click",this.closePanel);e.querySelector(".feedback-form").addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value});const t=e=>{"Escape"===e.key&&(this.closePanel(),document.removeEventListener("keydown",t))};document.addEventListener("keydown",t)}_updateSubmitButton(){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-btn-submit");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}}_showError(e){if(this.panelElement){const t=this.panelElement.querySelector(".feedback-error");t&&(t.textContent=e,t.classList.add("show"))}}_hideError(){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-error");e&&e.classList.remove("show")}}_showSuccessMessage(){const e=document.createElement("div");e.className="feedback-success-notification",e.innerHTML='\n <div class="feedback-success-content">\n <div class="feedback-success-icon">✓</div>\n <span>Feedback submitted successfully!</span>\n <button class="feedback-success-close" aria-label="Close">&times;</button>\n </div>\n ',document.body.appendChild(e);const t=()=>{e.parentNode&&(e.style.opacity="0",setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},300))};e.querySelector(".feedback-success-close").addEventListener("click",t),setTimeout(t,4e3)}_resetForm(){this.state.title="",this.state.content="",this.state.email="",this.state.errors={}}_updateTheme(){this.element&&(this.element.className=this.element.className.replace(/theme-\w+/,`theme-${this.options.theme}`)),this.panelElement&&(this.panelElement.className=this.panelElement.className.replace(/theme-\w+/,`theme-${this.options.theme}`))}openModal(){this.openPanel()}closeModal(){this.closePanel()}}class w extends y{constructor(e){super({...e,type:"button"}),this.isMinimized=!1}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-button theme-${this.options.theme} position-${this.options.position}`,e.innerHTML='\n <button class="feedback-trigger-btn" type="button">\n <svg class="feedback-icon" width="20" height="20" viewBox="0 0 256 256" fill="currentColor">\n <path d="M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z"/>\n </svg>\n <span class="feedback-text">Feedback</span>\n \n <div class="feedback-minimize-icon">\n <svg viewBox="0 0 256 256">\n <path d="M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z"/>\n </svg>\n </div>\n \n <div class="feedback-expand-icon">\n <svg viewBox="0 0 256 256">\n <path d="M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z"/>\n </svg>\n </div>\n </button>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-trigger-btn"),t=this.element.querySelector(".feedback-minimize-icon"),n=this.element.querySelector(".feedback-expand-icon");t.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.minimize()}),n.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.restore()}),e.addEventListener("click",e=>{e.target.closest(".feedback-minimize-icon")||e.target.closest(".feedback-expand-icon")||this.isMinimized||this.openPanel()}),e.addEventListener("mouseenter",()=>{this.state.isSubmitting||this.isMinimized||(e.style.transform="translateY(-2px)")}),e.addEventListener("mouseleave",()=>{this.isMinimized||(e.style.transform="translateY(0)")})}minimize(){this.isMinimized=!0,this.element.classList.add("minimized")}restore(){this.isMinimized=!1,this.element.classList.remove("minimized")}mount(e){super.mount(e)}updateText(e){const t=this.element?.querySelector(".feedback-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class x extends y{constructor(e){super({...e,type:"changelog"}),this.changelogs=[],this.isLoading=!1,this.modalElement=null,this.sidebarElement=null,this.currentIndex=0}_render(){const e=document.createElement("div");return e.className=`feedback-widget changelog-widget theme-${this.options.theme} position-${this.options.position}`,e.innerHTML=`\n\t\t\t<button class="changelog-trigger-btn" type="button" aria-label="View Updates">\n\t\t\t\t<svg class="changelog-icon" width="18" height="18" viewBox="0 0 24 24" fill="currentColor">\n\t\t\t\t\t<path d="M5.8 21L7.4 14L2 9.2L9.2 8.6L12 2L14.8 8.6L22 9.2L16.6 14L18.2 21L12 17.3L5.8 21Z"/>\n\t\t\t\t</svg>\n\t\t\t\t<span class="changelog-text">${this.options.triggerText||"What's New"}</span>\n\t\t\t\t<span class="changelog-confetti-emoji">🎉</span>\n\t\t\t\t${this.options.showBadge?'<span class="changelog-badge"></span>':""}\n\t\t\t</button>\n\t\t`,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".changelog-trigger-btn");e.addEventListener("click",()=>{this.openSidebar()}),e.addEventListener("mouseenter",()=>{e.style.transform="translateY(-2px)"}),e.addEventListener("mouseleave",()=>{e.style.transform="translateY(0)"})}async openModal(){this.modalElement||(this.state.isOpen=!0,this._createModal(),0===this.changelogs.length&&await this._loadChangelogs(),this.currentIndex=0,this._renderCurrentChangelog(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.modalElement&&this.modalElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}closeModal(){document.body.style.overflow="",this.modalElement&&this.modalElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.modalElement&&this.modalElement.parentNode&&(this.modalElement.parentNode.removeChild(this.modalElement),this.modalElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null)},300)}_createModal(){this.backdropElement=document.createElement("div"),this.backdropElement.className="changelog-modal-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this.closeModal()),this.modalElement=document.createElement("div"),this.modalElement.className=`changelog-modal theme-${this.options.theme}`,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">&times;</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="changelog-loading-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',document.body.appendChild(this.modalElement),this.modalElement.querySelector(".changelog-modal-container").addEventListener("click",e=>{e.stopPropagation()}),this.modalElement.querySelector(".changelog-modal-close").addEventListener("click",()=>this.closeModal()),this._escapeHandler=e=>{"Escape"===e.key&&this.closeModal()},document.addEventListener("keydown",this._escapeHandler)}async openSidebar(){this.listModalElement||(this.modalElement&&(this.closeModal(),await new Promise(e=>setTimeout(e,350))),this.state.isOpen=!0,this._createListModal(),0===this.changelogs.length&&await this._loadChangelogs(),this._renderChangelogList(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.listModalElement&&(this.listModalElement.classList.add("open"),this._showConfetti()),this.listModalBackdropElement&&this.listModalBackdropElement.classList.add("show")}))}_showConfetti(){const e=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA"],t=document.createElement("div");t.className="changelog-confetti-container",document.body.appendChild(t);for(let n=0;n<50;n++){const n=document.createElement("div");n.className="changelog-confetti",n.style.left=100*Math.random()+"%",n.style.backgroundColor=e[Math.floor(Math.random()*e.length)],n.style.animationDelay=.5*Math.random()+"s",n.style.animationDuration=1*Math.random()+1.5+"s";const s=["circle","square","rectangle"],i=s[Math.floor(Math.random()*s.length)];"circle"===i?(n.style.borderRadius="50%",n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width):"rectangle"===i?(n.style.width=4*Math.random()+3+"px",n.style.height=10*Math.random()+8+"px"):(n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width),t.appendChild(n)}setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},2500)}closeSidebar(){document.body.style.overflow="",this.listModalElement&&this.listModalElement.classList.remove("open"),this.listModalBackdropElement&&this.listModalBackdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.listModalElement&&this.listModalElement.parentNode&&(this.listModalElement.parentNode.removeChild(this.listModalElement),this.listModalElement=null),this.listModalBackdropElement&&this.listModalBackdropElement.parentNode&&(this.listModalBackdropElement.parentNode.removeChild(this.listModalBackdropElement),this.listModalBackdropElement=null),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler)},300)}_createListModal(){this.listModalBackdropElement=document.createElement("div"),this.listModalBackdropElement.className="changelog-list-modal-backdrop",document.body.appendChild(this.listModalBackdropElement),this.listModalBackdropElement.addEventListener("click",()=>this.closeSidebar()),this.listModalElement=document.createElement("div"),this.listModalElement.className=`changelog-list-modal theme-${this.options.theme}`,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">&times;</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="changelog-loading-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,document.body.appendChild(this.listModalElement),this.listModalElement.querySelector(".changelog-list-modal-container").addEventListener("click",e=>{e.stopPropagation()}),this.listModalElement.querySelector(".changelog-list-modal-close").addEventListener("click",()=>this.closeSidebar()),this._listModalEscapeHandler=e=>{"Escape"===e.key&&this.closeSidebar()},document.addEventListener("keydown",this._listModalEscapeHandler)}_renderChangelogList(){const e=this.listModalElement.querySelector(".changelog-list-modal-body");this.isLoading||(0!==this.changelogs.length?(e.innerHTML=`\n\t\t\t<div class="changelog-list">\n\t\t\t\t${this.changelogs.map((e,t)=>this._renderChangelogListItem(e,t)).join("")}\n\t\t\t</div>\n\t\t`,e.querySelectorAll(".changelog-list-item").forEach((e,t)=>{e.addEventListener("click",()=>{const e=this.changelogs[t];this._handleViewUpdate(e)})})):e.innerHTML='\n\t\t\t\t<div class="changelog-empty">\n\t\t\t\t\t<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n\t\t\t\t\t\t<path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"/>\n\t\t\t\t\t\t<polyline points="14,2 14,8 20,8"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t')}_renderChangelogListItem(e,t){const n=e.cover_image||e.image,s=e.cover_image||e.image,i=e.published_at?this._formatDate(e.published_at):"";return`\n\t\t\t<div class="changelog-list-item" data-index="${t}">\n\t\t\t\t<div class="changelog-list-item-main">\n\t\t\t\t\t${n?`\n\t\t\t\t\t\t<div class="changelog-list-item-image">\n\t\t\t\t\t\t\t<img src="${s}" alt="${e.title}" loading="lazy" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<div class="changelog-list-item-content">\n\t\t\t\t\t\t${i?`<span class="changelog-list-item-date">${i}</span>`:""}\n\t\t\t\t\t\t${e.labels&&e.labels.length>0?`\n\t\t\t\t\t\t\t<div class="changelog-list-item-labels">\n\t\t\t\t\t\t\t\t${e.labels.map(e=>`\n\t\t\t\t\t\t\t\t\t<span class="changelog-label" style="background-color: ${e.color||"#E5E7EB"}; color: ${this._getContrastColor(e.color||"#E5E7EB")}">${e.name}</span>\n\t\t\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`:""}\n\t\t\t\t\t\t<h3 class="changelog-list-item-title">${e.title}</h3>\n\t\t\t\t\t\t${e.excerpt||e.description?`\n\t\t\t\t\t\t\t<p class="changelog-list-item-description">${e.excerpt||e.description}</p>\n\t\t\t\t\t\t`:""}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class="changelog-list-item-arrow">\n\t\t\t\t\t<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n\t\t\t\t\t\t<path d="M9 18l6-6-6-6"/>\n\t\t\t\t\t</svg>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}async _loadChangelogs(){this.isLoading=!0;try{const e=await this.apiService.getChangelogs();this.changelogs=e.data||[],this.sdk.eventBus.emit("changelog:loaded",{changelogs:this.changelogs})}catch(e){this.changelogs=[],this.sdk.eventBus.emit("changelog:error",{error:e})}finally{this.isLoading=!1}}_renderCurrentChangelog(){const e=this.modalElement.querySelector(".changelog-modal-content");if(this.isLoading)return;if(0===this.changelogs.length)return void(e.innerHTML='\n\t\t\t\t<div class="changelog-empty">\n\t\t\t\t\t<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n\t\t\t\t\t\t<path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"/>\n\t\t\t\t\t\t<polyline points="14,2 14,8 20,8"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t');const t=this.changelogs[this.currentIndex],n=t.cover_image||t.image,s=t.cover_image||t.image,i=this.changelogs.length>1;e.innerHTML=`\n\t\t\t<div class="changelog-popup-item">\n\t\t\t\t${n?`\n\t\t\t\t\t<div class="changelog-popup-image">\n\t\t\t\t\t\t<img src="${s}" alt="${t.title}" loading="lazy" />\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="changelog-popup-body">\n\t\t\t\t\t<h2 class="changelog-popup-title">${t.title}</h2>\n\t\t\t\t\t${t.excerpt||t.description?`\n\t\t\t\t\t\t<p class="changelog-popup-description">${t.excerpt||t.description}</p>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<button class="changelog-popup-btn" type="button">\n\t\t\t\t\t\t${this.options.viewButtonText||"View Update"}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="changelog-popup-footer">\n\t\t\t\t\t${i?`\n\t\t\t\t\t\t<div class="changelog-popup-dots">\n\t\t\t\t\t\t\t${this.changelogs.map((e,t)=>`\n\t\t\t\t\t\t\t\t<span class="changelog-dot ${t===this.currentIndex?"active":""}" data-index="${t}"></span>\n\t\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<button class="changelog-view-all-btn" type="button">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n\t\t\t\t\t\t\t<path d="M5 12h14M12 5l7 7-7 7"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,e.querySelector(".changelog-popup-btn").addEventListener("click",()=>{this._handleViewUpdate(t)}),e.querySelector(".changelog-view-all-btn").addEventListener("click",()=>{this.closeModal(),setTimeout(()=>this.openSidebar(),350)}),i&&e.querySelectorAll(".changelog-dot").forEach(e=>{e.addEventListener("click",e=>{const t=parseInt(e.target.dataset.index,10);this.currentIndex=t,this._renderCurrentChangelog()})})}_handleViewUpdate(e){if(this.sdk.eventBus.emit("changelog:view",{changelog:e}),e.url||e.slug){const t=e.url||`${this.options.changelogBaseUrl||""}/${e.slug}`;!1!==this.options.openInNewTab?window.open(t,"_blank","noopener,noreferrer"):window.location.href=t}"function"==typeof this.options.onViewUpdate&&this.options.onViewUpdate(e)}_formatDate(e){return new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}_getContrastColor(e){const t=e.replace("#","");return(.299*parseInt(t.substr(0,2),16)+.587*parseInt(t.substr(2,2),16)+.114*parseInt(t.substr(4,2),16))/255>.5?"#1F2937":"#FFFFFF"}hideBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="none")}showBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="block")}nextChangelog(){this.currentIndex<this.changelogs.length-1&&(this.currentIndex++,this._renderCurrentChangelog())}prevChangelog(){this.currentIndex>0&&(this.currentIndex--,this._renderCurrentChangelog())}async refresh(){this.changelogs=[],await this._loadChangelogs(),this.modalElement&&(this.currentIndex=0,this._renderCurrentChangelog()),this.listModalElement&&this._renderChangelogList()}mount(e){super.mount(e)}destroy(){this._escapeHandler&&document.removeEventListener("keydown",this._escapeHandler),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler),this.closeModal(),this.closeSidebar(),super.destroy()}}class k extends y{constructor(e){super({...e,type:"inline"})}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-inline theme-${this.options.theme}`,e.innerHTML=`\n <div class="feedback-inline-content">\n <h3>Send us your feedback</h3>\n <form class="feedback-inline-form">\n <div class="feedback-form-group">\n <input \n type="text" \n name="title" \n placeholder="Title (optional)"\n value="${this.state.title}"\n />\n </div>\n <div class="feedback-form-group">\n <textarea \n name="content" \n placeholder="Your feedback..."\n required\n >${this.state.content}</textarea>\n </div>\n <div class="feedback-form-group">\n <input \n type="email" \n name="email" \n placeholder="Email (optional)"\n value="${this.state.email}"\n />\n </div>\n <button type="submit" class="feedback-btn feedback-btn-submit">\n Send Feedback\n </button>\n <div class="feedback-error" style="display: none;"></div>\n </form>\n </div>\n `,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-inline-form");e.addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value}),e.querySelector('input[name="email"]').addEventListener("input",e=>{this.state.email=e.target.value})}openModal(){const e=this.element.querySelector('textarea[name="content"]');e&&e.focus()}closeModal(){}_showSuccessMessage(){const e=this.element.querySelector(".feedback-inline-content"),t=e.innerHTML;e.innerHTML='\n <div class="feedback-success">\n <div class="feedback-success-icon">✓</div>\n <h3>Thank you!</h3>\n <p>Your feedback has been submitted successfully.</p>\n <button class="feedback-btn feedback-btn-reset">Send Another</button>\n </div>\n ';e.querySelector(".feedback-btn-reset").addEventListener("click",()=>{e.innerHTML=t,this._attachEvents(),this._resetForm()})}_showError(e){const t=this.element.querySelector(".feedback-error");t&&(t.textContent=e,t.style.display="block",setTimeout(()=>{t&&(t.style.display="none")},5e3))}_updateSubmitButton(){const e=this.element.querySelector(".feedback-btn-submit");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}updateTitle(e){const t=this.element?.querySelector("h3");t&&(t.textContent=e)}setPlaceholder(e,t){const n=this.element?.querySelector(`[name="${e}"]`);n&&(n.placeholder=t)}}class _{constructor(e={}){this.currentView="home",this.isOpen=!1,this.unreadCount=0,this.activeConversationId=null,this.conversations=[],this.messages={},this.helpArticles=[],this.helpSearchQuery="",this.homeChangelogItems=[],this.changelogItems=[],this.teamName=e.teamName||"Support",this.teamAvatars=e.teamAvatars||[],this.welcomeMessage=e.welcomeMessage||"How can we help?",this.userContext=e.userContext||null,this.enableHelp=!1!==e.enableHelp,this.enableChangelog=!1!==e.enableChangelog,this.agentsOnline=!1,this.onlineCount=0,this.responseTime="Usually replies within a few minutes",this.typingUsers={},this.isLoading=!1,this.isLoadingMessages=!1,this._listeners=new Set}subscribe(e){return this._listeners.add(e),()=>this._listeners.delete(e)}_notify(e,t){this._listeners.forEach(n=>n(e,t,this))}setView(e){const t=this.currentView;this.currentView=e,this._notify("viewChange",{previousView:t,currentView:e})}setOpen(e){this.isOpen=e,this._notify("openChange",{isOpen:e})}setActiveConversation(e){this.activeConversationId=e,this._notify("conversationChange",{conversationId:e})}setConversations(e){this.conversations=e,this._updateUnreadCount(),this._notify("conversationsUpdate",{conversations:e})}addConversation(e){this.conversations.unshift(e),this._updateUnreadCount(),this._notify("conversationAdded",{conversation:e})}setMessages(e,t){this.messages[e]=t,this._notify("messagesUpdate",{conversationId:e,messages:t})}addMessage(e,t){this.messages[e]||(this.messages[e]=[]),this.messages[e].push(t);const n=this.conversations.find(t=>t.id===e);n&&(n.lastMessage=t.content,n.lastMessageTime=t.timestamp,t.isOwn||(n.unread=(n.unread||0)+1,this._updateUnreadCount())),this._notify("messageAdded",{conversationId:e,message:t})}markAsRead(e){const t=this.conversations.find(t=>t.id===e);t&&t.unread>0&&(t.unread=0,this._updateUnreadCount(),this._notify("conversationRead",{conversationId:e}))}_updateUnreadCount(){this.unreadCount=this.conversations.reduce((e,t)=>e+(t.unread||0),0),this._notify("unreadCountChange",{count:this.unreadCount})}setHelpArticles(e){this.helpArticles=e,this._notify("helpArticlesUpdate",{articles:e})}setHelpSearchQuery(e){this.helpSearchQuery=e,this._notify("helpSearchChange",{query:e})}setHomeChangelogItems(e){this.homeChangelogItems=e,this._notify("homeChangelogUpdate",{items:e})}setChangelogItems(e){this.changelogItems=e,this._notify("changelogUpdate",{items:e})}getActiveConversation(){return this.conversations.find(e=>e.id===this.activeConversationId)}getActiveMessages(){return this.messages[this.activeConversationId]||[]}getFilteredHelpArticles(){if(!this.helpSearchQuery)return this.helpArticles;const e=this.helpSearchQuery.toLowerCase();return this.helpArticles.filter(t=>t.title.toLowerCase().includes(e)||t.description&&t.description.toLowerCase().includes(e))}reset(){this.currentView="home",this.activeConversationId=null,this.helpSearchQuery="",this._notify("reset",{})}}class S{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",primaryColor:t.primaryColor||"#1c1c1e",...t},this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className=`messenger-launcher messenger-launcher-${this.options.position}`,this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe((e,t)=>{"openChange"===e&&this._updateIcon(),"unreadCountChange"===e&&this._updateBadge()}),this.element}_updateContent(){const e=this.state.unreadCount>0?`<span class="messenger-launcher-badge">${this.state.unreadCount>9?"9+":this.state.unreadCount}</span>`:"";this.element.innerHTML=`\n\t\t\t<button class="messenger-launcher-btn" aria-label="Open messenger" style="background: ${this.options.primaryColor};">\n\t\t\t\t<span class="messenger-launcher-icon messenger-launcher-icon-chat">\n\t\t\t\t\t<i class="ph ph-chat-circle-dots" style="font-size: 24px;"></i>\n\t\t\t\t</span>\n\t\t\t\t<span class="messenger-launcher-icon messenger-launcher-icon-close" style="display: none;">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 24px;"></i>\n\t\t\t\t</span>\n\t\t\t\t${e}\n\t\t\t</button>\n\t\t`}_attachEvents(){this.element.querySelector(".messenger-launcher-btn").addEventListener("click",()=>{this.state.setOpen(!this.state.isOpen)})}_updateIcon(){const e=this.element.querySelector(".messenger-launcher-icon-chat"),t=this.element.querySelector(".messenger-launcher-icon-close");this.state.isOpen?(e.style.display="none",t.style.display="flex",this.element.classList.add("messenger-launcher-open")):(e.style.display="flex",t.style.display="none",this.element.classList.remove("messenger-launcher-open"))}_updateBadge(){const e=this.element.querySelector(".messenger-launcher-badge");if(e&&e.remove(),this.state.unreadCount>0&&!this.state.isOpen){const e=document.createElement("span");e.className="messenger-launcher-badge",e.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,this.element.querySelector(".messenger-launcher-btn").appendChild(e)}}show(){this.element&&(this.element.style.display="block")}hide(){this.element&&(this.element.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class C{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-nav",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"!==e&&"unreadCountChange"!==e||this._updateActiveTab()}),this.element}_getTabs(){const e=[{id:"home",label:"Home",icon:this._getHomeIcon()},{id:"messages",label:"Messages",icon:this._getMessagesIcon(),badge:this.state.unreadCount}];return this.state.enableHelp&&e.push({id:"help",label:"Help",icon:this._getHelpIcon()}),this.state.enableChangelog&&e.push({id:"changelog",label:"Changelog",icon:this._getChangelogIcon()}),e}_updateContent(){const e=this._getTabs().map(e=>{const t=this.state.currentView===e.id,n=e.badge&&e.badge>0?`<span class="messenger-nav-badge">${e.badge>9?"9+":e.badge}</span>`:"";return`\n\t\t\t\t<button class="messenger-nav-tab ${t?"active":""}" data-tab="${e.id}">\n\t\t\t\t\t<span class="messenger-nav-icon">${e.icon}</span>\n\t\t\t\t\t<span class="messenger-nav-label">${e.label}</span>\n\t\t\t\t\t${n}\n\t\t\t\t</button>\n\t\t\t`}).join("");this.element.innerHTML=e}_attachEvents(){this.element.addEventListener("click",e=>{const t=e.target.closest(".messenger-nav-tab");if(t){const e=t.dataset.tab;this.state.setView(e)}})}_updateActiveTab(){this.element.querySelectorAll(".messenger-nav-tab").forEach(e=>{const t=e.dataset.tab===this.state.currentView;if(e.classList.toggle("active",t),"messages"===e.dataset.tab){const t=e.querySelector(".messenger-nav-badge");if(t&&t.remove(),this.state.unreadCount>0){const t=document.createElement("span");t.className="messenger-nav-badge",t.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,e.appendChild(t)}}})}_getHomeIcon(){return'<i class="ph-duotone ph-house" style="font-size: 24px;"></i>'}_getMessagesIcon(){return'<i class="ph-duotone ph-chat" style="font-size: 24px;"></i>'}_getHelpIcon(){return'<i class="ph-duotone ph-question" style="font-size: 24px;"></i>'}_getChangelogIcon(){return'<i class="ph-duotone ph-megaphone" style="font-size: 24px;"></i>'}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class E{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",theme:t.theme||"dark",...t},this.element=null,this.navigationTabs=null,this.currentViewComponent=null,this.viewRegistry={},this._unsubscribe=null}registerView(e,t){this.viewRegistry[e]=t}render(){this.element=document.createElement("div"),this.element.className=`messenger-panel messenger-panel-${this.options.position} theme-${this.options.theme}`,this.element.innerHTML='\n\t\t\t<div class="messenger-panel-content">\n\t\t\t\t<div class="messenger-panel-views"></div>\n\t\t\t\t<div class="messenger-panel-nav"></div>\n\t\t\t</div>\n\t\t',this.navigationTabs=new C(this.state,this.options);return this.element.querySelector(".messenger-panel-nav").appendChild(this.navigationTabs.render()),this._renderCurrentView(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"===e&&this._renderCurrentView()}),this.element}_renderCurrentView(){const e=this.element.querySelector(".messenger-panel-views");this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),e.innerHTML="";const t=this.viewRegistry[this.state.currentView];t?(this.currentViewComponent=new t(this.state,this.options),e.appendChild(this.currentViewComponent.render())):e.innerHTML=`<div class="messenger-view-placeholder">View not found: ${this.state.currentView}</div>`}show(){this.element&&(this.element.style.display="block",requestAnimationFrame(()=>{this.element.classList.add("open")}))}hide(){this.element&&(this.element.classList.remove("open"),setTimeout(()=>{this.element&&(this.element.style.display="none")},300))}setHeader(e){const t=this.element.querySelector(".messenger-panel-header");t&&(t.innerHTML=e)}destroy(){this._unsubscribe&&this._unsubscribe(),this.navigationTabs&&this.navigationTabs.destroy(),this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class I{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-changelog-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"changelogUpdate"===e&&this._updateChangelogList()}),this.element}_updateContent(){const e=this._renderTeamAvatars();this.element.innerHTML=`\n\t\t\t<div class="messenger-changelog-header">\n\t\t\t\t<h2>Changelog</h2>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-changelog-subheader">\n\t\t\t\t<span class="messenger-changelog-latest">Latest</span>\n\t\t\t\t<div class="messenger-changelog-team">\n\t\t\t\t\t<span>From ${this.state.teamName}</span>\n\t\t\t\t\t${e}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-changelog-body">\n\t\t\t\t<div class="messenger-changelog-list"></div>\n\t\t\t</div>\n\t\t`,this._updateChangelogList(),this._attachEvents()}_updateChangelogList(){const e=this.element.querySelector(".messenger-changelog-list"),t=this.state.changelogItems;0!==t.length?(e.innerHTML=t.map(e=>this._renderChangelogCard(e)).join(""),this._attachChangelogEvents()):e.innerHTML=this._renderEmptyState()}_renderChangelogCard(e){const t=e.tags&&e.tags.length>0?`<div class="messenger-changelog-tags">\n\t\t\t\t${e.tags.map(e=>`<span class="messenger-changelog-tag">${e}</span>`).join("")}\n\t\t\t</div>`:"",n=this._formatDate(e.publishedAt||e.date);return`\n\t\t\t<div class="messenger-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-changelog-content">\n\t\t\t\t\t${t}\n\t\t\t\t\t<h3 class="messenger-changelog-title">${e.title}</h3>\n\t\t\t\t\t${e.description?`<p class="messenger-changelog-description">${this._truncateText(e.description,100)}</p>`:""}\n\t\t\t\t\t<div class="messenger-changelog-meta">\n\t\t\t\t\t\t<span class="messenger-changelog-date">${n}</span>\n\t\t\t\t\t\t<i class="ph ph-caret-right messenger-changelog-arrow" style="font-size: 16px;"></i>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack messenger-avatar-stack-tiny">\n\t\t\t\t\t<div class="messenger-avatar messenger-avatar-tiny" style="background: #5856d6;">S</div>\n\t\t\t\t</div>\n\t\t\t';const t=["#5856d6","#007aff","#34c759"];return`<div class="messenger-avatar-stack messenger-avatar-stack-tiny">${e.slice(0,2).map((e,n)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar messenger-avatar-tiny" src="${e}" alt="Team member" style="z-index: ${2-n};" />`:`<div class="messenger-avatar messenger-avatar-tiny" style="background: ${t[n%t.length]}; z-index: ${2-n};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderEmptyState(){return'\n\t\t\t<div class="messenger-changelog-empty">\n\t\t\t\t<div class="messenger-changelog-empty-icon">\n\t\t\t\t\t<i class="ph ph-megaphone" style="font-size: 48px;"></i>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t'}_formatDate(e){if(!e)return"";return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}_truncateText(e,t){return e?e.length<=t?e:e.substring(0,t).trim()+"...":""}_attachEvents(){this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)}),this._attachChangelogEvents()}_attachChangelogEvents(){this.element.querySelectorAll(".messenger-changelog-card").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.changelogId,n=this.state.changelogItems.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onChangelogClick&&this.options.onChangelogClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class T{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null,this._typingTimeout=null,this._isTyping=!1,this._typingIndicator=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-chat-view",this._updateContent(),this._unsubscribe=this.state.subscribe((e,t)=>{"messageAdded"===e&&t.conversationId===this.state.activeConversationId?(this._hideTypingIndicator(),this._appendMessage(t.message),this._scrollToBottom()):"typingStarted"===e&&t.conversationId===this.state.activeConversationId?this._showTypingIndicator(t.userName):"typingStopped"===e&&t.conversationId===this.state.activeConversationId?this._hideTypingIndicator():"messagesUpdate"===e&&t.conversationId===this.state.activeConversationId&&this._updateContent()}),this.element}_updateContent(){const e=this.state.getActiveConversation(),t=this.state.getActiveMessages(),n=!this.state.activeConversationId,s=0===t.length?this._renderEmptyState(n):t.map(e=>this._renderMessage(e)).join(""),i=this._renderConversationAvatar(e),a=n?"New conversation":e?.title||"Chat with team",o=n?"Start typing your message...":"Write a message...";this.element.innerHTML=`\n\t\t\t<div class="messenger-chat-header">\n\t\t\t\t<button class="messenger-back-btn" aria-label="Back">\n\t\t\t\t\t<i class="ph ph-caret-left" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t\t<div class="messenger-chat-header-info">\n\t\t\t\t\t${i}\n\t\t\t\t\t<span class="messenger-chat-title">${a}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-chat-messages">\n\t\t\t\t${s}\n\t\t\t\t<div class="messenger-typing-indicator" style="display: none;">\n\t\t\t\t\t<div class="messenger-typing-dots">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class="messenger-typing-text"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-chat-compose">\n\t\t\t\t<div class="messenger-compose-input-wrapper">\n\t\t\t\t\t<textarea class="messenger-compose-input" placeholder="${o}" rows="1"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class="messenger-compose-send" aria-label="Send" disabled>\n\t\t\t\t\t<i class="ph ph-paper-plane-tilt" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`,this._typingIndicator=this.element.querySelector(".messenger-typing-indicator"),this._attachEvents(),this._scrollToBottom()}_renderEmptyState(e=!1){const t=this._renderTeamAvatars(),n=this.state.responseTime||"We typically reply within a few minutes",s=this.state.agentsOnline;return`\n\t\t\t<div class="messenger-chat-empty">\n\t\t\t\t<div class="messenger-chat-empty-avatars">${t}</div>\n\t\t\t\t<h3>${e?"Start a new conversation":"Start the conversation"}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class="messenger-chat-availability">\n\t\t\t\t\t<span class="messenger-availability-dot ${s?"messenger-availability-online":"messenger-availability-away"}"></span>\n\t\t\t\t\t<span>${s?"We're online now":n}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderMessage(e){const t=e.isOwn,n=t?"messenger-message-own":"messenger-message-received",s=this._formatMessageTime(e.timestamp);if(t)return`\n\t\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t\t<div class="messenger-message-bubble">\n\t\t\t\t\t\t<div class="messenger-message-content">${this._formatMessageContent(e.content)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t\t</div>\n\t\t\t`;return`\n\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t<div class="messenger-message-avatar">${this._renderSenderAvatar(e.sender)}</div>\n\t\t\t\t<div class="messenger-message-wrapper">\n\t\t\t\t\t<div class="messenger-message-sender">${e.sender?.name||"Support"}</div>\n\t\t\t\t\t<div class="messenger-message-bubble">\n\t\t\t\t\t\t<div class="messenger-message-content">${this._formatMessageContent(e.content)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderSenderAvatar(e){if(e?.avatarUrl)return`<img class="messenger-avatar messenger-avatar-small" src="${e.avatarUrl}" alt="${e.name}" />`;return`<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">${(e?.name||"S").charAt(0).toUpperCase()}</div>`}_renderConversationAvatar(e){if(!e?.participants?.length)return'<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">S</div>';const t=e.participants[0];return t.avatarUrl?`<img class="messenger-avatar messenger-avatar-small" src="${t.avatarUrl}" alt="${t.name}" />`:`<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">${(t.name||"S").charAt(0).toUpperCase()}</div>`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="messenger-avatar" style="background: #5856d6;">S</div>\n\t\t\t\t\t<div class="messenger-avatar" style="background: #007aff;">T</div>\n\t\t\t\t</div>\n\t\t\t';const t=["#5856d6","#007aff","#34c759","#ff9500","#ff3b30"];return`<div class="messenger-avatar-stack">${e.slice(0,3).map((e,n)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar" src="${e}" alt="Team member" style="z-index: ${3-n};" />`:`<div class="messenger-avatar" style="background: ${t[n%t.length]}; z-index: ${3-n};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_formatMessageTime(e){if(!e)return"";return new Date(e).toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}_formatMessageContent(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br>"):""}_appendMessage(e){const t=this.element.querySelector(".messenger-chat-messages"),n=t.querySelector(".messenger-chat-empty");n&&n.remove();const s=this._renderMessage(e),i=document.createElement("div");i.innerHTML=s,t.appendChild(i.firstElementChild)}_scrollToBottom(){const e=this.element.querySelector(".messenger-chat-messages");e&&setTimeout(()=>{e.scrollTop=e.scrollHeight},50)}_attachEvents(){this.element.querySelector(".messenger-back-btn").addEventListener("click",()=>{this.state.setView("messages")}),this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".messenger-compose-input"),t=this.element.querySelector(".messenger-compose-send");e.addEventListener("input",()=>{e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px",t.disabled=!e.value.trim(),e.value.trim()&&this._startTyping()}),e.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this._sendMessage())}),t.addEventListener("click",()=>{this._sendMessage()})}_sendMessage(){const e=this.element.querySelector(".messenger-compose-input"),t=e.value.trim();if(!t)return;this._stopTyping();if(!this.state.activeConversationId)this.options.onStartConversation&&this.options.onStartConversation(t);else{const e={id:"msg_"+Date.now(),content:t,isOwn:!0,timestamp:(new Date).toISOString()};this.state.addMessage(this.state.activeConversationId,e),this.options.onSendMessage&&this.options.onSendMessage(this.state.activeConversationId,e)}e.value="",e.style.height="auto",this.element.querySelector(".messenger-compose-send").disabled=!0}_startTyping(){!this._isTyping&&this.state.activeConversationId&&(this._isTyping=!0,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!0)),this._typingTimeout&&clearTimeout(this._typingTimeout),this._typingTimeout=setTimeout(()=>{this._stopTyping()},3e3)}_stopTyping(){this._isTyping&&this.state.activeConversationId&&(this._isTyping=!1,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!1)),this._typingTimeout&&(clearTimeout(this._typingTimeout),this._typingTimeout=null)}_showTypingIndicator(e){if(this._typingIndicator){this._typingIndicator.style.display="flex";const t=this._typingIndicator.querySelector(".messenger-typing-text");t&&(t.textContent=`${e||"Support"} is typing...`),this._scrollToBottom()}}_hideTypingIndicator(){this._typingIndicator&&(this._typingIndicator.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this._typingTimeout&&clearTimeout(this._typingTimeout),this._stopTyping(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class M{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-conversations-view",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"conversationsUpdate"!==e&&"conversationAdded"!==e&&"conversationRead"!==e||this._updateContent()}),this.element}_updateContent(){const e=this.state.conversations,t=this._renderAvatarStack();let n;n=0===e.length?'\n\t\t\t\t<div class="messenger-conversations-empty">\n\t\t\t\t\t<div class="messenger-conversations-empty-icon">\n\t\t\t\t\t\t<i class="ph ph-chat" style="font-size: 48px;"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No conversations yet</h3>\n\t\t\t\t\t<p>Start a new conversation with our team</p>\n\t\t\t\t</div>\n\t\t\t':`\n\t\t\t\t<div class="messenger-conversations-list">\n\t\t\t\t\t${e.map(e=>this._renderConversationItem(e)).join("")}\n\t\t\t\t</div>\n\t\t\t`,this.element.innerHTML=`\n\t\t\t<div class="messenger-conversations-header">\n\t\t\t\t<h2>Messages</h2>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-conversations-body">\n\t\t\t\t${n}\n\t\t\t</div>\n\n\t\t\t<div class="messenger-conversations-footer">\n\t\t\t\t<button class="messenger-new-message-btn">\n\t\t\t\t\t<div class="messenger-new-message-avatars">${t}</div>\n\t\t\t\t\t<span>Send us a message</span>\n\t\t\t\t\t<i class="ph ph-arrow-right" style="font-size: 16px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderConversationItem(e){const t=e.unread>0?"unread":"",n=this._formatTimeAgo(e.lastMessageTime),s=this._renderConversationAvatars(e.participants);return`\n\t\t\t<div class="messenger-conversation-item ${t}" data-conversation-id="${e.id}">\n\t\t\t\t<div class="messenger-conversation-avatars">\n\t\t\t\t\t${s}\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-conversation-content">\n\t\t\t\t\t<div class="messenger-conversation-header">\n\t\t\t\t\t\t<span class="messenger-conversation-title">${e.title||"Chat with team"}</span>\n\t\t\t\t\t\t<span class="messenger-conversation-time">${n}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-conversation-preview">\n\t\t\t\t\t\t${e.unread>0?'<span class="messenger-unread-dot"></span>':""}\n\t\t\t\t\t\t<span class="messenger-conversation-message">${this._truncateMessage(e.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderConversationAvatars(e){if(!e||0===e.length)return'<div class="messenger-avatar messenger-avatar-medium" style="background: #5856d6;">S</div>';const t=e[0];return t.avatarUrl?`<img class="messenger-avatar messenger-avatar-medium" src="${t.avatarUrl}" alt="${t.name}" />`:`<div class="messenger-avatar messenger-avatar-medium" style="background: ${this._getAvatarColor(0)};">${(t.name||"S").charAt(0).toUpperCase()}</div>`}_renderAvatarStack(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack messenger-avatar-stack-small">\n\t\t\t\t\t<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">S</div>\n\t\t\t\t\t<div class="messenger-avatar messenger-avatar-small" style="background: #007aff;">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack messenger-avatar-stack-small">${e.slice(0,2).map((e,t)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar messenger-avatar-small" src="${e}" alt="Team member" style="z-index: ${2-t};" />`:`<div class="messenger-avatar messenger-avatar-small" style="background: ${this._getAvatarColor(t)}; z-index: ${2-t};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_getAvatarColor(e){const t=["#5856d6","#007aff","#34c759","#ff9500","#ff3b30"];return t[e%t.length]}_formatTimeAgo(e){if(!e)return"";const t=new Date(e),n=new Date-t,s=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return s<1?"now":s<60?`${s}m`:i<24?`${i}h`:a<7?`${a}d`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_truncateMessage(e){if(!e)return"No messages yet";return e.length<=50?e:e.substring(0,50)+"..."}_attachEvents(){const e=this.element.querySelector(".messenger-close-btn");e&&e.addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelectorAll(".messenger-conversation-item").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.conversationId;this.state.setActiveConversation(t),this.state.markAsRead(t),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t)})});const t=this.element.querySelector(".messenger-new-message-btn");t&&t.addEventListener("click",()=>{this._startNewConversation()})}_startNewConversation(){this.state.setActiveConversation(null),this.state.setView("chat"),this.options.onStartNewConversation&&this.options.onStartNewConversation()}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class A{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-help-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"helpArticlesUpdate"!==e&&"helpSearchChange"!==e||this._updateCollectionsList()}),this.element}_updateContent(){const e=this.state.helpSearchQuery||"",t=(this.state.helpArticles||[]).length;this.element.innerHTML=`\n\t\t\t<div class="messenger-help-header">\n\t\t\t\t<h2>Help</h2>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-help-search">\n\t\t\t\t<div class="messenger-help-search-wrapper">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\tclass="messenger-help-search-input"\n\t\t\t\t\t\tplaceholder="Search for help"\n\t\t\t\t\t\tvalue="${e}"\n\t\t\t\t\t/>\n\t\t\t\t\t<i class="ph ph-magnifying-glass messenger-help-search-icon" style="font-size: 18px;"></i>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-help-body">\n\t\t\t\t<div class="messenger-help-collections-header">\n\t\t\t\t\t${t} collections\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-help-collections"></div>\n\t\t\t</div>\n\t\t`,this._updateCollectionsList(),this._attachEvents()}_updateCollectionsList(){const e=this.element.querySelector(".messenger-help-collections"),t=this.state.helpArticles||[],n=(this.state.helpSearchQuery||"").toLowerCase(),s=n?t.filter(e=>e.title.toLowerCase().includes(n)||e.description&&e.description.toLowerCase().includes(n)):t,i=this.element.querySelector(".messenger-help-collections-header");i&&(i.textContent=`${s.length} collections`),0!==s.length?(e.innerHTML=s.map(e=>this._renderCollectionItem(e)).join(""),this._attachCollectionEvents()):e.innerHTML=this._renderEmptyState()}_renderCollectionItem(e){const t=e.articleCount||0;return`\n\t\t\t<div class="messenger-help-collection" data-collection-id="${e.id}">\n\t\t\t\t<div class="messenger-help-collection-content">\n\t\t\t\t\t<h3 class="messenger-help-collection-title">${e.title}</h3>\n\t\t\t\t\t<p class="messenger-help-collection-desc">${e.description||""}</p>\n\t\t\t\t\t<span class="messenger-help-collection-count">${t} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<i class="ph ph-caret-right messenger-help-collection-arrow" style="font-size: 20px;"></i>\n\t\t\t</div>\n\t\t`}_renderEmptyState(){return this.state.helpSearchQuery?'\n\t\t\t\t<div class="messenger-help-empty">\n\t\t\t\t\t<div class="messenger-help-empty-icon">\n\t\t\t\t\t\t<i class="ph ph-magnifying-glass" style="font-size: 48px;"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t':'\n\t\t\t<div class="messenger-help-empty">\n\t\t\t\t<div class="messenger-help-empty-icon">\n\t\t\t\t\t<i class="ph ph-question" style="font-size: 48px;"></i>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t'}_attachEvents(){this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});let e;this.element.querySelector(".messenger-help-search-input").addEventListener("input",t=>{clearTimeout(e),e=setTimeout(()=>{this.state.setHelpSearchQuery(t.target.value)},300)}),this._attachCollectionEvents()}_attachCollectionEvents(){this.element.querySelectorAll(".messenger-help-collection").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.collectionId,n=this.state.helpArticles.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onArticleClick&&this.options.onArticleClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class ${constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-home-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"homeChangelogUpdate"!==e&&"conversationsUpdate"!==e&&"availabilityUpdate"!==e||this._updateContent()}),this.element}_updateContent(){const e=this._renderAvatarStack(),t=this._renderRecentChangelog();this.element.innerHTML=`\n\t\t\t<div class="messenger-home-header">\n\t\t\t\t<div class="messenger-home-header-top">\n\t\t\t\t\t<div class="messenger-home-logo">\n\t\t\t\t\t\t${this.options.logoUrl?`<img src="${this.options.logoUrl}" alt="${this.state.teamName}" />`:""}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-home-avatars">${e}</div>\n\t\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-home-welcome">\n\t\t\t\t\t<span class="messenger-home-greeting">Hello there.</span>\n\t\t\t\t\t<span class="messenger-home-question">${this.state.welcomeMessage}</span>\n\t\t\t\t\t${this._renderAvailabilityStatus()}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-home-body">\n\t\t\t\t<button class="messenger-home-message-btn">\n\t\t\t\t\t<span>Send us a message</span>\n\t\t\t\t\t<i class="ph ph-arrow-right" style="font-size: 16px;"></i>\n\t\t\t\t</button>\n\n\t\t\t\t${this._renderFeaturedCard()}\n\n\t\t\t\t${t}\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderAvatarStack(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="messenger-avatar" style="background: #5856d6;">S</div>\n\t\t\t\t\t<div class="messenger-avatar" style="background: #007aff;">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack">${e.slice(0,3).map((e,t)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar" src="${e}" alt="Team member" style="z-index: ${3-t};" />`:`<div class="messenger-avatar" style="background: ${this._getAvatarColor(t)}; z-index: ${3-t};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_getAvatarColor(e){const t=["#5856d6","#007aff","#34c759","#ff9500","#ff3b30"];return t[e%t.length]}_renderAvailabilityStatus(){const e=this.state.agentsOnline,t=this.state.responseTime||"We typically reply within a few minutes";return e?'\n\t\t\t\t<div class="messenger-home-availability">\n\t\t\t\t\t<span class="messenger-availability-dot messenger-availability-online"></span>\n\t\t\t\t\t<span class="messenger-availability-text">We\'re online now</span>\n\t\t\t\t</div>\n\t\t\t':`\n\t\t\t<div class="messenger-home-availability">\n\t\t\t\t<span class="messenger-availability-dot messenger-availability-away"></span>\n\t\t\t\t<span class="messenger-availability-text">${t}</span>\n\t\t\t</div>\n\t\t`}_renderFeaturedCard(){if(!this.options.featuredContent)return"";const{title:e,description:t,imageUrl:n,action:s}=this.options.featuredContent;return`\n\t\t\t<div class="messenger-home-featured">\n\t\t\t\t${n?`<img src="${n}" alt="${e}" class="messenger-home-featured-image" onerror="this.style.display='none';" />`:""}\n\t\t\t\t<div class="messenger-home-featured-content">\n\t\t\t\t\t<h3>${e}</h3>\n\t\t\t\t\t<p>${t}</p>\n\t\t\t\t</div>\n\t\t\t\t${s?`<button class="messenger-home-featured-btn" data-action="${s.type}" data-value="${s.value}">${s.label}</button>`:""}\n\t\t\t</div>\n\t\t`}_renderRecentChangelog(){const e=this.state.homeChangelogItems;if(0===e.length)return"";return`\n\t\t\t<div class="messenger-home-changelog-section">\n\t\t\t\t${e.map(e=>`\n\t\t\t<div class="messenger-home-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-home-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t\t${e.coverText?`<span class="messenger-home-changelog-cover-text">${e.coverText}</span>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-home-changelog-card-content">\n\t\t\t\t\t<h4 class="messenger-home-changelog-card-title">${e.title}</h4>\n\t\t\t\t\t<p class="messenger-home-changelog-card-desc">${e.description||""}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`).join("")}\n\t\t\t</div>\n\t\t`}_formatDate(e){if(!e)return"";const t=new Date(e),n=new Date,s=Math.floor((n-t)/864e5);return 0===s?"Today":1===s?"Yesterday":s<7?`${s}d ago`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_attachEvents(){this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelector(".messenger-home-message-btn").addEventListener("click",()=>{this.state.setView("messages")}),this.element.querySelectorAll(".messenger-home-changelog-item").forEach(e=>{e.addEventListener("click",()=>{this.state.setView("changelog")})});const e=this.element.querySelector(".messenger-home-changelog-all");e&&e.addEventListener("click",()=>{this.state.setView("changelog")});const t=this.element.querySelector(".messenger-home-featured-btn");t&&t.addEventListener("click",()=>{const e=t.dataset.action,n=t.dataset.value;"url"===e?window.open(n,"_blank"):"view"===e&&this.state.setView(n)})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class z{constructor(e={}){this.baseURL=e.baseURL||"",this.workspace=e.workspace||"",this.sessionToken=e.sessionToken||null,this.mock=e.mock||!1,this.ws=null,this.reconnectAttempts=0,this.maxReconnectAttempts=5,this.reconnectDelay=1e3,this.pingInterval=null,this.isConnected=!1,this._listeners=new Map,this._onOpen=this._onOpen.bind(this),this._onMessage=this._onMessage.bind(this),this._onClose=this._onClose.bind(this),this._onError=this._onError.bind(this)}connect(e=null){if(e&&(this.sessionToken=e),!this.sessionToken)return void console.warn("[WebSocket] No session token provided");if(this.mock)return this.isConnected=!0,this._emit("connected",{}),void this._startMockResponses();const t="https:"===window.location.protocol?"wss:":"ws:";let n=this.baseURL.replace(/^https?:/,t);n=n.replace("/api/v1",""),n=`${n}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;try{this.ws=new WebSocket(n),this.ws.onopen=this._onOpen,this.ws.onmessage=this._onMessage,this.ws.onclose=this._onClose,this.ws.onerror=this._onError}catch(e){console.error("[WebSocket] Connection error:",e),this._scheduleReconnect()}}disconnect(){this.isConnected=!1,this.reconnectAttempts=this.maxReconnectAttempts,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this.ws&&(this.ws.close(),this.ws=null),this._mockInterval&&(clearInterval(this._mockInterval),this._mockInterval=null)}on(e,t){return this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(t),()=>this._listeners.get(e).delete(t)}off(e,t){this._listeners.has(e)&&this._listeners.get(e).delete(t)}send(e,t={}){this.isConnected?this.mock?console.log("[WebSocket Mock] Sending:",e,t):this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:e,payload:t})):console.warn("[WebSocket] Not connected, cannot send message")}_onOpen(){console.log("[WebSocket] Connected"),this.isConnected=!0,this.reconnectAttempts=0,this._emit("connected",{}),this.pingInterval=setInterval(()=>{this.send("ping",{})},3e4)}_onMessage(e){try{const t=JSON.parse(e.data),{type:n,payload:s}=t;switch(n){case"message:new":this._emit("message",s);break;case"typing:started":this._emit("typing_started",s);break;case"typing:stopped":this._emit("typing_stopped",s);break;case"conversation:updated":this._emit("conversation_updated",s);break;case"conversation:closed":this._emit("conversation_closed",s);break;case"availability:changed":this._emit("availability_changed",s);break;case"pong":break;default:console.log("[WebSocket] Unknown event:",n,s)}}catch(e){console.error("[WebSocket] Failed to parse message:",e)}}_onClose(e){console.log("[WebSocket] Disconnected:",e.code,e.reason),this.isConnected=!1,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._emit("disconnected",{code:e.code,reason:e.reason}),this._scheduleReconnect()}_onError(e){console.error("[WebSocket] Error:",e),this._emit("error",{error:e})}_scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts)return console.log("[WebSocket] Max reconnect attempts reached"),void this._emit("reconnect_failed",{});this.reconnectAttempts++;const e=this.reconnectDelay*Math.pow(2,this.reconnectAttempts-1);console.log(`[WebSocket] Reconnecting in ${e}ms (attempt ${this.reconnectAttempts})`),setTimeout(()=>{this.connect()},e)}_emit(e,t){this._listeners.has(e)&&this._listeners.get(e).forEach(n=>{try{n(t)}catch(t){console.error(`[WebSocket] Error in ${e} handler:`,t)}})}_startMockResponses(){this._mockInterval=setInterval(()=>{Math.random()<.1&&(this._emit("typing_started",{conversation_id:"conv_1",user_id:"agent_1",user_name:"Sarah",is_agent:!0}),setTimeout(()=>{this._emit("typing_stopped",{conversation_id:"conv_1",user_id:"agent_1"})},2e3))},1e4)}simulateMessage(e,t){this.mock&&this._emit("message",{conversation_id:e,message:{id:"msg_"+Date.now(),content:t.content,sender_type:t.sender_type||"agent",sender_name:t.sender_name||"Support",sender_avatar:t.sender_avatar||null,created_at:(new Date).toISOString()}})}}class L extends y{constructor(e){super({...e,type:"messenger"}),this.messengerOptions={position:e.position||"bottom-right",theme:e.theme||"light",teamName:e.teamName||"Support",teamAvatars:e.teamAvatars||[],welcomeMessage:e.welcomeMessage||"How can we help?",enableHelp:!1!==e.enableHelp,enableChangelog:!1!==e.enableChangelog,logoUrl:e.logoUrl||"https://feedback-sdk.product7.io/p7.png",featuredContent:e.featuredContent||null,primaryColor:e.primaryColor||"#1c1c1e",onSendMessage:e.onSendMessage||null,onArticleClick:e.onArticleClick||null,onChangelogClick:e.onChangelogClick||null},this.messengerState=new _({teamName:this.messengerOptions.teamName,teamAvatars:this.messengerOptions.teamAvatars,welcomeMessage:this.messengerOptions.welcomeMessage,enableHelp:this.messengerOptions.enableHelp,enableChangelog:this.messengerOptions.enableChangelog,userContext:this.sdk?.apiService?.getUserContext()||null}),this.launcher=null,this.panel=null,this.wsService=null,this._wsUnsubscribers=[],this._handleOpenChange=this._handleOpenChange.bind(this),this._handleWebSocketMessage=this._handleWebSocketMessage.bind(this),this._handleTypingStarted=this._handleTypingStarted.bind(this),this._handleTypingStopped=this._handleTypingStopped.bind(this)}_render(){const e=document.createElement("div");return e.className=`messenger-widget theme-${this.messengerOptions.theme}`,e.style.zIndex="999999",this.launcher=new S(this.messengerState,{position:this.messengerOptions.position,primaryColor:this.messengerOptions.primaryColor}),e.appendChild(this.launcher.render()),this.panel=new E(this.messengerState,{position:this.messengerOptions.position,theme:this.messengerOptions.theme,primaryColor:this.messengerOptions.primaryColor,logoUrl:this.messengerOptions.logoUrl,featuredContent:this.messengerOptions.featuredContent,onSendMessage:this.messengerOptions.onSendMessage||this._handleSendMessage.bind(this),onStartConversation:this._handleStartConversation.bind(this),onTyping:this.sendTypingIndicator.bind(this),onSelectConversation:this._handleSelectConversation.bind(this),onStartNewConversation:this._handleNewConversationClick.bind(this),onArticleClick:this.messengerOptions.onArticleClick,onChangelogClick:this.messengerOptions.onChangelogClick}),this.panel.registerView("home",$),this.panel.registerView("messages",M),this.panel.registerView("chat",T),this.panel.registerView("help",A),this.panel.registerView("changelog",I),e.appendChild(this.panel.render()),this.panel.hide(),e}_attachEvents(){this._stateUnsubscribe=this.messengerState.subscribe((e,t)=>{"openChange"===e&&this._handleOpenChange(t.isOpen)})}_handleOpenChange(e){e?(this.panel.show(),this.sdk.eventBus.emit("messenger:opened",{widget:this})):(this.panel.hide(),this.messengerState.reset(),this.sdk.eventBus.emit("messenger:closed",{widget:this}))}async _handleStartConversation(e){try{await this.startNewConversation(e)}catch(e){console.error("[MessengerWidget] Failed to start conversation:",e)}}async _handleSelectConversation(e){try{await this.fetchMessages(e)}catch(e){console.error("[MessengerWidget] Failed to fetch messages:",e)}}_handleNewConversationClick(){}async _handleSendMessage(e,t){this.sdk.eventBus.emit("messenger:messageSent",{widget:this,conversationId:e,message:t});try{const n=await this.apiService.sendMessage(e,{content:t.content});n.status&&n.data&&console.log("[MessengerWidget] Message sent:",n.data.id),this.apiService?.mock&&setTimeout(()=>{const t={id:"msg_"+Date.now(),content:"Thanks for your message! We'll get back to you soon.",isOwn:!1,timestamp:(new Date).toISOString(),sender:{name:"Support Team",avatarUrl:null}};this.messengerState.addMessage(e,t)},1500)}catch(e){console.error("[MessengerWidget] Failed to send message:",e)}}_handleWebSocketMessage(e){const{conversation_id:t,message:n}=e,s={id:n.id,content:n.content,isOwn:"customer"===n.sender_type,timestamp:n.created_at,sender:{name:n.sender_name||"Support",avatarUrl:n.sender_avatar||null}};this.messengerState.addMessage(t,s),this.messengerState.isOpen&&this.messengerState.activeConversationId===t||this._updateUnreadCount()}_handleTypingStarted(e){e.is_agent&&this.messengerState._notify("typingStarted",{conversationId:e.conversation_id,userName:e.user_name})}_handleTypingStopped(e){this.messengerState._notify("typingStopped",{conversationId:e.conversation_id})}async _updateUnreadCount(){try{const e=await this.apiService.getUnreadCount();e.status&&e.data&&(this.messengerState.unreadCount=e.data.unread_count||0,this.messengerState._notify("unreadCountChange",{count:this.messengerState.unreadCount}))}catch(e){console.error("[MessengerWidget] Failed to get unread count:",e)}}_initWebSocket(){this.wsService&&this.wsService.disconnect(),this.wsService=new z({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("connected",()=>{console.log("[MessengerWidget] WebSocket connected")})),this._wsUnsubscribers.push(this.wsService.on("disconnected",()=>{console.log("[MessengerWidget] WebSocket disconnected")})),this.wsService.connect()}open(){this.messengerState.setOpen(!0)}close(){this.messengerState.setOpen(!1)}toggle(){this.messengerState.setOpen(!this.messengerState.isOpen)}navigateTo(e){this.messengerState.setView(e),this.messengerState.isOpen||this.open()}setConversations(e){this.messengerState.setConversations(e)}addMessage(e,t){this.messengerState.addMessage(e,t)}setHelpArticles(e){this.messengerState.setHelpArticles(e)}setHomeChangelogItems(e){this.messengerState.setHomeChangelogItems(e)}setChangelogItems(e){this.messengerState.setChangelogItems(e)}setUnreadCount(e){this.messengerState.unreadCount=e,this.messengerState._notify("unreadCountChange",{count:e})}getState(){return{isOpen:this.messengerState.isOpen,currentView:this.messengerState.currentView,unreadCount:this.messengerState.unreadCount,conversations:this.messengerState.conversations}}async loadInitialData(){try{const e=await this._fetchConversations();this.messengerState.setConversations(e)}catch(e){console.error("[MessengerWidget] Failed to load conversations:",e)}if(this.messengerOptions.enableHelp)try{const e=await this._fetchHelpArticles();this.messengerState.setHelpArticles(e)}catch(e){console.error("[MessengerWidget] Failed to load help articles:",e)}if(this.messengerOptions.enableChangelog)try{const{homeItems:e,changelogItems:t}=await this._fetchChangelog();this.messengerState.setHomeChangelogItems(e),this.messengerState.setChangelogItems(t)}catch(e){console.error("[MessengerWidget] Failed to load changelog:",e)}}async _fetchConversations(){try{const e=await this.apiService.getConversations();return e.status&&e.data?e.data.map(e=>({id:e.id,title:e.subject||`Chat with ${e.assigned_user?.name||"Support"}`,participants:e.assigned_user?[{name:e.assigned_user.name,avatarUrl:e.assigned_user.avatar}]:[{name:"Support",avatarUrl:null}],lastMessage:e.preview||e.snippet||"",lastMessageTime:e.last_message_at,unread:e.unread||0,status:e.status})):[]}catch(e){return console.error("[MessengerWidget] Failed to fetch conversations:",e),[]}}async _fetchHelpArticles(){try{const e=await this.apiService.getHelpCollections();return e.status&&e.data?e.data.map(e=>({id:e.id,title:e.title||e.name,description:e.description||"",articleCount:e.article_count||e.articleCount||0,icon:e.icon||"ph-book-open",url:e.url||`#/help/${e.slug||e.id}`})):[]}catch(e){return console.error("[MessengerWidget] Failed to fetch help articles:",e),[]}}async fetchMessages(e){try{const t=await this.apiService.getConversation(e);if(t.status&&t.data){const n=(t.data.messages||[]).map(e=>({id:e.id,content:e.content,isOwn:"customer"===e.sender_type,timestamp:e.created_at,sender:{name:e.sender_name||("customer"===e.sender_type?"You":"Support"),avatarUrl:e.sender_avatar||null}}));return this.messengerState.setMessages(e,n),await this.apiService.markConversationAsRead(e),this.messengerState.markAsRead(e),n}return[]}catch(e){return console.error("[MessengerWidget] Failed to fetch messages:",e),[]}}async startNewConversation(e,t=""){try{const n=await this.apiService.startConversation({message:e,subject:t});if(n.status&&n.data){const t=n.data,s={id:t.id,title:t.subject||"New conversation",participants:[{name:"Support",avatarUrl:null}],lastMessage:e,lastMessageTime:t.created_at||(new Date).toISOString(),unread:0,status:"open"};return this.messengerState.addConversation(s),this.messengerState.setMessages(t.id,[{id:"msg_"+Date.now(),content:e,isOwn:!0,timestamp:(new Date).toISOString()}]),this.messengerState.setActiveConversation(t.id),this.messengerState.setView("chat"),t}return null}catch(e){return console.error("[MessengerWidget] Failed to start conversation:",e),null}}async sendTypingIndicator(e,t){try{await this.apiService.sendTypingIndicator(e,t)}catch(e){}}async checkAgentAvailability(){try{const e=await this.apiService.checkAgentsOnline();return e.status&&e.data?(this.messengerState.agentsOnline=e.data.agents_online,this.messengerState.onlineCount=e.data.online_count||0,this.messengerState.responseTime=e.data.response_time||"",this.messengerState._notify("availabilityUpdate",e.data),e.data):{agents_online:!1,online_count:0}}catch(e){return console.error("[MessengerWidget] Failed to check availability:",e),{agents_online:!1,online_count:0}}}async _fetchChangelog(){if(this.apiService?.mock)return{homeItems:[{id:"changelog_5",title:"New integrations available",description:"Connect with more tools you love and streamline your workflow.",tags:["Integration"],coverImage:"https://feedback-sdk.product7.io/700x400__5_.png",coverText:null,publishedAt:new Date(Date.now()-12096e5).toISOString(),url:"#"},{id:"changelog_2",title:"A new era of Insights has arrived",description:"We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.",tags:["New feature","AI"],coverImage:"https://feedback-sdk.product7.io/Intercom_Messenger__1_.jpg",coverText:"Watch our major product launch on-demand",publishedAt:new Date(Date.now()-432e6).toISOString(),url:"#"},{id:"changelog_1",title:"The 2025 Customer Service Transformation Report",description:"Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.",tags:["Report"],coverImage:"https://feedback-sdk.product7.io/Main_Report_Email_Header.png",coverText:"Customer service trends as we know them are dead.",publishedAt:new Date(Date.now()-1728e5).toISOString(),url:"#"}],changelogItems:[{id:"changelog_4",title:"Enhanced conversation analytics",description:"Get deeper insights into your customer conversations with our new analytics dashboard.",tags:["Analytics"],coverImage:"https://feedback-sdk.product7.io/cgangelog-Frame%202087334450.jpg",coverText:null,publishedAt:new Date(Date.now()-864e6).toISOString(),url:"#"},{id:"changelog_3",title:"Escalation guidance for complex issues",description:"New AI-powered escalation guidance helps your team handle complex customer issues more effectively.",tags:["New feature","AI"],coverImage:"https://feedback-sdk.product7.io/cgangelog-image-escalation-guidance-event@2x.png",coverText:null,publishedAt:new Date(Date.now()-6048e5).toISOString(),url:"#"}]};const e=((await this.apiService.getChangelogs({limit:20})).data||[]).map(e=>({id:e.id,title:e.title,description:e.excerpt||e.description||"",tags:e.labels?e.labels.map(e=>e.name):[],coverImage:e.cover_image||null,coverText:null,publishedAt:e.published_at,url:e.slug?`/changelog/${e.slug}`:"#"}));return{homeItems:e.slice(0,3),changelogItems:e}}onMount(){this.loadInitialData(),this.apiService?.sessionToken&&this._initWebSocket(),this.checkAgentAvailability(),this._availabilityInterval=setInterval(()=>{this.checkAgentAvailability()},6e4)}onDestroy(){this._stateUnsubscribe&&this._stateUnsubscribe(),this.wsService&&this.wsService.disconnect(),this._wsUnsubscribers.forEach(e=>e()),this._wsUnsubscribers=[],this._availabilityInterval&&clearInterval(this._availabilityInterval)}destroy(){this.launcher&&this.launcher.destroy(),this.panel&&this.panel.destroy(),this.onDestroy(),super.destroy()}}class D extends y{constructor(e){super({...e,type:"survey"}),this.surveyOptions={surveyId:e.surveyId||null,surveyType:e.surveyType||"nps",position:e.position||"bottom-right",title:e.title||null,description:e.description||null,lowLabel:e.lowLabel||null,highLabel:e.highLabel||null,customQuestions:e.customQuestions||[],theme:e.theme||"light",onSubmit:e.onSubmit||null,onDismiss:e.onDismiss||null},this.surveyState={score:null,feedback:"",customAnswers:{},isVisible:!1}}_render(){const e=document.createElement("div");return e.className="feedback-survey-container",e.style.display="none",e}_attachEvents(){}show(){return this._renderSurvey(),this.surveyState.isVisible=!0,this.sdk.eventBus.emit("survey:shown",{widget:this,type:this.surveyOptions.surveyType}),this}hide(){return this._closeSurvey(),this}_renderSurvey(){this._closeSurvey();const e=this._getSurveyConfig(),t=this._getPositionStyles(),n="dark"===this.surveyOptions.theme?"background: #1a1a1a; color: #fff;":"background: #fff; color: #1d1d1f;";"center"===this.surveyOptions.position&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-survey-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this._handleDismiss())),this.surveyElement=document.createElement("div"),this.surveyElement.className=`feedback-survey feedback-survey-${this.surveyOptions.position} theme-${this.surveyOptions.theme}`,this.surveyElement.style.cssText=`position: fixed; ${t} z-index: 10000; ${n} border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); padding: 24px; min-width: 320px; max-width: 400px; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;`,this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close" style="position: absolute; top: 12px; right: 12px; background: none; border: none; font-size: 20px; cursor: pointer; color: ${"dark"===this.surveyOptions.theme?"#888":"#86868b"}; line-height: 1;">&times;</button>\n\t\t\t<h3 class="feedback-survey-title" style="margin: 0 0 8px 0; font-size: 18px; font-weight: 600; padding-right: 24px;">${e.title}</h3>\n\t\t\t<p class="feedback-survey-description" style="color: ${"dark"===this.surveyOptions.theme?"#aaa":"#86868b"}; margin: 0 0 20px 0; font-size: 14px;">${e.description}</p>\n\t\t\t<div class="feedback-survey-content">${e.html}</div>\n\t\t\t<div class="feedback-survey-feedback" style="margin-top: 16px;">\n\t\t\t\t<textarea class="feedback-survey-textarea" placeholder="Any additional feedback? (optional)" style="width: 100%; padding: 12px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#333":"#d2d2d7"}; border-radius: 8px; font-size: 14px; resize: none; height: 80px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; font-family: inherit; box-sizing: border-box;"></textarea>\n\t\t\t</div>\n\t\t\t<button class="feedback-survey-submit" style="width: 100%; margin-top: 12px; padding: 12px; background: #007aff; color: white; border: none; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; font-family: inherit;">Submit</button>\n\t\t`,document.body.appendChild(this.surveyElement),this._attachSurveyEvents(),requestAnimationFrame(()=>{this.surveyElement.style.opacity="1",this.surveyElement.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(1)":"translateY(0)"})}_getSurveyConfig(){const e={nps:{title:this.surveyOptions.title||"How likely are you to recommend us?",description:this.surveyOptions.description||"On a scale of 0-10, how likely are you to recommend our product to a friend or colleague?",html:`\n\t\t\t\t\t<div class="feedback-survey-nps" style="display: flex; justify-content: space-between; gap: 4px;">\n\t\t\t\t\t\t${[...Array(11).keys()].map(e=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-nps-btn" data-score="${e}" style="width: 28px; height: 36px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 6px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa"}; cursor: pointer; font-size: 12px; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; transition: all 0.15s;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style="display: flex; justify-content: space-between; margin-top: 8px; font-size: 11px; color: ${"dark"===this.surveyOptions.theme?"#888":"#86868b"};">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel||"Not likely"}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel||"Very likely"}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`},csat:{title:this.surveyOptions.title||"How satisfied are you?",description:this.surveyOptions.description||"How would you rate your overall satisfaction with our product?",html:`\n\t\t\t\t\t<div class="feedback-survey-csat" style="display: flex; justify-content: center; gap: 16px;">\n\t\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-csat-btn" data-score="${t+1}" style="background: none; border: none; cursor: pointer; font-size: 36px; transition: transform 0.15s; padding: 8px;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style="display: flex; justify-content: space-between; margin-top: 8px; font-size: 11px; color: ${"dark"===this.surveyOptions.theme?"#888":"#86868b"};">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel||"Very dissatisfied"}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel||"Very satisfied"}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`},ces:{title:this.surveyOptions.title||"How easy was it?",description:this.surveyOptions.description||"How easy was it to accomplish your task today?",html:`\n\t\t\t\t\t<div class="feedback-survey-ces" style="display: flex; justify-content: space-between; gap: 8px;">\n\t\t\t\t\t\t${["Very Difficult","Difficult","Neutral","Easy","Very Easy"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-ces-btn" data-score="${t+1}" style="flex: 1; padding: 12px 8px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa"}; cursor: pointer; font-size: 11px; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; transition: all 0.15s;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t`},custom:{title:this.surveyOptions.title||"Quick Feedback",description:this.surveyOptions.description||"Help us improve by answering a few questions.",html:this._renderCustomQuestions()}};return e[this.surveyOptions.surveyType]||e.nps}_renderCustomQuestions(){return this.surveyOptions.customQuestions&&0!==this.surveyOptions.customQuestions.length?this.surveyOptions.customQuestions.map((e,t)=>`\n\t\t\t<div style="margin-bottom: 16px;">\n\t\t\t\t<label style="display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;">${e.label}</label>\n\t\t\t\t${this._renderQuestionInput(e,t)}\n\t\t\t</div>\n\t\t`).join(""):`\n\t\t\t\t<div style="margin-bottom: 16px;">\n\t\t\t\t\t<label style="display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;">What feature do you use most?</label>\n\t\t\t\t\t<select class="feedback-survey-select" data-question="feature" style="width: 100%; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; font-size: 14px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"};">\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>\n\t\t\t\t\t<label style="display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;">How often do you use it?</label>\n\t\t\t\t\t<div class="feedback-survey-frequency" style="display: flex; gap: 8px;">\n\t\t\t\t\t\t${["Daily","Weekly","Monthly","Rarely"].map(e=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-freq-btn" data-freq="${e}" style="flex: 1; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa"}; cursor: pointer; font-size: 12px; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; transition: all 0.15s;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`}_renderQuestionInput(e,t){switch(e.type){case"select":return`\n\t\t\t\t\t<select class="feedback-survey-select" data-question="${e.id||t}" style="width: 100%; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; font-size: 14px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"};">\n\t\t\t\t\t\t<option value="">${e.placeholder||"Select an option"}</option>\n\t\t\t\t\t\t${e.options.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}\n\t\t\t\t\t</select>\n\t\t\t\t`;case"text":return`\n\t\t\t\t\t<input type="text" class="feedback-survey-input" data-question="${e.id||t}" placeholder="${e.placeholder||""}" style="width: 100%; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; font-size: 14px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; box-sizing: border-box;">\n\t\t\t\t`;default:return""}}_getPositionStyles(){const e={"bottom-right":"bottom: 24px; right: 24px; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;","bottom-left":"bottom: 24px; left: 24px; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;",center:"top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.95); opacity: 0; transition: all 0.3s ease;",bottom:"bottom: 0; left: 0; right: 0; border-radius: 16px 16px 0 0; max-width: none; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;"};return e[this.surveyOptions.position]||e["bottom-right"]}_attachSurveyEvents(){if(!this.surveyElement)return;this.surveyElement.querySelector(".feedback-survey-close").addEventListener("click",()=>this._handleDismiss());this.surveyElement.querySelector(".feedback-survey-submit").addEventListener("click",()=>this._handleSubmit());this.surveyElement.querySelector(".feedback-survey-textarea").addEventListener("input",e=>{this.surveyState.feedback=e.target.value}),this._attachTypeSpecificEvents(),this._escapeHandler=e=>{"Escape"===e.key&&this._handleDismiss()},document.addEventListener("keydown",this._escapeHandler)}_attachTypeSpecificEvents(){const e=this.surveyOptions.surveyType;"nps"===e&&this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(e=>{e.addEventListener("click",()=>this._selectNPS(parseInt(e.dataset.score))),e.addEventListener("mouseenter",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="#007aff")}),e.addEventListener("mouseleave",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7")})}),"csat"===e&&this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCSAT(parseInt(e.dataset.score))),e.addEventListener("mouseenter",()=>{e.style.transform="scale(1.1)"}),e.addEventListener("mouseleave",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.transform="scale(1)")})}),"ces"===e&&this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCES(parseInt(e.dataset.score))),e.addEventListener("mouseenter",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="#007aff")}),e.addEventListener("mouseleave",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7")})}),"custom"===e&&(this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(e=>{e.addEventListener("click",()=>this._selectFrequency(e.dataset.freq))}),this.surveyElement.querySelectorAll(".feedback-survey-select").forEach(e=>{e.addEventListener("change",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}),this.surveyElement.querySelectorAll(".feedback-survey-input").forEach(e=>{e.addEventListener("input",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}))}_selectNPS(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(t=>{parseInt(t.dataset.score)===e?(t.style.background="#007aff",t.style.borderColor="#007aff",t.style.color="#fff"):(t.style.background="dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa",t.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7",t.style.color="dark"===this.surveyOptions.theme?"#fff":"#1d1d1f")})}_selectCSAT(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(t=>{const n=parseInt(t.dataset.score);t.style.transform=n===e?"scale(1.2)":"scale(1)"})}_selectCES(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(t=>{parseInt(t.dataset.score)===e?(t.style.background="#007aff",t.style.borderColor="#007aff",t.style.color="#fff"):(t.style.background="dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa",t.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7",t.style.color="dark"===this.surveyOptions.theme?"#fff":"#1d1d1f")})}_selectFrequency(e){this.surveyState.customAnswers.frequency=e,this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(t=>{t.dataset.freq===e?(t.style.background="#007aff",t.style.borderColor="#007aff",t.style.color="#fff"):(t.style.background="dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa",t.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7",t.style.color="dark"===this.surveyOptions.theme?"#fff":"#1d1d1f")})}async _handleSubmit(){const e=this.surveyOptions.surveyType;if(("nps"===e||"csat"===e||"ces"===e)&&null===this.surveyState.score)return void this._showError("Please select a rating");const t={rating:this.surveyState.score,feedback:this.surveyState.feedback,answers:this.surveyState.customAnswers},n={type:e,score:this.surveyState.score,feedback:this.surveyState.feedback,customAnswers:this.surveyState.customAnswers,timestamp:(new Date).toISOString()};this.surveyOptions.onSubmit&&this.surveyOptions.onSubmit(n);try{const n=this.surveyOptions.surveyId||`local_${e}_${Date.now()}`;await this.apiService.submitSurveyResponse(n,t)}catch(e){console.error("[SurveyWidget] Failed to submit survey:",e)}this.sdk.eventBus.emit("survey:submitted",{widget:this,response:n}),this._closeSurvey(),this._showSuccessNotification()}async _handleDismiss(){if(this.surveyOptions.surveyId)try{await this.apiService.dismissSurvey(this.surveyOptions.surveyId)}catch(e){console.error("[SurveyWidget] Failed to dismiss survey:",e)}this.surveyOptions.onDismiss&&this.surveyOptions.onDismiss(),this.sdk.eventBus.emit("survey:dismissed",{widget:this}),this._closeSurvey()}_showError(e){const t=this.surveyElement.querySelector(".feedback-survey-error");t&&t.remove();const n=document.createElement("div");n.className="feedback-survey-error",n.style.cssText="color: #ef4444; font-size: 13px; margin-top: 8px; text-align: center;",n.textContent=e;const s=this.surveyElement.querySelector(".feedback-survey-submit");s.parentNode.insertBefore(n,s),setTimeout(()=>n.remove(),3e3)}_showSuccessNotification(){const e=document.createElement("div");e.className="feedback-survey-success",e.style.cssText="\n\t\t\tposition: fixed;\n\t\t\ttop: 24px;\n\t\t\tright: 24px;\n\t\t\tbackground: #10b981;\n\t\t\tcolor: white;\n\t\t\tpadding: 16px 24px;\n\t\t\tborder-radius: 12px;\n\t\t\tfont-size: 14px;\n\t\t\tfont-weight: 500;\n\t\t\tz-index: 10001;\n\t\t\tbox-shadow: 0 10px 40px rgba(0,0,0,0.2);\n\t\t\tfont-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n\t\t",e.innerHTML='\n\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t<span style="font-size: 18px;">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t',document.body.appendChild(e),setTimeout(()=>{e.style.opacity="0",e.style.transition="opacity 0.3s ease",setTimeout(()=>e.remove(),300)},3e3)}_closeSurvey(){this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null);const e=this.surveyElement,t=this.backdropElement;e&&(e.style.opacity="0",e.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(0.95)":"translateY(20px)",setTimeout(()=>{e&&e.parentNode&&e.parentNode.removeChild(e)},300),this.surveyElement=null),t&&(t.style.opacity="0",setTimeout(()=>{t&&t.parentNode&&t.parentNode.removeChild(t)},300),this.backdropElement=null),this.surveyState={score:null,feedback:"",customAnswers:{},isVisible:!1}}destroy(){this._closeSurvey(),super.destroy()}}class O extends y{constructor(e){super({...e,type:"tab"})}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-tab theme-${this.options.theme} position-${this.options.position}`,e.innerHTML='\n <div class="feedback-tab-trigger">\n <span class="feedback-tab-text">Feedback</span>\n </div>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-tab-trigger");e.addEventListener("click",this.openModal),e.addEventListener("mouseenter",()=>{this.state.isSubmitting||(e.style.transform=this._getHoverTransform())}),e.addEventListener("mouseleave",()=>{e.style.transform="none"})}_getHoverTransform(){const e=this.options.position;return e.includes("right")?"translateX(-5px)":e.includes("left")?"translateX(5px)":"none"}updateText(e){const t=this.element?.querySelector(".feedback-tab-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class N{static widgets=new Map([["button",w],["tab",O],["inline",k],["survey",D],["messenger",L],["changelog",x]]);static register(e,n){if("string"!=typeof e||!e.trim())throw new t("Widget type must be a non-empty string");if("function"!=typeof n)throw new t("Widget class must be a constructor function");this.widgets.set(e,n)}static create(e,n={}){const s=this.widgets.get(e);if(!s){const n=Array.from(this.widgets.keys()).join(", ");throw new t(`Unknown widget type: ${e}. Available types: ${n}`)}try{return new s(n)}catch(n){throw new t(`Failed to create widget of type '${e}': ${n.message}`,n)}}static getAvailableTypes(){return Array.from(this.widgets.keys())}static isTypeRegistered(e){return this.widgets.has(e)}static unregister(e){return this.widgets.delete(e)}static clear(){this.widgets.clear()}static getWidgetClass(e){return this.widgets.get(e)}}class B{constructor(e={}){this.config=this._validateAndMergeConfig(e),this.initialized=!1,this.widgets=new Map,this.eventBus=new m,this.apiService=new p({apiUrl:this.config.apiUrl,workspace:this.config.workspace,userContext:this.config.userContext,mock:this.config.mock,env:this.config.env}),this._bindMethods()}async init(){if(this.initialized)return{alreadyInitialized:!0};try{const e=await this.apiService.init(this.config.userContext);return e.config&&(this.config=b(e.config,this.config)),this.initialized=!0,this.eventBus.emit("sdk:initialized",{config:this.config,sessionToken:e.sessionToken}),{initialized:!0,config:e.config||{},sessionToken:e.sessionToken,expiresIn:e.expiresIn}}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new t(`Failed to initialize SDK: ${e.message}`,e)}}createWidget(e="button",n={}){if(!this.initialized)throw new t("SDK must be initialized before creating widgets. Call init() first.");const s=u("widget"),i={id:s,sdk:this,apiService:this.apiService,...this.config,...n};try{const t=N.create(e,i);return this.widgets.set(s,t),this.eventBus.emit("widget:created",{widget:t,type:e}),t}catch(e){throw new t(`Failed to create widget: ${e.message}`,e)}}getWidget(e){return this.widgets.get(e)}async getActiveSurveys(e={}){if(!this.initialized)throw new t("SDK must be initialized before fetching surveys. Call init() first.");try{return(await this.apiService.getActiveSurveys(e)).data||[]}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new t(`Failed to fetch active surveys: ${e.message}`,e)}}async showSurveyById(e,n={}){if(!this.initialized)throw new t("SDK must be initialized before showing surveys. Call init() first.");const s=(await this.getActiveSurveys()).find(t=>t.id===e);if(!s)throw new t(`Survey with ID '${e}' not found or not active`);return this.showSurvey({surveyId:s.id,surveyType:s.type,title:s.title,description:s.description,lowLabel:s.low_label,highLabel:s.high_label,customQuestions:s.questions,...n})}showSurvey(e={}){if(!this.initialized)throw new t("SDK must be initialized before showing surveys. Call init() first.");const n=this.createWidget("survey",{surveyId:e.surveyId,surveyType:e.surveyType||e.type||"nps",position:e.position||"bottom-right",theme:e.theme||this.config.theme||"light",title:e.title,description:e.description,lowLabel:e.lowLabel,highLabel:e.highLabel,customQuestions:e.customQuestions,onSubmit:e.onSubmit,onDismiss:e.onDismiss});return n.mount(),n.show(),n}showChangelog(e={}){if(!this.initialized)throw new t("SDK must be initialized before showing changelog. Call init() first.");const n=this.createWidget("changelog",{position:e.position||"bottom-right",theme:e.theme||this.config.theme||"light",title:e.title||"What's New",triggerText:e.triggerText||"What's New",showBadge:!1!==e.showBadge,viewButtonText:e.viewButtonText||"View Update",changelogBaseUrl:e.changelogBaseUrl,openInNewTab:e.openInNewTab,onViewUpdate:e.onViewUpdate});return n.mount(),n.show(),n}async getChangelogs(e={}){if(!this.initialized)throw new t("SDK must be initialized before fetching changelogs. Call init() first.");try{return(await this.apiService.getChangelogs(e)).data||[]}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new t(`Failed to fetch changelogs: ${e.message}`,e)}}getAllWidgets(){return Array.from(this.widgets.values())}destroyWidget(e){const t=this.widgets.get(e);return!!t&&(t.destroy(),this.widgets.delete(e),this.eventBus.emit("widget:removed",{widgetId:e}),!0)}destroyAllWidgets(){for(const e of this.widgets.values())e.destroy();this.widgets.clear(),this.eventBus.emit("widgets:cleared")}updateConfig(e){const t={...this.config};this.config=this._validateAndMergeConfig(e,this.config);for(const e of this.widgets.values())e.handleConfigUpdate(this.config);this.eventBus.emit("config:updated",{oldConfig:t,newConfig:this.config})}setUserContext(e){this.config.userContext=e,this.apiService&&this.apiService.setUserContext(e),this.eventBus.emit("user:updated",{userContext:e})}getUserContext(){return this.config.userContext||(this.apiService?this.apiService.getUserContext():null)}async reinitialize(e=null){return this.apiService.clearSession(),this.initialized=!1,e&&this.setUserContext(e),this.init()}on(e,t){return this.eventBus.on(e,t),this}off(e,t){return this.eventBus.off(e,t),this}once(e,t){return this.eventBus.once(e,t),this}emit(e,t){return this.eventBus.emit(e,t),this}destroy(){this.destroyAllWidgets(),this.eventBus.removeAllListeners(),this.apiService.clearSession(),this.initialized=!1,this.eventBus.emit("sdk:destroyed")}hasFeedbackBeenSubmitted(e=30){const t=24*e*60*60*1e3,n=Date.now();if(this.config.last_feedback_at)try{if(n-new Date(this.config.last_feedback_at).getTime()<t)return!0}catch(e){}try{const e=`feedback_submitted_${this.config.workspace}`,s=localStorage.getItem(e);if(!s)return!1;return n-JSON.parse(s).submittedAt<t}catch(e){return!1}}clearFeedbackSubmissionTracking(){try{const e=`feedback_submitted_${this.config.workspace}`;localStorage.removeItem(e),this.eventBus.emit("feedback:trackingCleared")}catch(e){console.warn("Failed to clear feedback tracking:",e)}}_detectEnvironment(){if("undefined"==typeof window)return"production";const e=window.location.hostname.toLowerCase();return e.includes("staging")||e.includes("localhost")||e.includes("127.0.0.1")||e.includes(".local")?"staging":"production"}_validateAndMergeConfig(e,t={}){const n=b(b({apiUrl:null,workspace:null,userContext:null,position:"bottom-right",theme:"light",boardId:"general",autoShow:!0,debug:!1,mock:!1,env:this._detectEnvironment()},t),e);if(e.env||t.env||(n.env=this._detectEnvironment()),!n.workspace)throw new i("Missing required configuration: workspace");return n.userContext&&this._validateUserContext(n.userContext),n}_validateUserContext(e){if(!e.user_id&&!e.email)throw new i("User context must include at least user_id or email");const t={user_id:"string",email:"string",name:"string",custom_fields:"object",company:"object"};for(const[n,s]of Object.entries(t))if(e[n]&&typeof e[n]!==s)throw new i(`User context field '${n}' must be of type '${s}'`)}_bindMethods(){this.createWidget=this.createWidget.bind(this),this.destroyWidget=this.destroyWidget.bind(this),this.updateConfig=this.updateConfig.bind(this)}static create(e){return new B(e)}static async createAndInit(e){const t=new B(e);return await t.init(),t}static extractUserContextFromAuth(e){return e?{user_id:e.sub||e.id||e.user_id,email:e.email,name:e.name||e.display_name||e.full_name,custom_fields:{role:e.role,plan:e.plan||e.subscription?.plan,...e.custom_fields||{}},company:e.company||e.organization?{id:e.company?.id||e.organization?.id,name:e.company?.name||e.organization?.name,monthly_spend:e.company?.monthly_spend}:void 0}:null}}function F(){if("undefined"!=typeof document&&!document.querySelector("#feedback-sdk-styles")){const e=document.createElement("style");e.id="feedback-sdk-styles",e.textContent="\n.feedback-widget {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n z-index: 999999;\n box-sizing: border-box;\n}\n\n.feedback-widget *,\n.feedback-widget *::before,\n.feedback-widget *::after {\n box-sizing: border-box;\n}\n\n.feedback-widget-button {\n position: fixed;\n z-index: 999999;\n}\n\n.feedback-widget-button.position-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.feedback-widget-button.position-bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.feedback-widget-button.position-top-right {\n top: 20px;\n right: 20px;\n}\n\n.feedback-widget-button.position-top-left {\n top: 20px;\n left: 20px;\n}\n\n.feedback-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n height: 48px;\n overflow: visible;\n border-radius: 9999px;\n border: none;\n padding: 12px 20px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.3s ease;\n color: white;\n background: #155EEF;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n width: fit-content;\n}\n\n.feedback-trigger-btn:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);\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 #155EEF;\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: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border-radius: 50%;\n opacity: 0;\n transition: opacity 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.feedback-minimize-icon svg,\n.feedback-expand-icon svg {\n width: 16px;\n height: 16px;\n display: block;\n fill: #155EEF;\n}\n\n/* Show minimize icon on hover when expanded */\n.feedback-widget-button:not(.minimized) .feedback-trigger-btn:hover .feedback-minimize-icon {\n opacity: 1;\n}\n\n/* Minimized state - just icon */\n.feedback-widget-button.minimized .feedback-trigger-btn {\n padding: 12px;\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/* Show expand icon on hover when minimized */\n.feedback-widget-button.minimized .feedback-trigger-btn:hover .feedback-expand-icon {\n opacity: 1;\n}\n\n/* Side Panel Styles */\n.feedback-panel {\n position: fixed;\n bottom: 80px;\n right: 24px;\n width: 420px;\n max-height: 500px;\n z-index: 1000000;\n transform: translateX(calc(100% + 24px));\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n font-family: inherit;\n}\n\n.feedback-panel.open {\n transform: translateX(0);\n}\n\n.feedback-panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.1);\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n z-index: 999999;\n}\n\n.feedback-panel-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.feedback-panel-content {\n background: white;\n height: 100%;\n display: flex;\n flex-direction: column;\n border-radius: 16px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), \n 0 10px 10px -5px rgba(0, 0, 0, 0.04),\n 0 0 0 1px rgba(0, 0, 0, 0.05);\n}\n\n.feedback-panel.theme-dark .feedback-panel-content {\n background: #1F2937;\n color: white;\n}\n\n.feedback-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24px;\n border-bottom: 1px solid #E5E7EB;\n flex-shrink: 0;\n}\n\n.feedback-panel.theme-dark .feedback-panel-header {\n border-bottom-color: #374151;\n}\n\n.feedback-panel-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #111827;\n}\n\n.feedback-panel.theme-dark .feedback-panel-header h3 {\n color: white;\n}\n\n.feedback-panel-close {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: #6B7280;\n padding: 4px;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.feedback-panel-close:hover {\n background: #F3F4F6;\n color: #111827;\n}\n\n.feedback-panel-close:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n.feedback-panel.theme-dark .feedback-panel-close {\n color: #9CA3AF;\n}\n\n.feedback-panel.theme-dark .feedback-panel-close:hover {\n background: #374151;\n color: white;\n}\n\n.feedback-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n.feedback-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.feedback-form-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 20px;\n}\n\n.feedback-form-group:last-child {\n margin-bottom: 0;\n}\n\n.feedback-form-group label {\n font-size: 14px;\n font-weight: 500;\n line-height: 1.25;\n color: #374151;\n}\n\n.feedback-panel.theme-dark .feedback-form-group label {\n color: #D1D5DB;\n}\n\n.feedback-form-group input {\n height: 44px;\n width: 100%;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n padding: 10px 14px;\n font-size: 15px;\n font-weight: 400;\n line-height: 1.5;\n color: #1F2937;\n font-family: inherit;\n outline: none;\n transition: all 0.2s ease;\n}\n\n.feedback-form-group input::placeholder {\n font-size: 15px;\n color: #9CA3AF;\n}\n\n.feedback-form-group input:focus {\n border-color: #155EEF;\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);\n}\n\n.feedback-form-group input:focus-visible {\n outline: none;\n}\n\n.feedback-form-group textarea {\n min-height: 200px;\n width: 100%;\n resize: vertical;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n padding: 10px 14px;\n font-size: 15px;\n font-weight: 400;\n line-height: 1.5;\n color: #1F2937;\n font-family: inherit;\n outline: none;\n transition: all 0.2s ease;\n}\n\n.feedback-form-group textarea::placeholder {\n font-size: 15px;\n color: #9CA3AF;\n}\n\n.feedback-form-group textarea:focus {\n border-color: #155EEF;\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);\n}\n\n.feedback-form-group textarea:focus-visible {\n outline: none;\n}\n\n.feedback-panel.theme-dark .feedback-form-group input,\n.feedback-panel.theme-dark .feedback-form-group textarea {\n background: #374151;\n border-color: #4B5563;\n color: white;\n}\n\n.feedback-panel.theme-dark .feedback-form-group input::placeholder,\n.feedback-panel.theme-dark .feedback-form-group textarea::placeholder {\n color: #6B7280;\n}\n\n.feedback-btn {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border-radius: 8px;\n border: none;\n height: 44px;\n padding: 10px 18px;\n font-size: 15px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.feedback-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.feedback-btn:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n.feedback-btn-submit {\n background: #155EEF;\n color: white;\n width: 100%;\n}\n\n.feedback-btn-submit:hover:not(:disabled) {\n background: #4338ca;\n}\n\n.feedback-btn-submit:active:not(:disabled) {\n background: #3730a3;\n}\n\n.feedback-btn-cancel {\n background: transparent;\n color: #6B7280;\n border: 1px solid #D1D5DB;\n}\n\n.feedback-btn-cancel:hover:not(:disabled) {\n background: #F9FAFB;\n border-color: #9CA3AF;\n color: #374151;\n}\n\n.feedback-panel.theme-dark .feedback-btn-cancel {\n color: #D1D5DB;\n border-color: #4B5563;\n}\n\n.feedback-panel.theme-dark .feedback-btn-cancel:hover:not(:disabled) {\n background: #374151;\n}\n\n.feedback-form-actions {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: auto;\n padding-top: 24px;\n}\n\n.feedback-error {\n color: #DC2626;\n font-size: 14px;\n font-weight: 400;\n margin-top: 8px;\n padding: 12px;\n background: #FEE2E2;\n border: 1px solid #FECACA;\n border-radius: 8px;\n display: none;\n}\n\n.feedback-error.show {\n display: block;\n}\n\n.feedback-panel.theme-dark .feedback-error {\n background: #7F1D1D;\n border-color: #991B1B;\n color: #FCA5A5;\n}\n\n.feedback-success-notification {\n position: fixed;\n top: 24px;\n right: 24px;\n z-index: 1000002;\n background: white;\n border: 1px solid #D1FAE5;\n border-radius: 12px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n animation: slideInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 320px;\n}\n\n.feedback-success-content {\n display: flex;\n align-items: center;\n padding: 16px 20px;\n gap: 12px;\n}\n\n.feedback-success-icon {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #10B981;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.feedback-success-content span {\n color: #065F46;\n font-weight: 500;\n font-size: 14px;\n flex: 1;\n}\n\n.feedback-success-close {\n background: none;\n border: none;\n color: #6B7280;\n cursor: pointer;\n font-size: 20px;\n padding: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n border-radius: 4px;\n flex-shrink: 0;\n}\n\n.feedback-success-close:hover {\n background: #F3F4F6;\n color: #374151;\n}\n\n.feedback-success-close:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\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 { opacity: 0; }\n to { opacity: 1; }\n}\n\n.feedback-panel-backdrop {\n animation: fadeIn 0.3s ease;\n}\n\n@media (max-width: 768px) {\n .feedback-panel {\n width: 100%;\n top: auto;\n bottom: 0;\n right: 0;\n left: 0;\n height: 85vh;\n max-height: 85vh;\n transform: translateY(100%);\n border-radius: 20px 20px 0 0;\n }\n \n .feedback-panel.open {\n transform: translateY(0);\n }\n \n .feedback-panel-content {\n border-radius: 20px 20px 0 0;\n }\n \n .feedback-panel-header {\n padding: 20px;\n position: relative;\n }\n \n .feedback-panel-header::before {\n content: '';\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 4px;\n background: #D1D5DB;\n border-radius: 2px;\n }\n \n .feedback-panel.theme-dark .feedback-panel-header::before {\n background: #4B5563;\n }\n \n .feedback-panel-body {\n padding: 20px;\n }\n \n .feedback-form-group textarea {\n min-height: 150px;\n }\n \n .feedback-widget-button {\n bottom: 16px;\n right: 16px;\n }\n \n .feedback-widget-button.position-bottom-left {\n left: 16px;\n }\n \n .feedback-success-notification {\n top: 16px;\n right: 16px;\n left: 16px;\n min-width: auto;\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\n@media (prefers-reduced-motion: reduce) {\n .feedback-trigger-btn,\n .feedback-btn,\n .feedback-panel,\n .feedback-panel-backdrop,\n .feedback-success-notification,\n .feedback-minimize-icon,\n .feedback-expand-icon {\n transition: none;\n animation: none;\n }\n}\n\n@media print {\n .feedback-widget,\n .feedback-panel,\n .feedback-panel-backdrop,\n .feedback-success-notification {\n display: none !important;\n }\n}\n\n/* Changelog Widget Styles */\n.changelog-widget {\n position: fixed;\n z-index: 999999;\n}\n\n.changelog-widget.position-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.changelog-widget.position-bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.changelog-widget.position-top-right {\n top: 20px;\n right: 20px;\n}\n\n.changelog-widget.position-top-left {\n top: 20px;\n left: 20px;\n}\n\n.changelog-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n height: 48px;\n overflow: visible;\n border-radius: 9999px;\n border: none;\n padding: 12px 20px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.3s ease;\n color: white;\n background: #155EEF;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n width: fit-content;\n}\n\n.changelog-trigger-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);\n}\n\n.changelog-trigger-btn:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n.changelog-icon {\n flex-shrink: 0;\n}\n\n.changelog-confetti-emoji {\n font-size: 14px;\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: #EF4444;\n border-radius: 50%;\n border: 2px solid white;\n}\n\n/* Confetti Animation */\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: 1000001;\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/* Changelog Modal */\n.changelog-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 0.3s ease;\n pointer-events: none;\n z-index: 999998;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.changelog-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.changelog-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999999;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n}\n\n.changelog-modal.open {\n pointer-events: auto;\n}\n\n.changelog-modal-container {\n position: relative;\n width: 100%;\n max-width: 580px;\n max-height: 90vh;\n background: #DBEAFE;\n border-radius: 24px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n transform: scale(0.9) translateY(20px);\n opacity: 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.changelog-modal.open .changelog-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.changelog-modal.theme-dark .changelog-modal-container {\n background: #1E3A5F;\n}\n\n.changelog-modal-close {\n position: absolute;\n top: 16px;\n right: 16px;\n background: rgba(255, 255, 255, 0.9);\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: #6B7280;\n padding: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n transition: all 0.2s ease;\n line-height: 1;\n z-index: 10;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.changelog-modal-close:hover {\n background: white;\n color: #111827;\n transform: scale(1.05);\n}\n\n.changelog-modal.theme-dark .changelog-modal-close {\n background: rgba(55, 65, 81, 0.9);\n color: #D1D5DB;\n}\n\n.changelog-modal.theme-dark .changelog-modal-close:hover {\n background: #374151;\n color: white;\n}\n\n.changelog-modal-content {\n overflow-y: auto;\n max-height: 90vh;\n}\n\n/* Changelog Loading */\n.changelog-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n}\n\n.changelog-loading-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #E5E7EB;\n border-top-color: #155EEF;\n border-radius: 50%;\n animation: changelogSpin 0.8s linear infinite;\n}\n\n@keyframes changelogSpin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Changelog Empty State */\n.changelog-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n text-align: center;\n color: #9CA3AF;\n}\n\n.changelog-empty svg {\n margin-bottom: 16px;\n stroke: #D1D5DB;\n}\n\n.changelog-empty p {\n margin: 0;\n font-size: 15px;\n}\n\n/* Changelog Popup Item */\n.changelog-popup-item {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-popup-image {\n width: 100%;\n padding: 24px 24px 0;\n}\n\n.changelog-popup-image img {\n width: 100%;\n height: auto;\n display: block;\n object-fit: cover;\n border-radius: 12px;\n border: 2px solid #155EEF;\n box-shadow: 0 4px 20px rgba(21, 94, 239, 0.2);\n}\n\n.changelog-popup-body {\n padding: 24px 32px 32px;\n text-align: center;\n}\n\n.changelog-popup-title {\n margin: 0 0 16px;\n font-size: 18px;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\n}\n\n.changelog-modal.theme-dark .changelog-popup-title {\n color: white;\n}\n\n.changelog-popup-description {\n margin: 0 0 24px;\n font-size: 17px;\n line-height: 1.6;\n color: #4B5563;\n}\n\n.changelog-modal.theme-dark .changelog-popup-description {\n color: #D1D5DB;\n}\n\n.changelog-popup-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 14px 32px;\n font-size: 16px;\n font-weight: 600;\n color: white;\n background: #155EEF;\n border: none;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.changelog-popup-btn:hover {\n background: #1249CA;\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(21, 94, 239, 0.3);\n}\n\n.changelog-popup-btn:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n/* Popup Footer with Dots and View All */\n.changelog-popup-footer {\n padding: 0 32px 24px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.changelog-popup-dots {\n display: flex;\n gap: 8px;\n}\n\n.changelog-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: rgba(21, 94, 239, 0.3);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.changelog-dot:hover {\n background: rgba(21, 94, 239, 0.5);\n}\n\n.changelog-dot.active {\n background: #155EEF;\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: #155EEF;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n padding: 8px 12px;\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.changelog-view-all-btn:hover {\n background: rgba(21, 94, 239, 0.1);\n}\n\n.changelog-view-all-btn svg {\n transition: transform 0.2s ease;\n}\n\n.changelog-view-all-btn:hover svg {\n transform: translateX(3px);\n}\n\n.changelog-modal.theme-dark .changelog-view-all-btn {\n color: #60A5FA;\n}\n\n.changelog-modal.theme-dark .changelog-view-all-btn:hover {\n background: rgba(96, 165, 250, 0.1);\n}\n\n/* ==================== CHANGELOG LIST MODAL ==================== */\n.changelog-list-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 0.3s ease;\n pointer-events: none;\n z-index: 999998;\n}\n\n.changelog-list-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.changelog-list-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999999;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\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: white;\n border-radius: 20px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n transform: scale(0.9) translateY(20px);\n opacity: 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\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.theme-dark .changelog-list-modal-container {\n background: #1F2937;\n color: white;\n}\n\n.changelog-list-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-bottom: 1px solid #E5E7EB;\n flex-shrink: 0;\n background: white;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-header {\n border-bottom-color: #374151;\n background: #1F2937;\n}\n\n.changelog-list-modal-header h2 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-header h2 {\n color: white;\n}\n\n.changelog-list-modal-close {\n background: none;\n border: none;\n font-size: 22px;\n cursor: pointer;\n color: #6B7280;\n padding: 4px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s ease;\n line-height: 1;\n}\n\n.changelog-list-modal-close:hover {\n background: #F3F4F6;\n color: #111827;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-close {\n color: #9CA3AF;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-close:hover {\n background: #374151;\n color: white;\n}\n\n.changelog-list-modal-body {\n flex: 1;\n overflow-y: auto;\n}\n\n/* Changelog List */\n.changelog-list {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid #E5E7EB;\n cursor: pointer;\n transition: background-color 0.2s ease;\n position: relative;\n}\n\n.changelog-list-item:hover {\n background: #F9FAFB;\n}\n\n.changelog-list-item:last-child {\n border-bottom: none;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item {\n border-bottom-color: #374151;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item:hover {\n background: #374151;\n}\n\n.changelog-list-item-image {\n width: 100%;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid #E5E7EB;\n}\n\n.changelog-list-item-image img {\n width: 100%;\n height: 100px;\n display: block;\n object-fit: cover;\n}\n\n.changelog-list-item-main {\n flex: 1;\n min-width: 0;\n}\n\n.changelog-list-item-content {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.changelog-list-item-date {\n font-size: 11px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-date {\n color: #9CA3AF;\n}\n\n.changelog-list-item-labels {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 1px;\n}\n\n.changelog-list-item-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-title {\n color: white;\n}\n\n.changelog-list-item-description {\n margin: 0;\n font-size: 12px;\n line-height: 1.4;\n color: #6B7280;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-description {\n color: #9CA3AF;\n}\n\n.changelog-list-item-arrow {\n flex-shrink: 0;\n margin-left: 12px;\n color: #9CA3AF;\n transition: all 0.2s ease;\n}\n\n.changelog-list-item:hover .changelog-list-item-arrow {\n color: #155EEF;\n transform: translateX(3px);\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-arrow {\n color: #6B7280;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item:hover .changelog-list-item-arrow {\n color: #60A5FA;\n}\n\n/* Mobile Responsive */\n@media (max-width: 768px) {\n .changelog-modal {\n padding: 16px;\n }\n\n .changelog-modal-container {\n max-width: 100%;\n border-radius: 20px;\n }\n\n .changelog-widget {\n bottom: 16px;\n right: 16px;\n }\n\n .changelog-widget.position-bottom-left {\n left: 16px;\n }\n\n .changelog-popup-image {\n padding: 20px 20px 0;\n }\n\n .changelog-popup-body {\n padding: 20px 24px 24px;\n }\n\n .changelog-popup-title {\n font-size: 22px;\n }\n\n .changelog-popup-description {\n font-size: 15px;\n }\n\n .changelog-popup-btn {\n padding: 12px 28px;\n font-size: 15px;\n width: 100%;\n }\n\n .changelog-popup-footer {\n padding: 0 24px 20px;\n }\n\n /* List modal mobile */\n .changelog-list-modal {\n padding: 16px;\n }\n\n .changelog-list-modal-container {\n max-width: 100%;\n max-height: 90vh;\n border-radius: 16px;\n }\n\n .changelog-list-item {\n padding: 10px 14px;\n }\n\n .changelog-list-item-image img {\n height: 80px;\n }\n\n .changelog-list-item-title {\n font-size: 13px;\n }\n\n .changelog-list-item-description {\n font-size: 11px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .changelog-modal,\n .changelog-modal-container,\n .changelog-modal-backdrop,\n .changelog-list-modal,\n .changelog-list-modal-container,\n .changelog-list-modal-backdrop,\n .changelog-trigger-btn,\n .changelog-popup-btn,\n .changelog-view-all-btn,\n .changelog-loading-spinner,\n .changelog-dot,\n .changelog-list-item,\n .changelog-list-item-arrow {\n transition: none;\n animation: none;\n }\n}\n\n/* ========================================\n Messenger Widget - Intercom-style Dark Theme\n ======================================== */\n\n.messenger-widget {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.messenger-widget *,\n.messenger-widget *::before,\n.messenger-widget *::after {\n box-sizing: border-box;\n}\n\n/* ========================================\n Launcher Button\n ======================================== */\n\n.messenger-launcher {\n position: fixed;\n z-index: 999999;\n}\n\n.messenger-launcher-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.messenger-launcher-bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.messenger-launcher-btn {\n width: 60px;\n height: 60px;\n border-radius: 50%;\n border: none;\n background: #1c1c1e;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n}\n\n.messenger-launcher-btn:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);\n}\n\n.messenger-launcher-btn:active {\n transform: scale(0.95);\n}\n\n.messenger-launcher-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.messenger-launcher-open .messenger-launcher-icon-chat {\n opacity: 0;\n transform: rotate(-90deg);\n}\n\n.messenger-launcher-open .messenger-launcher-icon-close {\n opacity: 1;\n transform: rotate(0deg);\n}\n\n.messenger-launcher-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n background: #ef4444;\n color: white;\n font-size: 11px;\n font-weight: 600;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n border: 2px solid white;\n}\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.messenger-panel {\n position: fixed;\n z-index: 999998;\n width: 400px;\n height: 680px;\n max-height: calc(100vh - 100px);\n display: none;\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.messenger-panel.open {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.messenger-panel-bottom-right {\n bottom: 90px;\n right: 20px;\n}\n\n.messenger-panel-bottom-left {\n bottom: 90px;\n left: 20px;\n}\n\n.messenger-panel-content {\n background: #1c1c1e;\n height: 100%;\n border-radius: 16px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\n}\n\n/* Light theme */\n.messenger-panel.theme-light .messenger-panel-content {\n background: #ffffff;\n}\n\n/* ========================================\n Views Container\n ======================================== */\n\n.messenger-panel-views {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.messenger-view {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* ========================================\n Common Components\n ======================================== */\n\n/* Close Button */\n.messenger-close-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.6);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n\n.messenger-close-btn:hover {\n background: rgba(255, 255, 255, 0.1);\n color: white;\n}\n\n.theme-light .messenger-close-btn {\n color: #86868b;\n}\n\n.theme-light .messenger-close-btn:hover {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n/* Back Button */\n.messenger-back-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.6);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n\n.messenger-back-btn:hover {\n background: rgba(255, 255, 255, 0.1);\n color: white;\n}\n\n/* Avatar Stack */\n.messenger-avatar-stack {\n display: flex;\n align-items: center;\n}\n\n.messenger-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 2px solid #1c1c1e;\n background: #5856d6;\n color: white;\n font-size: 13px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: -8px;\n object-fit: cover;\n}\n\n.messenger-avatar:first-child {\n margin-left: 0;\n}\n\n.messenger-avatar-small {\n width: 28px;\n height: 28px;\n font-size: 11px;\n}\n\n.messenger-avatar-medium {\n width: 40px;\n height: 40px;\n font-size: 15px;\n font-weight: 600;\n}\n\n.messenger-avatar-tiny {\n width: 20px;\n height: 20px;\n font-size: 9px;\n border-width: 1.5px;\n margin-left: -6px;\n}\n\n.messenger-avatar-tiny:first-child {\n margin-left: 0;\n}\n\n.theme-light .messenger-avatar {\n border-color: #ffffff;\n}\n\n/* ========================================\n Home View\n ======================================== */\n\n.messenger-home-view {\n background: linear-gradient(180deg, #2c2c2e 0%, #1c1c1e 40%);\n}\n\n.messenger-home-header {\n padding: 20px;\n background: linear-gradient(180deg, rgba(88, 86, 214, 0.2) 0%, transparent 100%);\n}\n\n.messenger-home-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.messenger-home-logo {\n width: 32px;\n height: 32px;\n}\n\n.messenger-home-logo img {\n width: 100%;\n height: 100%;\n border-radius: 8px;\n object-fit: cover;\n}\n\n.messenger-home-logo-default {\n width: 32px;\n height: 32px;\n background: linear-gradient(135deg, #5856d6, #007aff);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n}\n\n.messenger-home-avatars {\n flex: 1;\n display: flex;\n justify-content: flex-end;\n margin-right: 12px;\n}\n\n.messenger-home-welcome {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.messenger-home-greeting {\n font-size: 15px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n.messenger-home-question {\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-home-body {\n flex: 1;\n padding: 20px;\n overflow-y: auto;\n}\n\n.messenger-home-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: #2c2c2e;\n border: none;\n border-radius: 24px;\n color: white;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n margin-bottom: 20px;\n}\n\n.messenger-home-message-btn:hover {\n background: #3c3c3e;\n transform: translateX(4px);\n}\n\n.messenger-home-message-btn svg {\n opacity: 0.6;\n}\n\n/* Featured Card */\n.messenger-home-featured {\n background: #2c2c2e;\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 20px;\n}\n\n.messenger-home-featured-image {\n width: 100%;\n height: 120px;\n object-fit: cover;\n}\n\n.messenger-home-featured-content {\n padding: 16px;\n}\n\n.messenger-home-featured-content h3 {\n margin: 0 0 8px;\n font-size: 16px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-home-featured-content p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.6);\n}\n\n/* Changelog Section in Home */\n.messenger-home-changelog-section {\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.messenger-home-changelog-card {\n background: #2c2c2e;\n border-radius: 16px;\n overflow: hidden;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.messenger-home-changelog-card:hover {\n background: #3c3c3e;\n transform: translateY(-2px);\n}\n\n.messenger-home-changelog-cover {\n width: 100%;\n height: 140px;\n overflow: hidden;\n position: relative;\n border-radius: 12px;\n margin: 12px 12px 0 12px;\n padding-bottom: 12px;\n width: calc(100% - 24px);\n}\n\n.messenger-home-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n}\n\n.messenger-home-changelog-cover-text {\n position: absolute;\n bottom: 12px;\n left: 12px;\n right: 12px;\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);\n line-height: 1.3;\n}\n\n.messenger-home-changelog-card-content {\n padding: 16px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-home-changelog-card-title {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 600;\n color: #ffffff;\n line-height: 1.3;\n}\n\n.messenger-home-changelog-card-desc {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.7);\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* ========================================\n Conversations View\n ======================================== */\n\n.messenger-conversations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-conversations-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-conversations-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n.messenger-conversations-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-conversations-empty-icon {\n color: rgba(255, 255, 255, 0.3);\n margin-bottom: 16px;\n}\n\n.messenger-conversations-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-conversations-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n.messenger-conversation-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n border-radius: 12px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.messenger-conversation-item:hover {\n background: rgba(255, 255, 255, 0.05);\n}\n\n.messenger-conversation-avatars {\n flex-shrink: 0;\n padding-top: 2px;\n}\n\n.messenger-conversation-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-conversation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 4px;\n gap: 12px;\n}\n\n.messenger-conversation-title {\n font-size: 15px;\n font-weight: 400;\n color: #ffffff;\n line-height: 1.3;\n}\n\n.messenger-conversation-time {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.5);\n flex-shrink: 0;\n}\n\n.messenger-conversation-preview {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.messenger-unread-dot {\n width: 8px;\n height: 8px;\n background: #ef4444;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.messenger-conversation-message {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.7);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.4;\n}\n\n.messenger-conversation-item.unread .messenger-conversation-title {\n font-weight: 400;\n color: #ffffff;\n}\n\n.messenger-conversation-item.unread .messenger-conversation-message {\n color: rgba(255, 255, 255, 0.9);\n}\n\n.messenger-conversations-footer {\n padding: 16px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-new-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: #2c2c2e;\n border: none;\n border-radius: 24px;\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.messenger-new-message-btn:hover {\n background: #3c3c3e;\n}\n\n.messenger-new-message-btn span {\n flex: 1;\n text-align: left;\n}\n\n.messenger-new-message-btn svg {\n opacity: 0.6;\n}\n\n/* ========================================\n Chat View\n ======================================== */\n\n.messenger-chat-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-chat-header-info {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.messenger-chat-title {\n font-size: 16px;\n font-weight: 500;\n color: white;\n}\n\n.messenger-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.messenger-chat-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-chat-empty-avatars {\n margin-bottom: 16px;\n}\n\n.messenger-chat-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-chat-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n max-width: 240px;\n}\n\n/* Messages */\n.messenger-message {\n display: flex;\n gap: 8px;\n max-width: 85%;\n}\n\n.messenger-message-own {\n align-self: flex-end;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.messenger-message-received {\n align-self: flex-start;\n}\n\n.messenger-message-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.messenger-message-sender {\n font-size: 12px;\n font-weight: 500;\n color: rgba(255, 255, 255, 0.6);\n margin-bottom: 4px;\n margin-left: 12px;\n}\n\n.messenger-message-bubble {\n padding: 12px 16px;\n border-radius: 18px;\n word-wrap: break-word;\n}\n\n.messenger-message-own .messenger-message-bubble {\n background: #007aff;\n color: white;\n border-bottom-right-radius: 4px;\n}\n\n.messenger-message-received .messenger-message-bubble {\n background: #2c2c2e;\n color: white;\n border-bottom-left-radius: 4px;\n}\n\n.messenger-message-content {\n font-size: 15px;\n line-height: 1.4;\n}\n\n.messenger-message-time {\n font-size: 11px;\n color: rgba(255, 255, 255, 0.4);\n margin-top: 4px;\n padding: 0 4px;\n}\n\n.messenger-message-avatar {\n flex-shrink: 0;\n margin-top: auto;\n}\n\n/* Compose Area */\n.messenger-chat-compose {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n background: #1c1c1e;\n}\n\n.messenger-compose-input-wrapper {\n flex: 1;\n background: #2c2c2e;\n border-radius: 20px;\n padding: 8px 16px;\n}\n\n.messenger-compose-input {\n width: 100%;\n background: transparent;\n border: none;\n outline: none;\n color: white;\n font-size: 15px;\n line-height: 1.4;\n resize: none;\n max-height: 120px;\n font-family: inherit;\n}\n\n.messenger-compose-input::placeholder {\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-compose-send {\n width: 40px;\n height: 40px;\n background: #007aff;\n border: none;\n border-radius: 50%;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.messenger-compose-send:hover:not(:disabled) {\n background: #0066d6;\n transform: scale(1.05);\n}\n\n.messenger-compose-send:disabled {\n background: #3c3c3e;\n color: rgba(255, 255, 255, 0.3);\n cursor: not-allowed;\n}\n\n/* ========================================\n Help View\n ======================================== */\n\n.messenger-help-header {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n position: relative;\n}\n\n.messenger-help-header h2 {\n margin: 0;\n font-size: 17px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-help-header .messenger-close-btn {\n position: absolute;\n right: 16px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.messenger-help-search {\n padding: 0 16px 16px;\n}\n\n.messenger-help-search-wrapper {\n display: flex;\n align-items: center;\n background: #2c2c2e;\n border-radius: 12px;\n padding: 14px 16px;\n position: relative;\n}\n\n.messenger-help-search-icon {\n position: absolute;\n right: 16px;\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-help-search-input {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n color: white;\n font-size: 16px;\n font-family: inherit;\n padding-right: 32px;\n}\n\n.messenger-help-search-input::placeholder {\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-help-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-help-collections-header {\n font-size: 17px;\n font-weight: 600;\n color: white;\n padding: 12px 16px 8px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-help-collections {\n padding: 0;\n}\n\n.messenger-help-collection {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-help-collection:hover {\n background: rgba(255, 255, 255, 0.05);\n}\n\n.messenger-help-collection-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-help-collection-title {\n margin: 0 0 2px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-help-collection-desc {\n margin: 0 0 2px;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.7);\n line-height: 1.3;\n}\n\n.messenger-help-collection-count {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-help-collection-arrow {\n color: rgba(255, 255, 255, 0.3);\n flex-shrink: 0;\n margin-left: 12px;\n}\n\n.messenger-help-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-help-empty-icon {\n color: rgba(255, 255, 255, 0.3);\n margin-bottom: 16px;\n}\n\n.messenger-help-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-help-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n/* ========================================\n Changelog View\n ======================================== */\n\n.messenger-changelog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-changelog-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-changelog-subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-changelog-latest {\n font-size: 12px;\n font-weight: 600;\n color: rgba(255, 255, 255, 0.5);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.messenger-changelog-team {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.6);\n}\n\n.messenger-changelog-body {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.messenger-changelog-card {\n background: #2c2c2e;\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.messenger-changelog-card:hover {\n background: #3c3c3e;\n transform: translateY(-2px);\n}\n\n.messenger-changelog-cover {\n height: 120px;\n overflow: hidden;\n}\n\n.messenger-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.messenger-changelog-content {\n padding: 16px;\n}\n\n.messenger-changelog-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.messenger-changelog-tag {\n font-size: 11px;\n font-weight: 600;\n color: white;\n background: rgba(88, 86, 214, 0.3);\n padding: 4px 10px;\n border-radius: 12px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.messenger-changelog-title {\n margin: 0 0 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n line-height: 1.3;\n}\n\n.messenger-changelog-description {\n margin: 0 0 12px;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.6);\n line-height: 1.4;\n}\n\n.messenger-changelog-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.messenger-changelog-date {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n.messenger-changelog-arrow {\n color: rgba(255, 255, 255, 0.3);\n}\n\n.messenger-changelog-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-changelog-empty-icon {\n color: rgba(255, 255, 255, 0.3);\n margin-bottom: 16px;\n}\n\n.messenger-changelog-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-changelog-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n/* ========================================\n Navigation Tabs\n ======================================== */\n\n.messenger-panel-nav {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n background: #1c1c1e;\n}\n\n.messenger-nav {\n display: flex;\n padding: 8px 12px;\n gap: 4px;\n}\n\n.messenger-nav-tab {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 4px;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 8px;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.messenger-nav-tab:hover {\n background: rgba(255, 255, 255, 0.05);\n}\n\n.messenger-nav-icon {\n color: rgba(255, 255, 255, 0.5);\n transition: color 0.2s ease;\n}\n\n.messenger-nav-home-icon {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.messenger-nav-home-icon > i:first-child {\n position: relative;\n}\n\n.messenger-nav-home-icon > i:last-child {\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translateX(-50%);\n transition: color 0.2s ease, filter 0.2s ease;\n}\n\n.messenger-nav-tab:hover .messenger-nav-home-icon > i:last-child {\n color: #ffd700;\n filter: drop-shadow(0 0 4px #ffd700);\n}\n\n.messenger-nav-label {\n font-size: 14px;\n font-weight: 400;\n color: rgba(255, 255, 255, 0.5);\n transition: color 0.2s ease;\n}\n\n.messenger-nav-tab.active .messenger-nav-icon {\n color: white;\n}\n\n.messenger-nav-tab.active .messenger-nav-label {\n color: white;\n font-weight: 400;\n}\n\n.messenger-nav-badge {\n position: absolute;\n top: 4px;\n right: calc(50% - 16px);\n min-width: 16px;\n height: 16px;\n background: #ef4444;\n color: white;\n font-size: 10px;\n font-weight: 600;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n}\n\n/* ========================================\n Light Theme Overrides\n ======================================== */\n\n/* Panel */\n.theme-light .messenger-panel-content {\n background: #ffffff;\n}\n\n/* Home View */\n.theme-light .messenger-home-view {\n background: linear-gradient(180deg, #f5f5f7 0%, #ffffff 40%);\n}\n\n.theme-light .messenger-home-header {\n background: linear-gradient(180deg, rgba(88, 86, 214, 0.1) 0%, transparent 100%);\n}\n\n.theme-light .messenger-home-greeting {\n color: #86868b;\n}\n\n.theme-light .messenger-home-question {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-home-message-btn {\n background: #f5f5f7;\n color: #1d1d1f;\n border: 1px solid #e0e0e0;\n}\n\n.theme-light .messenger-home-message-btn:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-home-message-btn svg,\n.theme-light .messenger-home-message-btn i {\n color: #86868b;\n}\n\n.theme-light .messenger-home-featured {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-home-featured-content h3 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-home-featured-content p {\n color: #86868b;\n}\n\n.theme-light .messenger-home-changelog-card {\n background: #f5f5f7;\n border: 1px solid #e0e0e0;\n}\n\n.theme-light .messenger-home-changelog-card-content {\n border-top-color: #e0e0e0;\n}\n\n.theme-light .messenger-home-changelog-card:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-home-changelog-card-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-home-changelog-card-desc {\n color: #6e6e73;\n}\n\n/* Close/Back buttons */\n.theme-light .messenger-close-btn,\n.theme-light .messenger-back-btn {\n color: #86868b;\n}\n\n.theme-light .messenger-close-btn:hover,\n.theme-light .messenger-back-btn:hover {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n/* Avatar */\n.theme-light .messenger-avatar {\n border-color: #ffffff;\n}\n\n/* Conversations View */\n.theme-light .messenger-conversations-view {\n background: #ffffff;\n}\n\n.theme-light .messenger-conversations-header,\n.theme-light .messenger-help-header,\n.theme-light .messenger-changelog-header,\n.theme-light .messenger-chat-header {\n background: #ffffff;\n border-bottom-color: #e5e5e7;\n}\n\n.theme-light .messenger-conversations-header h2,\n.theme-light .messenger-help-header h2,\n.theme-light .messenger-changelog-header h2 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-conversations-body {\n background: #ffffff;\n}\n\n.theme-light .messenger-conversations-footer {\n background: #ffffff;\n}\n\n.theme-light .messenger-conversations-empty-icon,\n.theme-light .messenger-chat-empty-avatars,\n.theme-light .messenger-help-empty-icon,\n.theme-light .messenger-changelog-empty-icon {\n color: #c7c7cc;\n}\n\n.theme-light .messenger-conversations-empty h3,\n.theme-light .messenger-chat-empty h3,\n.theme-light .messenger-help-empty h3,\n.theme-light .messenger-changelog-empty h3 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-conversations-empty p,\n.theme-light .messenger-chat-empty p,\n.theme-light .messenger-help-empty p,\n.theme-light .messenger-changelog-empty p {\n color: #86868b;\n}\n\n.theme-light .messenger-conversation-item:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.theme-light .messenger-conversation-title {\n color: #1d1d1f !important;\n}\n\n.theme-light .messenger-conversation-item.unread .messenger-conversation-title {\n color: #1d1d1f !important;\n font-weight: 400;\n}\n\n.theme-light .messenger-conversation-time {\n color: #86868b !important;\n}\n\n.theme-light .messenger-conversation-message {\n color: #6e6e73 !important;\n}\n\n.theme-light .messenger-conversation-item.unread .messenger-conversation-message {\n color: #3a3a3c !important;\n}\n\n.theme-light .messenger-chat-title,\n.theme-light .messenger-help-article-title,\n.theme-light .messenger-changelog-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-help-article-desc,\n.theme-light .messenger-changelog-description {\n color: #86868b;\n}\n\n.theme-light .messenger-conversations-footer {\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-new-message-btn {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n.theme-light .messenger-new-message-btn:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-new-message-btn svg,\n.theme-light .messenger-new-message-btn i {\n color: #86868b;\n}\n\n/* Chat View */\n.theme-light .messenger-chat-view {\n background: #ffffff;\n}\n\n.theme-light .messenger-chat-header {\n background: #ffffff;\n}\n\n.theme-light .messenger-chat-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-chat-messages {\n background: #ffffff;\n}\n\n.theme-light .messenger-chat-empty h3 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-chat-empty p {\n color: #86868b;\n}\n\n.theme-light .messenger-message-sender {\n color: #86868b;\n}\n\n.theme-light .messenger-message-received .messenger-message-bubble {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n.theme-light .messenger-message-own .messenger-message-bubble {\n background: #007aff;\n color: #ffffff;\n}\n\n.theme-light .messenger-message-time {\n color: #86868b;\n}\n\n.theme-light .messenger-chat-compose {\n background: #ffffff;\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-compose-input-wrapper {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-compose-input {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-compose-input::placeholder {\n color: #86868b;\n}\n\n.theme-light .messenger-compose-send:disabled {\n background: #e5e5e7;\n color: #c7c7cc;\n}\n\n/* Help View */\n.theme-light .messenger-help-view {\n background: #ffffff;\n}\n\n.theme-light .messenger-help-body {\n background: #ffffff;\n}\n\n.theme-light .messenger-help-search {\n background: #ffffff;\n}\n\n.theme-light .messenger-help-search-wrapper {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-help-search-icon {\n color: #86868b;\n}\n\n.theme-light .messenger-help-search-input {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-help-search-input::placeholder {\n color: #86868b;\n}\n\n.theme-light .messenger-help-collections-header {\n color: #1d1d1f;\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-help-collection {\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-help-collection:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.theme-light .messenger-help-collection-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-help-collection-desc {\n color: #6e6e73;\n}\n\n.theme-light .messenger-help-collection-count {\n color: #86868b;\n}\n\n.theme-light .messenger-help-collection-arrow {\n color: #c7c7cc;\n}\n\n/* Changelog View */\n.theme-light .messenger-changelog-subheader {\n border-bottom-color: #e5e5e7;\n}\n\n.theme-light .messenger-changelog-latest {\n color: #86868b;\n}\n\n.theme-light .messenger-changelog-team {\n color: #86868b;\n}\n\n.theme-light .messenger-changelog-card {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-changelog-card:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-changelog-tag {\n background: rgba(0, 122, 255, 0.15);\n color: #007aff;\n}\n\n.theme-light .messenger-changelog-date {\n color: #86868b;\n}\n\n.theme-light .messenger-changelog-arrow {\n color: #c7c7cc;\n}\n\n/* Navigation */\n.theme-light .messenger-panel-nav {\n background: #ffffff;\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-nav-icon {\n color: #86868b;\n}\n\n.theme-light .messenger-nav-label {\n color: #86868b;\n}\n\n.theme-light .messenger-nav-tab:hover {\n background: rgba(0, 0, 0, 0.05);\n}\n\n.theme-light .messenger-nav-tab.active .messenger-nav-icon,\n.theme-light .messenger-nav-tab.active .messenger-nav-label {\n color: #007aff;\n}\n\n/* ========================================\n Responsive Design\n ======================================== */\n\n@media (max-width: 480px) {\n .messenger-panel {\n width: 100%;\n height: 100%;\n max-height: 100%;\n bottom: 0;\n right: 0;\n left: 0;\n border-radius: 0;\n }\n\n .messenger-panel-content {\n border-radius: 0;\n }\n\n .messenger-launcher {\n bottom: 16px;\n right: 16px;\n }\n\n .messenger-launcher-bottom-left {\n left: 16px;\n }\n}\n\n/* ========================================\n Availability Status\n ======================================== */\n\n.messenger-home-availability,\n.messenger-chat-availability {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.7);\n}\n\n.theme-light .messenger-home-availability,\n.theme-light .messenger-chat-availability {\n color: #6b7280;\n}\n\n.messenger-availability-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.messenger-availability-online {\n background: #22c55e;\n box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.2);\n}\n\n.messenger-availability-away {\n background: #9ca3af;\n}\n\n.messenger-availability-text {\n opacity: 0.9;\n}\n\n/* ========================================\n Typing Indicator\n ======================================== */\n\n.messenger-typing-indicator {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n margin: 4px 0;\n}\n\n.messenger-typing-dots {\n display: flex;\n align-items: center;\n gap: 4px;\n background: #374151;\n padding: 8px 12px;\n border-radius: 16px;\n}\n\n.theme-light .messenger-typing-dots {\n background: #e5e7eb;\n}\n\n.messenger-typing-dots span {\n width: 6px;\n height: 6px;\n background: #9ca3af;\n border-radius: 50%;\n animation: messenger-typing-bounce 1.4s infinite ease-in-out;\n}\n\n.messenger-typing-dots span:nth-child(1) {\n animation-delay: -0.32s;\n}\n\n.messenger-typing-dots span:nth-child(2) {\n animation-delay: -0.16s;\n}\n\n.messenger-typing-dots span:nth-child(3) {\n animation-delay: 0s;\n}\n\n.messenger-typing-text {\n font-size: 12px;\n color: #9ca3af;\n}\n\n@keyframes messenger-typing-bounce {\n 0%, 80%, 100% {\n transform: scale(0.8);\n opacity: 0.5;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n/* ========================================\n Animations\n ======================================== */\n\n@keyframes messenger-slide-up {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes messenger-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .messenger-launcher-btn,\n .messenger-panel,\n .messenger-nav-tab,\n .messenger-conversation-item,\n .messenger-help-article,\n .messenger-changelog-card {\n transition: none;\n }\n}\n",document.head.appendChild(e)}}function H(){if("undefined"!=typeof window&&window.FeedbackSDKConfig){F();const e={...window.FeedbackSDKConfig},t=new B(e);t.init().then(n=>{if(window.FeedbackSDK.instance=t,window.FeedbackSDKConfig.autoCreate){(Array.isArray(window.FeedbackSDKConfig.autoCreate)?window.FeedbackSDKConfig.autoCreate:[window.FeedbackSDKConfig.autoCreate]).forEach(e=>{try{t.createWidget(e.type||"button",e).mount(e.container)}catch(e){console.error("[FeedbackSDK] Failed to create widget:",e)}})}if("undefined"!=typeof CustomEvent){const s=new CustomEvent("FeedbackSDKReady",{detail:{sdk:t,config:e,initData:n}});window.dispatchEvent(s)}}).catch(t=>{if(console.error("[FeedbackSDK] Auto-initialization failed:",t),"undefined"!=typeof CustomEvent){const n=new CustomEvent("FeedbackSDKError",{detail:{error:t,config:e,phase:"initialization"}});window.dispatchEvent(n)}})}}const j={FeedbackSDK:B,BaseWidget:y,ButtonWidget:w,ChangelogWidget:x,TabWidget:O,InlineWidget:k,SurveyWidget:D,MessengerWidget:L,WidgetFactory:N,EventBus:m,APIService:p,SDKError:t,APIError:n,WidgetError:s,ConfigError:i,ValidationError:a,helpers:v,create:e=>(F(),new B(e)),version:"1.0.0",instance:null,isReady:()=>Boolean(j.instance),getInstance:()=>j.instance,setUserContext:e=>{j.instance?j.instance.setUserContext(e):"undefined"!=typeof window&&(window.FeedbackSDKUserContext=e)},initWithUser:async(e,t)=>{F();const n={...e,userContext:t},s=new B(n);return await s.init(),"undefined"!=typeof window&&(window.FeedbackSDK.instance=s),s},onReady:e=>{"undefined"!=typeof window&&(j.isReady()?e(j.instance):window.addEventListener("FeedbackSDKReady",t=>{e(t.detail.sdk,t.detail)},{once:!0}))},onError:e=>{"undefined"!=typeof window&&window.addEventListener("FeedbackSDKError",t=>{e(t.detail.error,t.detail)})},extractUserContext:B.extractUserContextFromAuth};"undefined"!=typeof window&&(window.FeedbackSDK=j,"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",H):setTimeout(H,0))),e.APIError=n,e.APIService=p,e.BaseWidget=y,e.ButtonWidget=w,e.ChangelogWidget=x,e.ConfigError=i,e.EventBus=m,e.FeedbackSDK=B,e.InlineWidget=k,e.MessengerWidget=L,e.SDKError=t,e.SurveyWidget=D,e.TabWidget=O,e.ValidationError=a,e.WidgetError=s,e.WidgetFactory=N,e.default=j,e.helpers=v,Object.defineProperty(e,"__esModule",{value:!0})});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).FeedbackSDK={})}(this,function(e){"use strict";class t extends Error{constructor(e,n){super(e),this.name="SDKError",this.cause=n,Error.captureStackTrace&&Error.captureStackTrace(this,t)}}class n extends Error{constructor(e,t,s){super(t),this.name="APIError",this.status=e,this.response=s,Error.captureStackTrace&&Error.captureStackTrace(this,n)}isNetworkError(){return 0===this.status}isClientError(){return this.status>=400&&this.status<500}isServerError(){return this.status>=500&&this.status<600}}class s extends Error{constructor(e,t,n){super(e),this.name="WidgetError",this.widgetType=t,this.widgetId=n,Error.captureStackTrace&&Error.captureStackTrace(this,s)}}class i extends Error{constructor(e,t){super(e),this.name="ConfigError",this.configKey=t,Error.captureStackTrace&&Error.captureStackTrace(this,i)}}class a extends Error{constructor(e,t,n){super(e),this.name="ValidationError",this.field=t,this.value=n,Error.captureStackTrace&&Error.captureStackTrace(this,a)}}const o={primaryColor:"#21244A",backgroundColor:"#ffffff",textColor:"#1F2937",boardId:"feature-requests",size:"medium",displayMode:"modal"},r=[{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"}],l=[{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}}],c={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()}]},d=[{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:"#"}],h=[{id:"mock_nps_survey",type:"nps",title:"How likely are you to recommend us?",description:"Your feedback helps us improve",low_label:"Not likely",high_label:"Very likely",trigger:"manual",status:"active"},{id:"mock_csat_survey",type:"csat",title:"How satisfied are you?",description:"Rate your experience with our product",trigger:"manual",status:"active"},{id:"mock_ces_survey",type:"ces",title:"How easy was it?",description:"Rate the ease of completing your task",low_label:"Very difficult",high_label:"Very easy",trigger:"manual",status:"active"}],g={production:{base:"https://api.product7.io/api/v1",withWorkspace:e=>`https://${e}.api.product7.io/api/v1`},staging:{base:"https://staging.api.product7.io/api/v1",withWorkspace:e=>`https://${e}.staging.api.product7.io/api/v1`}};class p{constructor(e={}){if(this.workspace=e.workspace,this.sessionToken=null,this.sessionExpiry=null,this.userContext=e.userContext||null,this.mock=e.mock||!1,this.env=e.env||"production",e.apiUrl)this.baseURL=e.apiUrl;else{const e=g[this.env]||g.production;this.baseURL=this.workspace?e.withWorkspace(this.workspace):e.base}this._loadStoredSession()}async init(e=null){if(e&&(this.userContext=e),this.isSessionValid())return{sessionToken:this.sessionToken};if(!this.userContext||!this.workspace){const e=`Missing ${this.workspace?"user context":"workspace"} for initialization`;throw new n(400,e)}if(this.mock)return this.sessionToken="mock_session_"+Date.now(),this.sessionExpiry=new Date(Date.now()+36e5),this._storeSession(),{sessionToken:this.sessionToken,config:o,expiresIn:3600};const t={workspace:this.workspace,user:this.userContext};try{const e=await this._makeRequest("/widget/init",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json"}});return this.sessionToken=e.session_token,this.sessionExpiry=new Date(Date.now()+1e3*e.expires_in),this._storeSession(),{sessionToken:this.sessionToken,config:e.config||{},expiresIn:e.expires_in}}catch(e){throw new n(e.status||500,`Failed to initialize widget: ${e.message}`,e.response)}}async submitFeedback(e){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(this.mock)return await new Promise(e=>setTimeout(e,500)),{success:!0,data:{id:"mock_post_"+Date.now(),title:e.title,content:e.content},message:"Feedback submitted successfully!"};const t={board:e.board_id||e.board||e.boardId,title:e.title,content:e.content,attachments:e.attachments||[]};try{return await this._makeRequest("/widget/feedback",{method:"POST",body:JSON.stringify(t),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.submitFeedback(e);throw new n(t.status||500,`Failed to submit feedback: ${t.message}`,t.response)}}async getActiveSurveys(e={}){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(this.mock)return await new Promise(e=>setTimeout(e,200)),{success:!0,data:h};try{const t=new URLSearchParams,n=e.url||("undefined"!=typeof window?window.location.href:"");n&&t.append("url",n);const s=this._getDeviceInfo();s.device&&t.append("device",s.device),s.browser&&t.append("browser",s.browser),s.os&&t.append("os",s.os),e.userProperties&&t.append("user_properties",JSON.stringify(e.userProperties));const i="/widget/surveys/active"+(t.toString()?"?"+t.toString():"");return await this._makeRequest(i,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.getActiveSurveys(e);throw new n(t.status||500,`Failed to get active surveys: ${t.message}`,t.response)}}_getDeviceInfo(){if("undefined"==typeof navigator)return{device:null,browser:null,os:null};const e=navigator.userAgent;let t="desktop";/Mobi|Android/i.test(e)&&(t=/Tablet|iPad/i.test(e)?"tablet":"mobile");let n="unknown";e.includes("Firefox")?n="firefox":e.includes("Edg")?n="edge":e.includes("Chrome")?n="chrome":e.includes("Safari")?n="safari":(e.includes("Opera")||e.includes("OPR"))&&(n="opera");let s="unknown";return e.includes("Windows")?s="windows":e.includes("Mac")?s="macos":e.includes("Linux")?s="linux":e.includes("Android")?s="android":(e.includes("iPhone")||e.includes("iPad"))&&(s="ios"),{device:t,browser:n,os:s}}async submitSurveyResponse(e,t){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(!e)throw new n(400,"Survey ID is required");if(this.mock)return await new Promise(e=>setTimeout(e,300)),{success:!0,data:{id:"mock_response_"+Date.now(),survey_id:e,...t},message:"Survey response submitted successfully!"};const s={rating:t.rating,feedback:t.feedback||"",answers:t.answers||{}};try{return await this._makeRequest(`/widget/surveys/${e}/responses`,{method:"POST",body:JSON.stringify(s),headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`}})}catch(s){if(401===s.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.submitSurveyResponse(e,t);throw new n(s.status||500,`Failed to submit survey response: ${s.message}`,s.response)}}async dismissSurvey(e){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(!e)throw new n(400,"Survey ID is required");if(this.mock)return await new Promise(e=>setTimeout(e,100)),{success:!0,message:"Survey dismissed successfully"};try{return await this._makeRequest(`/widget/surveys/${e}/dismiss`,{method:"POST",headers:{Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.dismissSurvey(e);throw new n(t.status||500,`Failed to dismiss survey: ${t.message}`,t.response)}}async getMessengerSettings(){return this.isSessionValid()||await this.init(),this.mock?{status:!0,data:{enabled:!0,greeting_message:"Hi there! How can we help you today?",team_name:"Support Team",response_time:"Usually replies within a few minutes"}}:this._makeRequest("/widget/messenger/settings",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async checkAgentsOnline(){return this.isSessionValid()||await this.init(),this.mock?{status:!0,data:{agents_online:!0,online_count:2,response_time:"Usually replies within a few minutes"}}:this._makeRequest("/widget/messenger/agents/online",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getConversations(e={}){if(this.isSessionValid()||await this.init(),this.mock)return await new Promise(e=>setTimeout(e,300)),{status:!0,data:l,meta:{total:l.length,page:1,limit:20}};const t=new URLSearchParams;e.page&&t.append("page",e.page),e.limit&&t.append("limit",e.limit);const n="/widget/messenger/conversations"+(t.toString()?"?"+t.toString():"");return this._makeRequest(n,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getConversation(e){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));return{status:!0,data:{...l.find(t=>t.id===e),messages:c[e]||[]}}}return this._makeRequest(`/widget/messenger/conversations/${e}`,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getMessages(e,t={}){if(this.isSessionValid()||await this.init(),this.mock)return await new Promise(e=>setTimeout(e,200)),{status:!0,data:c[e]||[]};const n=new URLSearchParams;t.page&&n.append("page",t.page),t.limit&&n.append("limit",t.limit);const s=`/widget/messenger/conversations/${e}/messages${n.toString()?"?"+n.toString():""}`;return this._makeRequest(s,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async startConversation(e){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,300));const t={id:"conv_"+Date.now(),subject:e.subject||"New conversation",status:"open",last_message_at:(new Date).toISOString(),created_at:(new Date).toISOString(),messages:[{id:"msg_"+Date.now(),content:e.message,sender_type:"customer",created_at:(new Date).toISOString()}]};return l.unshift(t),c[t.id]=t.messages,{status:!0,data:t}}return this._makeRequest("/widget/messenger/conversations",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({message:e.message,subject:e.subject||""})})}async sendMessage(e,t){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));const n={id:"msg_"+Date.now(),content:t.content,sender_type:"customer",created_at:(new Date).toISOString()};return c[e]||(c[e]=[]),c[e].push(n),{status:!0,data:n}}return this._makeRequest(`/widget/messenger/conversations/${e}/messages`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({content:t.content})})}async sendTypingIndicator(e,t){return this.isSessionValid()||await this.init(),this.mock?{status:!0}:this._makeRequest(`/widget/messenger/conversations/${e}/typing`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({is_typing:t})})}async markConversationAsRead(e){return this.isSessionValid()||await this.init(),this.mock?{status:!0}:this._makeRequest(`/widget/messenger/conversations/${e}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getUnreadCount(){if(this.isSessionValid()||await this.init(),this.mock){const e=l.reduce((e,t)=>e+(t.unread||0),0);return{status:!0,data:{unread_count:e,unread_conversations:e>0?1:0}}}return this._makeRequest("/widget/messenger/unread",{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async submitRating(e,t){return this.isSessionValid()||await this.init(),this.mock?{status:!0,message:"Thank you for your feedback!"}:this._makeRequest(`/widget/messenger/conversations/${e}/rate`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify({rating:t.rating,comment:t.comment||""})})}async identifyContact(e){return this.isSessionValid()||await this.init(),this.mock?{status:!0,message:"Contact identified"}:this._makeRequest("/widget/messenger/identify",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.sessionToken}`},body:JSON.stringify(e)})}async getHelpCollections(e={}){if(this.isSessionValid()||await this.init(),this.mock)return await new Promise(e=>setTimeout(e,200)),{status:!0,data:d};const t=new URLSearchParams;e.limit&&t.append("limit",e.limit);const n="/widget/help/collections"+(t.toString()?"?"+t.toString():"");return this._makeRequest(n,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async searchHelpArticles(e,t={}){if(this.isSessionValid()||await this.init(),this.mock){await new Promise(e=>setTimeout(e,200));return{status:!0,data:d.filter(t=>t.title.toLowerCase().includes(e.toLowerCase())||t.description.toLowerCase().includes(e.toLowerCase()))}}const n=new URLSearchParams({q:e});return t.limit&&n.append("limit",t.limit),this._makeRequest(`/widget/help/search?${n.toString()}`,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}async getChangelogs(e={}){if(this.isSessionValid()||await this.init(),!this.sessionToken)throw new n(401,"No valid session token available");if(this.mock)return await new Promise(e=>setTimeout(e,300)),{success:!0,data:r};try{const t=new URLSearchParams;e.limit&&t.append("limit",e.limit),e.offset&&t.append("offset",e.offset);const n="/widget/changelogs"+(t.toString()?"?"+t.toString():"");return await this._makeRequest(n,{method:"GET",headers:{Authorization:`Bearer ${this.sessionToken}`}})}catch(t){if(401===t.status)return this.sessionToken=null,this.sessionExpiry=null,await this.init(),this.getChangelogs(e);throw new n(t.status||500,`Failed to get changelogs: ${t.message}`,t.response)}}isSessionValid(){return this.sessionToken&&this.sessionExpiry&&new Date<this.sessionExpiry}setUserContext(e){this.userContext=e,"undefined"!=typeof localStorage&&localStorage.setItem("feedbackSDK_userContext",JSON.stringify(e))}getUserContext(){return this.userContext}clearSession(){this.sessionToken=null,this.sessionExpiry=null,"undefined"!=typeof localStorage&&(localStorage.removeItem("feedbackSDK_session"),localStorage.removeItem("feedbackSDK_userContext"))}_storeSession(){if("undefined"!=typeof localStorage)try{const e={token:this.sessionToken,expiry:this.sessionExpiry.toISOString(),workspace:this.workspace};localStorage.setItem("feedbackSDK_session",JSON.stringify(e))}catch(e){}}_loadStoredSession(){if("undefined"==typeof localStorage)return!1;try{const e=localStorage.getItem("feedbackSDK_session");if(!e)return!1;const t=JSON.parse(e);return this.sessionToken=t.token,this.sessionExpiry=new Date(t.expiry),this.isSessionValid()}catch(e){return!1}}async _makeRequest(e,t={}){const s=`${this.baseURL}${e}`;try{const e=await fetch(s,t);if(!e.ok){let t=`HTTP ${e.status}`,s=null;try{s=await e.json(),t=s.message||s.error||t}catch(n){t=await e.text()||t}throw new n(e.status,t,s)}const i=e.headers.get("content-type");return i&&i.includes("application/json")?await e.json():await e.text()}catch(e){if(e instanceof n)throw e;throw new n(0,e.message,null)}}}class m{constructor(){this.events=new Map}on(e,t){return this.events.has(e)||this.events.set(e,[]),this.events.get(e).push(t),()=>this.off(e,t)}off(e,t){const n=this.events.get(e);if(n){const e=n.indexOf(t);e>-1&&n.splice(e,1)}}emit(e,t){const n=this.events.get(e);n&&n.forEach(e=>{try{e(t)}catch(e){console.error("[FeedbackSDK] Event callback error:",e)}})}once(e,t){const n=this.on(e,e=>{t(e),n()});return n}clear(){this.events.clear()}getListenerCount(e){const t=this.events.get(e);return t?t.length:0}}function u(e="feedback"){return`${e}_${Date.now()}_${Math.random().toString(36).substring(2,9)}`}function b(e,t){const n={...e};for(const s in t)t.hasOwnProperty(s)&&(t[s]&&"object"==typeof t[s]&&!Array.isArray(t[s])?n[s]=b(e[s]||{},t[s]):n[s]=t[s]);return n}function f(){return"undefined"!=typeof window&&"undefined"!=typeof document}var v=Object.freeze({__proto__:null,debounce:function(e,t){let n;return function(...s){clearTimeout(n),n=setTimeout(()=>{clearTimeout(n),e(...s)},t)}},deepMerge:b,delay:function(e){return new Promise(t=>setTimeout(t,e))},escapeRegex:function(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")},formatFileSize:function(e){if(0===e)return"0 Bytes";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["Bytes","KB","MB","GB"][t]},generateId:u,getBrowserInfo:function(){return{userAgent:navigator.userAgent,platform:navigator.platform,language:navigator.language||navigator.userLanguage,cookieEnabled:navigator.cookieEnabled,screenResolution:`${screen.width}x${screen.height}`,windowSize:`${window.innerWidth}x${window.innerHeight}`,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}},getCSSProperty:function(e,t,n=""){if(!e||!t)return n;try{return window.getComputedStyle(e).getPropertyValue(t)||n}catch(e){return n}},getCurrentTimestamp:function(){return(new Date).toISOString()},getNestedProperty:function(e,t,n=void 0){if(!e||!t)return n;const s=t.split(".");let i=e;for(const e of s){if(null==i||!(e in i))return n;i=i[e]}return i},isBrowser:f,isInViewport:function(e){if(!e)return!1;const t=e.getBoundingClientRect();return t.top>=0&&t.left>=0&&t.bottom<=(window.innerHeight||document.documentElement.clientHeight)&&t.right<=(window.innerWidth||document.documentElement.clientWidth)},isMobile:function(){return!!f()&&(/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)||window.innerWidth<=768)},isValidEmail:function(e){return!(!e||"string"!=typeof e)&&/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e.trim())},safeJsonParse:function(e,t=null){try{return JSON.parse(e)}catch(e){return t}},sanitizeHTML:function(e){if(!e||"string"!=typeof e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML},scrollToElement:function(e,t={}){if(!e)return;e.scrollIntoView({behavior:"smooth",block:"center",inline:"nearest",...t})},setNestedProperty:function(e,t,n){if(!e||!t)return e;const s=t.split("."),i=s.pop();let a=e;for(const e of s)e in a&&"object"==typeof a[e]||(a[e]={}),a=a[e];return a[i]=n,e},throttle:function(e,t){let n,s;return function(...i){s?(clearTimeout(n),n=setTimeout(()=>{Date.now()-s>=t&&(e(...i),s=Date.now())},t-(Date.now()-s))):(e(...i),s=Date.now())}},validateConfig:function(e,t=[]){const n=[];for(const s of t)e[s]||n.push(s);if(n.length>0)throw new Error(`Missing required configuration: ${n.join(", ")}`);return!0}});class y{static STORAGE_KEY="feedback_submitted";static DEFAULT_COOLDOWN_DAYS=30;constructor(e={}){this.id=e.id,this.sdk=e.sdk,this.apiService=e.apiService,this.type=e.type||"base",this.options={container:null,position:this.sdk.config.position,boardId:this.sdk.config.boardId,displayMode:e.displayMode||"panel",size:e.size||"medium",primaryColor:e.primaryColor||"#21244A",backgroundColor:e.backgroundColor||"#ffffff",textColor:e.textColor||"#1F2937",autoShow:!1,showBackdrop:!0,customStyles:{},suppressAfterSubmission:!0,suppressionDays:y.DEFAULT_COOLDOWN_DAYS,...e},this.element=null,this.panelElement=null,this.backdropElement=null,this.mounted=!1,this.destroyed=!1,this.state={isOpen:!1,isLoading:!1,isSubmitting:!1,title:"",content:"",email:"",attachments:[],errors:{}},this._bindMethods()}mount(e){return this.mounted||this.destroyed?this:this.options.suppressAfterSubmission&&this._hasRecentlySubmitted()?(this.sdk.eventBus.emit("widget:suppressed",{widget:this,reason:"recently_submitted"}),this):("string"==typeof e&&(e=document.querySelector(e)),e||(e=document.body),this.container=e,this.element=this._render(),this.container.appendChild(this.element),this.mounted=!0,this._attachEvents(),this.onMount(),this.options.autoShow&&this.show(),this.sdk.eventBus.emit("widget:mounted",{widget:this}),this)}show(){return this.element&&(this.element.style.display="block"),this}hide(){return this.element&&(this.element.style.display="none"),this}openPanel(){this.state.isOpen=!0,"modal"===this.options.displayMode?(this._showLoadingModal(),setTimeout(()=>{this._hideLoadingModal(),this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")})},600)):(this._renderPanel(),requestAnimationFrame(()=>{this.panelElement&&this.panelElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}_showLoadingModal(){this.state.isLoading=!0,this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-panel-backdrop",document.body.appendChild(this.backdropElement),this.loadingElement=document.createElement("div"),this.loadingElement.className=`feedback-loading-modal theme-${this.options.theme}`,this.loadingElement.innerHTML='\n\t\t\t<div class="feedback-loading-spinner"></div>\n\t\t',document.body.appendChild(this.loadingElement),requestAnimationFrame(()=>{this.backdropElement.classList.add("show"),this.loadingElement.classList.add("show")})}_hideLoadingModal(){this.state.isLoading=!1,this.loadingElement&&(this.loadingElement.remove(),this.loadingElement=null)}closePanel(){this.panelElement&&this.panelElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.panelElement&&this.panelElement.parentNode&&(this.panelElement.parentNode.removeChild(this.panelElement),this.panelElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null),this._resetForm()},300)}async submitFeedback(){if(!this.state.isSubmitting){this._hideError();try{this.state.isSubmitting=!0,this._updateSubmitButton();const e={title:this.state.title||"Feedback",content:this.state.content,email:this.state.email,board_id:this.options.boardId,attachments:this.state.attachments};if(!this.state.content.trim())return void this._showError("Please enter your feedback message.");const t=await this.apiService.submitFeedback(e);this._trackSubmission(),this._showSuccessMessage(),this.closePanel(),this.sdk.eventBus.emit("feedback:submitted",{widget:this,feedback:t})}catch(e){this._showError("Failed to submit feedback. Please try again."),this.sdk.eventBus.emit("feedback:error",{widget:this,error:e})}finally{this.state.isSubmitting=!1,this._updateSubmitButton()}}}handleConfigUpdate(e){this.options.theme=e.theme,this.element&&this._updateTheme()}destroy(){this.destroyed||(this.onDestroy(),this.closePanel(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element),this.destroyed=!0,this.mounted=!1,this.sdk.eventBus.emit("widget:destroyed",{widget:this}))}onMount(){}onDestroy(){}_trackSubmission(){try{const e=this.sdk.config.workspace,t=`${y.STORAGE_KEY}_${e}`,n={submittedAt:Date.now(),boardId:this.options.boardId};localStorage.setItem(t,JSON.stringify(n))}catch(e){console.warn("Failed to track feedback submission:",e)}}_hasRecentlySubmitted(){const e=24*this.options.suppressionDays*60*60*1e3,t=Date.now();if(this.sdk.config.last_feedback_at)try{if(t-new Date(this.sdk.config.last_feedback_at).getTime()<e)return!0}catch(e){}try{const n=this.sdk.config.workspace,s=`${y.STORAGE_KEY}_${n}`,i=localStorage.getItem(s);if(!i)return!1;const a=JSON.parse(i);return t-a.submittedAt<e}catch(e){return!1}}clearSubmissionTracking(){try{const e=this.sdk.config.workspace,t=`${y.STORAGE_KEY}_${e}`;localStorage.removeItem(t)}catch(e){console.warn("Failed to clear submission tracking:",e)}}shouldShow(){return!this.options.suppressAfterSubmission||!this._hasRecentlySubmitted()}_render(){throw new Error("_render() must be implemented by concrete widget")}_attachEvents(){}_bindMethods(){this.openPanel=this.openPanel.bind(this),this.closePanel=this.closePanel.bind(this),this.submitFeedback=this.submitFeedback.bind(this)}_renderPanel(){if(this.panelElement)return;this.options.showBackdrop&&!this.backdropElement&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-panel-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",this.closePanel));const e="modal"===this.options.displayMode?"feedback-modal":"feedback-panel",t=`size-${this.options.size}`;this.panelElement=document.createElement("div"),this.panelElement.className=`${e} ${t}`,this.panelElement.style.setProperty("--primary-color",this.options.primaryColor),this.panelElement.style.setProperty("--bg-color",this.options.backgroundColor),this.panelElement.style.setProperty("--text-color",this.options.textColor),this.panelElement.innerHTML=this._getPanelHTML(),document.body.appendChild(this.panelElement),this._attachPanelEvents();const n=this.panelElement.querySelector("input, textarea");n&&setTimeout(()=>n.focus(),350)}_getPanelHTML(){return`\n <div class="feedback-panel-content">\n <div class="feedback-panel-header">\n <h3>Send Feedback</h3>\n <button class="feedback-panel-close" type="button" aria-label="Close">&times;</button>\n </div>\n <div class="feedback-panel-body">\n <form class="feedback-form">\n <div class="feedback-form-group">\n <label for="feedback-title-${this.id}">Title (optional)</label>\n <input \n type="text" \n id="feedback-title-${this.id}" \n name="title" \n placeholder="Brief description of your feedback"\n value="${this.state.title}"\n />\n </div>\n <div class="feedback-form-group">\n <label for="feedback-content-${this.id}">Message *</label>\n <textarea \n id="feedback-content-${this.id}" \n name="content" \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="feedback-btn feedback-btn-submit">\n ${this.state.isSubmitting?"Sending...":"Send Feedback"}\n </button>\n </div>\n </form>\n </div>\n </div>\n `}_attachPanelEvents(){const e=this.panelElement;e.querySelector(".feedback-panel-close").addEventListener("click",this.closePanel);e.querySelector(".feedback-form").addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value});const t=e=>{"Escape"===e.key&&(this.closePanel(),document.removeEventListener("keydown",t))};document.addEventListener("keydown",t)}_updateSubmitButton(){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-btn-submit");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}}_showError(e){if(this.panelElement){const t=this.panelElement.querySelector(".feedback-error");t&&(t.textContent=e,t.classList.add("show"))}}_hideError(){if(this.panelElement){const e=this.panelElement.querySelector(".feedback-error");e&&e.classList.remove("show")}}_showSuccessMessage(){const e=document.createElement("div");e.className="feedback-success-notification",e.innerHTML='\n <div class="feedback-success-content">\n <div class="feedback-success-icon">✓</div>\n <span>Feedback submitted successfully!</span>\n <button class="feedback-success-close" aria-label="Close">&times;</button>\n </div>\n ',document.body.appendChild(e);const t=()=>{e.parentNode&&(e.style.opacity="0",setTimeout(()=>{e.parentNode&&e.parentNode.removeChild(e)},300))};e.querySelector(".feedback-success-close").addEventListener("click",t),setTimeout(t,4e3)}_resetForm(){this.state.title="",this.state.content="",this.state.email="",this.state.errors={}}_updateTheme(){this.element&&(this.element.className=this.element.className.replace(/theme-\w+/,`theme-${this.options.theme}`)),this.panelElement&&(this.panelElement.className=this.panelElement.className.replace(/theme-\w+/,`theme-${this.options.theme}`))}openModal(){this.openPanel()}closeModal(){this.closePanel()}}class w extends y{constructor(e){super({...e,type:"button"}),this.isMinimized=!1}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-button theme-${this.options.theme} position-${this.options.position}`,e.innerHTML='\n <button class="feedback-trigger-btn" type="button">\n <svg class="feedback-icon" width="20" height="20" viewBox="0 0 256 256" fill="currentColor">\n <path d="M216,80H184V48a16,16,0,0,0-16-16H40A16,16,0,0,0,24,48V176a8,8,0,0,0,13,6.22L72,154V184a16,16,0,0,0,16,16h93.59L219,230.22a8,8,0,0,0,5,1.78,8,8,0,0,0,8-8V96A16,16,0,0,0,216,80ZM66.55,137.78,40,159.25V48H168v88H71.58A8,8,0,0,0,66.55,137.78ZM216,207.25l-26.55-21.47a8,8,0,0,0-5-1.78H88V152h80a16,16,0,0,0,16-16V96h32Z"/>\n </svg>\n <span class="feedback-text">Feedback</span>\n \n <div class="feedback-minimize-icon">\n <svg viewBox="0 0 256 256">\n <path d="M213.66,53.66,163.31,104H192a8,8,0,0,1,0,16H144a8,8,0,0,1-8-8V64a8,8,0,0,1,16,0V92.69l50.34-50.35a8,8,0,0,1,11.32,11.32ZM112,136H64a8,8,0,0,0,0,16H92.69L42.34,202.34a8,8,0,0,0,11.32,11.32L104,163.31V192a8,8,0,0,0,16,0V144A8,8,0,0,0,112,136Z"/>\n </svg>\n </div>\n \n <div class="feedback-expand-icon">\n <svg viewBox="0 0 256 256">\n <path d="M112,40V64.69L61.66,14.34A8,8,0,0,0,50.34,25.66L100.69,76H72a8,8,0,0,0,0,16h48a8,8,0,0,0,8-8V36A8,8,0,0,0,112,40Zm131.06,70.61a8,8,0,0,0-8.72,1.73L184,162.69V136a8,8,0,0,0-16,0v48a8,8,0,0,0,8,8h48a8,8,0,0,0,0-16H195.31l50.35-50.34A8,8,0,0,0,243.06,110.61Z"/>\n </svg>\n </div>\n </button>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-trigger-btn"),t=this.element.querySelector(".feedback-minimize-icon"),n=this.element.querySelector(".feedback-expand-icon");t.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.minimize()}),n.addEventListener("click",e=>{e.stopPropagation(),e.preventDefault(),this.restore()}),e.addEventListener("click",e=>{e.target.closest(".feedback-minimize-icon")||e.target.closest(".feedback-expand-icon")||this.isMinimized||this.openPanel()}),e.addEventListener("mouseenter",()=>{this.state.isSubmitting||this.isMinimized||(e.style.transform="translateY(-2px)")}),e.addEventListener("mouseleave",()=>{this.isMinimized||(e.style.transform="translateY(0)")})}minimize(){this.isMinimized=!0,this.element.classList.add("minimized")}restore(){this.isMinimized=!1,this.element.classList.remove("minimized")}mount(e){super.mount(e)}updateText(e){const t=this.element?.querySelector(".feedback-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class x extends y{constructor(e){super({...e,type:"changelog"}),this.changelogs=[],this.isLoading=!1,this.modalElement=null,this.sidebarElement=null,this.currentIndex=0}_render(){const e=document.createElement("div");return e.className=`feedback-widget changelog-widget theme-${this.options.theme} position-${this.options.position}`,e.innerHTML=`\n\t\t\t<button class="changelog-trigger-btn" type="button" aria-label="View Updates">\n\t\t\t\t<svg class="changelog-icon" width="18" height="18" viewBox="0 0 24 24" fill="currentColor">\n\t\t\t\t\t<path d="M5.8 21L7.4 14L2 9.2L9.2 8.6L12 2L14.8 8.6L22 9.2L16.6 14L18.2 21L12 17.3L5.8 21Z"/>\n\t\t\t\t</svg>\n\t\t\t\t<span class="changelog-text">${this.options.triggerText||"What's New"}</span>\n\t\t\t\t<span class="changelog-confetti-emoji">🎉</span>\n\t\t\t\t${this.options.showBadge?'<span class="changelog-badge"></span>':""}\n\t\t\t</button>\n\t\t`,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".changelog-trigger-btn");e.addEventListener("click",()=>{this.openSidebar()}),e.addEventListener("mouseenter",()=>{e.style.transform="translateY(-2px)"}),e.addEventListener("mouseleave",()=>{e.style.transform="translateY(0)"})}async openModal(){this.modalElement||(this.state.isOpen=!0,this._createModal(),0===this.changelogs.length&&await this._loadChangelogs(),this.currentIndex=0,this._renderCurrentChangelog(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.modalElement&&this.modalElement.classList.add("open"),this.backdropElement&&this.backdropElement.classList.add("show")}))}closeModal(){document.body.style.overflow="",this.modalElement&&this.modalElement.classList.remove("open"),this.backdropElement&&this.backdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.modalElement&&this.modalElement.parentNode&&(this.modalElement.parentNode.removeChild(this.modalElement),this.modalElement=null),this.backdropElement&&this.backdropElement.parentNode&&(this.backdropElement.parentNode.removeChild(this.backdropElement),this.backdropElement=null)},300)}_createModal(){this.backdropElement=document.createElement("div"),this.backdropElement.className="changelog-modal-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this.closeModal()),this.modalElement=document.createElement("div"),this.modalElement.className=`changelog-modal theme-${this.options.theme}`,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">&times;</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="changelog-loading-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t',document.body.appendChild(this.modalElement),this.modalElement.querySelector(".changelog-modal-container").addEventListener("click",e=>{e.stopPropagation()}),this.modalElement.querySelector(".changelog-modal-close").addEventListener("click",()=>this.closeModal()),this._escapeHandler=e=>{"Escape"===e.key&&this.closeModal()},document.addEventListener("keydown",this._escapeHandler)}async openSidebar(){this.listModalElement||(this.modalElement&&(this.closeModal(),await new Promise(e=>setTimeout(e,350))),this.state.isOpen=!0,this._createListModal(),0===this.changelogs.length&&await this._loadChangelogs(),this._renderChangelogList(),document.body.style.overflow="hidden",requestAnimationFrame(()=>{this.listModalElement&&(this.listModalElement.classList.add("open"),this._showConfetti()),this.listModalBackdropElement&&this.listModalBackdropElement.classList.add("show")}))}_showConfetti(){const e=["#FF6B6B","#4ECDC4","#FFE66D","#95E1D3","#F38181","#AA96DA","#FCBAD3","#A8D8EA"],t=document.createElement("div");t.className="changelog-confetti-container",document.body.appendChild(t);for(let n=0;n<50;n++){const n=document.createElement("div");n.className="changelog-confetti",n.style.left=100*Math.random()+"%",n.style.backgroundColor=e[Math.floor(Math.random()*e.length)],n.style.animationDelay=.5*Math.random()+"s",n.style.animationDuration=1*Math.random()+1.5+"s";const s=["circle","square","rectangle"],i=s[Math.floor(Math.random()*s.length)];"circle"===i?(n.style.borderRadius="50%",n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width):"rectangle"===i?(n.style.width=4*Math.random()+3+"px",n.style.height=10*Math.random()+8+"px"):(n.style.width=8*Math.random()+4+"px",n.style.height=n.style.width),t.appendChild(n)}setTimeout(()=>{t.parentNode&&t.parentNode.removeChild(t)},2500)}closeSidebar(){document.body.style.overflow="",this.listModalElement&&this.listModalElement.classList.remove("open"),this.listModalBackdropElement&&this.listModalBackdropElement.classList.remove("show"),setTimeout(()=>{this.state.isOpen=!1,this.listModalElement&&this.listModalElement.parentNode&&(this.listModalElement.parentNode.removeChild(this.listModalElement),this.listModalElement=null),this.listModalBackdropElement&&this.listModalBackdropElement.parentNode&&(this.listModalBackdropElement.parentNode.removeChild(this.listModalBackdropElement),this.listModalBackdropElement=null),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler)},300)}_createListModal(){this.listModalBackdropElement=document.createElement("div"),this.listModalBackdropElement.className="changelog-list-modal-backdrop",document.body.appendChild(this.listModalBackdropElement),this.listModalBackdropElement.addEventListener("click",()=>this.closeSidebar()),this.listModalElement=document.createElement("div"),this.listModalElement.className=`changelog-list-modal theme-${this.options.theme}`,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">&times;</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="changelog-loading-spinner"></div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,document.body.appendChild(this.listModalElement),this.listModalElement.querySelector(".changelog-list-modal-container").addEventListener("click",e=>{e.stopPropagation()}),this.listModalElement.querySelector(".changelog-list-modal-close").addEventListener("click",()=>this.closeSidebar()),this._listModalEscapeHandler=e=>{"Escape"===e.key&&this.closeSidebar()},document.addEventListener("keydown",this._listModalEscapeHandler)}_renderChangelogList(){const e=this.listModalElement.querySelector(".changelog-list-modal-body");this.isLoading||(0!==this.changelogs.length?(e.innerHTML=`\n\t\t\t<div class="changelog-list">\n\t\t\t\t${this.changelogs.map((e,t)=>this._renderChangelogListItem(e,t)).join("")}\n\t\t\t</div>\n\t\t`,e.querySelectorAll(".changelog-list-item").forEach((e,t)=>{e.addEventListener("click",()=>{const e=this.changelogs[t];this._handleViewUpdate(e)})})):e.innerHTML='\n\t\t\t\t<div class="changelog-empty">\n\t\t\t\t\t<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n\t\t\t\t\t\t<path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"/>\n\t\t\t\t\t\t<polyline points="14,2 14,8 20,8"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t')}_renderChangelogListItem(e,t){const n=e.cover_image||e.image,s=e.cover_image||e.image,i=e.published_at?this._formatDate(e.published_at):"";return`\n\t\t\t<div class="changelog-list-item" data-index="${t}">\n\t\t\t\t<div class="changelog-list-item-main">\n\t\t\t\t\t${n?`\n\t\t\t\t\t\t<div class="changelog-list-item-image">\n\t\t\t\t\t\t\t<img src="${s}" alt="${e.title}" loading="lazy" />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<div class="changelog-list-item-content">\n\t\t\t\t\t\t${i?`<span class="changelog-list-item-date">${i}</span>`:""}\n\t\t\t\t\t\t${e.labels&&e.labels.length>0?`\n\t\t\t\t\t\t\t<div class="changelog-list-item-labels">\n\t\t\t\t\t\t\t\t${e.labels.map(e=>`\n\t\t\t\t\t\t\t\t\t<span class="changelog-label" style="background-color: ${e.color||"#E5E7EB"}; color: ${this._getContrastColor(e.color||"#E5E7EB")}">${e.name}</span>\n\t\t\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t`:""}\n\t\t\t\t\t\t<h3 class="changelog-list-item-title">${e.title}</h3>\n\t\t\t\t\t\t${e.excerpt||e.description?`\n\t\t\t\t\t\t\t<p class="changelog-list-item-description">${e.excerpt||e.description}</p>\n\t\t\t\t\t\t`:""}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}async _loadChangelogs(){this.isLoading=!0;try{const e=await this.apiService.getChangelogs();this.changelogs=e.data||[],this.sdk.eventBus.emit("changelog:loaded",{changelogs:this.changelogs})}catch(e){this.changelogs=[],this.sdk.eventBus.emit("changelog:error",{error:e})}finally{this.isLoading=!1}}_renderCurrentChangelog(){const e=this.modalElement.querySelector(".changelog-modal-content");if(this.isLoading)return;if(0===this.changelogs.length)return void(e.innerHTML='\n\t\t\t\t<div class="changelog-empty">\n\t\t\t\t\t<svg width="48" height="48" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">\n\t\t\t\t\t\t<path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"/>\n\t\t\t\t\t\t<polyline points="14,2 14,8 20,8"/>\n\t\t\t\t\t</svg>\n\t\t\t\t\t<p>No updates yet</p>\n\t\t\t\t</div>\n\t\t\t');const t=this.changelogs[this.currentIndex],n=t.cover_image||t.image,s=t.cover_image||t.image,i=this.changelogs.length>1;e.innerHTML=`\n\t\t\t<div class="changelog-popup-item">\n\t\t\t\t${n?`\n\t\t\t\t\t<div class="changelog-popup-image">\n\t\t\t\t\t\t<img src="${s}" alt="${t.title}" loading="lazy" />\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="changelog-popup-body">\n\t\t\t\t\t<h2 class="changelog-popup-title">${t.title}</h2>\n\t\t\t\t\t${t.excerpt||t.description?`\n\t\t\t\t\t\t<p class="changelog-popup-description">${t.excerpt||t.description}</p>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<button class="changelog-popup-btn" type="button">\n\t\t\t\t\t\t${this.options.viewButtonText||"View Update"}\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="changelog-popup-footer">\n\t\t\t\t\t${i?`\n\t\t\t\t\t\t<div class="changelog-popup-dots">\n\t\t\t\t\t\t\t${this.changelogs.map((e,t)=>`\n\t\t\t\t\t\t\t\t<span class="changelog-dot ${t===this.currentIndex?"active":""}" data-index="${t}"></span>\n\t\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`:""}\n\t\t\t\t\t<button class="changelog-view-all-btn" type="button">\n\t\t\t\t\t\tView all updates\n\t\t\t\t\t\t<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">\n\t\t\t\t\t\t\t<path d="M5 12h14M12 5l7 7-7 7"/>\n\t\t\t\t\t\t</svg>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`,e.querySelector(".changelog-popup-btn").addEventListener("click",()=>{this._handleViewUpdate(t)}),e.querySelector(".changelog-view-all-btn").addEventListener("click",()=>{this.closeModal(),setTimeout(()=>this.openSidebar(),350)}),i&&e.querySelectorAll(".changelog-dot").forEach(e=>{e.addEventListener("click",e=>{const t=parseInt(e.target.dataset.index,10);this.currentIndex=t,this._renderCurrentChangelog()})})}_handleViewUpdate(e){if(this.sdk.eventBus.emit("changelog:view",{changelog:e}),e.url||e.slug){const t=e.url||`${this.options.changelogBaseUrl||""}/${e.slug}`;!1!==this.options.openInNewTab?window.open(t,"_blank","noopener,noreferrer"):window.location.href=t}"function"==typeof this.options.onViewUpdate&&this.options.onViewUpdate(e)}_formatDate(e){return new Date(e).toLocaleDateString("en-US",{year:"numeric",month:"short",day:"numeric"})}_getContrastColor(e){const t=e.replace("#","");return(.299*parseInt(t.substr(0,2),16)+.587*parseInt(t.substr(2,2),16)+.114*parseInt(t.substr(4,2),16))/255>.5?"#1F2937":"#FFFFFF"}hideBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="none")}showBadge(){const e=this.element?.querySelector(".changelog-badge");e&&(e.style.display="block")}nextChangelog(){this.currentIndex<this.changelogs.length-1&&(this.currentIndex++,this._renderCurrentChangelog())}prevChangelog(){this.currentIndex>0&&(this.currentIndex--,this._renderCurrentChangelog())}async refresh(){this.changelogs=[],await this._loadChangelogs(),this.modalElement&&(this.currentIndex=0,this._renderCurrentChangelog()),this.listModalElement&&this._renderChangelogList()}mount(e){super.mount(e)}destroy(){this._escapeHandler&&document.removeEventListener("keydown",this._escapeHandler),this._listModalEscapeHandler&&document.removeEventListener("keydown",this._listModalEscapeHandler),this.closeModal(),this.closeSidebar(),super.destroy()}}class k extends y{constructor(e){super({...e,type:"inline"})}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-inline theme-${this.options.theme}`,e.innerHTML=`\n <div class="feedback-inline-content">\n <h3>Send us your feedback</h3>\n <form class="feedback-inline-form">\n <div class="feedback-form-group">\n <input \n type="text" \n name="title" \n placeholder="Title (optional)"\n value="${this.state.title}"\n />\n </div>\n <div class="feedback-form-group">\n <textarea \n name="content" \n placeholder="Your feedback..."\n required\n >${this.state.content}</textarea>\n </div>\n <div class="feedback-form-group">\n <input \n type="email" \n name="email" \n placeholder="Email (optional)"\n value="${this.state.email}"\n />\n </div>\n <button type="submit" class="feedback-btn feedback-btn-submit">\n Send Feedback\n </button>\n <div class="feedback-error" style="display: none;"></div>\n </form>\n </div>\n `,this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-inline-form");e.addEventListener("submit",e=>{e.preventDefault(),this.submitFeedback()}),e.querySelector('input[name="title"]').addEventListener("input",e=>{this.state.title=e.target.value}),e.querySelector('textarea[name="content"]').addEventListener("input",e=>{this.state.content=e.target.value}),e.querySelector('input[name="email"]').addEventListener("input",e=>{this.state.email=e.target.value})}openModal(){const e=this.element.querySelector('textarea[name="content"]');e&&e.focus()}closeModal(){}_showSuccessMessage(){const e=this.element.querySelector(".feedback-inline-content"),t=e.innerHTML;e.innerHTML='\n <div class="feedback-success">\n <div class="feedback-success-icon">✓</div>\n <h3>Thank you!</h3>\n <p>Your feedback has been submitted successfully.</p>\n <button class="feedback-btn feedback-btn-reset">Send Another</button>\n </div>\n ';e.querySelector(".feedback-btn-reset").addEventListener("click",()=>{e.innerHTML=t,this._attachEvents(),this._resetForm()})}_showError(e){const t=this.element.querySelector(".feedback-error");t&&(t.textContent=e,t.style.display="block",setTimeout(()=>{t&&(t.style.display="none")},5e3))}_updateSubmitButton(){const e=this.element.querySelector(".feedback-btn-submit");e&&(e.textContent=this.state.isSubmitting?"Sending...":"Send Feedback",e.disabled=this.state.isSubmitting)}updateTitle(e){const t=this.element?.querySelector("h3");t&&(t.textContent=e)}setPlaceholder(e,t){const n=this.element?.querySelector(`[name="${e}"]`);n&&(n.placeholder=t)}}class _{constructor(e={}){this.baseURL=e.baseURL||"",this.workspace=e.workspace||"",this.sessionToken=e.sessionToken||null,this.mock=e.mock||!1,this.ws=null,this.reconnectAttempts=0,this.maxReconnectAttempts=5,this.reconnectDelay=1e3,this.pingInterval=null,this.isConnected=!1,this._listeners=new Map,this._onOpen=this._onOpen.bind(this),this._onMessage=this._onMessage.bind(this),this._onClose=this._onClose.bind(this),this._onError=this._onError.bind(this)}connect(e=null){if(e&&(this.sessionToken=e),!this.sessionToken)return void console.warn("[WebSocket] No session token provided");if(this.mock)return this.isConnected=!0,this._emit("connected",{}),void this._startMockResponses();const t="https:"===window.location.protocol?"wss:":"ws:";let n=this.baseURL.replace(/^https?:/,t);n=n.replace("/api/v1",""),n=`${n}/api/v1/widget/messenger/ws?token=${encodeURIComponent(this.sessionToken)}`;try{this.ws=new WebSocket(n),this.ws.onopen=this._onOpen,this.ws.onmessage=this._onMessage,this.ws.onclose=this._onClose,this.ws.onerror=this._onError}catch(e){console.error("[WebSocket] Connection error:",e),this._scheduleReconnect()}}disconnect(){this.isConnected=!1,this.reconnectAttempts=this.maxReconnectAttempts,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this.ws&&(this.ws.close(),this.ws=null),this._mockInterval&&(clearInterval(this._mockInterval),this._mockInterval=null)}on(e,t){return this._listeners.has(e)||this._listeners.set(e,new Set),this._listeners.get(e).add(t),()=>this._listeners.get(e).delete(t)}off(e,t){this._listeners.has(e)&&this._listeners.get(e).delete(t)}send(e,t={}){this.isConnected?this.mock?console.log("[WebSocket Mock] Sending:",e,t):this.ws&&this.ws.readyState===WebSocket.OPEN&&this.ws.send(JSON.stringify({type:e,payload:t})):console.warn("[WebSocket] Not connected, cannot send message")}_onOpen(){console.log("[WebSocket] Connected"),this.isConnected=!0,this.reconnectAttempts=0,this._emit("connected",{}),this.pingInterval=setInterval(()=>{this.send("ping",{})},3e4)}_onMessage(e){try{const t=JSON.parse(e.data),{type:n,payload:s}=t;switch(n){case"message:new":this._emit("message",s);break;case"typing:started":this._emit("typing_started",s);break;case"typing:stopped":this._emit("typing_stopped",s);break;case"conversation:updated":this._emit("conversation_updated",s);break;case"conversation:closed":this._emit("conversation_closed",s);break;case"availability:changed":this._emit("availability_changed",s);break;case"pong":break;default:console.log("[WebSocket] Unknown event:",n,s)}}catch(e){console.error("[WebSocket] Failed to parse message:",e)}}_onClose(e){console.log("[WebSocket] Disconnected:",e.code,e.reason),this.isConnected=!1,this.pingInterval&&(clearInterval(this.pingInterval),this.pingInterval=null),this._emit("disconnected",{code:e.code,reason:e.reason}),this._scheduleReconnect()}_onError(e){console.error("[WebSocket] Error:",e),this._emit("error",{error:e})}_scheduleReconnect(){if(this.reconnectAttempts>=this.maxReconnectAttempts)return console.log("[WebSocket] Max reconnect attempts reached"),void this._emit("reconnect_failed",{});this.reconnectAttempts++;const e=this.reconnectDelay*Math.pow(2,this.reconnectAttempts-1);console.log(`[WebSocket] Reconnecting in ${e}ms (attempt ${this.reconnectAttempts})`),setTimeout(()=>{this.connect()},e)}_emit(e,t){this._listeners.has(e)&&this._listeners.get(e).forEach(n=>{try{n(t)}catch(t){console.error(`[WebSocket] Error in ${e} handler:`,t)}})}_startMockResponses(){this._mockInterval=setInterval(()=>{Math.random()<.1&&(this._emit("typing_started",{conversation_id:"conv_1",user_id:"agent_1",user_name:"Sarah",is_agent:!0}),setTimeout(()=>{this._emit("typing_stopped",{conversation_id:"conv_1",user_id:"agent_1"})},2e3))},1e4)}simulateMessage(e,t){this.mock&&this._emit("message",{conversation_id:e,message:{id:"msg_"+Date.now(),content:t.content,sender_type:t.sender_type||"agent",sender_name:t.sender_name||"Support",sender_avatar:t.sender_avatar||null,created_at:(new Date).toISOString()}})}}class S{constructor(e={}){this.currentView="home",this.isOpen=!1,this.unreadCount=0,this.activeConversationId=null,this.conversations=[],this.messages={},this.helpArticles=[],this.helpSearchQuery="",this.homeChangelogItems=[],this.changelogItems=[],this.teamName=e.teamName||"Support",this.teamAvatars=e.teamAvatars||[],this.welcomeMessage=e.welcomeMessage||"How can we help?",this.userContext=e.userContext||null,this.enableHelp=!1!==e.enableHelp,this.enableChangelog=!1!==e.enableChangelog,this.agentsOnline=!1,this.onlineCount=0,this.responseTime="Usually replies within a few minutes",this.typingUsers={},this.isLoading=!1,this.isLoadingMessages=!1,this._listeners=new Set}subscribe(e){return this._listeners.add(e),()=>this._listeners.delete(e)}_notify(e,t){this._listeners.forEach(n=>n(e,t,this))}setView(e){const t=this.currentView;this.currentView=e,this._notify("viewChange",{previousView:t,currentView:e})}setOpen(e){this.isOpen=e,this._notify("openChange",{isOpen:e})}setActiveConversation(e){this.activeConversationId=e,this._notify("conversationChange",{conversationId:e})}setConversations(e){this.conversations=e,this._updateUnreadCount(),this._notify("conversationsUpdate",{conversations:e})}addConversation(e){this.conversations.unshift(e),this._updateUnreadCount(),this._notify("conversationAdded",{conversation:e})}setMessages(e,t){this.messages[e]=t,this._notify("messagesUpdate",{conversationId:e,messages:t})}addMessage(e,t){this.messages[e]||(this.messages[e]=[]),this.messages[e].push(t);const n=this.conversations.find(t=>t.id===e);n&&(n.lastMessage=t.content,n.lastMessageTime=t.timestamp,t.isOwn||(n.unread=(n.unread||0)+1,this._updateUnreadCount())),this._notify("messageAdded",{conversationId:e,message:t})}markAsRead(e){const t=this.conversations.find(t=>t.id===e);t&&t.unread>0&&(t.unread=0,this._updateUnreadCount(),this._notify("conversationRead",{conversationId:e}))}_updateUnreadCount(){this.unreadCount=this.conversations.reduce((e,t)=>e+(t.unread||0),0),this._notify("unreadCountChange",{count:this.unreadCount})}setHelpArticles(e){this.helpArticles=e,this._notify("helpArticlesUpdate",{articles:e})}setHelpSearchQuery(e){this.helpSearchQuery=e,this._notify("helpSearchChange",{query:e})}setHomeChangelogItems(e){this.homeChangelogItems=e,this._notify("homeChangelogUpdate",{items:e})}setChangelogItems(e){this.changelogItems=e,this._notify("changelogUpdate",{items:e})}getActiveConversation(){return this.conversations.find(e=>e.id===this.activeConversationId)}getActiveMessages(){return this.messages[this.activeConversationId]||[]}getFilteredHelpArticles(){if(!this.helpSearchQuery)return this.helpArticles;const e=this.helpSearchQuery.toLowerCase();return this.helpArticles.filter(t=>t.title.toLowerCase().includes(e)||t.description&&t.description.toLowerCase().includes(e))}reset(){this.currentView="home",this.activeConversationId=null,this.helpSearchQuery="",this._notify("reset",{})}}class C{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",primaryColor:t.primaryColor||"#1c1c1e",...t},this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className=`messenger-launcher messenger-launcher-${this.options.position}`,this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe((e,t)=>{"openChange"===e&&this._updateIcon(),"unreadCountChange"===e&&this._updateBadge()}),this.element}_updateContent(){const e=this.state.unreadCount>0?`<span class="messenger-launcher-badge">${this.state.unreadCount>9?"9+":this.state.unreadCount}</span>`:"";this.element.innerHTML=`\n\t\t\t<button class="messenger-launcher-btn" aria-label="Open messenger" style="background: ${this.options.primaryColor};">\n\t\t\t\t<span class="messenger-launcher-icon messenger-launcher-icon-chat">\n\t\t\t\t\t<i class="ph ph-chat-circle-dots" style="font-size: 24px;"></i>\n\t\t\t\t</span>\n\t\t\t\t<span class="messenger-launcher-icon messenger-launcher-icon-close" style="display: none;">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 24px;"></i>\n\t\t\t\t</span>\n\t\t\t\t${e}\n\t\t\t</button>\n\t\t`}_attachEvents(){this.element.querySelector(".messenger-launcher-btn").addEventListener("click",()=>{this.state.setOpen(!this.state.isOpen)})}_updateIcon(){const e=this.element.querySelector(".messenger-launcher-icon-chat"),t=this.element.querySelector(".messenger-launcher-icon-close");this.state.isOpen?(e.style.display="none",t.style.display="flex",this.element.classList.add("messenger-launcher-open")):(e.style.display="flex",t.style.display="none",this.element.classList.remove("messenger-launcher-open"))}_updateBadge(){const e=this.element.querySelector(".messenger-launcher-badge");if(e&&e.remove(),this.state.unreadCount>0&&!this.state.isOpen){const e=document.createElement("span");e.className="messenger-launcher-badge",e.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,this.element.querySelector(".messenger-launcher-btn").appendChild(e)}}show(){this.element&&(this.element.style.display="block")}hide(){this.element&&(this.element.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class E{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-nav",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"!==e&&"unreadCountChange"!==e||this._updateActiveTab()}),this.element}_getTabs(){const e=[{id:"home",label:"Home",icon:this._getHomeIcon()},{id:"messages",label:"Messages",icon:this._getMessagesIcon(),badge:this.state.unreadCount}];return this.state.enableHelp&&e.push({id:"help",label:"Help",icon:this._getHelpIcon()}),this.state.enableChangelog&&e.push({id:"changelog",label:"Changelog",icon:this._getChangelogIcon()}),e}_updateContent(){const e=this._getTabs().map(e=>{const t=this.state.currentView===e.id,n=e.badge&&e.badge>0?`<span class="messenger-nav-badge">${e.badge>9?"9+":e.badge}</span>`:"";return`\n\t\t\t\t<button class="messenger-nav-tab ${t?"active":""}" data-tab="${e.id}">\n\t\t\t\t\t<span class="messenger-nav-icon">${e.icon}</span>\n\t\t\t\t\t<span class="messenger-nav-label">${e.label}</span>\n\t\t\t\t\t${n}\n\t\t\t\t</button>\n\t\t\t`}).join("");this.element.innerHTML=e}_attachEvents(){this.element.addEventListener("click",e=>{const t=e.target.closest(".messenger-nav-tab");if(t){const e=t.dataset.tab;this.state.setView(e)}})}_updateActiveTab(){this.element.querySelectorAll(".messenger-nav-tab").forEach(e=>{const t=e.dataset.tab===this.state.currentView;if(e.classList.toggle("active",t),"messages"===e.dataset.tab){const t=e.querySelector(".messenger-nav-badge");if(t&&t.remove(),this.state.unreadCount>0){const t=document.createElement("span");t.className="messenger-nav-badge",t.textContent=this.state.unreadCount>9?"9+":this.state.unreadCount,e.appendChild(t)}}})}_getHomeIcon(){return'<i class="ph-duotone ph-house" style="font-size: 24px;"></i>'}_getMessagesIcon(){return'<i class="ph-duotone ph-chat" style="font-size: 24px;"></i>'}_getHelpIcon(){return'<i class="ph-duotone ph-question" style="font-size: 24px;"></i>'}_getChangelogIcon(){return'<i class="ph-duotone ph-megaphone" style="font-size: 24px;"></i>'}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class I{constructor(e,t={}){this.state=e,this.options={position:t.position||"bottom-right",theme:t.theme||"dark",...t},this.element=null,this.navigationTabs=null,this.currentViewComponent=null,this.viewRegistry={},this._unsubscribe=null}registerView(e,t){this.viewRegistry[e]=t}render(){this.element=document.createElement("div"),this.element.className=`messenger-panel messenger-panel-${this.options.position} theme-${this.options.theme}`,this.element.innerHTML='\n\t\t\t<div class="messenger-panel-content">\n\t\t\t\t<div class="messenger-panel-views"></div>\n\t\t\t\t<div class="messenger-panel-nav"></div>\n\t\t\t</div>\n\t\t',this.navigationTabs=new E(this.state,this.options);return this.element.querySelector(".messenger-panel-nav").appendChild(this.navigationTabs.render()),this._renderCurrentView(),this._unsubscribe=this.state.subscribe(e=>{"viewChange"===e&&this._renderCurrentView()}),this.element}_renderCurrentView(){const e=this.element.querySelector(".messenger-panel-views");this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),e.innerHTML="";const t=this.viewRegistry[this.state.currentView];t?(this.currentViewComponent=new t(this.state,this.options),e.appendChild(this.currentViewComponent.render())):e.innerHTML=`<div class="messenger-view-placeholder">View not found: ${this.state.currentView}</div>`}show(){this.element&&(this.element.style.display="block",requestAnimationFrame(()=>{this.element.classList.add("open")}))}hide(){this.element&&(this.element.classList.remove("open"),setTimeout(()=>{this.element&&(this.element.style.display="none")},300))}setHeader(e){const t=this.element.querySelector(".messenger-panel-header");t&&(t.innerHTML=e)}destroy(){this._unsubscribe&&this._unsubscribe(),this.navigationTabs&&this.navigationTabs.destroy(),this.currentViewComponent&&this.currentViewComponent.destroy&&this.currentViewComponent.destroy(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class T{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-changelog-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"changelogUpdate"===e&&this._updateChangelogList()}),this.element}_updateContent(){const e=this._renderTeamAvatars();this.element.innerHTML=`\n\t\t\t<div class="messenger-changelog-header">\n\t\t\t\t<h2>Changelog</h2>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-changelog-subheader">\n\t\t\t\t<span class="messenger-changelog-latest">Latest</span>\n\t\t\t\t<div class="messenger-changelog-team">\n\t\t\t\t\t<span>From ${this.state.teamName}</span>\n\t\t\t\t\t${e}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-changelog-body">\n\t\t\t\t<div class="messenger-changelog-list"></div>\n\t\t\t</div>\n\t\t`,this._updateChangelogList(),this._attachEvents()}_updateChangelogList(){const e=this.element.querySelector(".messenger-changelog-list"),t=this.state.changelogItems;0!==t.length?(e.innerHTML=t.map(e=>this._renderChangelogCard(e)).join(""),this._attachChangelogEvents()):e.innerHTML=this._renderEmptyState()}_renderChangelogCard(e){const t=e.tags&&e.tags.length>0?`<div class="messenger-changelog-tags">\n\t\t\t\t${e.tags.map(e=>`<span class="messenger-changelog-tag">${e}</span>`).join("")}\n\t\t\t</div>`:"",n=this._formatDate(e.publishedAt||e.date);return`\n\t\t\t<div class="messenger-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-changelog-content">\n\t\t\t\t\t${t}\n\t\t\t\t\t<h3 class="messenger-changelog-title">${e.title}</h3>\n\t\t\t\t\t${e.description?`<p class="messenger-changelog-description">${this._truncateText(e.description,100)}</p>`:""}\n\t\t\t\t\t<div class="messenger-changelog-meta">\n\t\t\t\t\t\t<span class="messenger-changelog-date">${n}</span>\n\t\t\t\t\t\t<i class="ph ph-caret-right messenger-changelog-arrow" style="font-size: 16px;"></i>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack messenger-avatar-stack-tiny">\n\t\t\t\t\t<div class="messenger-avatar messenger-avatar-tiny" style="background: #5856d6;">S</div>\n\t\t\t\t</div>\n\t\t\t';const t=["#5856d6","#007aff","#34c759"];return`<div class="messenger-avatar-stack messenger-avatar-stack-tiny">${e.slice(0,2).map((e,n)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar messenger-avatar-tiny" src="${e}" alt="Team member" style="z-index: ${2-n};" />`:`<div class="messenger-avatar messenger-avatar-tiny" style="background: ${t[n%t.length]}; z-index: ${2-n};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_renderEmptyState(){return'\n\t\t\t<div class="messenger-changelog-empty">\n\t\t\t\t<div class="messenger-changelog-empty-icon">\n\t\t\t\t\t<i class="ph ph-megaphone" style="font-size: 48px;"></i>\n\t\t\t\t</div>\n\t\t\t\t<h3>No changelog yet</h3>\n\t\t\t\t<p>Check back later for updates</p>\n\t\t\t</div>\n\t\t'}_formatDate(e){if(!e)return"";return new Date(e).toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})}_truncateText(e,t){return e?e.length<=t?e:e.substring(0,t).trim()+"...":""}_attachEvents(){this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)}),this._attachChangelogEvents()}_attachChangelogEvents(){this.element.querySelectorAll(".messenger-changelog-card").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.changelogId,n=this.state.changelogItems.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onChangelogClick&&this.options.onChangelogClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class M{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null,this._typingTimeout=null,this._isTyping=!1,this._typingIndicator=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-chat-view",this._updateContent(),this._unsubscribe=this.state.subscribe((e,t)=>{"messageAdded"===e&&t.conversationId===this.state.activeConversationId?(this._hideTypingIndicator(),this._appendMessage(t.message),this._scrollToBottom()):"typingStarted"===e&&t.conversationId===this.state.activeConversationId?this._showTypingIndicator(t.userName):"typingStopped"===e&&t.conversationId===this.state.activeConversationId?this._hideTypingIndicator():"messagesUpdate"===e&&t.conversationId===this.state.activeConversationId&&this._updateContent()}),this.element}_updateContent(){const e=this.state.getActiveConversation(),t=this.state.getActiveMessages(),n=!this.state.activeConversationId,s=0===t.length?this._renderEmptyState(n):t.map(e=>this._renderMessage(e)).join(""),i=this._renderConversationAvatar(e),a=n?"New conversation":e?.title||"Chat with team",o=n?"Start typing your message...":"Write a message...";this.element.innerHTML=`\n\t\t\t<div class="messenger-chat-header">\n\t\t\t\t<button class="messenger-back-btn" aria-label="Back">\n\t\t\t\t\t<i class="ph ph-caret-left" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t\t<div class="messenger-chat-header-info">\n\t\t\t\t\t${i}\n\t\t\t\t\t<span class="messenger-chat-title">${a}</span>\n\t\t\t\t</div>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-chat-messages">\n\t\t\t\t${s}\n\t\t\t\t<div class="messenger-typing-indicator" style="display: none;">\n\t\t\t\t\t<div class="messenger-typing-dots">\n\t\t\t\t\t\t<span></span><span></span><span></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<span class="messenger-typing-text"></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-chat-compose">\n\t\t\t\t<div class="messenger-compose-input-wrapper">\n\t\t\t\t\t<textarea class="messenger-compose-input" placeholder="${o}" rows="1"></textarea>\n\t\t\t\t</div>\n\t\t\t\t<button class="messenger-compose-send" aria-label="Send" disabled>\n\t\t\t\t\t<i class="ph ph-paper-plane-tilt" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`,this._typingIndicator=this.element.querySelector(".messenger-typing-indicator"),this._attachEvents(),this._scrollToBottom()}_renderEmptyState(e=!1){const t=this._renderTeamAvatars(),n=this.state.responseTime||"We typically reply within a few minutes",s=this.state.agentsOnline;return`\n\t\t\t<div class="messenger-chat-empty">\n\t\t\t\t<div class="messenger-chat-empty-avatars">${t}</div>\n\t\t\t\t<h3>${e?"Start a new conversation":"Start the conversation"}</h3>\n\t\t\t\t<p>Send us a message and we'll get back to you as soon as possible.</p>\n\t\t\t\t<div class="messenger-chat-availability">\n\t\t\t\t\t<span class="messenger-availability-dot ${s?"messenger-availability-online":"messenger-availability-away"}"></span>\n\t\t\t\t\t<span>${s?"We're online now":n}</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderMessage(e){const t=e.isOwn,n=t?"messenger-message-own":"messenger-message-received",s=this._formatMessageTime(e.timestamp);if(t)return`\n\t\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t\t<div class="messenger-message-bubble">\n\t\t\t\t\t\t<div class="messenger-message-content">${this._formatMessageContent(e.content)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t\t</div>\n\t\t\t`;return`\n\t\t\t<div class="messenger-message ${n}">\n\t\t\t\t<div class="messenger-message-avatar">${this._renderSenderAvatar(e.sender)}</div>\n\t\t\t\t<div class="messenger-message-wrapper">\n\t\t\t\t\t<div class="messenger-message-sender">${e.sender?.name||"Support"}</div>\n\t\t\t\t\t<div class="messenger-message-bubble">\n\t\t\t\t\t\t<div class="messenger-message-content">${this._formatMessageContent(e.content)}</div>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-message-time">${s}</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderSenderAvatar(e){if(e?.avatarUrl)return`<img class="messenger-avatar messenger-avatar-small" src="${e.avatarUrl}" alt="${e.name}" />`;return`<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">${(e?.name||"S").charAt(0).toUpperCase()}</div>`}_renderConversationAvatar(e){if(!e?.participants?.length)return'<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">S</div>';const t=e.participants[0];return t.avatarUrl?`<img class="messenger-avatar messenger-avatar-small" src="${t.avatarUrl}" alt="${t.name}" />`:`<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">${(t.name||"S").charAt(0).toUpperCase()}</div>`}_renderTeamAvatars(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="messenger-avatar" style="background: #5856d6;">S</div>\n\t\t\t\t\t<div class="messenger-avatar" style="background: #007aff;">T</div>\n\t\t\t\t</div>\n\t\t\t';const t=["#5856d6","#007aff","#34c759","#ff9500","#ff3b30"];return`<div class="messenger-avatar-stack">${e.slice(0,3).map((e,n)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar" src="${e}" alt="Team member" style="z-index: ${3-n};" />`:`<div class="messenger-avatar" style="background: ${t[n%t.length]}; z-index: ${3-n};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_formatMessageTime(e){if(!e)return"";return new Date(e).toLocaleTimeString("en-US",{hour:"numeric",minute:"2-digit",hour12:!0})}_formatMessageContent(e){return e?e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\n/g,"<br>"):""}_appendMessage(e){const t=this.element.querySelector(".messenger-chat-messages"),n=t.querySelector(".messenger-chat-empty");n&&n.remove();const s=this._renderMessage(e),i=document.createElement("div");i.innerHTML=s,t.appendChild(i.firstElementChild)}_scrollToBottom(){const e=this.element.querySelector(".messenger-chat-messages");e&&setTimeout(()=>{e.scrollTop=e.scrollHeight},50)}_attachEvents(){this.element.querySelector(".messenger-back-btn").addEventListener("click",()=>{this.state.setView("messages")}),this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});const e=this.element.querySelector(".messenger-compose-input"),t=this.element.querySelector(".messenger-compose-send");e.addEventListener("input",()=>{e.style.height="auto",e.style.height=Math.min(e.scrollHeight,120)+"px",t.disabled=!e.value.trim(),e.value.trim()&&this._startTyping()}),e.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),this._sendMessage())}),t.addEventListener("click",()=>{this._sendMessage()})}_sendMessage(){const e=this.element.querySelector(".messenger-compose-input"),t=e.value.trim();if(!t)return;this._stopTyping();if(!this.state.activeConversationId)this.options.onStartConversation&&this.options.onStartConversation(t);else{const e={id:"msg_"+Date.now(),content:t,isOwn:!0,timestamp:(new Date).toISOString()};this.state.addMessage(this.state.activeConversationId,e),this.options.onSendMessage&&this.options.onSendMessage(this.state.activeConversationId,e)}e.value="",e.style.height="auto",this.element.querySelector(".messenger-compose-send").disabled=!0}_startTyping(){!this._isTyping&&this.state.activeConversationId&&(this._isTyping=!0,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!0)),this._typingTimeout&&clearTimeout(this._typingTimeout),this._typingTimeout=setTimeout(()=>{this._stopTyping()},3e3)}_stopTyping(){this._isTyping&&this.state.activeConversationId&&(this._isTyping=!1,this.options.onTyping&&this.options.onTyping(this.state.activeConversationId,!1)),this._typingTimeout&&(clearTimeout(this._typingTimeout),this._typingTimeout=null)}_showTypingIndicator(e){if(this._typingIndicator){this._typingIndicator.style.display="flex";const t=this._typingIndicator.querySelector(".messenger-typing-text");t&&(t.textContent=`${e||"Support"} is typing...`),this._scrollToBottom()}}_hideTypingIndicator(){this._typingIndicator&&(this._typingIndicator.style.display="none")}destroy(){this._unsubscribe&&this._unsubscribe(),this._typingTimeout&&clearTimeout(this._typingTimeout),this._stopTyping(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class A{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-conversations-view",this._updateContent(),this._attachEvents(),this._unsubscribe=this.state.subscribe(e=>{"conversationsUpdate"!==e&&"conversationAdded"!==e&&"conversationRead"!==e||this._updateContent()}),this.element}_updateContent(){const e=this.state.conversations,t=this._renderAvatarStack();let n;n=0===e.length?'\n\t\t\t\t<div class="messenger-conversations-empty">\n\t\t\t\t\t<div class="messenger-conversations-empty-icon">\n\t\t\t\t\t\t<i class="ph ph-chat" style="font-size: 48px;"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No conversations yet</h3>\n\t\t\t\t\t<p>Start a new conversation with our team</p>\n\t\t\t\t</div>\n\t\t\t':`\n\t\t\t\t<div class="messenger-conversations-list">\n\t\t\t\t\t${e.map(e=>this._renderConversationItem(e)).join("")}\n\t\t\t\t</div>\n\t\t\t`,this.element.innerHTML=`\n\t\t\t<div class="messenger-conversations-header">\n\t\t\t\t<h2>Messages</h2>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-conversations-body">\n\t\t\t\t${n}\n\t\t\t</div>\n\n\t\t\t<div class="messenger-conversations-footer">\n\t\t\t\t<button class="messenger-new-message-btn">\n\t\t\t\t\t<div class="messenger-new-message-avatars">${t}</div>\n\t\t\t\t\t<span>Send us a message</span>\n\t\t\t\t\t<i class="ph ph-arrow-right" style="font-size: 16px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderConversationItem(e){const t=e.unread>0?"unread":"",n=this._formatTimeAgo(e.lastMessageTime),s=this._renderConversationAvatars(e.participants);return`\n\t\t\t<div class="messenger-conversation-item ${t}" data-conversation-id="${e.id}">\n\t\t\t\t<div class="messenger-conversation-avatars">\n\t\t\t\t\t${s}\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-conversation-content">\n\t\t\t\t\t<div class="messenger-conversation-header">\n\t\t\t\t\t\t<span class="messenger-conversation-title">${e.title||"Chat with team"}</span>\n\t\t\t\t\t\t<span class="messenger-conversation-time">${n}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-conversation-preview">\n\t\t\t\t\t\t${e.unread>0?'<span class="messenger-unread-dot"></span>':""}\n\t\t\t\t\t\t<span class="messenger-conversation-message">${this._truncateMessage(e.lastMessage)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`}_renderConversationAvatars(e){if(!e||0===e.length)return'<div class="messenger-avatar messenger-avatar-medium" style="background: #5856d6;">S</div>';const t=e[0];return t.avatarUrl?`<img class="messenger-avatar messenger-avatar-medium" src="${t.avatarUrl}" alt="${t.name}" />`:`<div class="messenger-avatar messenger-avatar-medium" style="background: ${this._getAvatarColor(0)};">${(t.name||"S").charAt(0).toUpperCase()}</div>`}_renderAvatarStack(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack messenger-avatar-stack-small">\n\t\t\t\t\t<div class="messenger-avatar messenger-avatar-small" style="background: #5856d6;">S</div>\n\t\t\t\t\t<div class="messenger-avatar messenger-avatar-small" style="background: #007aff;">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack messenger-avatar-stack-small">${e.slice(0,2).map((e,t)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar messenger-avatar-small" src="${e}" alt="Team member" style="z-index: ${2-t};" />`:`<div class="messenger-avatar messenger-avatar-small" style="background: ${this._getAvatarColor(t)}; z-index: ${2-t};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_getAvatarColor(e){const t=["#5856d6","#007aff","#34c759","#ff9500","#ff3b30"];return t[e%t.length]}_formatTimeAgo(e){if(!e)return"";const t=new Date(e),n=new Date-t,s=Math.floor(n/6e4),i=Math.floor(n/36e5),a=Math.floor(n/864e5);return s<1?"now":s<60?`${s}m`:i<24?`${i}h`:a<7?`${a}d`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_truncateMessage(e){if(!e)return"No messages yet";return e.length<=50?e:e.substring(0,50)+"..."}_attachEvents(){const e=this.element.querySelector(".messenger-close-btn");e&&e.addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelectorAll(".messenger-conversation-item").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.conversationId;this.state.setActiveConversation(t),this.state.markAsRead(t),this.state.setView("chat"),this.options.onSelectConversation&&this.options.onSelectConversation(t)})});const t=this.element.querySelector(".messenger-new-message-btn");t&&t.addEventListener("click",()=>{this._startNewConversation()})}_startNewConversation(){this.state.setActiveConversation(null),this.state.setView("chat"),this.options.onStartNewConversation&&this.options.onStartNewConversation()}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class ${constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-help-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"helpArticlesUpdate"!==e&&"helpSearchChange"!==e||this._updateCollectionsList()}),this.element}_updateContent(){const e=this.state.helpSearchQuery||"",t=(this.state.helpArticles||[]).length;this.element.innerHTML=`\n\t\t\t<div class="messenger-help-header">\n\t\t\t\t<h2>Help</h2>\n\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t</button>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-help-search">\n\t\t\t\t<div class="messenger-help-search-wrapper">\n\t\t\t\t\t<input\n\t\t\t\t\t\ttype="text"\n\t\t\t\t\t\tclass="messenger-help-search-input"\n\t\t\t\t\t\tplaceholder="Search for help"\n\t\t\t\t\t\tvalue="${e}"\n\t\t\t\t\t/>\n\t\t\t\t\t<i class="ph ph-magnifying-glass messenger-help-search-icon" style="font-size: 18px;"></i>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-help-body">\n\t\t\t\t<div class="messenger-help-collections-header">\n\t\t\t\t\t${t} collections\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-help-collections"></div>\n\t\t\t</div>\n\t\t`,this._updateCollectionsList(),this._attachEvents()}_updateCollectionsList(){const e=this.element.querySelector(".messenger-help-collections"),t=this.state.helpArticles||[],n=(this.state.helpSearchQuery||"").toLowerCase(),s=n?t.filter(e=>e.title.toLowerCase().includes(n)||e.description&&e.description.toLowerCase().includes(n)):t,i=this.element.querySelector(".messenger-help-collections-header");i&&(i.textContent=`${s.length} collections`),0!==s.length?(e.innerHTML=s.map(e=>this._renderCollectionItem(e)).join(""),this._attachCollectionEvents()):e.innerHTML=this._renderEmptyState()}_renderCollectionItem(e){const t=e.articleCount||0;return`\n\t\t\t<div class="messenger-help-collection" data-collection-id="${e.id}">\n\t\t\t\t<div class="messenger-help-collection-content">\n\t\t\t\t\t<h3 class="messenger-help-collection-title">${e.title}</h3>\n\t\t\t\t\t<p class="messenger-help-collection-desc">${e.description||""}</p>\n\t\t\t\t\t<span class="messenger-help-collection-count">${t} articles</span>\n\t\t\t\t</div>\n\t\t\t\t<i class="ph ph-caret-right messenger-help-collection-arrow" style="font-size: 20px;"></i>\n\t\t\t</div>\n\t\t`}_renderEmptyState(){return this.state.helpSearchQuery?'\n\t\t\t\t<div class="messenger-help-empty">\n\t\t\t\t\t<div class="messenger-help-empty-icon">\n\t\t\t\t\t\t<i class="ph ph-magnifying-glass" style="font-size: 48px;"></i>\n\t\t\t\t\t</div>\n\t\t\t\t\t<h3>No results found</h3>\n\t\t\t\t\t<p>Try a different search term</p>\n\t\t\t\t</div>\n\t\t\t':'\n\t\t\t<div class="messenger-help-empty">\n\t\t\t\t<div class="messenger-help-empty-icon">\n\t\t\t\t\t<i class="ph ph-question" style="font-size: 48px;"></i>\n\t\t\t\t</div>\n\t\t\t\t<h3>Help collections</h3>\n\t\t\t\t<p>No collections available yet</p>\n\t\t\t</div>\n\t\t'}_attachEvents(){this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)});let e;this.element.querySelector(".messenger-help-search-input").addEventListener("input",t=>{clearTimeout(e),e=setTimeout(()=>{this.state.setHelpSearchQuery(t.target.value)},300)}),this._attachCollectionEvents()}_attachCollectionEvents(){this.element.querySelectorAll(".messenger-help-collection").forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.collectionId,n=this.state.helpArticles.find(e=>e.id===t);n&&n.url?window.open(n.url,"_blank"):this.options.onArticleClick&&this.options.onArticleClick(n)})})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class z{constructor(e,t={}){this.state=e,this.options=t,this.element=null,this._unsubscribe=null}render(){return this.element=document.createElement("div"),this.element.className="messenger-view messenger-home-view",this._updateContent(),this._unsubscribe=this.state.subscribe(e=>{"homeChangelogUpdate"!==e&&"conversationsUpdate"!==e&&"availabilityUpdate"!==e||this._updateContent()}),this.element}_updateContent(){const e=this._renderAvatarStack(),t=this._renderRecentChangelog();this.element.innerHTML=`\n\t\t\t<div class="messenger-home-header">\n\t\t\t\t<div class="messenger-home-header-top">\n\t\t\t\t\t<div class="messenger-home-logo">\n\t\t\t\t\t\t${this.options.logoUrl?`<img src="${this.options.logoUrl}" alt="${this.state.teamName}" />`:""}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div class="messenger-home-avatars">${e}</div>\n\t\t\t\t\t<button class="messenger-close-btn" aria-label="Close">\n\t\t\t\t\t\t<i class="ph ph-x" style="font-size: 20px;"></i>\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\t\t\t\t<div class="messenger-home-welcome">\n\t\t\t\t\t<span class="messenger-home-greeting">Hello there.</span>\n\t\t\t\t\t<span class="messenger-home-question">${this.state.welcomeMessage}</span>\n\t\t\t\t\t${this._renderAvailabilityStatus()}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<div class="messenger-home-body">\n\t\t\t\t<button class="messenger-home-message-btn">\n\t\t\t\t\t<span>Send us a message</span>\n\t\t\t\t\t<i class="ph ph-arrow-right" style="font-size: 16px;"></i>\n\t\t\t\t</button>\n\n\t\t\t\t${this._renderFeaturedCard()}\n\n\t\t\t\t${t}\n\t\t\t</div>\n\t\t`,this._attachEvents()}_renderAvatarStack(){const e=this.state.teamAvatars;if(!e||0===e.length)return'\n\t\t\t\t<div class="messenger-avatar-stack">\n\t\t\t\t\t<div class="messenger-avatar" style="background: #5856d6;">S</div>\n\t\t\t\t\t<div class="messenger-avatar" style="background: #007aff;">T</div>\n\t\t\t\t</div>\n\t\t\t';return`<div class="messenger-avatar-stack">${e.slice(0,3).map((e,t)=>"string"==typeof e&&e.startsWith("http")?`<img class="messenger-avatar" src="${e}" alt="Team member" style="z-index: ${3-t};" />`:`<div class="messenger-avatar" style="background: ${this._getAvatarColor(t)}; z-index: ${3-t};">${e.charAt(0).toUpperCase()}</div>`).join("")}</div>`}_getAvatarColor(e){const t=["#5856d6","#007aff","#34c759","#ff9500","#ff3b30"];return t[e%t.length]}_renderAvailabilityStatus(){const e=this.state.agentsOnline,t=this.state.responseTime||"We typically reply within a few minutes";return e?'\n\t\t\t\t<div class="messenger-home-availability">\n\t\t\t\t\t<span class="messenger-availability-dot messenger-availability-online"></span>\n\t\t\t\t\t<span class="messenger-availability-text">We\'re online now</span>\n\t\t\t\t</div>\n\t\t\t':`\n\t\t\t<div class="messenger-home-availability">\n\t\t\t\t<span class="messenger-availability-dot messenger-availability-away"></span>\n\t\t\t\t<span class="messenger-availability-text">${t}</span>\n\t\t\t</div>\n\t\t`}_renderFeaturedCard(){if(!this.options.featuredContent)return"";const{title:e,description:t,imageUrl:n,action:s}=this.options.featuredContent;return`\n\t\t\t<div class="messenger-home-featured">\n\t\t\t\t${n?`<img src="${n}" alt="${e}" class="messenger-home-featured-image" onerror="this.style.display='none';" />`:""}\n\t\t\t\t<div class="messenger-home-featured-content">\n\t\t\t\t\t<h3>${e}</h3>\n\t\t\t\t\t<p>${t}</p>\n\t\t\t\t</div>\n\t\t\t\t${s?`<button class="messenger-home-featured-btn" data-action="${s.type}" data-value="${s.value}">${s.label}</button>`:""}\n\t\t\t</div>\n\t\t`}_renderRecentChangelog(){const e=this.state.homeChangelogItems;if(0===e.length)return"";return`\n\t\t\t<div class="messenger-home-changelog-section">\n\t\t\t\t${e.map(e=>`\n\t\t\t<div class="messenger-home-changelog-card" data-changelog-id="${e.id}">\n\t\t\t\t${e.coverImage?`\n\t\t\t\t\t<div class="messenger-home-changelog-cover">\n\t\t\t\t\t\t<img src="${e.coverImage}" alt="${e.title}" onerror="this.style.display='none';" />\n\t\t\t\t\t\t${e.coverText?`<span class="messenger-home-changelog-cover-text">${e.coverText}</span>`:""}\n\t\t\t\t\t</div>\n\t\t\t\t`:""}\n\t\t\t\t<div class="messenger-home-changelog-card-content">\n\t\t\t\t\t<h4 class="messenger-home-changelog-card-title">${e.title}</h4>\n\t\t\t\t\t<p class="messenger-home-changelog-card-desc">${e.description||""}</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t`).join("")}\n\t\t\t</div>\n\t\t`}_formatDate(e){if(!e)return"";const t=new Date(e),n=new Date,s=Math.floor((n-t)/864e5);return 0===s?"Today":1===s?"Yesterday":s<7?`${s}d ago`:t.toLocaleDateString("en-US",{month:"short",day:"numeric"})}_attachEvents(){this.element.querySelector(".messenger-close-btn").addEventListener("click",()=>{this.state.setOpen(!1)}),this.element.querySelector(".messenger-home-message-btn").addEventListener("click",()=>{this.state.setView("messages")}),this.element.querySelectorAll(".messenger-home-changelog-item").forEach(e=>{e.addEventListener("click",()=>{this.state.setView("changelog")})});const e=this.element.querySelector(".messenger-home-changelog-all");e&&e.addEventListener("click",()=>{this.state.setView("changelog")});const t=this.element.querySelector(".messenger-home-featured-btn");t&&t.addEventListener("click",()=>{const e=t.dataset.action,n=t.dataset.value;"url"===e?window.open(n,"_blank"):"view"===e&&this.state.setView(n)})}destroy(){this._unsubscribe&&this._unsubscribe(),this.element&&this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class L extends y{constructor(e){super({...e,type:"messenger"}),this.messengerOptions={position:e.position||"bottom-right",theme:e.theme||"light",teamName:e.teamName||"Support",teamAvatars:e.teamAvatars||[],welcomeMessage:e.welcomeMessage||"How can we help?",enableHelp:!1!==e.enableHelp,enableChangelog:!1!==e.enableChangelog,logoUrl:e.logoUrl||"https://feedback-sdk.product7.io/p7.png",featuredContent:e.featuredContent||null,primaryColor:e.primaryColor||"#1c1c1e",onSendMessage:e.onSendMessage||null,onArticleClick:e.onArticleClick||null,onChangelogClick:e.onChangelogClick||null},this.messengerState=new S({teamName:this.messengerOptions.teamName,teamAvatars:this.messengerOptions.teamAvatars,welcomeMessage:this.messengerOptions.welcomeMessage,enableHelp:this.messengerOptions.enableHelp,enableChangelog:this.messengerOptions.enableChangelog,userContext:this.sdk?.apiService?.getUserContext()||null}),this.launcher=null,this.panel=null,this.wsService=null,this._wsUnsubscribers=[],this._handleOpenChange=this._handleOpenChange.bind(this),this._handleWebSocketMessage=this._handleWebSocketMessage.bind(this),this._handleTypingStarted=this._handleTypingStarted.bind(this),this._handleTypingStopped=this._handleTypingStopped.bind(this)}_render(){const e=document.createElement("div");return e.className=`messenger-widget theme-${this.messengerOptions.theme}`,e.style.zIndex="999999",this.launcher=new C(this.messengerState,{position:this.messengerOptions.position,primaryColor:this.messengerOptions.primaryColor}),e.appendChild(this.launcher.render()),this.panel=new I(this.messengerState,{position:this.messengerOptions.position,theme:this.messengerOptions.theme,primaryColor:this.messengerOptions.primaryColor,logoUrl:this.messengerOptions.logoUrl,featuredContent:this.messengerOptions.featuredContent,onSendMessage:this.messengerOptions.onSendMessage||this._handleSendMessage.bind(this),onStartConversation:this._handleStartConversation.bind(this),onTyping:this.sendTypingIndicator.bind(this),onSelectConversation:this._handleSelectConversation.bind(this),onStartNewConversation:this._handleNewConversationClick.bind(this),onArticleClick:this.messengerOptions.onArticleClick,onChangelogClick:this.messengerOptions.onChangelogClick}),this.panel.registerView("home",z),this.panel.registerView("messages",A),this.panel.registerView("chat",M),this.panel.registerView("help",$),this.panel.registerView("changelog",T),e.appendChild(this.panel.render()),this.panel.hide(),e}_attachEvents(){this._stateUnsubscribe=this.messengerState.subscribe((e,t)=>{"openChange"===e&&this._handleOpenChange(t.isOpen)})}_handleOpenChange(e){e?(this.panel.show(),this.sdk.eventBus.emit("messenger:opened",{widget:this})):(this.panel.hide(),this.messengerState.reset(),this.sdk.eventBus.emit("messenger:closed",{widget:this}))}async _handleStartConversation(e){try{await this.startNewConversation(e)}catch(e){console.error("[MessengerWidget] Failed to start conversation:",e)}}async _handleSelectConversation(e){try{await this.fetchMessages(e)}catch(e){console.error("[MessengerWidget] Failed to fetch messages:",e)}}_handleNewConversationClick(){}async _handleSendMessage(e,t){this.sdk.eventBus.emit("messenger:messageSent",{widget:this,conversationId:e,message:t});try{const n=await this.apiService.sendMessage(e,{content:t.content});n.status&&n.data&&console.log("[MessengerWidget] Message sent:",n.data.id),this.apiService?.mock&&setTimeout(()=>{const t={id:"msg_"+Date.now(),content:"Thanks for your message! We'll get back to you soon.",isOwn:!1,timestamp:(new Date).toISOString(),sender:{name:"Support Team",avatarUrl:null}};this.messengerState.addMessage(e,t)},1500)}catch(e){console.error("[MessengerWidget] Failed to send message:",e)}}_handleWebSocketMessage(e){const{conversation_id:t,message:n}=e,s={id:n.id,content:n.content,isOwn:"customer"===n.sender_type,timestamp:n.created_at,sender:{name:n.sender_name||"Support",avatarUrl:n.sender_avatar||null}};this.messengerState.addMessage(t,s),this.messengerState.isOpen&&this.messengerState.activeConversationId===t||this._updateUnreadCount()}_handleTypingStarted(e){e.is_agent&&this.messengerState._notify("typingStarted",{conversationId:e.conversation_id,userName:e.user_name})}_handleTypingStopped(e){this.messengerState._notify("typingStopped",{conversationId:e.conversation_id})}async _updateUnreadCount(){try{const e=await this.apiService.getUnreadCount();e.status&&e.data&&(this.messengerState.unreadCount=e.data.unread_count||0,this.messengerState._notify("unreadCountChange",{count:this.messengerState.unreadCount}))}catch(e){console.error("[MessengerWidget] Failed to get unread count:",e)}}_initWebSocket(){this.wsService&&this.wsService.disconnect(),this.wsService=new _({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("connected",()=>{console.log("[MessengerWidget] WebSocket connected")})),this._wsUnsubscribers.push(this.wsService.on("disconnected",()=>{console.log("[MessengerWidget] WebSocket disconnected")})),this.wsService.connect()}open(){this.messengerState.setOpen(!0)}close(){this.messengerState.setOpen(!1)}toggle(){this.messengerState.setOpen(!this.messengerState.isOpen)}navigateTo(e){this.messengerState.setView(e),this.messengerState.isOpen||this.open()}setConversations(e){this.messengerState.setConversations(e)}addMessage(e,t){this.messengerState.addMessage(e,t)}setHelpArticles(e){this.messengerState.setHelpArticles(e)}setHomeChangelogItems(e){this.messengerState.setHomeChangelogItems(e)}setChangelogItems(e){this.messengerState.setChangelogItems(e)}setUnreadCount(e){this.messengerState.unreadCount=e,this.messengerState._notify("unreadCountChange",{count:e})}getState(){return{isOpen:this.messengerState.isOpen,currentView:this.messengerState.currentView,unreadCount:this.messengerState.unreadCount,conversations:this.messengerState.conversations}}async loadInitialData(){try{const e=await this._fetchConversations();this.messengerState.setConversations(e)}catch(e){console.error("[MessengerWidget] Failed to load conversations:",e)}if(this.messengerOptions.enableHelp)try{const e=await this._fetchHelpArticles();this.messengerState.setHelpArticles(e)}catch(e){console.error("[MessengerWidget] Failed to load help articles:",e)}if(this.messengerOptions.enableChangelog)try{const{homeItems:e,changelogItems:t}=await this._fetchChangelog();this.messengerState.setHomeChangelogItems(e),this.messengerState.setChangelogItems(t)}catch(e){console.error("[MessengerWidget] Failed to load changelog:",e)}}async _fetchConversations(){try{const e=await this.apiService.getConversations();return e.status&&e.data?e.data.map(e=>({id:e.id,title:e.subject||`Chat with ${e.assigned_user?.name||"Support"}`,participants:e.assigned_user?[{name:e.assigned_user.name,avatarUrl:e.assigned_user.avatar}]:[{name:"Support",avatarUrl:null}],lastMessage:e.preview||e.snippet||"",lastMessageTime:e.last_message_at,unread:e.unread||0,status:e.status})):[]}catch(e){return console.error("[MessengerWidget] Failed to fetch conversations:",e),[]}}async _fetchHelpArticles(){try{const e=await this.apiService.getHelpCollections();return e.status&&e.data?e.data.map(e=>({id:e.id,title:e.title||e.name,description:e.description||"",articleCount:e.article_count||e.articleCount||0,icon:e.icon||"ph-book-open",url:e.url||`#/help/${e.slug||e.id}`})):[]}catch(e){return console.error("[MessengerWidget] Failed to fetch help articles:",e),[]}}async fetchMessages(e){try{const t=await this.apiService.getConversation(e);if(t.status&&t.data){const n=(t.data.messages||[]).map(e=>({id:e.id,content:e.content,isOwn:"customer"===e.sender_type,timestamp:e.created_at,sender:{name:e.sender_name||("customer"===e.sender_type?"You":"Support"),avatarUrl:e.sender_avatar||null}}));return this.messengerState.setMessages(e,n),await this.apiService.markConversationAsRead(e),this.messengerState.markAsRead(e),n}return[]}catch(e){return console.error("[MessengerWidget] Failed to fetch messages:",e),[]}}async startNewConversation(e,t=""){try{const n=await this.apiService.startConversation({message:e,subject:t});if(n.status&&n.data){const t=n.data,s={id:t.id,title:t.subject||"New conversation",participants:[{name:"Support",avatarUrl:null}],lastMessage:e,lastMessageTime:t.created_at||(new Date).toISOString(),unread:0,status:"open"};return this.messengerState.addConversation(s),this.messengerState.setMessages(t.id,[{id:"msg_"+Date.now(),content:e,isOwn:!0,timestamp:(new Date).toISOString()}]),this.messengerState.setActiveConversation(t.id),this.messengerState.setView("chat"),t}return null}catch(e){return console.error("[MessengerWidget] Failed to start conversation:",e),null}}async sendTypingIndicator(e,t){try{await this.apiService.sendTypingIndicator(e,t)}catch(e){}}async checkAgentAvailability(){try{const e=await this.apiService.checkAgentsOnline();return e.status&&e.data?(this.messengerState.agentsOnline=e.data.agents_online,this.messengerState.onlineCount=e.data.online_count||0,this.messengerState.responseTime=e.data.response_time||"",this.messengerState._notify("availabilityUpdate",e.data),e.data):{agents_online:!1,online_count:0}}catch(e){return console.error("[MessengerWidget] Failed to check availability:",e),{agents_online:!1,online_count:0}}}async _fetchChangelog(){if(this.apiService?.mock)return{homeItems:[{id:"changelog_5",title:"New integrations available",description:"Connect with more tools you love and streamline your workflow.",tags:["Integration"],coverImage:"https://feedback-sdk.product7.io/700x400__5_.png",coverText:null,publishedAt:new Date(Date.now()-12096e5).toISOString(),url:"#"},{id:"changelog_2",title:"A new era of Insights has arrived",description:"We announced Fin Insights, a groundbreaking, AI-powered product that gives you complete visibility into every customer conversation.",tags:["New feature","AI"],coverImage:"https://feedback-sdk.product7.io/Intercom_Messenger__1_.jpg",coverText:"Watch our major product launch on-demand",publishedAt:new Date(Date.now()-432e6).toISOString(),url:"#"},{id:"changelog_1",title:"The 2025 Customer Service Transformation Report",description:"Learn how AI has transformed customer service from the ground up—rewriting its economics and reshaping expectations.",tags:["Report"],coverImage:"https://feedback-sdk.product7.io/Main_Report_Email_Header.png",coverText:"Customer service trends as we know them are dead.",publishedAt:new Date(Date.now()-1728e5).toISOString(),url:"#"}],changelogItems:[{id:"changelog_4",title:"Enhanced conversation analytics",description:"Get deeper insights into your customer conversations with our new analytics dashboard.",tags:["Analytics"],coverImage:"https://feedback-sdk.product7.io/cgangelog-Frame%202087334450.jpg",coverText:null,publishedAt:new Date(Date.now()-864e6).toISOString(),url:"#"},{id:"changelog_3",title:"Escalation guidance for complex issues",description:"New AI-powered escalation guidance helps your team handle complex customer issues more effectively.",tags:["New feature","AI"],coverImage:"https://feedback-sdk.product7.io/cgangelog-image-escalation-guidance-event@2x.png",coverText:null,publishedAt:new Date(Date.now()-6048e5).toISOString(),url:"#"}]};const e=((await this.apiService.getChangelogs({limit:20})).data||[]).map(e=>({id:e.id,title:e.title,description:e.excerpt||e.description||"",tags:e.labels?e.labels.map(e=>e.name):[],coverImage:e.cover_image||null,coverText:null,publishedAt:e.published_at,url:e.slug?`/changelog/${e.slug}`:"#"}));return{homeItems:e.slice(0,3),changelogItems:e}}onMount(){this.loadInitialData(),this.apiService?.sessionToken&&this._initWebSocket(),this.checkAgentAvailability(),this._availabilityInterval=setInterval(()=>{this.checkAgentAvailability()},6e4)}onDestroy(){this._stateUnsubscribe&&this._stateUnsubscribe(),this.wsService&&this.wsService.disconnect(),this._wsUnsubscribers.forEach(e=>e()),this._wsUnsubscribers=[],this._availabilityInterval&&clearInterval(this._availabilityInterval)}destroy(){this.launcher&&this.launcher.destroy(),this.panel&&this.panel.destroy(),this.onDestroy(),super.destroy()}}class D extends y{constructor(e){super({...e,type:"survey"}),this.surveyOptions={surveyId:e.surveyId||null,surveyType:e.surveyType||"nps",position:e.position||"bottom-right",title:e.title||null,description:e.description||null,lowLabel:e.lowLabel||null,highLabel:e.highLabel||null,customQuestions:e.customQuestions||[],theme:e.theme||"light",onSubmit:e.onSubmit||null,onDismiss:e.onDismiss||null},this.surveyState={score:null,feedback:"",customAnswers:{},isVisible:!1}}_render(){const e=document.createElement("div");return e.className="feedback-survey-container",e.style.display="none",e}_attachEvents(){}show(){return this._renderSurvey(),this.surveyState.isVisible=!0,this.sdk.eventBus.emit("survey:shown",{widget:this,type:this.surveyOptions.surveyType}),this}hide(){return this._closeSurvey(),this}_renderSurvey(){this._closeSurvey();const e=this._getSurveyConfig(),t=this._getPositionStyles(),n="dark"===this.surveyOptions.theme?"background: #1a1a1a; color: #fff;":"background: #fff; color: #1d1d1f;";"center"===this.surveyOptions.position&&(this.backdropElement=document.createElement("div"),this.backdropElement.className="feedback-survey-backdrop",document.body.appendChild(this.backdropElement),this.backdropElement.addEventListener("click",()=>this._handleDismiss())),this.surveyElement=document.createElement("div"),this.surveyElement.className=`feedback-survey feedback-survey-${this.surveyOptions.position} theme-${this.surveyOptions.theme}`,this.surveyElement.style.cssText=`position: fixed; ${t} z-index: 10000; ${n} border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,0.3); padding: 24px; min-width: 320px; max-width: 400px; font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;`,this.surveyElement.innerHTML=`\n\t\t\t<button class="feedback-survey-close" style="position: absolute; top: 12px; right: 12px; background: none; border: none; font-size: 20px; cursor: pointer; color: ${"dark"===this.surveyOptions.theme?"#888":"#86868b"}; line-height: 1;">&times;</button>\n\t\t\t<h3 class="feedback-survey-title" style="margin: 0 0 8px 0; font-size: 18px; font-weight: 600; padding-right: 24px;">${e.title}</h3>\n\t\t\t<p class="feedback-survey-description" style="color: ${"dark"===this.surveyOptions.theme?"#aaa":"#86868b"}; margin: 0 0 20px 0; font-size: 14px;">${e.description}</p>\n\t\t\t<div class="feedback-survey-content">${e.html}</div>\n\t\t\t<div class="feedback-survey-feedback" style="margin-top: 16px;">\n\t\t\t\t<textarea class="feedback-survey-textarea" placeholder="Any additional feedback? (optional)" style="width: 100%; padding: 12px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#333":"#d2d2d7"}; border-radius: 8px; font-size: 14px; resize: none; height: 80px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; font-family: inherit; box-sizing: border-box;"></textarea>\n\t\t\t</div>\n\t\t\t<button class="feedback-survey-submit" style="width: 100%; margin-top: 12px; padding: 12px; background: #007aff; color: white; border: none; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; font-family: inherit;">Submit</button>\n\t\t`,document.body.appendChild(this.surveyElement),this._attachSurveyEvents(),requestAnimationFrame(()=>{this.surveyElement.style.opacity="1",this.surveyElement.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(1)":"translateY(0)"})}_getSurveyConfig(){const e={nps:{title:this.surveyOptions.title||"How likely are you to recommend us?",description:this.surveyOptions.description||"On a scale of 0-10, how likely are you to recommend our product to a friend or colleague?",html:`\n\t\t\t\t\t<div class="feedback-survey-nps" style="display: flex; justify-content: space-between; gap: 4px;">\n\t\t\t\t\t\t${[...Array(11).keys()].map(e=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-nps-btn" data-score="${e}" style="width: 28px; height: 36px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 6px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa"}; cursor: pointer; font-size: 12px; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; transition: all 0.15s;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style="display: flex; justify-content: space-between; margin-top: 8px; font-size: 11px; color: ${"dark"===this.surveyOptions.theme?"#888":"#86868b"};">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel||"Not likely"}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel||"Very likely"}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`},csat:{title:this.surveyOptions.title||"How satisfied are you?",description:this.surveyOptions.description||"How would you rate your overall satisfaction with our product?",html:`\n\t\t\t\t\t<div class="feedback-survey-csat" style="display: flex; justify-content: center; gap: 16px;">\n\t\t\t\t\t\t${["😞","😕","😐","🙂","😄"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-csat-btn" data-score="${t+1}" style="background: none; border: none; cursor: pointer; font-size: 36px; transition: transform 0.15s; padding: 8px;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t\t<div style="display: flex; justify-content: space-between; margin-top: 8px; font-size: 11px; color: ${"dark"===this.surveyOptions.theme?"#888":"#86868b"};">\n\t\t\t\t\t\t<span>${this.surveyOptions.lowLabel||"Very dissatisfied"}</span>\n\t\t\t\t\t\t<span>${this.surveyOptions.highLabel||"Very satisfied"}</span>\n\t\t\t\t\t</div>\n\t\t\t\t`},ces:{title:this.surveyOptions.title||"How easy was it?",description:this.surveyOptions.description||"How easy was it to accomplish your task today?",html:`\n\t\t\t\t\t<div class="feedback-survey-ces" style="display: flex; justify-content: space-between; gap: 8px;">\n\t\t\t\t\t\t${["Very Difficult","Difficult","Neutral","Easy","Very Easy"].map((e,t)=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-ces-btn" data-score="${t+1}" style="flex: 1; padding: 12px 8px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa"}; cursor: pointer; font-size: 11px; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; transition: all 0.15s;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t`},custom:{title:this.surveyOptions.title||"Quick Feedback",description:this.surveyOptions.description||"Help us improve by answering a few questions.",html:this._renderCustomQuestions()}};return e[this.surveyOptions.surveyType]||e.nps}_renderCustomQuestions(){return this.surveyOptions.customQuestions&&0!==this.surveyOptions.customQuestions.length?this.surveyOptions.customQuestions.map((e,t)=>`\n\t\t\t<div style="margin-bottom: 16px;">\n\t\t\t\t<label style="display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;">${e.label}</label>\n\t\t\t\t${this._renderQuestionInput(e,t)}\n\t\t\t</div>\n\t\t`).join(""):`\n\t\t\t\t<div style="margin-bottom: 16px;">\n\t\t\t\t\t<label style="display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;">What feature do you use most?</label>\n\t\t\t\t\t<select class="feedback-survey-select" data-question="feature" style="width: 100%; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; font-size: 14px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"};">\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>\n\t\t\t\t\t<label style="display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500;">How often do you use it?</label>\n\t\t\t\t\t<div class="feedback-survey-frequency" style="display: flex; gap: 8px;">\n\t\t\t\t\t\t${["Daily","Weekly","Monthly","Rarely"].map(e=>`\n\t\t\t\t\t\t\t<button class="feedback-survey-freq-btn" data-freq="${e}" style="flex: 1; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa"}; cursor: pointer; font-size: 12px; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; transition: all 0.15s;">${e}</button>\n\t\t\t\t\t\t`).join("")}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t`}_renderQuestionInput(e,t){switch(e.type){case"select":return`\n\t\t\t\t\t<select class="feedback-survey-select" data-question="${e.id||t}" style="width: 100%; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; font-size: 14px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"};">\n\t\t\t\t\t\t<option value="">${e.placeholder||"Select an option"}</option>\n\t\t\t\t\t\t${e.options.map(e=>`<option value="${e.value}">${e.label}</option>`).join("")}\n\t\t\t\t\t</select>\n\t\t\t\t`;case"text":return`\n\t\t\t\t\t<input type="text" class="feedback-survey-input" data-question="${e.id||t}" placeholder="${e.placeholder||""}" style="width: 100%; padding: 10px; border: 1px solid ${"dark"===this.surveyOptions.theme?"#444":"#d2d2d7"}; border-radius: 8px; font-size: 14px; background: ${"dark"===this.surveyOptions.theme?"#2a2a2a":"#fff"}; color: ${"dark"===this.surveyOptions.theme?"#fff":"#1d1d1f"}; box-sizing: border-box;">\n\t\t\t\t`;default:return""}}_getPositionStyles(){const e={"bottom-right":"bottom: 24px; right: 24px; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;","bottom-left":"bottom: 24px; left: 24px; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;",center:"top: 50%; left: 50%; transform: translate(-50%, -50%) scale(0.95); opacity: 0; transition: all 0.3s ease;",bottom:"bottom: 0; left: 0; right: 0; border-radius: 16px 16px 0 0; max-width: none; opacity: 0; transform: translateY(20px); transition: all 0.3s ease;"};return e[this.surveyOptions.position]||e["bottom-right"]}_attachSurveyEvents(){if(!this.surveyElement)return;this.surveyElement.querySelector(".feedback-survey-close").addEventListener("click",()=>this._handleDismiss());this.surveyElement.querySelector(".feedback-survey-submit").addEventListener("click",()=>this._handleSubmit());this.surveyElement.querySelector(".feedback-survey-textarea").addEventListener("input",e=>{this.surveyState.feedback=e.target.value}),this._attachTypeSpecificEvents(),this._escapeHandler=e=>{"Escape"===e.key&&this._handleDismiss()},document.addEventListener("keydown",this._escapeHandler)}_attachTypeSpecificEvents(){const e=this.surveyOptions.surveyType;"nps"===e&&this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(e=>{e.addEventListener("click",()=>this._selectNPS(parseInt(e.dataset.score))),e.addEventListener("mouseenter",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="#007aff")}),e.addEventListener("mouseleave",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7")})}),"csat"===e&&this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCSAT(parseInt(e.dataset.score))),e.addEventListener("mouseenter",()=>{e.style.transform="scale(1.1)"}),e.addEventListener("mouseleave",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.transform="scale(1)")})}),"ces"===e&&this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(e=>{e.addEventListener("click",()=>this._selectCES(parseInt(e.dataset.score))),e.addEventListener("mouseenter",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="#007aff")}),e.addEventListener("mouseleave",()=>{this.surveyState.score!==parseInt(e.dataset.score)&&(e.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7")})}),"custom"===e&&(this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(e=>{e.addEventListener("click",()=>this._selectFrequency(e.dataset.freq))}),this.surveyElement.querySelectorAll(".feedback-survey-select").forEach(e=>{e.addEventListener("change",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}),this.surveyElement.querySelectorAll(".feedback-survey-input").forEach(e=>{e.addEventListener("input",t=>{this.surveyState.customAnswers[e.dataset.question]=t.target.value})}))}_selectNPS(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-nps-btn").forEach(t=>{parseInt(t.dataset.score)===e?(t.style.background="#007aff",t.style.borderColor="#007aff",t.style.color="#fff"):(t.style.background="dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa",t.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7",t.style.color="dark"===this.surveyOptions.theme?"#fff":"#1d1d1f")})}_selectCSAT(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-csat-btn").forEach(t=>{const n=parseInt(t.dataset.score);t.style.transform=n===e?"scale(1.2)":"scale(1)"})}_selectCES(e){this.surveyState.score=e,this.surveyElement.querySelectorAll(".feedback-survey-ces-btn").forEach(t=>{parseInt(t.dataset.score)===e?(t.style.background="#007aff",t.style.borderColor="#007aff",t.style.color="#fff"):(t.style.background="dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa",t.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7",t.style.color="dark"===this.surveyOptions.theme?"#fff":"#1d1d1f")})}_selectFrequency(e){this.surveyState.customAnswers.frequency=e,this.surveyElement.querySelectorAll(".feedback-survey-freq-btn").forEach(t=>{t.dataset.freq===e?(t.style.background="#007aff",t.style.borderColor="#007aff",t.style.color="#fff"):(t.style.background="dark"===this.surveyOptions.theme?"#2a2a2a":"#f8f9fa",t.style.borderColor="dark"===this.surveyOptions.theme?"#444":"#d2d2d7",t.style.color="dark"===this.surveyOptions.theme?"#fff":"#1d1d1f")})}async _handleSubmit(){const e=this.surveyOptions.surveyType;if(("nps"===e||"csat"===e||"ces"===e)&&null===this.surveyState.score)return void this._showError("Please select a rating");const t={rating:this.surveyState.score,feedback:this.surveyState.feedback,answers:this.surveyState.customAnswers},n={type:e,score:this.surveyState.score,feedback:this.surveyState.feedback,customAnswers:this.surveyState.customAnswers,timestamp:(new Date).toISOString()};this.surveyOptions.onSubmit&&this.surveyOptions.onSubmit(n);try{const n=this.surveyOptions.surveyId||`local_${e}_${Date.now()}`;await this.apiService.submitSurveyResponse(n,t)}catch(e){console.error("[SurveyWidget] Failed to submit survey:",e)}this.sdk.eventBus.emit("survey:submitted",{widget:this,response:n}),this._closeSurvey(),this._showSuccessNotification()}async _handleDismiss(){if(this.surveyOptions.surveyId)try{await this.apiService.dismissSurvey(this.surveyOptions.surveyId)}catch(e){console.error("[SurveyWidget] Failed to dismiss survey:",e)}this.surveyOptions.onDismiss&&this.surveyOptions.onDismiss(),this.sdk.eventBus.emit("survey:dismissed",{widget:this}),this._closeSurvey()}_showError(e){const t=this.surveyElement.querySelector(".feedback-survey-error");t&&t.remove();const n=document.createElement("div");n.className="feedback-survey-error",n.style.cssText="color: #ef4444; font-size: 13px; margin-top: 8px; text-align: center;",n.textContent=e;const s=this.surveyElement.querySelector(".feedback-survey-submit");s.parentNode.insertBefore(n,s),setTimeout(()=>n.remove(),3e3)}_showSuccessNotification(){const e=document.createElement("div");e.className="feedback-survey-success",e.style.cssText="\n\t\t\tposition: fixed;\n\t\t\ttop: 24px;\n\t\t\tright: 24px;\n\t\t\tbackground: #10b981;\n\t\t\tcolor: white;\n\t\t\tpadding: 16px 24px;\n\t\t\tborder-radius: 12px;\n\t\t\tfont-size: 14px;\n\t\t\tfont-weight: 500;\n\t\t\tz-index: 10001;\n\t\t\tbox-shadow: 0 10px 40px rgba(0,0,0,0.2);\n\t\t\tfont-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;\n\t\t",e.innerHTML='\n\t\t\t<div style="display: flex; align-items: center; gap: 8px;">\n\t\t\t\t<span style="font-size: 18px;">✓</span>\n\t\t\t\t<span>Thank you for your feedback!</span>\n\t\t\t</div>\n\t\t',document.body.appendChild(e),setTimeout(()=>{e.style.opacity="0",e.style.transition="opacity 0.3s ease",setTimeout(()=>e.remove(),300)},3e3)}_closeSurvey(){this._escapeHandler&&(document.removeEventListener("keydown",this._escapeHandler),this._escapeHandler=null);const e=this.surveyElement,t=this.backdropElement;e&&(e.style.opacity="0",e.style.transform="center"===this.surveyOptions.position?"translate(-50%, -50%) scale(0.95)":"translateY(20px)",setTimeout(()=>{e&&e.parentNode&&e.parentNode.removeChild(e)},300),this.surveyElement=null),t&&(t.style.opacity="0",setTimeout(()=>{t&&t.parentNode&&t.parentNode.removeChild(t)},300),this.backdropElement=null),this.surveyState={score:null,feedback:"",customAnswers:{},isVisible:!1}}destroy(){this._closeSurvey(),super.destroy()}}class O extends y{constructor(e){super({...e,type:"tab"})}_render(){const e=document.createElement("div");return e.className=`feedback-widget feedback-widget-tab theme-${this.options.theme} position-${this.options.position}`,e.innerHTML='\n <div class="feedback-tab-trigger">\n <span class="feedback-tab-text">Feedback</span>\n </div>\n ',this.options.customStyles&&Object.assign(e.style,this.options.customStyles),e}_attachEvents(){const e=this.element.querySelector(".feedback-tab-trigger");e.addEventListener("click",this.openModal),e.addEventListener("mouseenter",()=>{this.state.isSubmitting||(e.style.transform=this._getHoverTransform())}),e.addEventListener("mouseleave",()=>{e.style.transform="none"})}_getHoverTransform(){const e=this.options.position;return e.includes("right")?"translateX(-5px)":e.includes("left")?"translateX(5px)":"none"}updateText(e){const t=this.element?.querySelector(".feedback-tab-text");t&&(t.textContent=e)}updatePosition(e){this.options.position=e,this.element&&(this.element.className=this.element.className.replace(/position-\w+-\w+/,`position-${e}`))}}class N{static widgets=new Map([["button",w],["tab",O],["inline",k],["survey",D],["messenger",L],["changelog",x]]);static register(e,n){if("string"!=typeof e||!e.trim())throw new t("Widget type must be a non-empty string");if("function"!=typeof n)throw new t("Widget class must be a constructor function");this.widgets.set(e,n)}static create(e,n={}){const s=this.widgets.get(e);if(!s){const n=Array.from(this.widgets.keys()).join(", ");throw new t(`Unknown widget type: ${e}. Available types: ${n}`)}try{return new s(n)}catch(n){throw new t(`Failed to create widget of type '${e}': ${n.message}`,n)}}static getAvailableTypes(){return Array.from(this.widgets.keys())}static isTypeRegistered(e){return this.widgets.has(e)}static unregister(e){return this.widgets.delete(e)}static clear(){this.widgets.clear()}static getWidgetClass(e){return this.widgets.get(e)}}class B{constructor(e={}){this.config=this._validateAndMergeConfig(e),this.initialized=!1,this.widgets=new Map,this.eventBus=new m,this.apiService=new p({apiUrl:this.config.apiUrl,workspace:this.config.workspace,userContext:this.config.userContext,mock:this.config.mock,env:this.config.env}),this._bindMethods()}async init(){if(this.initialized)return{alreadyInitialized:!0};try{const e=await this.apiService.init(this.config.userContext);return e.config&&(this.config=b(e.config,this.config)),this.initialized=!0,this.eventBus.emit("sdk:initialized",{config:this.config,sessionToken:e.sessionToken}),{initialized:!0,config:e.config||{},sessionToken:e.sessionToken,expiresIn:e.expiresIn}}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new t(`Failed to initialize SDK: ${e.message}`,e)}}createWidget(e="button",n={}){if(!this.initialized)throw new t("SDK must be initialized before creating widgets. Call init() first.");const s=u("widget"),i={id:s,sdk:this,apiService:this.apiService,...this.config,...n};try{const t=N.create(e,i);return this.widgets.set(s,t),this.eventBus.emit("widget:created",{widget:t,type:e}),t}catch(e){throw new t(`Failed to create widget: ${e.message}`,e)}}getWidget(e){return this.widgets.get(e)}async getActiveSurveys(e={}){if(!this.initialized)throw new t("SDK must be initialized before fetching surveys. Call init() first.");try{return(await this.apiService.getActiveSurveys(e)).data||[]}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new t(`Failed to fetch active surveys: ${e.message}`,e)}}async showSurveyById(e,n={}){if(!this.initialized)throw new t("SDK must be initialized before showing surveys. Call init() first.");const s=(await this.getActiveSurveys()).find(t=>t.id===e);if(!s)throw new t(`Survey with ID '${e}' not found or not active`);return this.showSurvey({surveyId:s.id,surveyType:s.type,title:s.title,description:s.description,lowLabel:s.low_label,highLabel:s.high_label,customQuestions:s.questions,...n})}showSurvey(e={}){if(!this.initialized)throw new t("SDK must be initialized before showing surveys. Call init() first.");const n=this.createWidget("survey",{surveyId:e.surveyId,surveyType:e.surveyType||e.type||"nps",position:e.position||"bottom-right",theme:e.theme||this.config.theme||"light",title:e.title,description:e.description,lowLabel:e.lowLabel,highLabel:e.highLabel,customQuestions:e.customQuestions,onSubmit:e.onSubmit,onDismiss:e.onDismiss});return n.mount(),n.show(),n}showChangelog(e={}){if(!this.initialized)throw new t("SDK must be initialized before showing changelog. Call init() first.");const n=this.createWidget("changelog",{position:e.position||"bottom-right",theme:e.theme||this.config.theme||"light",title:e.title||"What's New",triggerText:e.triggerText||"What's New",showBadge:!1!==e.showBadge,viewButtonText:e.viewButtonText||"View Update",changelogBaseUrl:e.changelogBaseUrl,openInNewTab:e.openInNewTab,onViewUpdate:e.onViewUpdate});return n.mount(),n.show(),n}async getChangelogs(e={}){if(!this.initialized)throw new t("SDK must be initialized before fetching changelogs. Call init() first.");try{return(await this.apiService.getChangelogs(e)).data||[]}catch(e){throw this.eventBus.emit("sdk:error",{error:e}),new t(`Failed to fetch changelogs: ${e.message}`,e)}}getAllWidgets(){return Array.from(this.widgets.values())}destroyWidget(e){const t=this.widgets.get(e);return!!t&&(t.destroy(),this.widgets.delete(e),this.eventBus.emit("widget:removed",{widgetId:e}),!0)}destroyAllWidgets(){for(const e of this.widgets.values())e.destroy();this.widgets.clear(),this.eventBus.emit("widgets:cleared")}updateConfig(e){const t={...this.config};this.config=this._validateAndMergeConfig(e,this.config);for(const e of this.widgets.values())e.handleConfigUpdate(this.config);this.eventBus.emit("config:updated",{oldConfig:t,newConfig:this.config})}setUserContext(e){this.config.userContext=e,this.apiService&&this.apiService.setUserContext(e),this.eventBus.emit("user:updated",{userContext:e})}getUserContext(){return this.config.userContext||(this.apiService?this.apiService.getUserContext():null)}async reinitialize(e=null){return this.apiService.clearSession(),this.initialized=!1,e&&this.setUserContext(e),this.init()}on(e,t){return this.eventBus.on(e,t),this}off(e,t){return this.eventBus.off(e,t),this}once(e,t){return this.eventBus.once(e,t),this}emit(e,t){return this.eventBus.emit(e,t),this}destroy(){this.destroyAllWidgets(),this.eventBus.removeAllListeners(),this.apiService.clearSession(),this.initialized=!1,this.eventBus.emit("sdk:destroyed")}hasFeedbackBeenSubmitted(e=30){const t=24*e*60*60*1e3,n=Date.now();if(this.config.last_feedback_at)try{if(n-new Date(this.config.last_feedback_at).getTime()<t)return!0}catch(e){}try{const e=`feedback_submitted_${this.config.workspace}`,s=localStorage.getItem(e);if(!s)return!1;return n-JSON.parse(s).submittedAt<t}catch(e){return!1}}clearFeedbackSubmissionTracking(){try{const e=`feedback_submitted_${this.config.workspace}`;localStorage.removeItem(e),this.eventBus.emit("feedback:trackingCleared")}catch(e){console.warn("Failed to clear feedback tracking:",e)}}_detectEnvironment(){if("undefined"==typeof window)return"production";const e=window.location.hostname.toLowerCase();return e.includes("staging")||e.includes("localhost")||e.includes("127.0.0.1")||e.includes(".local")?"staging":"production"}_validateAndMergeConfig(e,t={}){const n=b(b({apiUrl:null,workspace:null,userContext:null,position:"bottom-right",theme:"light",boardId:"general",autoShow:!0,debug:!1,mock:!1,env:this._detectEnvironment()},t),e);if(e.env||t.env||(n.env=this._detectEnvironment()),!n.workspace)throw new i("Missing required configuration: workspace");return n.userContext&&this._validateUserContext(n.userContext),n}_validateUserContext(e){if(!e.user_id&&!e.email)throw new i("User context must include at least user_id or email");const t={user_id:"string",email:"string",name:"string",custom_fields:"object",company:"object"};for(const[n,s]of Object.entries(t))if(e[n]&&typeof e[n]!==s)throw new i(`User context field '${n}' must be of type '${s}'`)}_bindMethods(){this.createWidget=this.createWidget.bind(this),this.destroyWidget=this.destroyWidget.bind(this),this.updateConfig=this.updateConfig.bind(this)}static create(e){return new B(e)}static async createAndInit(e){const t=new B(e);return await t.init(),t}static extractUserContextFromAuth(e){return e?{user_id:e.sub||e.id||e.user_id,email:e.email,name:e.name||e.display_name||e.full_name,custom_fields:{role:e.role,plan:e.plan||e.subscription?.plan,...e.custom_fields||{}},company:e.company||e.organization?{id:e.company?.id||e.organization?.id,name:e.company?.name||e.organization?.name,monthly_spend:e.company?.monthly_spend}:void 0}:null}}function F(){if("undefined"!=typeof document&&!document.querySelector("#feedback-sdk-styles")){const e=document.createElement("style");e.id="feedback-sdk-styles",e.textContent="\n.feedback-widget {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n font-size: 14px;\n line-height: 1.4;\n z-index: 999999;\n box-sizing: border-box;\n}\n\n.feedback-widget *,\n.feedback-widget *::before,\n.feedback-widget *::after {\n box-sizing: border-box;\n}\n\n.feedback-widget-button {\n position: fixed;\n z-index: 999999;\n}\n\n.feedback-widget-button.position-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.feedback-widget-button.position-bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.feedback-widget-button.position-top-right {\n top: 20px;\n right: 20px;\n}\n\n.feedback-widget-button.position-top-left {\n top: 20px;\n left: 20px;\n}\n\n.feedback-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n height: 48px;\n overflow: visible;\n border-radius: 9999px;\n border: none;\n padding: 12px 20px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.3s ease;\n color: white;\n background: #155EEF;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n width: fit-content;\n}\n\n.feedback-trigger-btn:hover:not(:disabled) {\n transform: translateY(-2px);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);\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 #155EEF;\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: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: white;\n border-radius: 50%;\n opacity: 0;\n transition: opacity 0.2s ease;\n box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.feedback-minimize-icon svg,\n.feedback-expand-icon svg {\n width: 16px;\n height: 16px;\n display: block;\n fill: #155EEF;\n}\n\n/* Show minimize icon on hover when expanded */\n.feedback-widget-button:not(.minimized) .feedback-trigger-btn:hover .feedback-minimize-icon {\n opacity: 1;\n}\n\n/* Minimized state - just icon */\n.feedback-widget-button.minimized .feedback-trigger-btn {\n padding: 12px;\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/* Show expand icon on hover when minimized */\n.feedback-widget-button.minimized .feedback-trigger-btn:hover .feedback-expand-icon {\n opacity: 1;\n}\n\n/* Side Panel Styles */\n.feedback-panel {\n position: fixed;\n bottom: 80px;\n right: 24px;\n width: 420px;\n max-height: 500px;\n z-index: 1000000;\n transform: translateX(calc(100% + 24px));\n transition: transform 0.35s cubic-bezier(0.4, 0, 0.2, 1);\n font-family: inherit;\n}\n\n.feedback-panel.open {\n transform: translateX(0);\n}\n\n.feedback-panel-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: rgba(0, 0, 0, 0.1);\n opacity: 0;\n transition: opacity 0.3s ease;\n pointer-events: none;\n z-index: 999999;\n}\n\n.feedback-panel-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.feedback-panel-content {\n background: white;\n height: 100%;\n display: flex;\n flex-direction: column;\n border-radius: 16px;\n box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), \n 0 10px 10px -5px rgba(0, 0, 0, 0.04),\n 0 0 0 1px rgba(0, 0, 0, 0.05);\n}\n\n.feedback-panel.theme-dark .feedback-panel-content {\n background: #1F2937;\n color: white;\n}\n\n.feedback-panel-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 24px;\n border-bottom: 1px solid #E5E7EB;\n flex-shrink: 0;\n}\n\n.feedback-panel.theme-dark .feedback-panel-header {\n border-bottom-color: #374151;\n}\n\n.feedback-panel-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: #111827;\n}\n\n.feedback-panel.theme-dark .feedback-panel-header h3 {\n color: white;\n}\n\n.feedback-panel-close {\n background: none;\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: #6B7280;\n padding: 4px;\n width: 32px;\n height: 32px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.feedback-panel-close:hover {\n background: #F3F4F6;\n color: #111827;\n}\n\n.feedback-panel-close:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n.feedback-panel.theme-dark .feedback-panel-close {\n color: #9CA3AF;\n}\n\n.feedback-panel.theme-dark .feedback-panel-close:hover {\n background: #374151;\n color: white;\n}\n\n.feedback-panel-body {\n flex: 1;\n overflow-y: auto;\n padding: 24px;\n}\n\n.feedback-form {\n display: flex;\n flex-direction: column;\n height: 100%;\n}\n\n.feedback-form-group {\n display: flex;\n flex-direction: column;\n gap: 8px;\n margin-bottom: 20px;\n}\n\n.feedback-form-group:last-child {\n margin-bottom: 0;\n}\n\n.feedback-form-group label {\n font-size: 14px;\n font-weight: 500;\n line-height: 1.25;\n color: #374151;\n}\n\n.feedback-panel.theme-dark .feedback-form-group label {\n color: #D1D5DB;\n}\n\n.feedback-form-group input {\n height: 44px;\n width: 100%;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n padding: 10px 14px;\n font-size: 15px;\n font-weight: 400;\n line-height: 1.5;\n color: #1F2937;\n font-family: inherit;\n outline: none;\n transition: all 0.2s ease;\n}\n\n.feedback-form-group input::placeholder {\n font-size: 15px;\n color: #9CA3AF;\n}\n\n.feedback-form-group input:focus {\n border-color: #155EEF;\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);\n}\n\n.feedback-form-group input:focus-visible {\n outline: none;\n}\n\n.feedback-form-group textarea {\n min-height: 200px;\n width: 100%;\n resize: vertical;\n border-radius: 8px;\n border: 1px solid #D1D5DB;\n padding: 10px 14px;\n font-size: 15px;\n font-weight: 400;\n line-height: 1.5;\n color: #1F2937;\n font-family: inherit;\n outline: none;\n transition: all 0.2s ease;\n}\n\n.feedback-form-group textarea::placeholder {\n font-size: 15px;\n color: #9CA3AF;\n}\n\n.feedback-form-group textarea:focus {\n border-color: #155EEF;\n box-shadow: 0 0 0 3px rgba(79, 70, 229, 0.1);\n}\n\n.feedback-form-group textarea:focus-visible {\n outline: none;\n}\n\n.feedback-panel.theme-dark .feedback-form-group input,\n.feedback-panel.theme-dark .feedback-form-group textarea {\n background: #374151;\n border-color: #4B5563;\n color: white;\n}\n\n.feedback-panel.theme-dark .feedback-form-group input::placeholder,\n.feedback-panel.theme-dark .feedback-form-group textarea::placeholder {\n color: #6B7280;\n}\n\n.feedback-btn {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border-radius: 8px;\n border: none;\n height: 44px;\n padding: 10px 18px;\n font-size: 15px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.feedback-btn:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.feedback-btn:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n.feedback-btn-submit {\n background: #155EEF;\n color: white;\n width: 100%;\n}\n\n.feedback-btn-submit:hover:not(:disabled) {\n background: #4338ca;\n}\n\n.feedback-btn-submit:active:not(:disabled) {\n background: #3730a3;\n}\n\n.feedback-btn-cancel {\n background: transparent;\n color: #6B7280;\n border: 1px solid #D1D5DB;\n}\n\n.feedback-btn-cancel:hover:not(:disabled) {\n background: #F9FAFB;\n border-color: #9CA3AF;\n color: #374151;\n}\n\n.feedback-panel.theme-dark .feedback-btn-cancel {\n color: #D1D5DB;\n border-color: #4B5563;\n}\n\n.feedback-panel.theme-dark .feedback-btn-cancel:hover:not(:disabled) {\n background: #374151;\n}\n\n.feedback-form-actions {\n display: flex;\n flex-direction: column;\n gap: 12px;\n margin-top: auto;\n padding-top: 24px;\n}\n\n.feedback-error {\n color: #DC2626;\n font-size: 14px;\n font-weight: 400;\n margin-top: 8px;\n padding: 12px;\n background: #FEE2E2;\n border: 1px solid #FECACA;\n border-radius: 8px;\n display: none;\n}\n\n.feedback-error.show {\n display: block;\n}\n\n.feedback-panel.theme-dark .feedback-error {\n background: #7F1D1D;\n border-color: #991B1B;\n color: #FCA5A5;\n}\n\n.feedback-success-notification {\n position: fixed;\n top: 24px;\n right: 24px;\n z-index: 1000002;\n background: white;\n border: 1px solid #D1FAE5;\n border-radius: 12px;\n box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);\n animation: slideInRight 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n min-width: 320px;\n}\n\n.feedback-success-content {\n display: flex;\n align-items: center;\n padding: 16px 20px;\n gap: 12px;\n}\n\n.feedback-success-icon {\n width: 20px;\n height: 20px;\n border-radius: 50%;\n background: #10B981;\n color: white;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 12px;\n font-weight: 600;\n flex-shrink: 0;\n}\n\n.feedback-success-content span {\n color: #065F46;\n font-weight: 500;\n font-size: 14px;\n flex: 1;\n}\n\n.feedback-success-close {\n background: none;\n border: none;\n color: #6B7280;\n cursor: pointer;\n font-size: 20px;\n padding: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n border-radius: 4px;\n flex-shrink: 0;\n}\n\n.feedback-success-close:hover {\n background: #F3F4F6;\n color: #374151;\n}\n\n.feedback-success-close:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\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 { opacity: 0; }\n to { opacity: 1; }\n}\n\n.feedback-panel-backdrop {\n animation: fadeIn 0.3s ease;\n}\n\n@media (max-width: 768px) {\n .feedback-panel {\n width: 100%;\n top: auto;\n bottom: 0;\n right: 0;\n left: 0;\n height: 85vh;\n max-height: 85vh;\n transform: translateY(100%);\n border-radius: 20px 20px 0 0;\n }\n \n .feedback-panel.open {\n transform: translateY(0);\n }\n \n .feedback-panel-content {\n border-radius: 20px 20px 0 0;\n }\n \n .feedback-panel-header {\n padding: 20px;\n position: relative;\n }\n \n .feedback-panel-header::before {\n content: '';\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translateX(-50%);\n width: 40px;\n height: 4px;\n background: #D1D5DB;\n border-radius: 2px;\n }\n \n .feedback-panel.theme-dark .feedback-panel-header::before {\n background: #4B5563;\n }\n \n .feedback-panel-body {\n padding: 20px;\n }\n \n .feedback-form-group textarea {\n min-height: 150px;\n }\n \n .feedback-widget-button {\n bottom: 16px;\n right: 16px;\n }\n \n .feedback-widget-button.position-bottom-left {\n left: 16px;\n }\n \n .feedback-success-notification {\n top: 16px;\n right: 16px;\n left: 16px;\n min-width: auto;\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\n@media (prefers-reduced-motion: reduce) {\n .feedback-trigger-btn,\n .feedback-btn,\n .feedback-panel,\n .feedback-panel-backdrop,\n .feedback-success-notification,\n .feedback-minimize-icon,\n .feedback-expand-icon {\n transition: none;\n animation: none;\n }\n}\n\n@media print {\n .feedback-widget,\n .feedback-panel,\n .feedback-panel-backdrop,\n .feedback-success-notification {\n display: none !important;\n }\n}\n\n/* Changelog Widget Styles */\n.changelog-widget {\n position: fixed;\n z-index: 999999;\n}\n\n.changelog-widget.position-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.changelog-widget.position-bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.changelog-widget.position-top-right {\n top: 20px;\n right: 20px;\n}\n\n.changelog-widget.position-top-left {\n top: 20px;\n left: 20px;\n}\n\n.changelog-trigger-btn {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n height: 48px;\n overflow: visible;\n border-radius: 9999px;\n border: none;\n padding: 12px 20px;\n font-size: 14px;\n font-weight: 500;\n font-family: inherit;\n cursor: pointer;\n transition: all 0.3s ease;\n color: white;\n background: #155EEF;\n box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n width: fit-content;\n}\n\n.changelog-trigger-btn:hover {\n transform: translateY(-2px);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15);\n}\n\n.changelog-trigger-btn:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n.changelog-icon {\n flex-shrink: 0;\n}\n\n.changelog-confetti-emoji {\n font-size: 14px;\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: #EF4444;\n border-radius: 50%;\n border: 2px solid white;\n}\n\n/* Confetti Animation */\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: 1000001;\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/* Changelog Modal */\n.changelog-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 0.3s ease;\n pointer-events: none;\n z-index: 999998;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.changelog-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.changelog-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999999;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n}\n\n.changelog-modal.open {\n pointer-events: auto;\n}\n\n.changelog-modal-container {\n position: relative;\n width: 100%;\n max-width: 580px;\n max-height: 90vh;\n background: #DBEAFE;\n border-radius: 24px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n transform: scale(0.9) translateY(20px);\n opacity: 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.changelog-modal.open .changelog-modal-container {\n transform: scale(1) translateY(0);\n opacity: 1;\n}\n\n.changelog-modal.theme-dark .changelog-modal-container {\n background: #1E3A5F;\n}\n\n.changelog-modal-close {\n position: absolute;\n top: 16px;\n right: 16px;\n background: rgba(255, 255, 255, 0.9);\n border: none;\n font-size: 24px;\n cursor: pointer;\n color: #6B7280;\n padding: 0;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 50%;\n transition: all 0.2s ease;\n line-height: 1;\n z-index: 10;\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);\n}\n\n.changelog-modal-close:hover {\n background: white;\n color: #111827;\n transform: scale(1.05);\n}\n\n.changelog-modal.theme-dark .changelog-modal-close {\n background: rgba(55, 65, 81, 0.9);\n color: #D1D5DB;\n}\n\n.changelog-modal.theme-dark .changelog-modal-close:hover {\n background: #374151;\n color: white;\n}\n\n.changelog-modal-content {\n overflow-y: auto;\n max-height: 90vh;\n}\n\n/* Changelog Loading */\n.changelog-loading {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n}\n\n.changelog-loading-spinner {\n width: 32px;\n height: 32px;\n border: 3px solid #E5E7EB;\n border-top-color: #155EEF;\n border-radius: 50%;\n animation: changelogSpin 0.8s linear infinite;\n}\n\n@keyframes changelogSpin {\n to {\n transform: rotate(360deg);\n }\n}\n\n/* Changelog Empty State */\n.changelog-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n padding: 80px 20px;\n text-align: center;\n color: #9CA3AF;\n}\n\n.changelog-empty svg {\n margin-bottom: 16px;\n stroke: #D1D5DB;\n}\n\n.changelog-empty p {\n margin: 0;\n font-size: 15px;\n}\n\n/* Changelog Popup Item */\n.changelog-popup-item {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-popup-image {\n width: 100%;\n padding: 24px 24px 0;\n}\n\n.changelog-popup-image img {\n width: 100%;\n height: auto;\n display: block;\n object-fit: cover;\n border-radius: 12px;\n border: 2px solid #155EEF;\n box-shadow: 0 4px 20px rgba(21, 94, 239, 0.2);\n}\n\n.changelog-popup-body {\n padding: 24px 32px 32px;\n text-align: center;\n}\n\n.changelog-popup-title {\n margin: 0 0 16px;\n font-size: 18px;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\n}\n\n.changelog-modal.theme-dark .changelog-popup-title {\n color: white;\n}\n\n.changelog-popup-description {\n margin: 0 0 24px;\n font-size: 17px;\n line-height: 1.6;\n color: #4B5563;\n}\n\n.changelog-modal.theme-dark .changelog-popup-description {\n color: #D1D5DB;\n}\n\n.changelog-popup-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 14px 32px;\n font-size: 16px;\n font-weight: 600;\n color: white;\n background: #155EEF;\n border: none;\n border-radius: 10px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.changelog-popup-btn:hover {\n background: #1249CA;\n transform: translateY(-2px);\n box-shadow: 0 4px 12px rgba(21, 94, 239, 0.3);\n}\n\n.changelog-popup-btn:focus-visible {\n outline: 2px solid #155EEF;\n outline-offset: 2px;\n}\n\n/* Popup Footer with Dots and View All */\n.changelog-popup-footer {\n padding: 0 32px 24px;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 16px;\n}\n\n.changelog-popup-dots {\n display: flex;\n gap: 8px;\n}\n\n.changelog-dot {\n width: 10px;\n height: 10px;\n border-radius: 50%;\n background: rgba(21, 94, 239, 0.3);\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.changelog-dot:hover {\n background: rgba(21, 94, 239, 0.5);\n}\n\n.changelog-dot.active {\n background: #155EEF;\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: #155EEF;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n padding: 8px 12px;\n border-radius: 6px;\n transition: all 0.2s ease;\n}\n\n.changelog-view-all-btn:hover {\n background: rgba(21, 94, 239, 0.1);\n}\n\n.changelog-view-all-btn svg {\n transition: transform 0.2s ease;\n}\n\n.changelog-view-all-btn:hover svg {\n transform: translateX(3px);\n}\n\n.changelog-modal.theme-dark .changelog-view-all-btn {\n color: #60A5FA;\n}\n\n.changelog-modal.theme-dark .changelog-view-all-btn:hover {\n background: rgba(96, 165, 250, 0.1);\n}\n\n/* ==================== CHANGELOG LIST MODAL ==================== */\n.changelog-list-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 0.3s ease;\n pointer-events: none;\n z-index: 999998;\n}\n\n.changelog-list-modal-backdrop.show {\n opacity: 1;\n pointer-events: auto;\n}\n\n.changelog-list-modal {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 999999;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n pointer-events: none;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\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: white;\n border-radius: 20px;\n overflow: hidden;\n box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);\n transform: scale(0.9) translateY(20px);\n opacity: 0;\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\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.theme-dark .changelog-list-modal-container {\n background: #1F2937;\n color: white;\n}\n\n.changelog-list-modal-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 20px;\n border-bottom: 1px solid #E5E7EB;\n flex-shrink: 0;\n background: white;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-header {\n border-bottom-color: #374151;\n background: #1F2937;\n}\n\n.changelog-list-modal-header h2 {\n margin: 0;\n font-size: 16px;\n font-weight: 600;\n color: #111827;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-header h2 {\n color: white;\n}\n\n.changelog-list-modal-close {\n background: none;\n border: none;\n font-size: 22px;\n cursor: pointer;\n color: #6B7280;\n padding: 4px;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 6px;\n transition: all 0.2s ease;\n line-height: 1;\n}\n\n.changelog-list-modal-close:hover {\n background: #F3F4F6;\n color: #111827;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-close {\n color: #9CA3AF;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-modal-close:hover {\n background: #374151;\n color: white;\n}\n\n.changelog-list-modal-body {\n flex: 1;\n overflow-y: auto;\n}\n\n/* Changelog List */\n.changelog-list {\n display: flex;\n flex-direction: column;\n}\n\n.changelog-list-item {\n display: flex;\n flex-direction: row;\n align-items: center;\n padding: 12px 16px;\n border-bottom: 1px solid #E5E7EB;\n cursor: pointer;\n transition: background-color 0.2s ease;\n position: relative;\n}\n\n.changelog-list-item:hover {\n background: #F9FAFB;\n}\n\n.changelog-list-item:last-child {\n border-bottom: none;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item {\n border-bottom-color: #374151;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item:hover {\n background: #374151;\n}\n\n.changelog-list-item-image {\n width: 100%;\n margin-bottom: 8px;\n border-radius: 6px;\n overflow: hidden;\n border: 1px solid #E5E7EB;\n}\n\n.changelog-list-item-image img {\n width: 100%;\n height: 100px;\n display: block;\n object-fit: cover;\n}\n\n.changelog-list-item-main {\n flex: 1;\n min-width: 0;\n}\n\n.changelog-list-item-content {\n display: flex;\n flex-direction: column;\n gap: 3px;\n}\n\n.changelog-list-item-date {\n font-size: 11px;\n color: #6B7280;\n font-weight: 500;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-date {\n color: #9CA3AF;\n}\n\n.changelog-list-item-labels {\n display: flex;\n flex-wrap: wrap;\n gap: 4px;\n margin-bottom: 1px;\n}\n\n.changelog-list-item-title {\n margin: 0;\n font-size: 14px;\n font-weight: 600;\n line-height: 1.3;\n color: #111827;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-title {\n color: white;\n}\n\n.changelog-list-item-description {\n margin: 0;\n font-size: 12px;\n line-height: 1.4;\n color: #6B7280;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-description {\n color: #9CA3AF;\n}\n\n.changelog-list-item-arrow {\n flex-shrink: 0;\n margin-left: 12px;\n color: #9CA3AF;\n transition: all 0.2s ease;\n}\n\n.changelog-list-item:hover .changelog-list-item-arrow {\n color: #155EEF;\n transform: translateX(3px);\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item-arrow {\n color: #6B7280;\n}\n\n.changelog-list-modal.theme-dark .changelog-list-item:hover .changelog-list-item-arrow {\n color: #60A5FA;\n}\n\n/* Mobile Responsive */\n@media (max-width: 768px) {\n .changelog-modal {\n padding: 16px;\n }\n\n .changelog-modal-container {\n max-width: 100%;\n border-radius: 20px;\n }\n\n .changelog-widget {\n bottom: 16px;\n right: 16px;\n }\n\n .changelog-widget.position-bottom-left {\n left: 16px;\n }\n\n .changelog-popup-image {\n padding: 20px 20px 0;\n }\n\n .changelog-popup-body {\n padding: 20px 24px 24px;\n }\n\n .changelog-popup-title {\n font-size: 22px;\n }\n\n .changelog-popup-description {\n font-size: 15px;\n }\n\n .changelog-popup-btn {\n padding: 12px 28px;\n font-size: 15px;\n width: 100%;\n }\n\n .changelog-popup-footer {\n padding: 0 24px 20px;\n }\n\n /* List modal mobile */\n .changelog-list-modal {\n padding: 16px;\n }\n\n .changelog-list-modal-container {\n max-width: 100%;\n max-height: 90vh;\n border-radius: 16px;\n }\n\n .changelog-list-item {\n padding: 10px 14px;\n }\n\n .changelog-list-item-image img {\n height: 80px;\n }\n\n .changelog-list-item-title {\n font-size: 13px;\n }\n\n .changelog-list-item-description {\n font-size: 11px;\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n .changelog-modal,\n .changelog-modal-container,\n .changelog-modal-backdrop,\n .changelog-list-modal,\n .changelog-list-modal-container,\n .changelog-list-modal-backdrop,\n .changelog-trigger-btn,\n .changelog-popup-btn,\n .changelog-view-all-btn,\n .changelog-loading-spinner,\n .changelog-dot,\n .changelog-list-item,\n .changelog-list-item-arrow {\n transition: none;\n animation: none;\n }\n}\n\n/* ========================================\n Messenger Widget - Intercom-style Dark Theme\n ======================================== */\n\n.messenger-widget {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', Oxygen, Ubuntu, Cantarell, sans-serif;\n font-size: 14px;\n line-height: 1.5;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n.messenger-widget *,\n.messenger-widget *::before,\n.messenger-widget *::after {\n box-sizing: border-box;\n}\n\n/* ========================================\n Launcher Button\n ======================================== */\n\n.messenger-launcher {\n position: fixed;\n z-index: 999999;\n}\n\n.messenger-launcher-bottom-right {\n bottom: 20px;\n right: 20px;\n}\n\n.messenger-launcher-bottom-left {\n bottom: 20px;\n left: 20px;\n}\n\n.messenger-launcher-btn {\n width: 60px;\n height: 60px;\n border-radius: 50%;\n border: none;\n background: #1c1c1e;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n position: relative;\n}\n\n.messenger-launcher-btn:hover {\n transform: scale(1.05);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.4);\n}\n\n.messenger-launcher-btn:active {\n transform: scale(0.95);\n}\n\n.messenger-launcher-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n\n.messenger-launcher-open .messenger-launcher-icon-chat {\n opacity: 0;\n transform: rotate(-90deg);\n}\n\n.messenger-launcher-open .messenger-launcher-icon-close {\n opacity: 1;\n transform: rotate(0deg);\n}\n\n.messenger-launcher-badge {\n position: absolute;\n top: -4px;\n right: -4px;\n min-width: 20px;\n height: 20px;\n background: #ef4444;\n color: white;\n font-size: 11px;\n font-weight: 600;\n border-radius: 10px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 6px;\n border: 2px solid white;\n}\n\n/* ========================================\n Panel Container\n ======================================== */\n\n.messenger-panel {\n position: fixed;\n z-index: 999998;\n width: 400px;\n height: 680px;\n max-height: calc(100vh - 100px);\n display: none;\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\n}\n\n.messenger-panel.open {\n opacity: 1;\n transform: translateY(0) scale(1);\n}\n\n.messenger-panel-bottom-right {\n bottom: 90px;\n right: 20px;\n}\n\n.messenger-panel-bottom-left {\n bottom: 90px;\n left: 20px;\n}\n\n.messenger-panel-content {\n background: #1c1c1e;\n height: 100%;\n border-radius: 16px;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\n}\n\n/* Light theme */\n.messenger-panel.theme-light .messenger-panel-content {\n background: #ffffff;\n}\n\n/* ========================================\n Views Container\n ======================================== */\n\n.messenger-panel-views {\n flex: 1;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n}\n\n.messenger-view {\n height: 100%;\n display: flex;\n flex-direction: column;\n overflow: hidden;\n}\n\n/* ========================================\n Common Components\n ======================================== */\n\n/* Close Button */\n.messenger-close-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.6);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n\n.messenger-close-btn:hover {\n background: rgba(255, 255, 255, 0.1);\n color: white;\n}\n\n.theme-light .messenger-close-btn {\n color: #86868b;\n}\n\n.theme-light .messenger-close-btn:hover {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n/* Back Button */\n.messenger-back-btn {\n background: none;\n border: none;\n padding: 8px;\n cursor: pointer;\n color: rgba(255, 255, 255, 0.6);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n\n.messenger-back-btn:hover {\n background: rgba(255, 255, 255, 0.1);\n color: white;\n}\n\n/* Avatar Stack */\n.messenger-avatar-stack {\n display: flex;\n align-items: center;\n}\n\n.messenger-avatar {\n width: 32px;\n height: 32px;\n border-radius: 50%;\n border: 2px solid #1c1c1e;\n background: #5856d6;\n color: white;\n font-size: 13px;\n font-weight: 600;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-left: -8px;\n object-fit: cover;\n}\n\n.messenger-avatar:first-child {\n margin-left: 0;\n}\n\n.messenger-avatar-small {\n width: 28px;\n height: 28px;\n font-size: 11px;\n}\n\n.messenger-avatar-medium {\n width: 40px;\n height: 40px;\n font-size: 15px;\n font-weight: 600;\n}\n\n.messenger-avatar-tiny {\n width: 20px;\n height: 20px;\n font-size: 9px;\n border-width: 1.5px;\n margin-left: -6px;\n}\n\n.messenger-avatar-tiny:first-child {\n margin-left: 0;\n}\n\n.theme-light .messenger-avatar {\n border-color: #ffffff;\n}\n\n/* ========================================\n Home View\n ======================================== */\n\n.messenger-home-view {\n background: linear-gradient(180deg, #2c2c2e 0%, #1c1c1e 40%);\n}\n\n.messenger-home-header {\n padding: 20px;\n background: linear-gradient(180deg, rgba(88, 86, 214, 0.2) 0%, transparent 100%);\n}\n\n.messenger-home-header-top {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 24px;\n}\n\n.messenger-home-logo {\n width: 32px;\n height: 32px;\n}\n\n.messenger-home-logo img {\n width: 100%;\n height: 100%;\n border-radius: 8px;\n object-fit: cover;\n}\n\n.messenger-home-logo-default {\n width: 32px;\n height: 32px;\n background: linear-gradient(135deg, #5856d6, #007aff);\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n color: white;\n}\n\n.messenger-home-avatars {\n flex: 1;\n display: flex;\n justify-content: flex-end;\n margin-right: 12px;\n}\n\n.messenger-home-welcome {\n display: flex;\n flex-direction: column;\n gap: 4px;\n}\n\n.messenger-home-greeting {\n font-size: 15px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n.messenger-home-question {\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-home-body {\n flex: 1;\n padding: 20px;\n overflow-y: auto;\n}\n\n.messenger-home-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 16px 20px;\n background: #2c2c2e;\n border: none;\n border-radius: 24px;\n color: white;\n font-size: 15px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n margin-bottom: 20px;\n}\n\n.messenger-home-message-btn:hover {\n background: #3c3c3e;\n transform: translateX(4px);\n}\n\n.messenger-home-message-btn svg {\n opacity: 0.6;\n}\n\n/* Featured Card */\n.messenger-home-featured {\n background: #2c2c2e;\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 20px;\n}\n\n.messenger-home-featured-image {\n width: 100%;\n height: 120px;\n object-fit: cover;\n}\n\n.messenger-home-featured-content {\n padding: 16px;\n}\n\n.messenger-home-featured-content h3 {\n margin: 0 0 8px;\n font-size: 16px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-home-featured-content p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.6);\n}\n\n/* Changelog Section in Home */\n.messenger-home-changelog-section {\n margin-top: 20px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.messenger-home-changelog-card {\n background: #2c2c2e;\n border-radius: 16px;\n overflow: hidden;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.messenger-home-changelog-card:hover {\n background: #3c3c3e;\n transform: translateY(-2px);\n}\n\n.messenger-home-changelog-cover {\n width: 100%;\n height: 140px;\n overflow: hidden;\n position: relative;\n border-radius: 12px;\n margin: 12px 12px 0 12px;\n padding-bottom: 12px;\n width: calc(100% - 24px);\n}\n\n.messenger-home-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 12px;\n}\n\n.messenger-home-changelog-cover-text {\n position: absolute;\n bottom: 12px;\n left: 12px;\n right: 12px;\n color: #ffffff;\n font-size: 14px;\n font-weight: 600;\n text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);\n line-height: 1.3;\n}\n\n.messenger-home-changelog-card-content {\n padding: 16px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-home-changelog-card-title {\n margin: 0 0 8px 0;\n font-size: 14px;\n font-weight: 600;\n color: #ffffff;\n line-height: 1.3;\n}\n\n.messenger-home-changelog-card-desc {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.7);\n line-height: 1.5;\n display: -webkit-box;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n overflow: hidden;\n}\n\n/* ========================================\n Conversations View\n ======================================== */\n\n.messenger-conversations-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-conversations-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-conversations-body {\n flex: 1;\n overflow-y: auto;\n padding: 12px;\n}\n\n.messenger-conversations-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-conversations-empty-icon {\n color: rgba(255, 255, 255, 0.3);\n margin-bottom: 16px;\n}\n\n.messenger-conversations-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-conversations-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n.messenger-conversation-item {\n display: flex;\n align-items: flex-start;\n gap: 12px;\n padding: 16px;\n border-radius: 12px;\n cursor: pointer;\n transition: background 0.2s ease;\n}\n\n.messenger-conversation-item:hover {\n background: rgba(255, 255, 255, 0.05);\n}\n\n.messenger-conversation-avatars {\n flex-shrink: 0;\n padding-top: 2px;\n}\n\n.messenger-conversation-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-conversation-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin-bottom: 4px;\n gap: 12px;\n}\n\n.messenger-conversation-title {\n font-size: 15px;\n font-weight: 400;\n color: #ffffff;\n line-height: 1.3;\n}\n\n.messenger-conversation-time {\n font-size: 13px;\n color: rgba(255, 255, 255, 0.5);\n flex-shrink: 0;\n}\n\n.messenger-conversation-preview {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.messenger-unread-dot {\n width: 8px;\n height: 8px;\n background: #ef4444;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.messenger-conversation-message {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.7);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: 1.4;\n}\n\n.messenger-conversation-item.unread .messenger-conversation-title {\n font-weight: 400;\n color: #ffffff;\n}\n\n.messenger-conversation-item.unread .messenger-conversation-message {\n color: rgba(255, 255, 255, 0.9);\n}\n\n.messenger-conversations-footer {\n padding: 16px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-new-message-btn {\n width: 100%;\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 12px 16px;\n background: #2c2c2e;\n border: none;\n border-radius: 24px;\n color: white;\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.messenger-new-message-btn:hover {\n background: #3c3c3e;\n}\n\n.messenger-new-message-btn span {\n flex: 1;\n text-align: left;\n}\n\n.messenger-new-message-btn svg {\n opacity: 0.6;\n}\n\n/* ========================================\n Chat View\n ======================================== */\n\n.messenger-chat-header {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-chat-header-info {\n flex: 1;\n display: flex;\n align-items: center;\n gap: 10px;\n}\n\n.messenger-chat-title {\n font-size: 16px;\n font-weight: 500;\n color: white;\n}\n\n.messenger-chat-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n display: flex;\n flex-direction: column;\n gap: 16px;\n}\n\n.messenger-chat-empty {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-chat-empty-avatars {\n margin-bottom: 16px;\n}\n\n.messenger-chat-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-chat-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n max-width: 240px;\n}\n\n/* Messages */\n.messenger-message {\n display: flex;\n gap: 8px;\n max-width: 85%;\n}\n\n.messenger-message-own {\n align-self: flex-end;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.messenger-message-received {\n align-self: flex-start;\n}\n\n.messenger-message-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.messenger-message-sender {\n font-size: 12px;\n font-weight: 500;\n color: rgba(255, 255, 255, 0.6);\n margin-bottom: 4px;\n margin-left: 12px;\n}\n\n.messenger-message-bubble {\n padding: 12px 16px;\n border-radius: 18px;\n word-wrap: break-word;\n}\n\n.messenger-message-own .messenger-message-bubble {\n background: #007aff;\n color: white;\n border-bottom-right-radius: 4px;\n}\n\n.messenger-message-received .messenger-message-bubble {\n background: #2c2c2e;\n color: white;\n border-bottom-left-radius: 4px;\n}\n\n.messenger-message-content {\n font-size: 15px;\n line-height: 1.4;\n}\n\n.messenger-message-time {\n font-size: 11px;\n color: rgba(255, 255, 255, 0.4);\n margin-top: 4px;\n padding: 0 4px;\n}\n\n.messenger-message-avatar {\n flex-shrink: 0;\n margin-top: auto;\n}\n\n/* Compose Area */\n.messenger-chat-compose {\n display: flex;\n align-items: flex-end;\n gap: 8px;\n padding: 12px 16px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n background: #1c1c1e;\n}\n\n.messenger-compose-input-wrapper {\n flex: 1;\n background: #2c2c2e;\n border-radius: 20px;\n padding: 8px 16px;\n}\n\n.messenger-compose-input {\n width: 100%;\n background: transparent;\n border: none;\n outline: none;\n color: white;\n font-size: 15px;\n line-height: 1.4;\n resize: none;\n max-height: 120px;\n font-family: inherit;\n}\n\n.messenger-compose-input::placeholder {\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-compose-send {\n width: 40px;\n height: 40px;\n background: #007aff;\n border: none;\n border-radius: 50%;\n color: white;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n flex-shrink: 0;\n}\n\n.messenger-compose-send:hover:not(:disabled) {\n background: #0066d6;\n transform: scale(1.05);\n}\n\n.messenger-compose-send:disabled {\n background: #3c3c3e;\n color: rgba(255, 255, 255, 0.3);\n cursor: not-allowed;\n}\n\n/* ========================================\n Help View\n ======================================== */\n\n.messenger-help-header {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px;\n position: relative;\n}\n\n.messenger-help-header h2 {\n margin: 0;\n font-size: 17px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-help-header .messenger-close-btn {\n position: absolute;\n right: 16px;\n top: 50%;\n transform: translateY(-50%);\n}\n\n.messenger-help-search {\n padding: 0 16px 16px;\n}\n\n.messenger-help-search-wrapper {\n display: flex;\n align-items: center;\n background: #2c2c2e;\n border-radius: 12px;\n padding: 14px 16px;\n position: relative;\n}\n\n.messenger-help-search-icon {\n position: absolute;\n right: 16px;\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-help-search-input {\n flex: 1;\n background: transparent;\n border: none;\n outline: none;\n color: white;\n font-size: 16px;\n font-family: inherit;\n padding-right: 32px;\n}\n\n.messenger-help-search-input::placeholder {\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-help-body {\n flex: 1;\n overflow-y: auto;\n padding: 0;\n}\n\n.messenger-help-collections-header {\n font-size: 17px;\n font-weight: 600;\n color: white;\n padding: 12px 16px 8px;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-help-collections {\n padding: 0;\n}\n\n.messenger-help-collection {\n display: flex;\n align-items: center;\n padding: 10px 16px;\n cursor: pointer;\n transition: background 0.2s ease;\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-help-collection:hover {\n background: rgba(255, 255, 255, 0.05);\n}\n\n.messenger-help-collection-content {\n flex: 1;\n min-width: 0;\n}\n\n.messenger-help-collection-title {\n margin: 0 0 2px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-help-collection-desc {\n margin: 0 0 2px;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.7);\n line-height: 1.3;\n}\n\n.messenger-help-collection-count {\n font-size: 14px;\n color: rgba(255, 255, 255, 0.4);\n}\n\n.messenger-help-collection-arrow {\n color: rgba(255, 255, 255, 0.3);\n flex-shrink: 0;\n margin-left: 12px;\n}\n\n.messenger-help-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-help-empty-icon {\n color: rgba(255, 255, 255, 0.3);\n margin-bottom: 16px;\n}\n\n.messenger-help-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-help-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n/* ========================================\n Changelog View\n ======================================== */\n\n.messenger-changelog-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-changelog-header h2 {\n margin: 0;\n font-size: 20px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-changelog-subheader {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 20px;\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.messenger-changelog-latest {\n font-size: 12px;\n font-weight: 600;\n color: rgba(255, 255, 255, 0.5);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n}\n\n.messenger-changelog-team {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.6);\n}\n\n.messenger-changelog-body {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n}\n\n.messenger-changelog-card {\n background: #2c2c2e;\n border-radius: 12px;\n overflow: hidden;\n margin-bottom: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n\n.messenger-changelog-card:hover {\n background: #3c3c3e;\n transform: translateY(-2px);\n}\n\n.messenger-changelog-cover {\n height: 120px;\n overflow: hidden;\n}\n\n.messenger-changelog-cover img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n\n.messenger-changelog-content {\n padding: 16px;\n}\n\n.messenger-changelog-tags {\n display: flex;\n flex-wrap: wrap;\n gap: 8px;\n margin-bottom: 12px;\n}\n\n.messenger-changelog-tag {\n font-size: 11px;\n font-weight: 600;\n color: white;\n background: rgba(88, 86, 214, 0.3);\n padding: 4px 10px;\n border-radius: 12px;\n text-transform: uppercase;\n letter-spacing: 0.3px;\n}\n\n.messenger-changelog-title {\n margin: 0 0 8px;\n font-size: 14px;\n font-weight: 600;\n color: white;\n line-height: 1.3;\n}\n\n.messenger-changelog-description {\n margin: 0 0 12px;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.6);\n line-height: 1.4;\n}\n\n.messenger-changelog-meta {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.messenger-changelog-date {\n font-size: 12px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n.messenger-changelog-arrow {\n color: rgba(255, 255, 255, 0.3);\n}\n\n.messenger-changelog-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: 100%;\n text-align: center;\n padding: 40px;\n}\n\n.messenger-changelog-empty-icon {\n color: rgba(255, 255, 255, 0.3);\n margin-bottom: 16px;\n}\n\n.messenger-changelog-empty h3 {\n margin: 0 0 8px;\n font-size: 18px;\n font-weight: 600;\n color: white;\n}\n\n.messenger-changelog-empty p {\n margin: 0;\n font-size: 14px;\n color: rgba(255, 255, 255, 0.5);\n}\n\n/* ========================================\n Navigation Tabs\n ======================================== */\n\n.messenger-panel-nav {\n border-top: 1px solid rgba(255, 255, 255, 0.1);\n background: #1c1c1e;\n}\n\n.messenger-nav {\n display: flex;\n padding: 8px 12px;\n gap: 4px;\n}\n\n.messenger-nav-tab {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 8px 4px;\n background: none;\n border: none;\n cursor: pointer;\n border-radius: 8px;\n transition: all 0.2s ease;\n position: relative;\n}\n\n.messenger-nav-tab:hover {\n background: rgba(255, 255, 255, 0.05);\n}\n\n.messenger-nav-icon {\n color: rgba(255, 255, 255, 0.5);\n transition: color 0.2s ease;\n}\n\n.messenger-nav-home-icon {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n}\n\n.messenger-nav-home-icon > i:first-child {\n position: relative;\n}\n\n.messenger-nav-home-icon > i:last-child {\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translateX(-50%);\n transition: color 0.2s ease, filter 0.2s ease;\n}\n\n.messenger-nav-tab:hover .messenger-nav-home-icon > i:last-child {\n color: #ffd700;\n filter: drop-shadow(0 0 4px #ffd700);\n}\n\n.messenger-nav-label {\n font-size: 14px;\n font-weight: 400;\n color: rgba(255, 255, 255, 0.5);\n transition: color 0.2s ease;\n}\n\n.messenger-nav-tab.active .messenger-nav-icon {\n color: white;\n}\n\n.messenger-nav-tab.active .messenger-nav-label {\n color: white;\n font-weight: 400;\n}\n\n.messenger-nav-badge {\n position: absolute;\n top: 4px;\n right: calc(50% - 16px);\n min-width: 16px;\n height: 16px;\n background: #ef4444;\n color: white;\n font-size: 10px;\n font-weight: 600;\n border-radius: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0 4px;\n}\n\n/* ========================================\n Light Theme Overrides\n ======================================== */\n\n/* Panel */\n.theme-light .messenger-panel-content {\n background: #ffffff;\n}\n\n/* Home View */\n.theme-light .messenger-home-view {\n background: linear-gradient(180deg, #f5f5f7 0%, #ffffff 40%);\n}\n\n.theme-light .messenger-home-header {\n background: linear-gradient(180deg, rgba(88, 86, 214, 0.1) 0%, transparent 100%);\n}\n\n.theme-light .messenger-home-greeting {\n color: #86868b;\n}\n\n.theme-light .messenger-home-question {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-home-message-btn {\n background: #f5f5f7;\n color: #1d1d1f;\n border: 1px solid #e0e0e0;\n}\n\n.theme-light .messenger-home-message-btn:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-home-message-btn svg,\n.theme-light .messenger-home-message-btn i {\n color: #86868b;\n}\n\n.theme-light .messenger-home-featured {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-home-featured-content h3 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-home-featured-content p {\n color: #86868b;\n}\n\n.theme-light .messenger-home-changelog-card {\n background: #f5f5f7;\n border: 1px solid #e0e0e0;\n}\n\n.theme-light .messenger-home-changelog-card-content {\n border-top-color: #e0e0e0;\n}\n\n.theme-light .messenger-home-changelog-card:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-home-changelog-card-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-home-changelog-card-desc {\n color: #6e6e73;\n}\n\n/* Close/Back buttons */\n.theme-light .messenger-close-btn,\n.theme-light .messenger-back-btn {\n color: #86868b;\n}\n\n.theme-light .messenger-close-btn:hover,\n.theme-light .messenger-back-btn:hover {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n/* Avatar */\n.theme-light .messenger-avatar {\n border-color: #ffffff;\n}\n\n/* Conversations View */\n.theme-light .messenger-conversations-view {\n background: #ffffff;\n}\n\n.theme-light .messenger-conversations-header,\n.theme-light .messenger-help-header,\n.theme-light .messenger-changelog-header,\n.theme-light .messenger-chat-header {\n background: #ffffff;\n border-bottom-color: #e5e5e7;\n}\n\n.theme-light .messenger-conversations-header h2,\n.theme-light .messenger-help-header h2,\n.theme-light .messenger-changelog-header h2 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-conversations-body {\n background: #ffffff;\n}\n\n.theme-light .messenger-conversations-footer {\n background: #ffffff;\n}\n\n.theme-light .messenger-conversations-empty-icon,\n.theme-light .messenger-chat-empty-avatars,\n.theme-light .messenger-help-empty-icon,\n.theme-light .messenger-changelog-empty-icon {\n color: #c7c7cc;\n}\n\n.theme-light .messenger-conversations-empty h3,\n.theme-light .messenger-chat-empty h3,\n.theme-light .messenger-help-empty h3,\n.theme-light .messenger-changelog-empty h3 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-conversations-empty p,\n.theme-light .messenger-chat-empty p,\n.theme-light .messenger-help-empty p,\n.theme-light .messenger-changelog-empty p {\n color: #86868b;\n}\n\n.theme-light .messenger-conversation-item:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.theme-light .messenger-conversation-title {\n color: #1d1d1f !important;\n}\n\n.theme-light .messenger-conversation-item.unread .messenger-conversation-title {\n color: #1d1d1f !important;\n font-weight: 400;\n}\n\n.theme-light .messenger-conversation-time {\n color: #86868b !important;\n}\n\n.theme-light .messenger-conversation-message {\n color: #6e6e73 !important;\n}\n\n.theme-light .messenger-conversation-item.unread .messenger-conversation-message {\n color: #3a3a3c !important;\n}\n\n.theme-light .messenger-chat-title,\n.theme-light .messenger-help-article-title,\n.theme-light .messenger-changelog-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-help-article-desc,\n.theme-light .messenger-changelog-description {\n color: #86868b;\n}\n\n.theme-light .messenger-conversations-footer {\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-new-message-btn {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n.theme-light .messenger-new-message-btn:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-new-message-btn svg,\n.theme-light .messenger-new-message-btn i {\n color: #86868b;\n}\n\n/* Chat View */\n.theme-light .messenger-chat-view {\n background: #ffffff;\n}\n\n.theme-light .messenger-chat-header {\n background: #ffffff;\n}\n\n.theme-light .messenger-chat-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-chat-messages {\n background: #ffffff;\n}\n\n.theme-light .messenger-chat-empty h3 {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-chat-empty p {\n color: #86868b;\n}\n\n.theme-light .messenger-message-sender {\n color: #86868b;\n}\n\n.theme-light .messenger-message-received .messenger-message-bubble {\n background: #f5f5f7;\n color: #1d1d1f;\n}\n\n.theme-light .messenger-message-own .messenger-message-bubble {\n background: #007aff;\n color: #ffffff;\n}\n\n.theme-light .messenger-message-time {\n color: #86868b;\n}\n\n.theme-light .messenger-chat-compose {\n background: #ffffff;\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-compose-input-wrapper {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-compose-input {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-compose-input::placeholder {\n color: #86868b;\n}\n\n.theme-light .messenger-compose-send:disabled {\n background: #e5e5e7;\n color: #c7c7cc;\n}\n\n/* Help View */\n.theme-light .messenger-help-view {\n background: #ffffff;\n}\n\n.theme-light .messenger-help-body {\n background: #ffffff;\n}\n\n.theme-light .messenger-help-search {\n background: #ffffff;\n}\n\n.theme-light .messenger-help-search-wrapper {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-help-search-icon {\n color: #86868b;\n}\n\n.theme-light .messenger-help-search-input {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-help-search-input::placeholder {\n color: #86868b;\n}\n\n.theme-light .messenger-help-collections-header {\n color: #1d1d1f;\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-help-collection {\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-help-collection:hover {\n background: rgba(0, 0, 0, 0.03);\n}\n\n.theme-light .messenger-help-collection-title {\n color: #1d1d1f;\n}\n\n.theme-light .messenger-help-collection-desc {\n color: #6e6e73;\n}\n\n.theme-light .messenger-help-collection-count {\n color: #86868b;\n}\n\n.theme-light .messenger-help-collection-arrow {\n color: #c7c7cc;\n}\n\n/* Changelog View */\n.theme-light .messenger-changelog-subheader {\n border-bottom-color: #e5e5e7;\n}\n\n.theme-light .messenger-changelog-latest {\n color: #86868b;\n}\n\n.theme-light .messenger-changelog-team {\n color: #86868b;\n}\n\n.theme-light .messenger-changelog-card {\n background: #f5f5f7;\n}\n\n.theme-light .messenger-changelog-card:hover {\n background: #e8e8ed;\n}\n\n.theme-light .messenger-changelog-tag {\n background: rgba(0, 122, 255, 0.15);\n color: #007aff;\n}\n\n.theme-light .messenger-changelog-date {\n color: #86868b;\n}\n\n.theme-light .messenger-changelog-arrow {\n color: #c7c7cc;\n}\n\n/* Navigation */\n.theme-light .messenger-panel-nav {\n background: #ffffff;\n border-top-color: #e5e5e7;\n}\n\n.theme-light .messenger-nav-icon {\n color: #86868b;\n}\n\n.theme-light .messenger-nav-label {\n color: #86868b;\n}\n\n.theme-light .messenger-nav-tab:hover {\n background: rgba(0, 0, 0, 0.05);\n}\n\n.theme-light .messenger-nav-tab.active .messenger-nav-icon,\n.theme-light .messenger-nav-tab.active .messenger-nav-label {\n color: #007aff;\n}\n\n/* ========================================\n Responsive Design\n ======================================== */\n\n@media (max-width: 480px) {\n .messenger-panel {\n width: 100%;\n height: 100%;\n max-height: 100%;\n bottom: 0;\n right: 0;\n left: 0;\n border-radius: 0;\n }\n\n .messenger-panel-content {\n border-radius: 0;\n }\n\n .messenger-launcher {\n bottom: 16px;\n right: 16px;\n }\n\n .messenger-launcher-bottom-left {\n left: 16px;\n }\n}\n\n/* ========================================\n Availability Status\n ======================================== */\n\n.messenger-home-availability,\n.messenger-chat-availability {\n display: flex;\n align-items: center;\n gap: 6px;\n margin-top: 8px;\n font-size: 13px;\n color: rgba(255, 255, 255, 0.7);\n}\n\n.theme-light .messenger-home-availability,\n.theme-light .messenger-chat-availability {\n color: #6b7280;\n}\n\n.messenger-availability-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n flex-shrink: 0;\n}\n\n.messenger-availability-online {\n background: #22c55e;\n box-shadow: 0 0 0 2px rgba(34, 197, 94, 0.2);\n}\n\n.messenger-availability-away {\n background: #9ca3af;\n}\n\n.messenger-availability-text {\n opacity: 0.9;\n}\n\n/* ========================================\n Typing Indicator\n ======================================== */\n\n.messenger-typing-indicator {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n margin: 4px 0;\n}\n\n.messenger-typing-dots {\n display: flex;\n align-items: center;\n gap: 4px;\n background: #374151;\n padding: 8px 12px;\n border-radius: 16px;\n}\n\n.theme-light .messenger-typing-dots {\n background: #e5e7eb;\n}\n\n.messenger-typing-dots span {\n width: 6px;\n height: 6px;\n background: #9ca3af;\n border-radius: 50%;\n animation: messenger-typing-bounce 1.4s infinite ease-in-out;\n}\n\n.messenger-typing-dots span:nth-child(1) {\n animation-delay: -0.32s;\n}\n\n.messenger-typing-dots span:nth-child(2) {\n animation-delay: -0.16s;\n}\n\n.messenger-typing-dots span:nth-child(3) {\n animation-delay: 0s;\n}\n\n.messenger-typing-text {\n font-size: 12px;\n color: #9ca3af;\n}\n\n@keyframes messenger-typing-bounce {\n 0%, 80%, 100% {\n transform: scale(0.8);\n opacity: 0.5;\n }\n 40% {\n transform: scale(1);\n opacity: 1;\n }\n}\n\n/* ========================================\n Animations\n ======================================== */\n\n@keyframes messenger-slide-up {\n from {\n opacity: 0;\n transform: translateY(20px) scale(0.95);\n }\n to {\n opacity: 1;\n transform: translateY(0) scale(1);\n }\n}\n\n@keyframes messenger-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n/* Reduced motion */\n@media (prefers-reduced-motion: reduce) {\n .messenger-launcher-btn,\n .messenger-panel,\n .messenger-nav-tab,\n .messenger-conversation-item,\n .messenger-help-article,\n .messenger-changelog-card {\n transition: none;\n }\n}\n",document.head.appendChild(e)}}function H(){if("undefined"!=typeof window&&window.FeedbackSDKConfig){F();const e={...window.FeedbackSDKConfig},t=new B(e);t.init().then(n=>{if(window.FeedbackSDK.instance=t,window.FeedbackSDKConfig.autoCreate){(Array.isArray(window.FeedbackSDKConfig.autoCreate)?window.FeedbackSDKConfig.autoCreate:[window.FeedbackSDKConfig.autoCreate]).forEach(e=>{try{t.createWidget(e.type||"button",e).mount(e.container)}catch(e){console.error("[FeedbackSDK] Failed to create widget:",e)}})}if("undefined"!=typeof CustomEvent){const s=new CustomEvent("FeedbackSDKReady",{detail:{sdk:t,config:e,initData:n}});window.dispatchEvent(s)}}).catch(t=>{if(console.error("[FeedbackSDK] Auto-initialization failed:",t),"undefined"!=typeof CustomEvent){const n=new CustomEvent("FeedbackSDKError",{detail:{error:t,config:e,phase:"initialization"}});window.dispatchEvent(n)}})}}const j={FeedbackSDK:B,BaseWidget:y,ButtonWidget:w,ChangelogWidget:x,TabWidget:O,InlineWidget:k,SurveyWidget:D,MessengerWidget:L,WidgetFactory:N,EventBus:m,APIService:p,SDKError:t,APIError:n,WidgetError:s,ConfigError:i,ValidationError:a,helpers:v,create:e=>(F(),new B(e)),version:"1.0.0",instance:null,isReady:()=>Boolean(j.instance),getInstance:()=>j.instance,setUserContext:e=>{j.instance?j.instance.setUserContext(e):"undefined"!=typeof window&&(window.FeedbackSDKUserContext=e)},initWithUser:async(e,t)=>{F();const n={...e,userContext:t},s=new B(n);return await s.init(),"undefined"!=typeof window&&(window.FeedbackSDK.instance=s),s},onReady:e=>{"undefined"!=typeof window&&(j.isReady()?e(j.instance):window.addEventListener("FeedbackSDKReady",t=>{e(t.detail.sdk,t.detail)},{once:!0}))},onError:e=>{"undefined"!=typeof window&&window.addEventListener("FeedbackSDKError",t=>{e(t.detail.error,t.detail)})},extractUserContext:B.extractUserContextFromAuth};"undefined"!=typeof window&&(window.FeedbackSDK=j,"undefined"!=typeof document&&("loading"===document.readyState?document.addEventListener("DOMContentLoaded",H):setTimeout(H,0))),e.APIError=n,e.APIService=p,e.BaseWidget=y,e.ButtonWidget=w,e.ChangelogWidget=x,e.ConfigError=i,e.EventBus=m,e.FeedbackSDK=B,e.InlineWidget=k,e.MessengerWidget=L,e.SDKError=t,e.SurveyWidget=D,e.TabWidget=O,e.ValidationError=a,e.WidgetError=s,e.WidgetFactory=N,e.default=j,e.helpers=v,Object.defineProperty(e,"__esModule",{value:!0})});
2
2
  //# sourceMappingURL=feedback-sdk.min.js.map