@prodantix/sdk 0.5.0-beta.395 → 0.5.0-beta.397

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/chat.cjs CHANGED
@@ -1,10 +1,10 @@
1
- 'use strict';var Y=Object.defineProperty;var W=(r,e,t)=>e in r?Y(r,e,{enumerable:true,configurable:true,writable:true,value:t}):r[e]=t;var c=(r,e,t)=>W(r,typeof e!="symbol"?e+"":e,t);function H(r){if(r)return r;let e=globalThis.fetch;if(typeof e=="function")return e.bind(globalThis)}function $(r){return r.replace(/\/+$/,"")}var M="X-Prodantix-Conversation-Token",A="prodantix.chat.handle";function J(){let r=globalThis.localStorage;if(r)return {get:e=>r.getItem(e),remove:e=>r.removeItem(e),set:(e,t)=>r.setItem(e,t)}}var C=class{constructor(e){this.options=e;c(this,"fetchImpl");c(this,"fileFetchImpl");c(this,"host");c(this,"storage");c(this,"handle");c(this,"identity",null);this.fetchImpl=H(e.fetchImpl),this.fileFetchImpl=e.fileFetchImpl??((t,n)=>fetch(t,n)),this.host=$(e.host),this.storage=e.storage??J(),this.handle=this.readHandle();}get hasThread(){return this.handle!==null}avatarUrl(e){return e.startsWith("/")?`${this.host}${e}?api_key=${encodeURIComponent(this.options.apiKey)}`:e}get socketAuth(){return this.handle?{conversationId:this.handle.conversationId,conversationToken:this.handle.token,projectKey:this.options.apiKey}:null}identify(e){this.identity=e;}async ensureThread(e){if(this.handle)return true;let t=await this.request("POST","/v1/conversations",{body:{distinctId:this.options.distinctId,subject:e,userHash:this.identity?.userHash,userId:this.identity?.userId}});return !t?.conversationId||!t.token?false:(this.handle={conversationId:t.conversationId,token:t.token},this.storage?.set(A,JSON.stringify(this.handle)),true)}async send(e,t,n){if(!await this.ensureThread())return null;let a=this.handle;return a?(await this.request("POST",`/v1/conversations/${encodeURIComponent(a.conversationId)}/turns`,{body:{attachmentIds:n,body:e,pageContext:t},token:a.token}))?.turn??null:null}async upload(e){if(!await this.ensureThread())return null;let t=this.handle;return t?this.fileRequest("POST",`/v1/conversations/${encodeURIComponent(t.conversationId)}/attachments?name=${encodeURIComponent(e.name)}`,t.token,async n=>JSON.parse(await n.text()),e):null}async file(e){let t=this.handle;return t?this.fileRequest("GET",e,t.token,n=>n.blob()):null}async load(){let e=this.handle;return e?this.request("GET",`/v1/conversations/${encodeURIComponent(e.conversationId)}`,{token:e.token}):null}readHandle(){let e=this.storage?.get(A);if(!e)return null;try{let t=JSON.parse(e);if(typeof t.conversationId=="string"&&typeof t.token=="string")return {conversationId:t.conversationId,token:t.token}}catch{}return this.storage?.remove(A),null}async fileRequest(e,t,n,a,o){let i={authorization:`Bearer ${this.options.apiKey}`,[M]:n};o&&(i["content-type"]=o.type||"application/octet-stream");try{let s=await this.fileFetchImpl(`${this.host}${t}`,{body:o,headers:i,method:e});if(s.ok)return await a(s);this.options.onError?.(new Error(`prodantix chat ${t}: ${s.status}`));}catch(s){this.options.onError?.(s);}return null}async request(e,t,n={}){let a=this.fetchImpl;if(!a)return this.options.onError?.(new Error("no fetch available for prodantix chat")),null;let o={authorization:`Bearer ${this.options.apiKey}`,"content-type":"application/json"};n.token&&(o[M]=n.token);try{let i=await a(`${this.host}${t}`,{body:n.body===void 0?void 0:JSON.stringify(n.body),headers:o,method:e}),s=await i.text();return i.ok?s?JSON.parse(s):{}:(this.options.onError?.(new Error(`prodantix chat ${t}: ${i.status}`)),null)}catch(i){return this.options.onError?.(i),null}}};var V={Fri:"fri",Mon:"mon",Sat:"sat",Sun:"sun",Thu:"thu",Tue:"tue",Wed:"wed"};function w(r,e){let t=new Intl.DateTimeFormat(void 0,{hour:"2-digit",hour12:false,minute:"2-digit",timeZone:r.timezone,weekday:"short"}).formatToParts(e),n=V[t.find(s=>s.type==="weekday")?.value??""];if(!n)return false;let a=t.find(s=>s.type==="hour")?.value??"",o=t.find(s=>s.type==="minute")?.value??"",i=`${a}:${o}`;return r.windows.some(s=>s.days.includes(n)&&s.open<=i&&i<s.close)}var g={bubbleFill:"filled",bubbleShape:"tailed",composerShape:"round",dayDividers:true,launcherContent:"glyph",launcherFill:"outlined",launcherShape:"circle",launcherSize:"small",nameAvatar:true,namePlacement:"hidden",skin:"standard",stampContent:"time",stampPlacement:"none"},X=["quiet","standard"],Z=["round","square"],Q=["rounded","tailed"],ee=["filled","outlined"],te=["circle","pill","squircle"],ne=["filled","outlined"],re=["avatar","glyph","team_faces"],ae=["large","medium","small"],ie=["above","hidden","inline"],oe=["beside_name","none","under_turn"],se=["time","time_and_latency"],x=(r,e,t)=>typeof r=="string"&&e.includes(r)?r:t,O=(r,e)=>typeof r=="boolean"?r:e,le={avatar_circle:["circle","outlined","avatar","large"],circle_filled:["circle","filled","glyph","medium"],circle_outlined:["circle","outlined","glyph","small"],pill_labelled:["pill","filled","glyph","medium"],pill_team:["pill","outlined","team_faces","medium"],squircle_filled:["squircle","filled","glyph","medium"]},ce={above:["above",false],avatar_only:["hidden",true],gutter:["above",true],hidden:["hidden",false],inline:["inline",false]},de={cluster:[true,"none","time"],latency:[false,"beside_name","time_and_latency"],none:[false,"none","time"],trailing:[false,"under_turn","time"],with_name:[false,"beside_name","time"]},pe={concierge:["standard","round"],console:["standard","square"],quiet:["quiet","square"]},ue={hairline:["rounded","outlined"],outlined:["rounded","outlined"],rounded:["rounded","filled"],tailed:["tailed","filled"]};function E(r){let e=typeof r=="object"&&r!==null?r:{},t=typeof e.launcherStyle=="string"?e.launcherStyle:void 0,n=t===void 0?void 0:le[t],a=typeof e.namePlacement=="string"?e.namePlacement:void 0,o=a===void 0?void 0:ce[a],i=typeof e.timestampStyle=="string"?e.timestampStyle:void 0,s=i===void 0?void 0:de[i],d=typeof e.skin=="string"?e.skin:void 0,u=d===void 0?void 0:pe[d],p=typeof e.bubbleStyle=="string"?e.bubbleStyle:void 0,l=p===void 0?void 0:ue[p],m={bubbleFill:x(e.bubbleFill,ee,l?.[1]??g.bubbleFill),bubbleShape:x(e.bubbleShape,Q,l?.[0]??g.bubbleShape),composerShape:x(e.composerShape,Z,u?.[1]??g.composerShape),dayDividers:O(e.dayDividers,s?.[0]??g.dayDividers),launcherContent:x(e.launcherContent,re,n?.[2]??g.launcherContent),launcherFill:x(e.launcherFill,ne,n?.[1]??g.launcherFill),launcherShape:x(e.launcherShape,te,n?.[0]??g.launcherShape),launcherSize:x(e.launcherSize,ae,n?.[3]??g.launcherSize),nameAvatar:O(e.nameAvatar,o?.[1]??g.nameAvatar),namePlacement:x(e.namePlacement,ie,o?.[0]??g.namePlacement),skin:x(e.skin,X,u?.[0]??g.skin),stampContent:x(e.stampContent,se,s?.[2]??g.stampContent),stampPlacement:x(e.stampPlacement,oe,s?.[1]??g.stampPlacement)};return m.stampPlacement==="beside_name"&&m.namePlacement==="hidden"&&(m.stampPlacement="under_turn"),m}function z(r){let e=r.split(/\s+/).filter(n=>n.length>0);return (e.length>1?`${e[0]?.slice(0,1)}${e[1]?.slice(0,1)}`:e[0]?.slice(0,2)??"").toUpperCase()}var he="M20 11.6a7.4 7.4 0 0 1-7.4 7.4H8.2L4 21.8l1-4.1A7.4 7.4 0 1 1 20 11.6Z",me={large:66,medium:56,small:46},ge={circle:"width:var(--fab-size);height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);",pill:"width:auto;height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);padding:0 22px;gap:10px;",squircle:"width:var(--fab-size);height:var(--fab-size);border-radius:16px;"},fe={filled:"background:var(--a);color:#fff;",outlined:"background:var(--paper);border:1px solid var(--hairline);color:var(--ink-2);box-shadow:0 1px 2px rgba(0,0,0,.08);"},be={avatar:"",glyph:".launcher svg{width:calc(var(--fab-size) * 0.375);height:calc(var(--fab-size) * 0.375);}",team_faces:".launcher .faces{display:flex;}.launcher .faces .av{box-shadow:0 0 0 2px var(--paper);}.launcher .faces .av+.av{margin-left:-10px;}"},xe=".launcher .live{width:10px;height:10px;position:absolute;right:3px;bottom:3px;border-radius:50%;background:var(--online);box-shadow:0 0 0 2px var(--paper);}.launcher.closed .live{display:none}",ye={circle:"",pill:".badge{position:static;box-shadow:none}",squircle:""},ve={filled:"",outlined:".badge{background:var(--a);top:-7px;right:-7px;min-width:19px;height:19px;font-size:11.5px}"},ke={circle:"",pill:".launcher .label{font-size:14px;font-weight:600;white-space:nowrap;}",squircle:""},Se={circle:"",pill:"@media (max-width:480px){.launcher{width:var(--fab-size);padding:0}.launcher .label{display:none}}",squircle:""};function U(r,e,t,n){return `.launcher{--fab-size:${me[n]}px;${ge[r]}${fe[e]}}${be[t]}${xe}${ye[r]}${ve[e]}${ke[r]}${Se[r]}`}function B(r,e,t,n=a=>a){let a=document.createDocumentFragment();if(r==="glyph"||t.length===0){let o=document.createElement("span");return o.innerHTML=`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="${he}"/></svg>`,a.append(...o.childNodes,N()),a}return r==="avatar"?(a.append(D(t[0],e,n),N()),a):(a.append(P(t,e,n),N()),a)}function P(r,e,t=n=>n){let n=document.createElement("span");n.className="faces";for(let a of r.slice(0,2))n.append(D(a,e,t));return n}function D(r,e,t){let n=document.createElement("span");if(n.className="av",n.setAttribute("aria-hidden","true"),r&&(n.style.background=r.tone),r?.avatarUrl){let a=document.createElement("img");return a.alt="",a.src=t(r.avatarUrl),n.append(a),n}return n.textContent=r?r.initials:e.agentLabel.slice(0,2).toUpperCase(),n}function N(){let r=document.createElement("span");return r.className="live",r.setAttribute("aria-hidden","true"),r}var Ce={agentLabel:"Agent",aiLabel:"AI",attachLabel:"Attach a file",awayBody:"We are away right now, but we will reply as soon as we are back.",closeLabel:"Close chat",emptyBody:"We usually reply within a few minutes.",emptyTitle:"Ask us anything.",fileRefusal:(r,e)=>`That file is ${r}. Send a PNG, JPEG, WebP, GIF or PDF up to ${e}.`,inputPlaceholder:"Type a message",launcherLabel:"Chat with us",removeFileLabel:"Remove file",replyTime:"Usually replying in a few minutes",retryLabel:"Not delivered. Retry",sendLabel:"Send",timeLabel:r=>{let e=new Date(r);return Number.isNaN(e.getTime())?"":`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},title:"Support",unreadLabel:r=>`${r} unread`},S={accentColor:"#5b5bff",availability:{timezone:"UTC",windows:[]},awayMessage:"",greeting:"",launcherOffsetX:20,launcherOffsetY:20,launcherPosition:"bottom_right",starterPrompts:[],team:[],...g},Ee={quiet:".composer{position:relative;padding:8px 10px 10px}.composer input{padding-right:36px}.composer button{position:absolute;top:50%;right:14px;width:28px;min-width:28px;height:28px;padding:0;background:transparent;color:var(--ink);border-radius:7px;transform:translateY(-50%)}.composer button .sendglyph{display:block;width:16px;height:16px}.composer button .sendtext{display:none}.panel{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.12)}.header{background:var(--paper);color:var(--ink);height:44px;padding:0 8px 0 16px;border-bottom:1px solid var(--hairline)}.header h2{font-size:11px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3)}.header .faces,.header .status{display:none}.header .close{top:6px}.close{color:var(--ink-2)}",standard:".panel{border-radius:16px;box-shadow:0 16px 40px rgba(0,0,0,.2)}.header{background:var(--a);color:#fff;flex-direction:column;align-items:flex-start;gap:14px;padding:18px 14px 20px 20px}.header h2{font-size:19px;font-weight:640}"},Te={round:".composer{padding:10px 10px 12px;gap:6px}.composer input{height:36px;border-radius:18px;padding:0 14px}.composer button{width:36px;min-width:36px;height:36px;padding:0;border-radius:18px}.composer button .sendglyph{display:block}.composer button .sendtext{display:none}",square:".composer input{height:36px;border-radius:8px;padding:0 12px}"},we={rounded:".turn{border-radius:18px;padding:10px 15px}",tailed:".turn.agent,.turn.ai{border-radius:12px 12px 12px 4px}.turn.end_user{border-radius:12px 12px 4px 12px}"},Le={filled:"",outlined:".turn{background:none;border:1px solid var(--hairline)}.turn.end_user{background:none;border-color:var(--a);color:var(--ink)}"},Ae={above:"",hidden:".turn.agent .author,.turn.ai .author:not(.ai){display:none}",inline:".body .author.below{display:block;margin:4px 0 0;font-size:11.5px;font-weight:500;color:var(--ink-2);text-transform:none;letter-spacing:0;opacity:1}"},Ne=".turn.agent,.turn.ai{display:flex;gap:10px;max-width:100%;background:none;padding:0}.turn.agent .body,.turn.ai .body{background:var(--fill);padding:9px 13px;border-radius:inherit}.author{text-transform:none;letter-spacing:0;font-size:12.5px;font-weight:600;opacity:1}",Pe='.divider{display:flex;align-items:center;gap:10px;margin:0;font-size:11px;opacity:.6}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--hairline)}',_e={beside_name:".stamp{font-size:11px;opacity:.7;margin-left:6px}",none:"",under_turn:".stamp{display:block;font-size:11px;opacity:.7;margin-top:4px}.turn.end_user .stamp{text-align:right}"},Fe=".lat{font-size:11px;opacity:.7;margin-left:6px}",Ie=".att{display:block;width:180px;margin-bottom:6px;border-radius:8px;overflow:hidden}.att img{display:block;width:100%}.pdfc{display:inline-flex;gap:8px;align-items:center;margin-bottom:6px;padding:6px 8px;border-radius:8px;background:color-mix(in srgb,currentColor 16%,transparent);color:inherit;font-size:12.5px;text-decoration:none;overflow-wrap:anywhere}.pdfc b,.file b{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:4px;font-size:9px;letter-spacing:.04em;background:color-mix(in srgb,currentColor 22%,transparent)}.att:last-child,.pdfc:last-child{margin-bottom:0}";function Re(r){let e=r==="round"?14:12;return `.field{position:relative;flex:1;min-width:0;display:flex}.composer .field input{padding-left:${e+26}px}.composer button.clip{position:absolute;top:50%;left:${e-5}px;right:auto;width:28px;min-width:28px;height:28px;padding:0;border-radius:7px;background:none;color:var(--ink-2);transform:translateY(-50%)}.composer button.clip:hover{background:color-mix(in srgb,currentColor 14%,transparent)}.clip svg{display:block;width:18px;height:18px}.file{display:inline-flex;gap:8px;align-items:center;align-self:flex-start;max-width:calc(100% - 20px);margin:0 10px 8px;padding:6px 10px 6px 6px;font-size:12.5px;color:var(--ink);border:1px solid var(--hairline);border-radius:8px}.file .th{flex:none;width:28px;height:28px;border-radius:4px;object-fit:cover}.file .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file .sz,.file .x{flex:none;color:var(--ink-3)}.file .x{margin-left:4px;padding:0;border:0;background:none;font:inherit;font-size:16px;line-height:1;cursor:pointer}.ferr{margin:0 10px 6px;font-size:12px;color:oklch(60% 0.2 27)}`}function _(r){return r<999500?`${Math.max(1,Math.round(r/1e3))} KB`:`${(r/1e6).toFixed(1)} MB`}var G=`--paper: oklch(24.6% 0.015 257); --ink: #fff; --ink-3: rgba(255,255,255,.55);
1
+ 'use strict';var Y=Object.defineProperty;var W=(n,e,t)=>e in n?Y(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t;var p=(n,e,t)=>W(n,typeof e!="symbol"?e+"":e,t);function H(n){if(n)return n;let e=globalThis.fetch;if(typeof e=="function")return e.bind(globalThis)}function $(n){return n.replace(/\/+$/,"")}var M="X-Prodantix-Conversation-Token",A="prodantix.chat.handle";function J(){let n=globalThis.localStorage;if(n)return {get:e=>n.getItem(e),remove:e=>n.removeItem(e),set:(e,t)=>n.setItem(e,t)}}var C=class{constructor(e){this.options=e;p(this,"fetchImpl");p(this,"fileFetchImpl");p(this,"host");p(this,"storage");p(this,"handle");p(this,"identity",null);this.fetchImpl=H(e.fetchImpl),this.fileFetchImpl=e.fileFetchImpl??((t,r)=>fetch(t,r)),this.host=$(e.host),this.storage=e.storage??J(),this.handle=this.readHandle();}get hasThread(){return this.handle!==null}avatarUrl(e){return e.startsWith("/")?`${this.host}${e}?api_key=${encodeURIComponent(this.options.apiKey)}`:e}get socketAuth(){return this.handle?{conversationId:this.handle.conversationId,conversationToken:this.handle.token,projectKey:this.options.apiKey}:null}identify(e){this.identity=e;}async ensureThread(e){if(this.handle)return true;let t=await this.request("POST","/v1/conversations",{body:{distinctId:this.options.distinctId,subject:e,userHash:this.identity?.userHash,userId:this.identity?.userId}});return !t?.conversationId||!t.token?false:(this.handle={conversationId:t.conversationId,token:t.token},this.storage?.set(A,JSON.stringify(this.handle)),true)}async send(e,t,r){if(!await this.ensureThread())return null;let a=this.handle;return a?(await this.request("POST",`/v1/conversations/${encodeURIComponent(a.conversationId)}/turns`,{body:{attachmentIds:r,body:e,pageContext:t},token:a.token}))?.turn??null:null}async upload(e){if(!await this.ensureThread())return null;let t=this.handle;return t?this.fileRequest("POST",`/v1/conversations/${encodeURIComponent(t.conversationId)}/attachments?name=${encodeURIComponent(e.name)}`,t.token,async r=>JSON.parse(await r.text()),e):null}async file(e){let t=this.handle;return t?this.fileRequest("GET",e,t.token,r=>r.blob()):null}async load(){let e=this.handle;return e?this.request("GET",`/v1/conversations/${encodeURIComponent(e.conversationId)}`,{token:e.token}):null}readHandle(){let e=this.storage?.get(A);if(!e)return null;try{let t=JSON.parse(e);if(typeof t.conversationId=="string"&&typeof t.token=="string")return {conversationId:t.conversationId,token:t.token}}catch{}return this.storage?.remove(A),null}async fileRequest(e,t,r,a,o){let i={authorization:`Bearer ${this.options.apiKey}`,[M]:r};o&&(i["content-type"]=o.type||"application/octet-stream");try{let s=await this.fileFetchImpl(`${this.host}${t}`,{body:o,headers:i,method:e});if(s.ok)return await a(s);this.options.onError?.(new Error(`prodantix chat ${t}: ${s.status}`));}catch(s){this.options.onError?.(s);}return null}async request(e,t,r={}){let a=this.fetchImpl;if(!a)return this.options.onError?.(new Error("no fetch available for prodantix chat")),null;let o={authorization:`Bearer ${this.options.apiKey}`,"content-type":"application/json"};r.token&&(o[M]=r.token);try{let i=await a(`${this.host}${t}`,{body:r.body===void 0?void 0:JSON.stringify(r.body),headers:o,method:e}),s=await i.text();return i.ok?s?JSON.parse(s):{}:(this.options.onError?.(new Error(`prodantix chat ${t}: ${i.status}`)),null)}catch(i){return this.options.onError?.(i),null}}};var V={Fri:"fri",Mon:"mon",Sat:"sat",Sun:"sun",Thu:"thu",Tue:"tue",Wed:"wed"};function w(n,e){let t=new Intl.DateTimeFormat(void 0,{hour:"2-digit",hour12:false,minute:"2-digit",timeZone:n.timezone,weekday:"short"}).formatToParts(e),r=V[t.find(s=>s.type==="weekday")?.value??""];if(!r)return false;let a=t.find(s=>s.type==="hour")?.value??"",o=t.find(s=>s.type==="minute")?.value??"",i=`${a}:${o}`;return n.windows.some(s=>s.days.includes(r)&&s.open<=i&&i<s.close)}var g={bubbleFill:"filled",bubbleShape:"tailed",composerShape:"round",dayDividers:true,launcherContent:"glyph",launcherFill:"outlined",launcherShape:"circle",launcherSize:"small",nameAvatar:true,namePlacement:"hidden",skin:"standard",stampContent:"time",stampPlacement:"none"},X=["quiet","standard"],Z=["round","square"],Q=["rounded","tailed"],ee=["filled","outlined"],te=["circle","pill","squircle"],ne=["filled","outlined"],re=["avatar","glyph","team_faces"],ae=["large","medium","small"],ie=["above","hidden","inline"],oe=["beside_name","none","under_turn"],se=["time","time_and_latency"],x=(n,e,t)=>typeof n=="string"&&e.includes(n)?n:t,O=(n,e)=>typeof n=="boolean"?n:e,le={avatar_circle:["circle","outlined","avatar","large"],circle_filled:["circle","filled","glyph","medium"],circle_outlined:["circle","outlined","glyph","small"],pill_labelled:["pill","filled","glyph","medium"],pill_team:["pill","outlined","team_faces","medium"],squircle_filled:["squircle","filled","glyph","medium"]},ce={above:["above",false],avatar_only:["hidden",true],gutter:["above",true],hidden:["hidden",false],inline:["inline",false]},de={cluster:[true,"none","time"],latency:[false,"beside_name","time_and_latency"],none:[false,"none","time"],trailing:[false,"under_turn","time"],with_name:[false,"beside_name","time"]},pe={concierge:["standard","round"],console:["standard","square"],quiet:["quiet","square"]},ue={hairline:["rounded","outlined"],outlined:["rounded","outlined"],rounded:["rounded","filled"],tailed:["tailed","filled"]};function E(n){let e=typeof n=="object"&&n!==null?n:{},t=typeof e.launcherStyle=="string"?e.launcherStyle:void 0,r=t===void 0?void 0:le[t],a=typeof e.namePlacement=="string"?e.namePlacement:void 0,o=a===void 0?void 0:ce[a],i=typeof e.timestampStyle=="string"?e.timestampStyle:void 0,s=i===void 0?void 0:de[i],d=typeof e.skin=="string"?e.skin:void 0,u=d===void 0?void 0:pe[d],c=typeof e.bubbleStyle=="string"?e.bubbleStyle:void 0,l=c===void 0?void 0:ue[c],h={bubbleFill:x(e.bubbleFill,ee,l?.[1]??g.bubbleFill),bubbleShape:x(e.bubbleShape,Q,l?.[0]??g.bubbleShape),composerShape:x(e.composerShape,Z,u?.[1]??g.composerShape),dayDividers:O(e.dayDividers,s?.[0]??g.dayDividers),launcherContent:x(e.launcherContent,re,r?.[2]??g.launcherContent),launcherFill:x(e.launcherFill,ne,r?.[1]??g.launcherFill),launcherShape:x(e.launcherShape,te,r?.[0]??g.launcherShape),launcherSize:x(e.launcherSize,ae,r?.[3]??g.launcherSize),nameAvatar:O(e.nameAvatar,o?.[1]??g.nameAvatar),namePlacement:x(e.namePlacement,ie,o?.[0]??g.namePlacement),skin:x(e.skin,X,u?.[0]??g.skin),stampContent:x(e.stampContent,se,s?.[2]??g.stampContent),stampPlacement:x(e.stampPlacement,oe,s?.[1]??g.stampPlacement)};return h.stampPlacement==="beside_name"&&h.namePlacement==="hidden"&&(h.stampPlacement="under_turn"),h}function z(n){let e=n.split(/\s+/).filter(r=>r.length>0);return (e.length>1?`${e[0]?.slice(0,1)}${e[1]?.slice(0,1)}`:e[0]?.slice(0,2)??"").toUpperCase()}var he="M20 11.6a7.4 7.4 0 0 1-7.4 7.4H8.2L4 21.8l1-4.1A7.4 7.4 0 1 1 20 11.6Z",me={large:66,medium:56,small:46},ge={circle:"width:var(--fab-size);height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);",pill:"width:auto;height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);padding:0 22px;gap:10px;",squircle:"width:var(--fab-size);height:var(--fab-size);border-radius:16px;"},fe={filled:"background:var(--a);color:#fff;",outlined:"background:var(--paper);border:1px solid var(--hairline);color:var(--ink-2);box-shadow:0 1px 2px rgba(0,0,0,.08);"},be={avatar:"",glyph:".launcher svg{width:calc(var(--fab-size) * 0.375);height:calc(var(--fab-size) * 0.375);}",team_faces:".launcher .faces{display:flex;}.launcher .faces .av{box-shadow:0 0 0 2px var(--paper);}.launcher .faces .av+.av{margin-left:-10px;}"},xe=".launcher .live{width:10px;height:10px;position:absolute;right:3px;bottom:3px;border-radius:50%;background:var(--online);box-shadow:0 0 0 2px var(--paper);}.launcher.closed .live{display:none}",ye={circle:"",pill:".badge{position:static;box-shadow:none}",squircle:""},ve={filled:"",outlined:".badge{background:var(--a);top:-7px;right:-7px;min-width:19px;height:19px;font-size:11.5px}"},ke={circle:"",pill:".launcher .label{font-size:14px;font-weight:600;white-space:nowrap;}",squircle:""},Se={circle:"",pill:"@media (max-width:480px){.launcher{width:var(--fab-size);padding:0}.launcher .label{display:none}}",squircle:""};function U(n,e,t,r){return `.launcher{--fab-size:${me[r]}px;${ge[n]}${fe[e]}}${be[t]}${xe}${ye[n]}${ve[e]}${ke[n]}${Se[n]}`}function B(n,e,t,r=a=>a){let a=document.createDocumentFragment();if(n==="glyph"||t.length===0){let o=document.createElement("span");return o.innerHTML=`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="${he}"/></svg>`,a.append(...o.childNodes,N()),a}return n==="avatar"?(a.append(D(t[0],e,r),N()),a):(a.append(P(t,e,r),N()),a)}function P(n,e,t=r=>r){let r=document.createElement("span");r.className="faces";for(let a of n.slice(0,2))r.append(D(a,e,t));return r}function D(n,e,t){let r=document.createElement("span");if(r.className="av",r.setAttribute("aria-hidden","true"),n&&(r.style.background=n.tone),n?.avatarUrl){let a=document.createElement("img");return a.alt="",a.src=t(n.avatarUrl),r.append(a),r}return r.textContent=n?n.initials:e.agentLabel.slice(0,2).toUpperCase(),r}function N(){let n=document.createElement("span");return n.className="live",n.setAttribute("aria-hidden","true"),n}var Ce={agentLabel:"Agent",aiLabel:"AI",attachLabel:"Attach a file",awayBody:"We are away right now, but we will reply as soon as we are back.",closeLabel:"Close chat",emptyBody:"We usually reply within a few minutes.",emptyTitle:"Ask us anything.",fileRefusal:(n,e)=>`That file is ${n}. Send a PNG, JPEG, WebP, GIF or PDF up to ${e}.`,inputPlaceholder:"Type a message",launcherLabel:"Chat with us",removeFileLabel:"Remove file",replyTime:"Usually replying in a few minutes",retryLabel:"Not delivered. Retry",sendLabel:"Send",timeLabel:n=>{let e=new Date(n);return Number.isNaN(e.getTime())?"":`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},title:"Support",unreadLabel:n=>`${n} unread`},S={accentColor:"#5b5bff",availability:{timezone:"UTC",windows:[]},awayMessage:"",greeting:"",launcherOffsetX:20,launcherOffsetY:20,launcherPosition:"bottom_right",starterPrompts:[],team:[],...g},Ee={quiet:".composer{position:relative;padding:8px 10px 10px}.composer input{padding-right:36px}.composer button{position:absolute;top:50%;right:14px;width:28px;min-width:28px;height:28px;padding:0;background:transparent;color:var(--ink);border-radius:7px;transform:translateY(-50%)}.composer button .sendglyph{display:block;width:16px;height:16px}.composer button .sendtext{display:none}.panel{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.12)}.header{background:var(--paper);color:var(--ink);height:44px;padding:0 8px 0 16px;border-bottom:1px solid var(--hairline)}.header h2{font-size:11px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3)}.header .faces,.header .status{display:none}.header .close{top:6px}.close{color:var(--ink-2)}",standard:".panel{border-radius:16px;box-shadow:0 16px 40px rgba(0,0,0,.2)}.header{background:var(--a);color:#fff;flex-direction:column;align-items:flex-start;gap:14px;padding:18px 14px 20px 20px}.header h2{font-size:19px;font-weight:640}"},Te={round:".composer{padding:10px 10px 12px;gap:6px}.composer input{height:36px;border-radius:18px;padding:0 14px}.composer button{width:36px;min-width:36px;height:36px;padding:0;border-radius:18px}.composer button .sendglyph{display:block}.composer button .sendtext{display:none}",square:".composer input{height:36px;border-radius:8px;padding:0 12px}"},we={rounded:".turn{border-radius:18px;padding:10px 15px}",tailed:".turn.agent,.turn.ai{border-radius:12px 12px 12px 4px}.turn.end_user{border-radius:12px 12px 4px 12px}"},Le={filled:"",outlined:".turn{background:none;border:1px solid var(--hairline)}.turn.end_user{background:none;border-color:var(--a);color:var(--ink)}"},Ae={above:"",hidden:".turn.agent .author,.turn.ai .author:not(.ai){display:none}",inline:".body .author.below{display:block;margin:4px 0 0;font-size:11.5px;font-weight:500;color:var(--ink-2);text-transform:none;letter-spacing:0;opacity:1}"},Ne=".turn.agent,.turn.ai{display:flex;gap:10px;max-width:100%;background:none;padding:0}.turn.agent .body,.turn.ai .body{background:var(--fill);padding:9px 13px;border-radius:inherit}.author{text-transform:none;letter-spacing:0;font-size:12.5px;font-weight:600;opacity:1}",Pe='.divider{display:flex;align-items:center;gap:10px;margin:0;font-size:11px;opacity:.6}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--hairline)}',_e={beside_name:".stamp{font-size:11px;opacity:.7;margin-left:6px}",none:"",under_turn:".stamp{display:block;font-size:11px;opacity:.7;margin-top:4px}.turn.end_user .stamp{text-align:right}"},Fe=".lat{font-size:11px;opacity:.7;margin-left:6px}",Ie=".att{display:block;width:180px;margin-bottom:6px;border-radius:8px;overflow:hidden}.att img{display:block;width:100%}.pdfc{display:inline-flex;gap:8px;align-items:center;margin-bottom:6px;padding:6px 8px;border-radius:8px;background:color-mix(in srgb,currentColor 16%,transparent);color:inherit;font-size:12.5px;text-decoration:none;overflow-wrap:anywhere}.pdfc b,.file b{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:4px;font-size:9px;letter-spacing:.04em;background:color-mix(in srgb,currentColor 22%,transparent)}.att:last-child,.pdfc:last-child{margin-bottom:0}";function Re(n){let e=n==="round"?14:12;return `.field{position:relative;flex:1;min-width:0;display:flex}.composer .field input{padding-left:${e+26}px}.composer button.clip{position:absolute;top:50%;left:${e-5}px;right:auto;width:28px;min-width:28px;height:28px;padding:0;border-radius:7px;background:none;color:var(--ink-2);transform:translateY(-50%)}.composer button.clip:hover{background:color-mix(in srgb,currentColor 14%,transparent)}.clip svg{display:block;width:18px;height:18px}.file{display:inline-flex;gap:8px;align-items:center;align-self:flex-start;max-width:calc(100% - 20px);margin:0 10px 8px;padding:6px 10px 6px 6px;font-size:12.5px;color:var(--ink);border:1px solid var(--hairline);border-radius:8px}.file .th{flex:none;width:28px;height:28px;border-radius:4px;object-fit:cover}.file .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file .sz,.file .x{flex:none;color:var(--ink-3)}.file .x{margin-left:4px;padding:0;border:0;background:none;font:inherit;font-size:16px;line-height:1;cursor:pointer}.ferr{margin:0 10px 6px;font-size:12px;color:oklch(60% 0.2 27)}`}function _(n){return n<999500?`${Math.max(1,Math.round(n/1e3))} KB`:`${(n/1e6).toFixed(1)} MB`}var G=`--paper: oklch(24.6% 0.015 257); --ink: #fff; --ink-3: rgba(255,255,255,.55);
2
2
  --fill: rgba(255,255,255,.06); --hairline: rgba(255,255,255,.13); --ink-2: rgba(255,255,255,.70);
3
- --online: oklch(72% 0.13 163.23);`;function He(r){return r==="light"?"":r==="dark"?`:host { ${G} }`:`@media (prefers-color-scheme: dark) {
3
+ --online: oklch(72% 0.13 163.23);`;function He(n){return n==="light"?"":n==="dark"?`:host { ${G} }`:`@media (prefers-color-scheme: dark) {
4
4
  :host {
5
5
  ${G}
6
6
  }
7
- }`}var $e=/https?:\/\/[^\s<>"]+/g,Me=/[.,;:!?)]$/,Oe=r=>{let e=r;for(;Me.test(e);){let t=e.split("(").length-1,n=e.split(")").length-1;if(e.endsWith(")")&&t>=n)break;e=e.slice(0,-1);}return e};function ze(r,e){let t=0;for(let n of e.matchAll($e)){let a=n.index??0,o=Oe(n[0]);a>t&&r.append(e.slice(t,a));let i=document.createElement("a");i.href=o,i.target="_blank",i.rel="noopener noreferrer",i.textContent=o,r.append(i),t=a+o.length;}t<e.length&&r.append(e.slice(t));}function F(r,e="system"){let t=E(r),n=r.launcherPosition==="bottom_left"?"left":"right",a=r.accentColor;return `${`
7
+ }`}var $e=/https?:\/\/[^\s<>"]+/g,Me=/[.,;:!?)]$/,Oe=n=>{let e=n;for(;Me.test(e);){let t=e.split("(").length-1,r=e.split(")").length-1;if(e.endsWith(")")&&t>=r)break;e=e.slice(0,-1);}return e};function ze(n,e){let t=0;for(let r of e.matchAll($e)){let a=r.index??0,o=Oe(r[0]);a>t&&n.append(e.slice(t,a));let i=document.createElement("a");i.href=o,i.target="_blank",i.rel="noopener noreferrer",i.textContent=o,n.append(i),t=a+o.length;}t<e.length&&n.append(e.slice(t));}var Ue=["P","BR","STRONG","EM","A","UL","OL","LI"],Be=n=>typeof n=="object"&&n!==null&&"html"in n&&typeof n.html=="string"&&"text"in n&&typeof n.text=="string",De=(n,e)=>e.name==="class"||e.name==="data-block-type"?true:n!=="A"?false:e.name==="target"||e.name==="rel"?true:e.name==="href"&&/^https?:\/\//i.test(e.value.trim()),Ge=n=>[...n.querySelectorAll("*")].every(e=>Ue.includes(e.tagName)&&[...e.attributes].every(t=>De(e.tagName,t)));function F(n,e="system"){let t=E(n),r=n.launcherPosition==="bottom_left"?"left":"right",a=n.accentColor;return `${`
8
8
  :host {
9
9
  all: initial; z-index: 2147483000; --a: ${a};
10
10
  --paper: #fff; --ink: #0f172a; --ink-3: rgba(0,0,0,.55);
@@ -15,7 +15,7 @@
15
15
  ${He(e)}
16
16
  * { box-sizing: border-box; font-family: system-ui, sans-serif; }
17
17
  .launcher {
18
- z-index: 2147483000; position: fixed; ${n}: ${r.launcherOffsetX}px; bottom: ${r.launcherOffsetY}px; width: 56px; height: 56px;
18
+ z-index: 2147483000; position: fixed; ${r}: ${n.launcherOffsetX}px; bottom: ${n.launcherOffsetY}px; width: 56px; height: 56px;
19
19
  border-radius: 28px; border: none; cursor: pointer;
20
20
  display: inline-flex; align-items: center; justify-content: center;
21
21
  background: ${a}; color: #fff; font-size: 24px;
@@ -35,7 +35,7 @@ ${He(e)}
35
35
  }
36
36
  .badge[hidden] { display: none; }
37
37
  .panel {
38
- z-index: 2147483001; position: fixed; ${n}: ${r.launcherOffsetX}px; bottom: ${r.launcherOffsetY+68}px; width: 360px; max-width: calc(100vw - 40px);
38
+ z-index: 2147483001; position: fixed; ${r}: ${n.launcherOffsetX}px; bottom: ${n.launcherOffsetY+68}px; width: 360px; max-width: calc(100vw - 40px);
39
39
  height: 520px; max-height: calc(100vh - 120px); background: var(--paper); color: var(--ink);
40
40
  border-radius: 12px; box-shadow: 0 8px 32px rgba(0,0,0,.24);
41
41
  display: flex; flex-direction: column; overflow: hidden;
@@ -73,13 +73,20 @@ ${He(e)}
73
73
  .awayglyph { flex: none; width: 16px; height: 16px; margin-top: 1px; border: 1.5px solid currentColor; border-radius: 50%; }
74
74
  .empty { display: flex; flex-direction: column; gap: 8px; padding: 20px 16px; }
75
75
  .empty h3 { margin: 0; font-size: 18px; font-weight: 640; letter-spacing: -.015em; }
76
- .empty p { margin: 0 0 8px; font-size: 13.5px; color: var(--ink-2); }
76
+ .empty > p { margin: 0 0 8px; font-size: 13.5px; color: var(--ink-2); }
77
77
  .prompt {
78
- display: flex; align-items: center; min-height: 44px; padding: 0 14px; text-align: left;
78
+ position: relative; display: flex; align-items: center; min-height: 44px; padding: 10px 14px; text-align: left;
79
79
  font-family: inherit; font-size: 13.5px; font-weight: 500; color: var(--ink);
80
80
  background: none; border: 1px solid var(--hairline); border-radius: 8px; cursor: pointer;
81
81
  }
82
- .prompt:focus-visible { outline: 2px solid ${a}; outline-offset: 2px; }
82
+ .promptwords { min-width: 0; overflow-wrap: anywhere; }
83
+ .promptwords > :last-child { margin-bottom: 0; }
84
+ .prompt p { margin: 0 0 16px; line-height: 1.6; }
85
+ .prompt ul, .prompt ol { margin: 0 0 16px; padding-left: 32px; }
86
+ .prompt li { margin: 8px 0; line-height: 1.6; }
87
+ .prompt a { position: relative; z-index: 1; color: ${a}; text-decoration: underline; overflow-wrap: anywhere; }
88
+ .promptpress { position: absolute; inset: 0; padding: 0; background: none; border: 0; border-radius: inherit; cursor: pointer; }
89
+ .promptpress:focus-visible { outline: 2px solid ${a}; outline-offset: 2px; }
83
90
  .av { width: 30px; height: 30px; border-radius: 50%; flex: none; display: inline-flex; align-items: center; justify-content: center; font-size: 11.5px; font-weight: 650; color: #fff; background: oklch(52% 0.17 22); }
84
91
  .av.bot { border-radius: 9px; background: var(--fill); color: var(--ink); }
85
92
  .av img { width: 100%; height: 100%; display: block; object-fit: cover; border-radius: inherit; }
@@ -95,5 +102,5 @@ ${He(e)}
95
102
  .panel { animation: rise 180ms ease-out; }
96
103
  @keyframes rise { from { transform: translateY(8px); opacity: 0; } to { transform: none; opacity: 1; } }
97
104
  }
98
- `}${Te[t.composerShape]}${Ee[t.skin]}${U(t.launcherShape,t.launcherFill,t.launcherContent,t.launcherSize)}${we[t.bubbleShape]}${Le[t.bubbleFill]}${Ae[t.namePlacement]}${t.nameAvatar?Ne:""}${t.dayDividers?Pe:""}${_e[t.stampPlacement]}${t.stampContent==="time_and_latency"?Fe:""}${Ie}${r.attachments?.enabled?Re(t.composerShape):""}`}var Ue=["end_user","agent","ai"];function Be(){let r=globalThis.location;if(r)return {host:r.host,path:r.pathname,title:document.title}}var De='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m16.5 6.5-7.8 7.8a2.1 2.1 0 0 0 3 3l8.1-8.1a4.2 4.2 0 0 0-6-6L5.7 11.3a6.3 6.3 0 0 0 8.9 8.9l6.6-6.6"/></svg>',Ge='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.88 9.29 12 13.17 8.12 9.29a.996.996 0 0 0-1.41 0c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0l4.59-4.59c.39-.39.39-1.02 0-1.41-.39-.38-1.03-.39-1.42 0"/></svg>',T=class{constructor(e,t,n={},a={},o={}){this.host=e;this.client=t;c(this,"root");c(this,"strings");c(this,"settings");c(this,"appearance");c(this,"launcher");c(this,"badge");c(this,"panel",null);c(this,"lastFocused",null);c(this,"unread",0);c(this,"pendingTurns",0);c(this,"openNow");c(this,"style");c(this,"scheme");c(this,"picked",null);c(this,"objectUrls",[]);this.strings={...Ce,...n},this.appearance={...S,...a},this.settings=E({...S,...a}),this.root=e.attachShadow({mode:o.shadowMode??"closed"}),this.openNow=w(this.appearance.availability,new Date),this.scheme=o.scheme,this.style=document.createElement("style"),this.style.textContent=F(this.appearance,this.scheme),this.root.append(this.style),this.launcher=document.createElement("button"),this.launcher.className="launcher",this.launcher.type="button",this.launcher.setAttribute("aria-haspopup","dialog"),this.launcher.addEventListener("click",()=>this.toggle()),this.badge=document.createElement("span"),this.badge.className="badge",this.badge.hidden=true,this.drawLauncher(),this.root.append(this.launcher);}drawLauncher(){if(this.launcher.setAttribute("aria-label",this.strings.launcherLabel),this.launcher.replaceChildren(),this.launcher.append(B(this.settings.launcherContent,this.strings,this.appearance.team,e=>this.client.avatarUrl(e))),this.settings.launcherShape==="pill"){let e=document.createElement("span");e.className="label",e.textContent=this.settings.launcherContent==="team_faces"?this.strings.agentLabel:this.strings.launcherLabel,this.launcher.append(e);}this.launcher.append(this.badge),this.launcher.classList.toggle("closed",!this.openNow);}update(e,t){this.appearance={...S,...e},this.settings=E(this.appearance),t!==void 0&&(this.scheme=t),this.style.textContent=F(this.appearance,this.scheme),this.drawLauncher(),this.panel&&(this.close(),this.open());}toggle(){this.panel?this.close():this.open();}setOpenNow(e){this.openNow=e,this.launcher.classList.toggle("closed",!e),this.panel?.classList.toggle("closed",!e);}async open(){if(this.panel)return;this.lastFocused=this.host.ownerDocument.activeElement,this.unread=0,this.renderBadge();let e=document.createElement("section");e.className=this.openNow?"panel":"panel closed",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label",this.strings.title);let t=document.createElement("div");t.className="header";let n=this.appearance.team??[];n.length>0&&t.append(P(n,this.strings,f=>this.client.avatarUrl(f)));let a=document.createElement("div");a.className="headmain";let o=document.createElement("h2");o.textContent=this.strings.title;let i=document.createElement("p");i.className="status";let s=document.createElement("span");s.className="live",s.setAttribute("aria-hidden","true"),i.append(s,this.strings.replyTime),a.append(o,i);let d=document.createElement("button");d.className="close",d.type="button",d.setAttribute("aria-label",this.strings.closeLabel),d.innerHTML=Ge,d.addEventListener("click",()=>this.close()),t.append(a,d);let u=document.createElement("div");u.className="log",u.setAttribute("role","log"),u.setAttribute("aria-live","polite"),u.setAttribute("aria-label",this.strings.title);let p=document.createElement("form");p.className="composer";let l=document.createElement("input");l.type="text",l.setAttribute("aria-label",this.strings.inputPlaceholder),l.placeholder=this.strings.inputPlaceholder;let m=document.createElement("button");m.type="submit",m.setAttribute("aria-label",this.strings.sendLabel),m.innerHTML='<svg class="sendglyph" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 12 20 4.5 15 20l-3.6-5.4L4.5 12Z"/></svg>';let y=document.createElement("span");y.className="sendtext",y.textContent=this.strings.sendLabel,m.append(y);let v=this.appearance.attachments;if(v?.enabled&&this.client.upload){let f=document.createElement("span");f.className="field";let h=document.createElement("input");h.type="file",h.accept=v.accept.join(","),h.hidden=true,h.addEventListener("change",()=>{let R=h.files?.[0];h.value="",R&&this.pick(u,p,v,R);});let b=document.createElement("button");b.type="button",b.className="clip",b.setAttribute("aria-label",this.strings.attachLabel),b.innerHTML=De,b.addEventListener("click",()=>h.click()),f.append(b,l,h),p.append(f,m);}else p.append(l,m);p.addEventListener("submit",f=>{f.preventDefault(),this.submit(l,u);}),e.append(t,u,p),e.addEventListener("keydown",f=>this.onKeydown(f,e,d)),this.root.append(e),this.panel=e,l.focus();let k=await this.client.load();k&&k.turns.length>0?this.renderThread(u,k):this.renderFirstRun(u,l),this.openNow||this.renderAway(t);}renderFirstRun(e,t){let n=document.createElement("div");n.className="empty";let a=document.createElement("h3");a.textContent=this.appearance.greeting.trim()||this.strings.emptyTitle;let o=document.createElement("p");o.textContent=this.strings.emptyBody,n.append(a,o);for(let i of this.appearance.starterPrompts){let s=document.createElement("button");s.className="prompt",s.type="button",s.textContent=i,s.addEventListener("click",()=>{t.value=i,this.submit(t,e);}),n.append(s);}e.replaceChildren(n);}renderAway(e){let t=document.createElement("div");t.className="away";let n=document.createElement("span");n.className="awayglyph",n.setAttribute("aria-hidden","true");let a=document.createElement("span");a.textContent=this.appearance.awayMessage.trim()||this.strings.awayBody,t.append(n,a),e.after(t);}pick(e,t,n,a){let o=a.size>n.maxBytes||!n.accept.includes(a.type);for(let l of this.root.querySelectorAll(o?".ferr":".file,.ferr"))l.remove();if(o){let l=document.createElement("p");l.className="ferr",l.setAttribute("role","alert"),l.textContent=this.strings.fileRefusal(_(a.size),`${n.maxBytes/1e6} MB`),t.before(l),e.scrollTop=e.scrollHeight;return}this.picked=a;let i=document.createElement("span");i.className="file";let s;if(a.type==="application/pdf")s=document.createElement("b"),s.textContent="PDF";else {let l=document.createElement("img");l.className="th",l.alt="",l.src=this.objectUrl(a),s=l;}let d=document.createElement("span");d.className="name",d.textContent=a.name;let u=document.createElement("span");u.className="sz",u.textContent=`\xB7 ${_(a.size)}`;let p=document.createElement("button");p.type="button",p.className="x",p.setAttribute("aria-label",this.strings.removeFileLabel),p.textContent="\xD7",p.addEventListener("click",()=>{this.picked=null,i.remove();}),i.append(s,d,u,p),t.before(i),e.scrollTop=e.scrollHeight;}objectUrl(e){let t=URL.createObjectURL(e);return this.objectUrls.push(t),t}close(){if(this.panel){this.panel.remove(),this.panel=null,this.picked=null;for(let e of this.objectUrls)URL.revokeObjectURL(e);this.objectUrls=[],this.lastFocused instanceof HTMLElement?this.lastFocused.focus():this.launcher.focus();}}onIncomingTurn(e){if(this.panel){let t=this.panel.querySelector(".log");t instanceof HTMLElement&&!this.hasTurn(t,e.id)&&this.appendTurn(t,e);return}e.authorKind!=="end_user"&&(this.unread+=1,this.renderBadge());}async submit(e,t){let n=e.value.trim(),a=this.picked;if(!(!n&&!a)){e.value="",this.picked=null;for(let o of this.root.querySelectorAll(".file,.ferr"))o.remove();await this.sendBody(t,n,a);}}async sendBody(e,t,n=null){e.querySelector(".empty")?.remove(),this.pendingTurns+=1;let a=this.appendTurn(e,{authorId:null,authorKind:"end_user",body:t,createdAt:new Date().toISOString(),id:`pending-${this.pendingTurns}`},n);a.setAttribute("data-pending","");let o=n?await this.client.upload?.(n):void 0,i=o===null?null:await this.client.send(t,Be(),o?[o.id]:void 0);if(a.removeAttribute("data-pending"),i){a.dataset.turnId=i.id;return}this.markFailed(e,a,t,n);}markFailed(e,t,n,a){t.setAttribute("data-failed","");let o=document.createElement("button");o.type="button",o.className="retry",o.textContent=this.strings.retryLabel,o.addEventListener("click",()=>{t.remove(),this.sendBody(e,n,a);}),(t.querySelector(".body")??t).append(o);}hasTurn(e,t){for(let n of e.children)if(n instanceof HTMLElement&&n.dataset.turnId===t)return true;return false}renderThread(e,t){e.replaceChildren();for(let n of t.turns)this.appendTurn(e,n);}appendTurn(e,t,n=null){e.querySelector(".empty")?.remove();let a=Ue.includes(t.authorKind)?t.authorKind:"agent",o=this.settings,i=document.createElement("div");if(i.className=`turn ${a}`,i.dataset.turnId=t.id,a!=="end_user"&&o.nameAvatar){let l=document.createElement("span");if(l.className=a==="ai"?"av bot":"av",l.setAttribute("aria-hidden","true"),a==="agent"&&t.authorAvatarUrl){let m=document.createElement("img");m.alt="",m.src=this.client.avatarUrl(t.authorAvatarUrl),l.append(m);}else {l.textContent=a==="ai"?this.strings.aiLabel:z(this.agentName(t));let m=a==="agent"?this.appearance.team?.find(y=>y.name===t.authorName)?.tone:void 0;m&&(l.style.background=m);}i.append(l);}let d=document.createElement("div");if(d.className="body",a==="end_user"){n&&this.drawFile(d,n.name,n.type,n.size,Promise.resolve(n));for(let l of t.attachments??[])this.drawFile(d,l.name,l.contentType,l.bytes,this.client.file?.(l.url)??Promise.resolve(null));}let u=a!=="end_user"&&o.namePlacement!=="hidden",p=document.createElement("div");if(a==="ai"?ze(p,t.body):p.textContent=t.body,u||a==="ai"&&o.namePlacement==="hidden"){let l=document.createElement("div");l.className=a==="ai"?"author ai":"author",l.textContent=a==="ai"?this.strings.aiLabel:this.agentName(t),o.stampPlacement==="beside_name"&&l.append(this.stamp(t)),o.namePlacement==="inline"?(l.classList.add("below"),d.append(p,l)):d.append(l,p);}else t.body&&d.append(p);return o.stampPlacement==="under_turn"&&d.append(this.stamp(t)),i.append(d),e.append(i),e.scrollTop=e.scrollHeight,i}drawFile(e,t,n,a,o){let i=document.createElement("a");if(n==="application/pdf"){i.className="pdfc",i.download=t;let s=document.createElement("b");s.textContent="PDF",i.append(s,`${t} \xB7 ${_(a)}`);}else {i.className="att",i.target="_blank",i.rel="noopener noreferrer";let s=document.createElement("img");s.alt=t,s.addEventListener("load",()=>{let d=i.closest(".log");d&&(d.scrollTop=d.scrollHeight);}),i.append(s);}e.append(i),o.then(s=>{s&&(i.href=this.objectUrl(s),i.querySelector("img")?.setAttribute("src",i.href));});}agentName(e){return e.authorName||this.strings.agentLabel}stamp(e){let t=document.createElement("span");return t.className="stamp",t.textContent=this.strings.timeLabel(e.createdAt),t}onKeydown(e,t,n){if(e.key==="Escape"){e.preventDefault(),this.close();return}if(e.key!=="Tab")return;let a=t.querySelectorAll('button, input, [tabindex]:not([tabindex="-1"])');if(a.length===0)return;let o=a[0],i=a[a.length-1],s=this.root.activeElement;e.shiftKey&&s===o?(e.preventDefault(),i.focus()):!e.shiftKey&&s===i?(e.preventDefault(),o.focus()):s===null&&(e.preventDefault(),n.focus());}renderBadge(){this.unread>0?(this.badge.hidden=false,this.badge.textContent=String(this.unread),this.launcher.setAttribute("aria-label",`${this.strings.launcherLabel}, ${this.strings.unreadLabel(this.unread)}`)):(this.badge.hidden=true,this.badge.textContent="",this.launcher.setAttribute("aria-label",this.strings.launcherLabel));}};function K(r){return `40${JSON.stringify(r)}`}function q(){return "3"}function j(r){let e=r.charAt(0),t=r.slice(1);if(e==="2")return {kind:"ping"};if(e==="1")return {kind:"disconnect"};if(e==="0"){let i=I(t);return {kind:"open",pingInterval:typeof i?.pingInterval=="number"?i.pingInterval:25e3,pingTimeout:typeof i?.pingTimeout=="number"?i.pingTimeout:2e4}}if(e!=="4")return {kind:"other"};let n=t.charAt(0),a=t.slice(1);if(n==="0")return {kind:"connected"};if(n==="1")return {kind:"disconnect"};if(n==="4"){let i=I(a);return {kind:"connectError",message:typeof i?.message=="string"?i.message:"refused"}}if(n!=="2")return {kind:"other"};let o=I(a);return !Array.isArray(o)||typeof o[0]!="string"?{kind:"other"}:{kind:"event",name:o[0],payload:o[1]}}function I(r){try{return JSON.parse(r)}catch{return null}}var Ke="/socket.io/?EIO=4&transport=websocket",L=class{constructor(e){this.options=e;c(this,"socket",null);c(this,"heartbeat",null);c(this,"ready",false);c(this,"closed",false);c(this,"heartbeatWindow",45e3);c(this,"factory");c(this,"setTimer");c(this,"clearTimer");this.factory=e.socketFactory??qe,this.setTimer=e.setTimer??((t,n)=>setTimeout(t,n)),this.clearTimer=e.clearTimer??(t=>clearTimeout(t));}open(){if(this.socket||this.closed)return;let e=`${this.options.host.replace(/^http/,"ws").replace(/\/+$/,"")}${Ke}`,t;try{t=this.factory(e);}catch{this.options.onClosed(false);return}this.socket=t,t.onmessage=n=>this.receive(String(n.data)),t.onerror=()=>t.close(),t.onclose=()=>this.fell();}close(){this.closed=true,this.stopHeartbeat();let e=this.socket;this.socket=null,e?.close();}receive(e){let t=j(e);if(t.kind==="open"){this.armHeartbeat(t.pingInterval+t.pingTimeout),this.socket?.send(K(this.options.auth));return}if(t.kind==="ping"){this.armHeartbeat(),this.socket?.send(q());return}if(t.kind==="connectError"||t.kind==="disconnect"){this.stopHeartbeat(),this.socket?.close();return}if(t.kind==="event"){if(t.name==="ready"){this.ready=true,this.options.onReady();return}if(t.name==="conversation.turn"){let n=t.payload?.turn;n&&this.options.onTurn(n);}}}fell(){this.stopHeartbeat();let e=this.ready;this.socket=null,this.ready=false,this.closed||this.options.onClosed(e);}armHeartbeat(e){e!==void 0&&(this.heartbeatWindow=e),this.stopHeartbeat(),this.heartbeat=this.setTimer(()=>this.socket?.close(),this.heartbeatWindow);}stopHeartbeat(){this.heartbeat!==null&&this.clearTimer(this.heartbeat),this.heartbeat=null;}};function qe(r){let e=globalThis.WebSocket;if(!e)throw new Error("no WebSocket");return new e(r)}var je=6e4;function mt(r){let e=globalThis.document;if(!e)throw new Error("prodantix chat requires a document; mount it in the browser");let t=r.mountPoint??e.createElement("div");r.mountPoint||e.body.append(t);let n=new C(r),a=new T(t,n,r.strings,r.appearance),o=r.appearance?.availability??S.availability,i,s=()=>{a.setOpenNow(w(o,new Date)),i=setTimeout(s,je);};s();let d=new Set,u,p=null,l=r.pollIntervalMs??15e3,m=h=>{d.has(h.id)||h.authorKind==="end_user"||(d.add(h.id),a.onIncomingTurn(h));},y=async()=>{if(!n.hasThread)return;let h=await n.load();if(h){for(let b of h.turns)m(b);d=new Set(h.turns.map(b=>b.id));}},v=()=>{u||l<=0||(u=setInterval(()=>void y(),l));},k=()=>{u&&clearInterval(u),u=void 0;},f=()=>{if(p||!r.socketHost)return;let h=n.socketAuth;h&&(p=new L({auth:h,host:r.socketHost,onClosed:b=>{p=null,v(),b&&f();},onReady:k,onTurn:m,socketFactory:r.socketFactory}),p.open());};return v(),f(),{close:()=>a.close(),destroy:()=>{k(),clearTimeout(i),p?.close(),p=null,a.close(),t.remove();},identify:h=>n.identify(h),open:()=>{a.open().then(f);}}}exports.ChatClient=C;exports.ChatPanel=T;exports.DEFAULT_APPEARANCE=S;exports.DEFAULT_APPEARANCE_SETTINGS=g;exports.mountChat=mt;exports.panelStyles=F;exports.resolveAppearance=E;//# sourceMappingURL=chat.cjs.map
105
+ `}${Te[t.composerShape]}${Ee[t.skin]}${U(t.launcherShape,t.launcherFill,t.launcherContent,t.launcherSize)}${we[t.bubbleShape]}${Le[t.bubbleFill]}${Ae[t.namePlacement]}${t.nameAvatar?Ne:""}${t.dayDividers?Pe:""}${_e[t.stampPlacement]}${t.stampContent==="time_and_latency"?Fe:""}${Ie}${n.attachments?.enabled?Re(t.composerShape):""}`}var Ke=["end_user","agent","ai"];function qe(){let n=globalThis.location;if(n)return {host:n.host,path:n.pathname,title:document.title}}var je='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m16.5 6.5-7.8 7.8a2.1 2.1 0 0 0 3 3l8.1-8.1a4.2 4.2 0 0 0-6-6L5.7 11.3a6.3 6.3 0 0 0 8.9 8.9l6.6-6.6"/></svg>',Ye='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.88 9.29 12 13.17 8.12 9.29a.996.996 0 0 0-1.41 0c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0l4.59-4.59c.39-.39.39-1.02 0-1.41-.39-.38-1.03-.39-1.42 0"/></svg>',T=class{constructor(e,t,r={},a={},o={}){this.host=e;this.client=t;p(this,"root");p(this,"strings");p(this,"settings");p(this,"appearance");p(this,"launcher");p(this,"badge");p(this,"panel",null);p(this,"lastFocused",null);p(this,"unread",0);p(this,"pendingTurns",0);p(this,"openNow");p(this,"style");p(this,"scheme");p(this,"picked",null);p(this,"objectUrls",[]);this.strings={...Ce,...r},this.appearance={...S,...a},this.settings=E({...S,...a}),this.root=e.attachShadow({mode:o.shadowMode??"closed"}),this.openNow=w(this.appearance.availability,new Date),this.scheme=o.scheme,this.style=document.createElement("style"),this.style.textContent=F(this.appearance,this.scheme),this.root.append(this.style),this.launcher=document.createElement("button"),this.launcher.className="launcher",this.launcher.type="button",this.launcher.setAttribute("aria-haspopup","dialog"),this.launcher.addEventListener("click",()=>this.toggle()),this.badge=document.createElement("span"),this.badge.className="badge",this.badge.hidden=true,this.drawLauncher(),this.root.append(this.launcher);}drawLauncher(){if(this.launcher.setAttribute("aria-label",this.strings.launcherLabel),this.launcher.replaceChildren(),this.launcher.append(B(this.settings.launcherContent,this.strings,this.appearance.team,e=>this.client.avatarUrl(e))),this.settings.launcherShape==="pill"){let e=document.createElement("span");e.className="label",e.textContent=this.settings.launcherContent==="team_faces"?this.strings.agentLabel:this.strings.launcherLabel,this.launcher.append(e);}this.launcher.append(this.badge),this.launcher.classList.toggle("closed",!this.openNow);}update(e,t){this.appearance={...S,...e},this.settings=E(this.appearance),t!==void 0&&(this.scheme=t),this.style.textContent=F(this.appearance,this.scheme),this.drawLauncher(),this.panel&&(this.close(),this.open());}toggle(){this.panel?this.close():this.open();}setOpenNow(e){this.openNow=e,this.launcher.classList.toggle("closed",!e),this.panel?.classList.toggle("closed",!e);}async open(){if(this.panel)return;this.lastFocused=this.host.ownerDocument.activeElement,this.unread=0,this.renderBadge();let e=document.createElement("section");e.className=this.openNow?"panel":"panel closed",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label",this.strings.title);let t=document.createElement("div");t.className="header";let r=this.appearance.team??[];r.length>0&&t.append(P(r,this.strings,f=>this.client.avatarUrl(f)));let a=document.createElement("div");a.className="headmain";let o=document.createElement("h2");o.textContent=this.strings.title;let i=document.createElement("p");i.className="status";let s=document.createElement("span");s.className="live",s.setAttribute("aria-hidden","true"),i.append(s,this.strings.replyTime),a.append(o,i);let d=document.createElement("button");d.className="close",d.type="button",d.setAttribute("aria-label",this.strings.closeLabel),d.innerHTML=Ye,d.addEventListener("click",()=>this.close()),t.append(a,d);let u=document.createElement("div");u.className="log",u.setAttribute("role","log"),u.setAttribute("aria-live","polite"),u.setAttribute("aria-label",this.strings.title);let c=document.createElement("form");c.className="composer";let l=document.createElement("input");l.type="text",l.setAttribute("aria-label",this.strings.inputPlaceholder),l.placeholder=this.strings.inputPlaceholder;let h=document.createElement("button");h.type="submit",h.setAttribute("aria-label",this.strings.sendLabel),h.innerHTML='<svg class="sendglyph" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 12 20 4.5 15 20l-3.6-5.4L4.5 12Z"/></svg>';let y=document.createElement("span");y.className="sendtext",y.textContent=this.strings.sendLabel,h.append(y);let v=this.appearance.attachments;if(v?.enabled&&this.client.upload){let f=document.createElement("span");f.className="field";let m=document.createElement("input");m.type="file",m.accept=v.accept.join(","),m.hidden=true,m.addEventListener("change",()=>{let R=m.files?.[0];m.value="",R&&this.pick(u,c,v,R);});let b=document.createElement("button");b.type="button",b.className="clip",b.setAttribute("aria-label",this.strings.attachLabel),b.innerHTML=je,b.addEventListener("click",()=>m.click()),f.append(b,l,m),c.append(f,h);}else c.append(l,h);c.addEventListener("submit",f=>{f.preventDefault(),this.submit(l,u);}),e.append(t,u,c),e.addEventListener("keydown",f=>this.onKeydown(f,e,d)),this.root.append(e),this.panel=e,l.focus();let k=await this.client.load();k&&k.turns.length>0?this.renderThread(u,k):this.renderFirstRun(u,l),this.openNow||this.renderAway(t);}renderFirstRun(e,t){let r=document.createElement("div");r.className="empty";let a=document.createElement("h3");a.textContent=this.appearance.greeting.trim()||this.strings.emptyTitle;let o=document.createElement("p");o.textContent=this.strings.emptyBody,r.append(a,o),this.appearance.starterPrompts.filter(Be).forEach((s,d)=>{let u=document.createElement("div");u.className="prompt";let c=document.createElement("div");c.className="promptwords",c.id=`prompt-${d}`;let l=document.createElement("template");l.innerHTML=s.html,Ge(l.content)?c.append(l.content):c.textContent=s.text;for(let y of c.querySelectorAll("a"))y.target="_blank",y.rel="noopener noreferrer";let h=document.createElement("button");h.className="promptpress",h.type="button",h.setAttribute("aria-labelledby",c.id),h.addEventListener("click",()=>{t.value=s.text,this.submit(t,e);}),u.append(c,h),r.append(u);}),e.replaceChildren(r);}renderAway(e){let t=document.createElement("div");t.className="away";let r=document.createElement("span");r.className="awayglyph",r.setAttribute("aria-hidden","true");let a=document.createElement("span");a.textContent=this.appearance.awayMessage.trim()||this.strings.awayBody,t.append(r,a),e.after(t);}pick(e,t,r,a){let o=a.size>r.maxBytes||!r.accept.includes(a.type);for(let l of this.root.querySelectorAll(o?".ferr":".file,.ferr"))l.remove();if(o){let l=document.createElement("p");l.className="ferr",l.setAttribute("role","alert"),l.textContent=this.strings.fileRefusal(_(a.size),`${r.maxBytes/1e6} MB`),t.before(l),e.scrollTop=e.scrollHeight;return}this.picked=a;let i=document.createElement("span");i.className="file";let s;if(a.type==="application/pdf")s=document.createElement("b"),s.textContent="PDF";else {let l=document.createElement("img");l.className="th",l.alt="",l.src=this.objectUrl(a),s=l;}let d=document.createElement("span");d.className="name",d.textContent=a.name;let u=document.createElement("span");u.className="sz",u.textContent=`\xB7 ${_(a.size)}`;let c=document.createElement("button");c.type="button",c.className="x",c.setAttribute("aria-label",this.strings.removeFileLabel),c.textContent="\xD7",c.addEventListener("click",()=>{this.picked=null,i.remove();}),i.append(s,d,u,c),t.before(i),e.scrollTop=e.scrollHeight;}objectUrl(e){let t=URL.createObjectURL(e);return this.objectUrls.push(t),t}close(){if(this.panel){this.panel.remove(),this.panel=null,this.picked=null;for(let e of this.objectUrls)URL.revokeObjectURL(e);this.objectUrls=[],this.lastFocused instanceof HTMLElement?this.lastFocused.focus():this.launcher.focus();}}onIncomingTurn(e){if(this.panel){let t=this.panel.querySelector(".log");t instanceof HTMLElement&&!this.hasTurn(t,e.id)&&this.appendTurn(t,e);return}e.authorKind!=="end_user"&&(this.unread+=1,this.renderBadge());}async submit(e,t){let r=e.value.trim(),a=this.picked;if(!(!r&&!a)){e.value="",this.picked=null;for(let o of this.root.querySelectorAll(".file,.ferr"))o.remove();await this.sendBody(t,r,a);}}async sendBody(e,t,r=null){e.querySelector(".empty")?.remove(),this.pendingTurns+=1;let a=this.appendTurn(e,{authorId:null,authorKind:"end_user",body:t,createdAt:new Date().toISOString(),id:`pending-${this.pendingTurns}`},r);a.setAttribute("data-pending","");let o=r?await this.client.upload?.(r):void 0,i=o===null?null:await this.client.send(t,qe(),o?[o.id]:void 0);if(a.removeAttribute("data-pending"),i){a.dataset.turnId=i.id;return}this.markFailed(e,a,t,r);}markFailed(e,t,r,a){t.setAttribute("data-failed","");let o=document.createElement("button");o.type="button",o.className="retry",o.textContent=this.strings.retryLabel,o.addEventListener("click",()=>{t.remove(),this.sendBody(e,r,a);}),(t.querySelector(".body")??t).append(o);}hasTurn(e,t){for(let r of e.children)if(r instanceof HTMLElement&&r.dataset.turnId===t)return true;return false}renderThread(e,t){e.replaceChildren();for(let r of t.turns)this.appendTurn(e,r);}appendTurn(e,t,r=null){e.querySelector(".empty")?.remove();let a=Ke.includes(t.authorKind)?t.authorKind:"agent",o=this.settings,i=document.createElement("div");if(i.className=`turn ${a}`,i.dataset.turnId=t.id,a!=="end_user"&&o.nameAvatar){let l=document.createElement("span");if(l.className=a==="ai"?"av bot":"av",l.setAttribute("aria-hidden","true"),a==="agent"&&t.authorAvatarUrl){let h=document.createElement("img");h.alt="",h.src=this.client.avatarUrl(t.authorAvatarUrl),l.append(h);}else {l.textContent=a==="ai"?this.strings.aiLabel:z(this.agentName(t));let h=a==="agent"?this.appearance.team?.find(y=>y.name===t.authorName)?.tone:void 0;h&&(l.style.background=h);}i.append(l);}let d=document.createElement("div");if(d.className="body",a==="end_user"){r&&this.drawFile(d,r.name,r.type,r.size,Promise.resolve(r));for(let l of t.attachments??[])this.drawFile(d,l.name,l.contentType,l.bytes,this.client.file?.(l.url)??Promise.resolve(null));}let u=a!=="end_user"&&o.namePlacement!=="hidden",c=document.createElement("div");if(a==="ai"?ze(c,t.body):c.textContent=t.body,u||a==="ai"&&o.namePlacement==="hidden"){let l=document.createElement("div");l.className=a==="ai"?"author ai":"author",l.textContent=a==="ai"?this.strings.aiLabel:this.agentName(t),o.stampPlacement==="beside_name"&&l.append(this.stamp(t)),o.namePlacement==="inline"?(l.classList.add("below"),d.append(c,l)):d.append(l,c);}else t.body&&d.append(c);return o.stampPlacement==="under_turn"&&d.append(this.stamp(t)),i.append(d),e.append(i),e.scrollTop=e.scrollHeight,i}drawFile(e,t,r,a,o){let i=document.createElement("a");if(r==="application/pdf"){i.className="pdfc",i.download=t;let s=document.createElement("b");s.textContent="PDF",i.append(s,`${t} \xB7 ${_(a)}`);}else {i.className="att",i.target="_blank",i.rel="noopener noreferrer";let s=document.createElement("img");s.alt=t,s.addEventListener("load",()=>{let d=i.closest(".log");d&&(d.scrollTop=d.scrollHeight);}),i.append(s);}e.append(i),o.then(s=>{s&&(i.href=this.objectUrl(s),i.querySelector("img")?.setAttribute("src",i.href));});}agentName(e){return e.authorName||this.strings.agentLabel}stamp(e){let t=document.createElement("span");return t.className="stamp",t.textContent=this.strings.timeLabel(e.createdAt),t}onKeydown(e,t,r){if(e.key==="Escape"){e.preventDefault(),this.close();return}if(e.key!=="Tab")return;let a=t.querySelectorAll('button, input, [tabindex]:not([tabindex="-1"])');if(a.length===0)return;let o=a[0],i=a[a.length-1],s=this.root.activeElement;e.shiftKey&&s===o?(e.preventDefault(),i.focus()):!e.shiftKey&&s===i?(e.preventDefault(),o.focus()):s===null&&(e.preventDefault(),r.focus());}renderBadge(){this.unread>0?(this.badge.hidden=false,this.badge.textContent=String(this.unread),this.launcher.setAttribute("aria-label",`${this.strings.launcherLabel}, ${this.strings.unreadLabel(this.unread)}`)):(this.badge.hidden=true,this.badge.textContent="",this.launcher.setAttribute("aria-label",this.strings.launcherLabel));}};function K(n){return `40${JSON.stringify(n)}`}function q(){return "3"}function j(n){let e=n.charAt(0),t=n.slice(1);if(e==="2")return {kind:"ping"};if(e==="1")return {kind:"disconnect"};if(e==="0"){let i=I(t);return {kind:"open",pingInterval:typeof i?.pingInterval=="number"?i.pingInterval:25e3,pingTimeout:typeof i?.pingTimeout=="number"?i.pingTimeout:2e4}}if(e!=="4")return {kind:"other"};let r=t.charAt(0),a=t.slice(1);if(r==="0")return {kind:"connected"};if(r==="1")return {kind:"disconnect"};if(r==="4"){let i=I(a);return {kind:"connectError",message:typeof i?.message=="string"?i.message:"refused"}}if(r!=="2")return {kind:"other"};let o=I(a);return !Array.isArray(o)||typeof o[0]!="string"?{kind:"other"}:{kind:"event",name:o[0],payload:o[1]}}function I(n){try{return JSON.parse(n)}catch{return null}}var We="/socket.io/?EIO=4&transport=websocket",L=class{constructor(e){this.options=e;p(this,"socket",null);p(this,"heartbeat",null);p(this,"ready",false);p(this,"closed",false);p(this,"heartbeatWindow",45e3);p(this,"factory");p(this,"setTimer");p(this,"clearTimer");this.factory=e.socketFactory??Je,this.setTimer=e.setTimer??((t,r)=>setTimeout(t,r)),this.clearTimer=e.clearTimer??(t=>clearTimeout(t));}open(){if(this.socket||this.closed)return;let e=`${this.options.host.replace(/^http/,"ws").replace(/\/+$/,"")}${We}`,t;try{t=this.factory(e);}catch{this.options.onClosed(false);return}this.socket=t,t.onmessage=r=>this.receive(String(r.data)),t.onerror=()=>t.close(),t.onclose=()=>this.fell();}close(){this.closed=true,this.stopHeartbeat();let e=this.socket;this.socket=null,e?.close();}receive(e){let t=j(e);if(t.kind==="open"){this.armHeartbeat(t.pingInterval+t.pingTimeout),this.socket?.send(K(this.options.auth));return}if(t.kind==="ping"){this.armHeartbeat(),this.socket?.send(q());return}if(t.kind==="connectError"||t.kind==="disconnect"){this.stopHeartbeat(),this.socket?.close();return}if(t.kind==="event"){if(t.name==="ready"){this.ready=true,this.options.onReady();return}if(t.name==="conversation.turn"){let r=t.payload?.turn;r&&this.options.onTurn(r);}}}fell(){this.stopHeartbeat();let e=this.ready;this.socket=null,this.ready=false,this.closed||this.options.onClosed(e);}armHeartbeat(e){e!==void 0&&(this.heartbeatWindow=e),this.stopHeartbeat(),this.heartbeat=this.setTimer(()=>this.socket?.close(),this.heartbeatWindow);}stopHeartbeat(){this.heartbeat!==null&&this.clearTimer(this.heartbeat),this.heartbeat=null;}};function Je(n){let e=globalThis.WebSocket;if(!e)throw new Error("no WebSocket");return new e(n)}var Ve=6e4;function xt(n){let e=globalThis.document;if(!e)throw new Error("prodantix chat requires a document; mount it in the browser");let t=n.mountPoint??e.createElement("div");n.mountPoint||e.body.append(t);let r=new C(n),a=new T(t,r,n.strings,n.appearance),o=n.appearance?.availability??S.availability,i,s=()=>{a.setOpenNow(w(o,new Date)),i=setTimeout(s,Ve);};s();let d=new Set,u,c=null,l=n.pollIntervalMs??15e3,h=m=>{d.has(m.id)||m.authorKind==="end_user"||(d.add(m.id),a.onIncomingTurn(m));},y=async()=>{if(!r.hasThread)return;let m=await r.load();if(m){for(let b of m.turns)h(b);d=new Set(m.turns.map(b=>b.id));}},v=()=>{u||l<=0||(u=setInterval(()=>void y(),l));},k=()=>{u&&clearInterval(u),u=void 0;},f=()=>{if(c||!n.socketHost)return;let m=r.socketAuth;m&&(c=new L({auth:m,host:n.socketHost,onClosed:b=>{c=null,v(),b&&f();},onReady:k,onTurn:h,socketFactory:n.socketFactory}),c.open());};return v(),f(),{close:()=>a.close(),destroy:()=>{k(),clearTimeout(i),c?.close(),c=null,a.close(),t.remove();},identify:m=>r.identify(m),open:()=>{a.open().then(f);}}}exports.ChatClient=C;exports.ChatPanel=T;exports.DEFAULT_APPEARANCE=S;exports.DEFAULT_APPEARANCE_SETTINGS=g;exports.mountChat=xt;exports.panelStyles=F;exports.resolveAppearance=E;//# sourceMappingURL=chat.cjs.map
99
106
  //# sourceMappingURL=chat.cjs.map
package/dist/chat.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as ChatThread, P as PageContext, a as ChatTurn, b as ChatUpload, M as MessengerConfig, A as AppearanceSettings, c as ChatIdentity, d as ChatClientOptions } from './config-CM4nTGof.cjs';
2
- export { B as BubbleFill, e as BubbleShape, f as ChatAttachment, g as ChatClient, h as ChatStorage, i as ComposerShape, D as DEFAULT_APPEARANCE_SETTINGS, F as FileFetchLike, j as FileResponseLike, L as LauncherContent, k as LauncherFill, l as LauncherShape, m as LauncherSize, n as MessengerSkin, N as NamePlacement, S as StampContent, o as StampPlacement, r as resolveAppearance } from './config-CM4nTGof.cjs';
1
+ import { C as ChatThread, P as PageContext, a as ChatTurn, b as ChatUpload, M as MessengerConfig, A as AppearanceSettings, c as ChatIdentity, d as ChatClientOptions } from './config-CMF9zz1a.cjs';
2
+ export { B as BubbleFill, e as BubbleShape, f as ChatAttachment, g as ChatClient, h as ChatStorage, i as ComposerShape, D as DEFAULT_APPEARANCE_SETTINGS, F as FileFetchLike, j as FileResponseLike, L as LauncherContent, k as LauncherFill, l as LauncherShape, m as LauncherSize, n as MessengerSkin, N as NamePlacement, S as StampContent, o as StampPlacement, r as resolveAppearance } from './config-CMF9zz1a.cjs';
3
3
  import { S as SocketFactory } from './types-DjMXp6Wg.cjs';
4
4
  import './http-BCh716Vs.cjs';
5
5
 
package/dist/chat.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { C as ChatThread, P as PageContext, a as ChatTurn, b as ChatUpload, M as MessengerConfig, A as AppearanceSettings, c as ChatIdentity, d as ChatClientOptions } from './config-DJX2zFaa.js';
2
- export { B as BubbleFill, e as BubbleShape, f as ChatAttachment, g as ChatClient, h as ChatStorage, i as ComposerShape, D as DEFAULT_APPEARANCE_SETTINGS, F as FileFetchLike, j as FileResponseLike, L as LauncherContent, k as LauncherFill, l as LauncherShape, m as LauncherSize, n as MessengerSkin, N as NamePlacement, S as StampContent, o as StampPlacement, r as resolveAppearance } from './config-DJX2zFaa.js';
1
+ import { C as ChatThread, P as PageContext, a as ChatTurn, b as ChatUpload, M as MessengerConfig, A as AppearanceSettings, c as ChatIdentity, d as ChatClientOptions } from './config-DqC0lcr7.js';
2
+ export { B as BubbleFill, e as BubbleShape, f as ChatAttachment, g as ChatClient, h as ChatStorage, i as ComposerShape, D as DEFAULT_APPEARANCE_SETTINGS, F as FileFetchLike, j as FileResponseLike, L as LauncherContent, k as LauncherFill, l as LauncherShape, m as LauncherSize, n as MessengerSkin, N as NamePlacement, S as StampContent, o as StampPlacement, r as resolveAppearance } from './config-DqC0lcr7.js';
3
3
  import { S as SocketFactory } from './types-DjMXp6Wg.js';
4
4
  import './http-BCh716Vs.js';
5
5
 
package/dist/chat.js CHANGED
@@ -1,12 +1,12 @@
1
- import {c,a as a$2,b}from'./chunk-V77KYPOF.js';import {a as a$1,d}from'./chunk-VG77TYVX.js';import {a}from'./chunk-5XGN7UAV.js';var U="X-Prodantix-Conversation-Token",A="prodantix.chat.handle";function G(){let r=globalThis.localStorage;if(r)return {get:e=>r.getItem(e),remove:e=>r.removeItem(e),set:(e,t)=>r.setItem(e,t)}}var C=class{constructor(e){this.options=e;a(this,"fetchImpl");a(this,"fileFetchImpl");a(this,"host");a(this,"storage");a(this,"handle");a(this,"identity",null);this.fetchImpl=a$1(e.fetchImpl),this.fileFetchImpl=e.fileFetchImpl??((t,n)=>fetch(t,n)),this.host=d(e.host),this.storage=e.storage??G(),this.handle=this.readHandle();}get hasThread(){return this.handle!==null}avatarUrl(e){return e.startsWith("/")?`${this.host}${e}?api_key=${encodeURIComponent(this.options.apiKey)}`:e}get socketAuth(){return this.handle?{conversationId:this.handle.conversationId,conversationToken:this.handle.token,projectKey:this.options.apiKey}:null}identify(e){this.identity=e;}async ensureThread(e){if(this.handle)return true;let t=await this.request("POST","/v1/conversations",{body:{distinctId:this.options.distinctId,subject:e,userHash:this.identity?.userHash,userId:this.identity?.userId}});return !t?.conversationId||!t.token?false:(this.handle={conversationId:t.conversationId,token:t.token},this.storage?.set(A,JSON.stringify(this.handle)),true)}async send(e,t,n){if(!await this.ensureThread())return null;let a=this.handle;return a?(await this.request("POST",`/v1/conversations/${encodeURIComponent(a.conversationId)}/turns`,{body:{attachmentIds:n,body:e,pageContext:t},token:a.token}))?.turn??null:null}async upload(e){if(!await this.ensureThread())return null;let t=this.handle;return t?this.fileRequest("POST",`/v1/conversations/${encodeURIComponent(t.conversationId)}/attachments?name=${encodeURIComponent(e.name)}`,t.token,async n=>JSON.parse(await n.text()),e):null}async file(e){let t=this.handle;return t?this.fileRequest("GET",e,t.token,n=>n.blob()):null}async load(){let e=this.handle;return e?this.request("GET",`/v1/conversations/${encodeURIComponent(e.conversationId)}`,{token:e.token}):null}readHandle(){let e=this.storage?.get(A);if(!e)return null;try{let t=JSON.parse(e);if(typeof t.conversationId=="string"&&typeof t.token=="string")return {conversationId:t.conversationId,token:t.token}}catch{}return this.storage?.remove(A),null}async fileRequest(e,t,n,a,o){let i={authorization:`Bearer ${this.options.apiKey}`,[U]:n};o&&(i["content-type"]=o.type||"application/octet-stream");try{let s=await this.fileFetchImpl(`${this.host}${t}`,{body:o,headers:i,method:e});if(s.ok)return await a(s);this.options.onError?.(new Error(`prodantix chat ${t}: ${s.status}`));}catch(s){this.options.onError?.(s);}return null}async request(e,t,n={}){let a=this.fetchImpl;if(!a)return this.options.onError?.(new Error("no fetch available for prodantix chat")),null;let o={authorization:`Bearer ${this.options.apiKey}`,"content-type":"application/json"};n.token&&(o[U]=n.token);try{let i=await a(`${this.host}${t}`,{body:n.body===void 0?void 0:JSON.stringify(n.body),headers:o,method:e}),s=await i.text();return i.ok?s?JSON.parse(s):{}:(this.options.onError?.(new Error(`prodantix chat ${t}: ${i.status}`)),null)}catch(i){return this.options.onError?.(i),null}}};var Y={Fri:"fri",Mon:"mon",Sat:"sat",Sun:"sun",Thu:"thu",Tue:"tue",Wed:"wed"};function L(r,e){let t=new Intl.DateTimeFormat(void 0,{hour:"2-digit",hour12:false,minute:"2-digit",timeZone:r.timezone,weekday:"short"}).formatToParts(e),n=Y[t.find(s=>s.type==="weekday")?.value??""];if(!n)return false;let a=t.find(s=>s.type==="hour")?.value??"",o=t.find(s=>s.type==="minute")?.value??"",i=`${a}:${o}`;return r.windows.some(s=>s.days.includes(n)&&s.open<=i&&i<s.close)}var g={bubbleFill:"filled",bubbleShape:"tailed",composerShape:"round",dayDividers:true,launcherContent:"glyph",launcherFill:"outlined",launcherShape:"circle",launcherSize:"small",nameAvatar:true,namePlacement:"hidden",skin:"standard",stampContent:"time",stampPlacement:"none"},W=["quiet","standard"],J=["round","square"],X=["rounded","tailed"],Z=["filled","outlined"],V=["circle","pill","squircle"],Q=["filled","outlined"],ee=["avatar","glyph","team_faces"],te=["large","medium","small"],ne=["above","hidden","inline"],ae=["beside_name","none","under_turn"],re=["time","time_and_latency"],x=(r,e,t)=>typeof r=="string"&&e.includes(r)?r:t,B=(r,e)=>typeof r=="boolean"?r:e,ie={avatar_circle:["circle","outlined","avatar","large"],circle_filled:["circle","filled","glyph","medium"],circle_outlined:["circle","outlined","glyph","small"],pill_labelled:["pill","filled","glyph","medium"],pill_team:["pill","outlined","team_faces","medium"],squircle_filled:["squircle","filled","glyph","medium"]},oe={above:["above",false],avatar_only:["hidden",true],gutter:["above",true],hidden:["hidden",false],inline:["inline",false]},se={cluster:[true,"none","time"],latency:[false,"beside_name","time_and_latency"],none:[false,"none","time"],trailing:[false,"under_turn","time"],with_name:[false,"beside_name","time"]},le={concierge:["standard","round"],console:["standard","square"],quiet:["quiet","square"]},ce={hairline:["rounded","outlined"],outlined:["rounded","outlined"],rounded:["rounded","filled"],tailed:["tailed","filled"]};function E(r){let e=typeof r=="object"&&r!==null?r:{},t=typeof e.launcherStyle=="string"?e.launcherStyle:void 0,n=t===void 0?void 0:ie[t],a=typeof e.namePlacement=="string"?e.namePlacement:void 0,o=a===void 0?void 0:oe[a],i=typeof e.timestampStyle=="string"?e.timestampStyle:void 0,s=i===void 0?void 0:se[i],d=typeof e.skin=="string"?e.skin:void 0,h=d===void 0?void 0:le[d],p=typeof e.bubbleStyle=="string"?e.bubbleStyle:void 0,l=p===void 0?void 0:ce[p],m={bubbleFill:x(e.bubbleFill,Z,l?.[1]??g.bubbleFill),bubbleShape:x(e.bubbleShape,X,l?.[0]??g.bubbleShape),composerShape:x(e.composerShape,J,h?.[1]??g.composerShape),dayDividers:B(e.dayDividers,s?.[0]??g.dayDividers),launcherContent:x(e.launcherContent,ee,n?.[2]??g.launcherContent),launcherFill:x(e.launcherFill,Q,n?.[1]??g.launcherFill),launcherShape:x(e.launcherShape,V,n?.[0]??g.launcherShape),launcherSize:x(e.launcherSize,te,n?.[3]??g.launcherSize),nameAvatar:B(e.nameAvatar,o?.[1]??g.nameAvatar),namePlacement:x(e.namePlacement,ne,o?.[0]??g.namePlacement),skin:x(e.skin,W,h?.[0]??g.skin),stampContent:x(e.stampContent,re,s?.[2]??g.stampContent),stampPlacement:x(e.stampPlacement,ae,s?.[1]??g.stampPlacement)};return m.stampPlacement==="beside_name"&&m.namePlacement==="hidden"&&(m.stampPlacement="under_turn"),m}function O(r){let e=r.split(/\s+/).filter(n=>n.length>0);return (e.length>1?`${e[0]?.slice(0,1)}${e[1]?.slice(0,1)}`:e[0]?.slice(0,2)??"").toUpperCase()}var de="M20 11.6a7.4 7.4 0 0 1-7.4 7.4H8.2L4 21.8l1-4.1A7.4 7.4 0 1 1 20 11.6Z",pe={large:66,medium:56,small:46},he={circle:"width:var(--fab-size);height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);",pill:"width:auto;height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);padding:0 22px;gap:10px;",squircle:"width:var(--fab-size);height:var(--fab-size);border-radius:16px;"},ue={filled:"background:var(--a);color:#fff;",outlined:"background:var(--paper);border:1px solid var(--hairline);color:var(--ink-2);box-shadow:0 1px 2px rgba(0,0,0,.08);"},me={avatar:"",glyph:".launcher svg{width:calc(var(--fab-size) * 0.375);height:calc(var(--fab-size) * 0.375);}",team_faces:".launcher .faces{display:flex;}.launcher .faces .av{box-shadow:0 0 0 2px var(--paper);}.launcher .faces .av+.av{margin-left:-10px;}"},ge=".launcher .live{width:10px;height:10px;position:absolute;right:3px;bottom:3px;border-radius:50%;background:var(--online);box-shadow:0 0 0 2px var(--paper);}.launcher.closed .live{display:none}",fe={circle:"",pill:".badge{position:static;box-shadow:none}",squircle:""},be={filled:"",outlined:".badge{background:var(--a);top:-7px;right:-7px;min-width:19px;height:19px;font-size:11.5px}"},xe={circle:"",pill:".launcher .label{font-size:14px;font-weight:600;white-space:nowrap;}",squircle:""},ye={circle:"",pill:"@media (max-width:480px){.launcher{width:var(--fab-size);padding:0}.launcher .label{display:none}}",squircle:""};function D(r,e,t,n){return `.launcher{--fab-size:${pe[n]}px;${he[r]}${ue[e]}}${me[t]}${ge}${fe[r]}${be[e]}${xe[r]}${ye[r]}`}function q(r,e,t,n=a=>a){let a=document.createDocumentFragment();if(r==="glyph"||t.length===0){let o=document.createElement("span");return o.innerHTML=`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="${de}"/></svg>`,a.append(...o.childNodes,P()),a}return r==="avatar"?(a.append(K(t[0],e,n),P()),a):(a.append(_(t,e,n),P()),a)}function _(r,e,t=n=>n){let n=document.createElement("span");n.className="faces";for(let a of r.slice(0,2))n.append(K(a,e,t));return n}function K(r,e,t){let n=document.createElement("span");if(n.className="av",n.setAttribute("aria-hidden","true"),r&&(n.style.background=r.tone),r?.avatarUrl){let a=document.createElement("img");return a.alt="",a.src=t(r.avatarUrl),n.append(a),n}return n.textContent=r?r.initials:e.agentLabel.slice(0,2).toUpperCase(),n}function P(){let r=document.createElement("span");return r.className="live",r.setAttribute("aria-hidden","true"),r}var ve={agentLabel:"Agent",aiLabel:"AI",attachLabel:"Attach a file",awayBody:"We are away right now, but we will reply as soon as we are back.",closeLabel:"Close chat",emptyBody:"We usually reply within a few minutes.",emptyTitle:"Ask us anything.",fileRefusal:(r,e)=>`That file is ${r}. Send a PNG, JPEG, WebP, GIF or PDF up to ${e}.`,inputPlaceholder:"Type a message",launcherLabel:"Chat with us",removeFileLabel:"Remove file",replyTime:"Usually replying in a few minutes",retryLabel:"Not delivered. Retry",sendLabel:"Send",timeLabel:r=>{let e=new Date(r);return Number.isNaN(e.getTime())?"":`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},title:"Support",unreadLabel:r=>`${r} unread`},k={accentColor:"#5b5bff",availability:{timezone:"UTC",windows:[]},awayMessage:"",greeting:"",launcherOffsetX:20,launcherOffsetY:20,launcherPosition:"bottom_right",starterPrompts:[],team:[],...g},Se={quiet:".composer{position:relative;padding:8px 10px 10px}.composer input{padding-right:36px}.composer button{position:absolute;top:50%;right:14px;width:28px;min-width:28px;height:28px;padding:0;background:transparent;color:var(--ink);border-radius:7px;transform:translateY(-50%)}.composer button .sendglyph{display:block;width:16px;height:16px}.composer button .sendtext{display:none}.panel{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.12)}.header{background:var(--paper);color:var(--ink);height:44px;padding:0 8px 0 16px;border-bottom:1px solid var(--hairline)}.header h2{font-size:11px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3)}.header .faces,.header .status{display:none}.header .close{top:6px}.close{color:var(--ink-2)}",standard:".panel{border-radius:16px;box-shadow:0 16px 40px rgba(0,0,0,.2)}.header{background:var(--a);color:#fff;flex-direction:column;align-items:flex-start;gap:14px;padding:18px 14px 20px 20px}.header h2{font-size:19px;font-weight:640}"},ke={round:".composer{padding:10px 10px 12px;gap:6px}.composer input{height:36px;border-radius:18px;padding:0 14px}.composer button{width:36px;min-width:36px;height:36px;padding:0;border-radius:18px}.composer button .sendglyph{display:block}.composer button .sendtext{display:none}",square:".composer input{height:36px;border-radius:8px;padding:0 12px}"},Ce={rounded:".turn{border-radius:18px;padding:10px 15px}",tailed:".turn.agent,.turn.ai{border-radius:12px 12px 12px 4px}.turn.end_user{border-radius:12px 12px 4px 12px}"},Ee={filled:"",outlined:".turn{background:none;border:1px solid var(--hairline)}.turn.end_user{background:none;border-color:var(--a);color:var(--ink)}"},we={above:"",hidden:".turn.agent .author,.turn.ai .author:not(.ai){display:none}",inline:".body .author.below{display:block;margin:4px 0 0;font-size:11.5px;font-weight:500;color:var(--ink-2);text-transform:none;letter-spacing:0;opacity:1}"},Le=".turn.agent,.turn.ai{display:flex;gap:10px;max-width:100%;background:none;padding:0}.turn.agent .body,.turn.ai .body{background:var(--fill);padding:9px 13px;border-radius:inherit}.author{text-transform:none;letter-spacing:0;font-size:12.5px;font-weight:600;opacity:1}",Te='.divider{display:flex;align-items:center;gap:10px;margin:0;font-size:11px;opacity:.6}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--hairline)}',Ae={beside_name:".stamp{font-size:11px;opacity:.7;margin-left:6px}",none:"",under_turn:".stamp{display:block;font-size:11px;opacity:.7;margin-top:4px}.turn.end_user .stamp{text-align:right}"},Pe=".lat{font-size:11px;opacity:.7;margin-left:6px}",_e=".att{display:block;width:180px;margin-bottom:6px;border-radius:8px;overflow:hidden}.att img{display:block;width:100%}.pdfc{display:inline-flex;gap:8px;align-items:center;margin-bottom:6px;padding:6px 8px;border-radius:8px;background:color-mix(in srgb,currentColor 16%,transparent);color:inherit;font-size:12.5px;text-decoration:none;overflow-wrap:anywhere}.pdfc b,.file b{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:4px;font-size:9px;letter-spacing:.04em;background:color-mix(in srgb,currentColor 22%,transparent)}.att:last-child,.pdfc:last-child{margin-bottom:0}";function Ne(r){let e=r==="round"?14:12;return `.field{position:relative;flex:1;min-width:0;display:flex}.composer .field input{padding-left:${e+26}px}.composer button.clip{position:absolute;top:50%;left:${e-5}px;right:auto;width:28px;min-width:28px;height:28px;padding:0;border-radius:7px;background:none;color:var(--ink-2);transform:translateY(-50%)}.composer button.clip:hover{background:color-mix(in srgb,currentColor 14%,transparent)}.clip svg{display:block;width:18px;height:18px}.file{display:inline-flex;gap:8px;align-items:center;align-self:flex-start;max-width:calc(100% - 20px);margin:0 10px 8px;padding:6px 10px 6px 6px;font-size:12.5px;color:var(--ink);border:1px solid var(--hairline);border-radius:8px}.file .th{flex:none;width:28px;height:28px;border-radius:4px;object-fit:cover}.file .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file .sz,.file .x{flex:none;color:var(--ink-3)}.file .x{margin-left:4px;padding:0;border:0;background:none;font:inherit;font-size:16px;line-height:1;cursor:pointer}.ferr{margin:0 10px 6px;font-size:12px;color:oklch(60% 0.2 27)}`}function N(r){return r<999500?`${Math.max(1,Math.round(r/1e3))} KB`:`${(r/1e6).toFixed(1)} MB`}var j=`--paper: oklch(24.6% 0.015 257); --ink: #fff; --ink-3: rgba(255,255,255,.55);
1
+ import {c,a as a$2,b}from'./chunk-V77KYPOF.js';import {a as a$1,d}from'./chunk-VG77TYVX.js';import {a}from'./chunk-5XGN7UAV.js';var U="X-Prodantix-Conversation-Token",A="prodantix.chat.handle";function G(){let a=globalThis.localStorage;if(a)return {get:e=>a.getItem(e),remove:e=>a.removeItem(e),set:(e,t)=>a.setItem(e,t)}}var C=class{constructor(e){this.options=e;a(this,"fetchImpl");a(this,"fileFetchImpl");a(this,"host");a(this,"storage");a(this,"handle");a(this,"identity",null);this.fetchImpl=a$1(e.fetchImpl),this.fileFetchImpl=e.fileFetchImpl??((t,n)=>fetch(t,n)),this.host=d(e.host),this.storage=e.storage??G(),this.handle=this.readHandle();}get hasThread(){return this.handle!==null}avatarUrl(e){return e.startsWith("/")?`${this.host}${e}?api_key=${encodeURIComponent(this.options.apiKey)}`:e}get socketAuth(){return this.handle?{conversationId:this.handle.conversationId,conversationToken:this.handle.token,projectKey:this.options.apiKey}:null}identify(e){this.identity=e;}async ensureThread(e){if(this.handle)return true;let t=await this.request("POST","/v1/conversations",{body:{distinctId:this.options.distinctId,subject:e,userHash:this.identity?.userHash,userId:this.identity?.userId}});return !t?.conversationId||!t.token?false:(this.handle={conversationId:t.conversationId,token:t.token},this.storage?.set(A,JSON.stringify(this.handle)),true)}async send(e,t,n){if(!await this.ensureThread())return null;let r=this.handle;return r?(await this.request("POST",`/v1/conversations/${encodeURIComponent(r.conversationId)}/turns`,{body:{attachmentIds:n,body:e,pageContext:t},token:r.token}))?.turn??null:null}async upload(e){if(!await this.ensureThread())return null;let t=this.handle;return t?this.fileRequest("POST",`/v1/conversations/${encodeURIComponent(t.conversationId)}/attachments?name=${encodeURIComponent(e.name)}`,t.token,async n=>JSON.parse(await n.text()),e):null}async file(e){let t=this.handle;return t?this.fileRequest("GET",e,t.token,n=>n.blob()):null}async load(){let e=this.handle;return e?this.request("GET",`/v1/conversations/${encodeURIComponent(e.conversationId)}`,{token:e.token}):null}readHandle(){let e=this.storage?.get(A);if(!e)return null;try{let t=JSON.parse(e);if(typeof t.conversationId=="string"&&typeof t.token=="string")return {conversationId:t.conversationId,token:t.token}}catch{}return this.storage?.remove(A),null}async fileRequest(e,t,n,r,o){let i={authorization:`Bearer ${this.options.apiKey}`,[U]:n};o&&(i["content-type"]=o.type||"application/octet-stream");try{let s=await this.fileFetchImpl(`${this.host}${t}`,{body:o,headers:i,method:e});if(s.ok)return await r(s);this.options.onError?.(new Error(`prodantix chat ${t}: ${s.status}`));}catch(s){this.options.onError?.(s);}return null}async request(e,t,n={}){let r=this.fetchImpl;if(!r)return this.options.onError?.(new Error("no fetch available for prodantix chat")),null;let o={authorization:`Bearer ${this.options.apiKey}`,"content-type":"application/json"};n.token&&(o[U]=n.token);try{let i=await r(`${this.host}${t}`,{body:n.body===void 0?void 0:JSON.stringify(n.body),headers:o,method:e}),s=await i.text();return i.ok?s?JSON.parse(s):{}:(this.options.onError?.(new Error(`prodantix chat ${t}: ${i.status}`)),null)}catch(i){return this.options.onError?.(i),null}}};var Y={Fri:"fri",Mon:"mon",Sat:"sat",Sun:"sun",Thu:"thu",Tue:"tue",Wed:"wed"};function L(a,e){let t=new Intl.DateTimeFormat(void 0,{hour:"2-digit",hour12:false,minute:"2-digit",timeZone:a.timezone,weekday:"short"}).formatToParts(e),n=Y[t.find(s=>s.type==="weekday")?.value??""];if(!n)return false;let r=t.find(s=>s.type==="hour")?.value??"",o=t.find(s=>s.type==="minute")?.value??"",i=`${r}:${o}`;return a.windows.some(s=>s.days.includes(n)&&s.open<=i&&i<s.close)}var g={bubbleFill:"filled",bubbleShape:"tailed",composerShape:"round",dayDividers:true,launcherContent:"glyph",launcherFill:"outlined",launcherShape:"circle",launcherSize:"small",nameAvatar:true,namePlacement:"hidden",skin:"standard",stampContent:"time",stampPlacement:"none"},W=["quiet","standard"],J=["round","square"],X=["rounded","tailed"],Z=["filled","outlined"],V=["circle","pill","squircle"],Q=["filled","outlined"],ee=["avatar","glyph","team_faces"],te=["large","medium","small"],ne=["above","hidden","inline"],re=["beside_name","none","under_turn"],ae=["time","time_and_latency"],x=(a,e,t)=>typeof a=="string"&&e.includes(a)?a:t,B=(a,e)=>typeof a=="boolean"?a:e,ie={avatar_circle:["circle","outlined","avatar","large"],circle_filled:["circle","filled","glyph","medium"],circle_outlined:["circle","outlined","glyph","small"],pill_labelled:["pill","filled","glyph","medium"],pill_team:["pill","outlined","team_faces","medium"],squircle_filled:["squircle","filled","glyph","medium"]},oe={above:["above",false],avatar_only:["hidden",true],gutter:["above",true],hidden:["hidden",false],inline:["inline",false]},se={cluster:[true,"none","time"],latency:[false,"beside_name","time_and_latency"],none:[false,"none","time"],trailing:[false,"under_turn","time"],with_name:[false,"beside_name","time"]},le={concierge:["standard","round"],console:["standard","square"],quiet:["quiet","square"]},ce={hairline:["rounded","outlined"],outlined:["rounded","outlined"],rounded:["rounded","filled"],tailed:["tailed","filled"]};function w(a){let e=typeof a=="object"&&a!==null?a:{},t=typeof e.launcherStyle=="string"?e.launcherStyle:void 0,n=t===void 0?void 0:ie[t],r=typeof e.namePlacement=="string"?e.namePlacement:void 0,o=r===void 0?void 0:oe[r],i=typeof e.timestampStyle=="string"?e.timestampStyle:void 0,s=i===void 0?void 0:se[i],d=typeof e.skin=="string"?e.skin:void 0,u=d===void 0?void 0:le[d],c=typeof e.bubbleStyle=="string"?e.bubbleStyle:void 0,l=c===void 0?void 0:ce[c],h={bubbleFill:x(e.bubbleFill,Z,l?.[1]??g.bubbleFill),bubbleShape:x(e.bubbleShape,X,l?.[0]??g.bubbleShape),composerShape:x(e.composerShape,J,u?.[1]??g.composerShape),dayDividers:B(e.dayDividers,s?.[0]??g.dayDividers),launcherContent:x(e.launcherContent,ee,n?.[2]??g.launcherContent),launcherFill:x(e.launcherFill,Q,n?.[1]??g.launcherFill),launcherShape:x(e.launcherShape,V,n?.[0]??g.launcherShape),launcherSize:x(e.launcherSize,te,n?.[3]??g.launcherSize),nameAvatar:B(e.nameAvatar,o?.[1]??g.nameAvatar),namePlacement:x(e.namePlacement,ne,o?.[0]??g.namePlacement),skin:x(e.skin,W,u?.[0]??g.skin),stampContent:x(e.stampContent,ae,s?.[2]??g.stampContent),stampPlacement:x(e.stampPlacement,re,s?.[1]??g.stampPlacement)};return h.stampPlacement==="beside_name"&&h.namePlacement==="hidden"&&(h.stampPlacement="under_turn"),h}function O(a){let e=a.split(/\s+/).filter(n=>n.length>0);return (e.length>1?`${e[0]?.slice(0,1)}${e[1]?.slice(0,1)}`:e[0]?.slice(0,2)??"").toUpperCase()}var de="M20 11.6a7.4 7.4 0 0 1-7.4 7.4H8.2L4 21.8l1-4.1A7.4 7.4 0 1 1 20 11.6Z",pe={large:66,medium:56,small:46},ue={circle:"width:var(--fab-size);height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);",pill:"width:auto;height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);padding:0 22px;gap:10px;",squircle:"width:var(--fab-size);height:var(--fab-size);border-radius:16px;"},he={filled:"background:var(--a);color:#fff;",outlined:"background:var(--paper);border:1px solid var(--hairline);color:var(--ink-2);box-shadow:0 1px 2px rgba(0,0,0,.08);"},me={avatar:"",glyph:".launcher svg{width:calc(var(--fab-size) * 0.375);height:calc(var(--fab-size) * 0.375);}",team_faces:".launcher .faces{display:flex;}.launcher .faces .av{box-shadow:0 0 0 2px var(--paper);}.launcher .faces .av+.av{margin-left:-10px;}"},ge=".launcher .live{width:10px;height:10px;position:absolute;right:3px;bottom:3px;border-radius:50%;background:var(--online);box-shadow:0 0 0 2px var(--paper);}.launcher.closed .live{display:none}",fe={circle:"",pill:".badge{position:static;box-shadow:none}",squircle:""},be={filled:"",outlined:".badge{background:var(--a);top:-7px;right:-7px;min-width:19px;height:19px;font-size:11.5px}"},xe={circle:"",pill:".launcher .label{font-size:14px;font-weight:600;white-space:nowrap;}",squircle:""},ye={circle:"",pill:"@media (max-width:480px){.launcher{width:var(--fab-size);padding:0}.launcher .label{display:none}}",squircle:""};function D(a,e,t,n){return `.launcher{--fab-size:${pe[n]}px;${ue[a]}${he[e]}}${me[t]}${ge}${fe[a]}${be[e]}${xe[a]}${ye[a]}`}function q(a,e,t,n=r=>r){let r=document.createDocumentFragment();if(a==="glyph"||t.length===0){let o=document.createElement("span");return o.innerHTML=`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="${de}"/></svg>`,r.append(...o.childNodes,P()),r}return a==="avatar"?(r.append(K(t[0],e,n),P()),r):(r.append(_(t,e,n),P()),r)}function _(a,e,t=n=>n){let n=document.createElement("span");n.className="faces";for(let r of a.slice(0,2))n.append(K(r,e,t));return n}function K(a,e,t){let n=document.createElement("span");if(n.className="av",n.setAttribute("aria-hidden","true"),a&&(n.style.background=a.tone),a?.avatarUrl){let r=document.createElement("img");return r.alt="",r.src=t(a.avatarUrl),n.append(r),n}return n.textContent=a?a.initials:e.agentLabel.slice(0,2).toUpperCase(),n}function P(){let a=document.createElement("span");return a.className="live",a.setAttribute("aria-hidden","true"),a}var ve={agentLabel:"Agent",aiLabel:"AI",attachLabel:"Attach a file",awayBody:"We are away right now, but we will reply as soon as we are back.",closeLabel:"Close chat",emptyBody:"We usually reply within a few minutes.",emptyTitle:"Ask us anything.",fileRefusal:(a,e)=>`That file is ${a}. Send a PNG, JPEG, WebP, GIF or PDF up to ${e}.`,inputPlaceholder:"Type a message",launcherLabel:"Chat with us",removeFileLabel:"Remove file",replyTime:"Usually replying in a few minutes",retryLabel:"Not delivered. Retry",sendLabel:"Send",timeLabel:a=>{let e=new Date(a);return Number.isNaN(e.getTime())?"":`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},title:"Support",unreadLabel:a=>`${a} unread`},k={accentColor:"#5b5bff",availability:{timezone:"UTC",windows:[]},awayMessage:"",greeting:"",launcherOffsetX:20,launcherOffsetY:20,launcherPosition:"bottom_right",starterPrompts:[],team:[],...g},Se={quiet:".composer{position:relative;padding:8px 10px 10px}.composer input{padding-right:36px}.composer button{position:absolute;top:50%;right:14px;width:28px;min-width:28px;height:28px;padding:0;background:transparent;color:var(--ink);border-radius:7px;transform:translateY(-50%)}.composer button .sendglyph{display:block;width:16px;height:16px}.composer button .sendtext{display:none}.panel{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.12)}.header{background:var(--paper);color:var(--ink);height:44px;padding:0 8px 0 16px;border-bottom:1px solid var(--hairline)}.header h2{font-size:11px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3)}.header .faces,.header .status{display:none}.header .close{top:6px}.close{color:var(--ink-2)}",standard:".panel{border-radius:16px;box-shadow:0 16px 40px rgba(0,0,0,.2)}.header{background:var(--a);color:#fff;flex-direction:column;align-items:flex-start;gap:14px;padding:18px 14px 20px 20px}.header h2{font-size:19px;font-weight:640}"},ke={round:".composer{padding:10px 10px 12px;gap:6px}.composer input{height:36px;border-radius:18px;padding:0 14px}.composer button{width:36px;min-width:36px;height:36px;padding:0;border-radius:18px}.composer button .sendglyph{display:block}.composer button .sendtext{display:none}",square:".composer input{height:36px;border-radius:8px;padding:0 12px}"},Ce={rounded:".turn{border-radius:18px;padding:10px 15px}",tailed:".turn.agent,.turn.ai{border-radius:12px 12px 12px 4px}.turn.end_user{border-radius:12px 12px 4px 12px}"},we={filled:"",outlined:".turn{background:none;border:1px solid var(--hairline)}.turn.end_user{background:none;border-color:var(--a);color:var(--ink)}"},Ee={above:"",hidden:".turn.agent .author,.turn.ai .author:not(.ai){display:none}",inline:".body .author.below{display:block;margin:4px 0 0;font-size:11.5px;font-weight:500;color:var(--ink-2);text-transform:none;letter-spacing:0;opacity:1}"},Le=".turn.agent,.turn.ai{display:flex;gap:10px;max-width:100%;background:none;padding:0}.turn.agent .body,.turn.ai .body{background:var(--fill);padding:9px 13px;border-radius:inherit}.author{text-transform:none;letter-spacing:0;font-size:12.5px;font-weight:600;opacity:1}",Te='.divider{display:flex;align-items:center;gap:10px;margin:0;font-size:11px;opacity:.6}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--hairline)}',Ae={beside_name:".stamp{font-size:11px;opacity:.7;margin-left:6px}",none:"",under_turn:".stamp{display:block;font-size:11px;opacity:.7;margin-top:4px}.turn.end_user .stamp{text-align:right}"},Pe=".lat{font-size:11px;opacity:.7;margin-left:6px}",_e=".att{display:block;width:180px;margin-bottom:6px;border-radius:8px;overflow:hidden}.att img{display:block;width:100%}.pdfc{display:inline-flex;gap:8px;align-items:center;margin-bottom:6px;padding:6px 8px;border-radius:8px;background:color-mix(in srgb,currentColor 16%,transparent);color:inherit;font-size:12.5px;text-decoration:none;overflow-wrap:anywhere}.pdfc b,.file b{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:4px;font-size:9px;letter-spacing:.04em;background:color-mix(in srgb,currentColor 22%,transparent)}.att:last-child,.pdfc:last-child{margin-bottom:0}";function Ne(a){let e=a==="round"?14:12;return `.field{position:relative;flex:1;min-width:0;display:flex}.composer .field input{padding-left:${e+26}px}.composer button.clip{position:absolute;top:50%;left:${e-5}px;right:auto;width:28px;min-width:28px;height:28px;padding:0;border-radius:7px;background:none;color:var(--ink-2);transform:translateY(-50%)}.composer button.clip:hover{background:color-mix(in srgb,currentColor 14%,transparent)}.clip svg{display:block;width:18px;height:18px}.file{display:inline-flex;gap:8px;align-items:center;align-self:flex-start;max-width:calc(100% - 20px);margin:0 10px 8px;padding:6px 10px 6px 6px;font-size:12.5px;color:var(--ink);border:1px solid var(--hairline);border-radius:8px}.file .th{flex:none;width:28px;height:28px;border-radius:4px;object-fit:cover}.file .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file .sz,.file .x{flex:none;color:var(--ink-3)}.file .x{margin-left:4px;padding:0;border:0;background:none;font:inherit;font-size:16px;line-height:1;cursor:pointer}.ferr{margin:0 10px 6px;font-size:12px;color:oklch(60% 0.2 27)}`}function N(a){return a<999500?`${Math.max(1,Math.round(a/1e3))} KB`:`${(a/1e6).toFixed(1)} MB`}var j=`--paper: oklch(24.6% 0.015 257); --ink: #fff; --ink-3: rgba(255,255,255,.55);
2
2
  --fill: rgba(255,255,255,.06); --hairline: rgba(255,255,255,.13); --ink-2: rgba(255,255,255,.70);
3
- --online: oklch(72% 0.13 163.23);`;function Fe(r){return r==="light"?"":r==="dark"?`:host { ${j} }`:`@media (prefers-color-scheme: dark) {
3
+ --online: oklch(72% 0.13 163.23);`;function Fe(a){return a==="light"?"":a==="dark"?`:host { ${j} }`:`@media (prefers-color-scheme: dark) {
4
4
  :host {
5
5
  ${j}
6
6
  }
7
- }`}var He=/https?:\/\/[^\s<>"]+/g,Ie=/[.,;:!?)]$/,Re=r=>{let e=r;for(;Ie.test(e);){let t=e.split("(").length-1,n=e.split(")").length-1;if(e.endsWith(")")&&t>=n)break;e=e.slice(0,-1);}return e};function $e(r,e){let t=0;for(let n of e.matchAll(He)){let a=n.index??0,o=Re(n[0]);a>t&&r.append(e.slice(t,a));let i=document.createElement("a");i.href=o,i.target="_blank",i.rel="noopener noreferrer",i.textContent=o,r.append(i),t=a+o.length;}t<e.length&&r.append(e.slice(t));}function F(r,e="system"){let t=E(r),n=r.launcherPosition==="bottom_left"?"left":"right",a=r.accentColor;return `${`
7
+ }`}var He=/https?:\/\/[^\s<>"]+/g,Re=/[.,;:!?)]$/,Ie=a=>{let e=a;for(;Re.test(e);){let t=e.split("(").length-1,n=e.split(")").length-1;if(e.endsWith(")")&&t>=n)break;e=e.slice(0,-1);}return e};function $e(a,e){let t=0;for(let n of e.matchAll(He)){let r=n.index??0,o=Ie(n[0]);r>t&&a.append(e.slice(t,r));let i=document.createElement("a");i.href=o,i.target="_blank",i.rel="noopener noreferrer",i.textContent=o,a.append(i),t=r+o.length;}t<e.length&&a.append(e.slice(t));}var Me=["P","BR","STRONG","EM","A","UL","OL","LI"],ze=a=>typeof a=="object"&&a!==null&&"html"in a&&typeof a.html=="string"&&"text"in a&&typeof a.text=="string",Ue=(a,e)=>e.name==="class"||e.name==="data-block-type"?true:a!=="A"?false:e.name==="target"||e.name==="rel"?true:e.name==="href"&&/^https?:\/\//i.test(e.value.trim()),Be=a=>[...a.querySelectorAll("*")].every(e=>Me.includes(e.tagName)&&[...e.attributes].every(t=>Ue(e.tagName,t)));function F(a,e="system"){let t=w(a),n=a.launcherPosition==="bottom_left"?"left":"right",r=a.accentColor;return `${`
8
8
  :host {
9
- all: initial; z-index: 2147483000; --a: ${a};
9
+ all: initial; z-index: 2147483000; --a: ${r};
10
10
  --paper: #fff; --ink: #0f172a; --ink-3: rgba(0,0,0,.55);
11
11
  --fill: #f1f5f9; --hairline: #e2e8f0; --ink-2: rgba(0,0,0,.72);
12
12
  --online: oklch(53.8% 0.1274 163.23);
@@ -15,16 +15,16 @@ import {c,a as a$2,b}from'./chunk-V77KYPOF.js';import {a as a$1,d}from'./chunk-V
15
15
  ${Fe(e)}
16
16
  * { box-sizing: border-box; font-family: system-ui, sans-serif; }
17
17
  .launcher {
18
- z-index: 2147483000; position: fixed; ${n}: ${r.launcherOffsetX}px; bottom: ${r.launcherOffsetY}px; width: 56px; height: 56px;
18
+ z-index: 2147483000; position: fixed; ${n}: ${a.launcherOffsetX}px; bottom: ${a.launcherOffsetY}px; width: 56px; height: 56px;
19
19
  border-radius: 28px; border: none; cursor: pointer;
20
20
  display: inline-flex; align-items: center; justify-content: center;
21
- background: ${a}; color: #fff; font-size: 24px;
21
+ background: ${r}; color: #fff; font-size: 24px;
22
22
  box-shadow: 0 4px 12px rgba(0,0,0,.2);
23
23
  }
24
24
  .launcher:focus-visible { outline: 3px solid #0b0e14; outline-offset: 2px; }
25
25
  .launcher { transition: background-color 120ms ease; }
26
- .launcher:hover { background: color-mix(in srgb, #000 12%, ${a}); }
27
- .launcher:active { background: color-mix(in srgb, #000 20%, ${a}); }
26
+ .launcher:hover { background: color-mix(in srgb, #000 12%, ${r}); }
27
+ .launcher:active { background: color-mix(in srgb, #000 20%, ${r}); }
28
28
  @media (prefers-reduced-motion: reduce) {
29
29
  .launcher { transition: none; }
30
30
  }
@@ -35,7 +35,7 @@ ${Fe(e)}
35
35
  }
36
36
  .badge[hidden] { display: none; }
37
37
  .panel {
38
- z-index: 2147483001; position: fixed; ${n}: ${r.launcherOffsetX}px; bottom: ${r.launcherOffsetY+68}px; width: 360px; max-width: calc(100vw - 40px);
38
+ z-index: 2147483001; position: fixed; ${n}: ${a.launcherOffsetX}px; bottom: ${a.launcherOffsetY+68}px; width: 360px; max-width: calc(100vw - 40px);
39
39
  height: 520px; max-height: calc(100vh - 120px); background: var(--paper); color: var(--ink);
40
40
  border-radius: 12px; box-shadow: 0 8px 32px rgba(0,0,0,.24);
41
41
  display: flex; flex-direction: column; overflow: hidden;
@@ -62,32 +62,39 @@ ${Fe(e)}
62
62
  .close:focus-visible { outline: 2px solid currentColor; outline-offset: 1px; }
63
63
  .log { flex: 1; overflow-y: auto; padding: 12px; display: flex; flex-direction: column; gap: 8px; }
64
64
  .turn { max-width: 80%; padding: 8px 12px; border-radius: 12px; font-size: 14px; }
65
- .turn.end_user { align-self: flex-end; background: ${a}; color: #fff; }
65
+ .turn.end_user { align-self: flex-end; background: ${r}; color: #fff; }
66
66
  .turn.agent, .turn.ai { align-self: flex-start; background: var(--fill); color: var(--ink); }
67
- .turn.ai a { color: ${a}; text-decoration: underline; overflow-wrap: anywhere; }
67
+ .turn.ai a { color: ${r}; text-decoration: underline; overflow-wrap: anywhere; }
68
68
  .author { font-size: 11px; opacity: .7; margin-bottom: 2px; }
69
69
  .turn[data-pending] { opacity: .6; }
70
70
  .turn[data-failed] { opacity: 1; box-shadow: inset 0 0 0 1px #dc2626; }
71
71
  .retry { display: block; margin: 5px 0 0; padding: 0; background: none; border: 0; color: inherit; font: inherit; font-size: 11.5px; text-decoration: underline; cursor: pointer; opacity: .85; }
72
- .away { display: flex; gap: 10px; align-items: flex-start; margin: 12px 12px 0; padding: 10px 14px; font-size: 13px; line-height: 1.43; color: ${a}; background: color-mix(in srgb, ${a} 12%, transparent); border-radius: 4px; }
72
+ .away { display: flex; gap: 10px; align-items: flex-start; margin: 12px 12px 0; padding: 10px 14px; font-size: 13px; line-height: 1.43; color: ${r}; background: color-mix(in srgb, ${r} 12%, transparent); border-radius: 4px; }
73
73
  .awayglyph { flex: none; width: 16px; height: 16px; margin-top: 1px; border: 1.5px solid currentColor; border-radius: 50%; }
74
74
  .empty { display: flex; flex-direction: column; gap: 8px; padding: 20px 16px; }
75
75
  .empty h3 { margin: 0; font-size: 18px; font-weight: 640; letter-spacing: -.015em; }
76
- .empty p { margin: 0 0 8px; font-size: 13.5px; color: var(--ink-2); }
76
+ .empty > p { margin: 0 0 8px; font-size: 13.5px; color: var(--ink-2); }
77
77
  .prompt {
78
- display: flex; align-items: center; min-height: 44px; padding: 0 14px; text-align: left;
78
+ position: relative; display: flex; align-items: center; min-height: 44px; padding: 10px 14px; text-align: left;
79
79
  font-family: inherit; font-size: 13.5px; font-weight: 500; color: var(--ink);
80
80
  background: none; border: 1px solid var(--hairline); border-radius: 8px; cursor: pointer;
81
81
  }
82
- .prompt:focus-visible { outline: 2px solid ${a}; outline-offset: 2px; }
82
+ .promptwords { min-width: 0; overflow-wrap: anywhere; }
83
+ .promptwords > :last-child { margin-bottom: 0; }
84
+ .prompt p { margin: 0 0 16px; line-height: 1.6; }
85
+ .prompt ul, .prompt ol { margin: 0 0 16px; padding-left: 32px; }
86
+ .prompt li { margin: 8px 0; line-height: 1.6; }
87
+ .prompt a { position: relative; z-index: 1; color: ${r}; text-decoration: underline; overflow-wrap: anywhere; }
88
+ .promptpress { position: absolute; inset: 0; padding: 0; background: none; border: 0; border-radius: inherit; cursor: pointer; }
89
+ .promptpress:focus-visible { outline: 2px solid ${r}; outline-offset: 2px; }
83
90
  .av { width: 30px; height: 30px; border-radius: 50%; flex: none; display: inline-flex; align-items: center; justify-content: center; font-size: 11.5px; font-weight: 650; color: #fff; background: oklch(52% 0.17 22); }
84
91
  .av.bot { border-radius: 9px; background: var(--fill); color: var(--ink); }
85
92
  .av img { width: 100%; height: 100%; display: block; object-fit: cover; border-radius: inherit; }
86
93
  .composer { display: flex; gap: 6px; padding: 10px; border-top: 1px solid var(--hairline); }
87
94
  .composer input { flex: 1; min-width: 0; height: 36px; padding: 0 12px; border: 0; border-radius: 8px; font-size: 14px; background: var(--fill); color: var(--ink); }
88
- .composer input:focus-visible { outline: 2px solid ${a}; }
89
- .composer button { display: inline-flex; align-items: center; justify-content: center; gap: 0; min-width: 56px; height: 36px; padding: 0 14px; background: ${a}; color: #fff; border: none; border-radius: 8px; cursor: pointer; font-family: inherit; font-size: 13.5px; font-weight: 550; }
90
- .composer button:hover { background: color-mix(in srgb, #000 12%, ${a}); }
95
+ .composer input:focus-visible { outline: 2px solid ${r}; }
96
+ .composer button { display: inline-flex; align-items: center; justify-content: center; gap: 0; min-width: 56px; height: 36px; padding: 0 14px; background: ${r}; color: #fff; border: none; border-radius: 8px; cursor: pointer; font-family: inherit; font-size: 13.5px; font-weight: 550; }
97
+ .composer button:hover { background: color-mix(in srgb, #000 12%, ${r}); }
91
98
  .composer button:focus-visible { outline: 2px solid var(--ink); outline-offset: 2px; }
92
99
  .composer button .sendglyph { display: none; width: 17px; height: 17px; }
93
100
  .composer button:focus-visible { outline: 2px solid #0b0e14; }
@@ -95,5 +102,5 @@ ${Fe(e)}
95
102
  .panel { animation: rise 180ms ease-out; }
96
103
  @keyframes rise { from { transform: translateY(8px); opacity: 0; } to { transform: none; opacity: 1; } }
97
104
  }
98
- `}${ke[t.composerShape]}${Se[t.skin]}${D(t.launcherShape,t.launcherFill,t.launcherContent,t.launcherSize)}${Ce[t.bubbleShape]}${Ee[t.bubbleFill]}${we[t.namePlacement]}${t.nameAvatar?Le:""}${t.dayDividers?Te:""}${Ae[t.stampPlacement]}${t.stampContent==="time_and_latency"?Pe:""}${_e}${r.attachments?.enabled?Ne(t.composerShape):""}`}var Me=["end_user","agent","ai"];function ze(){let r=globalThis.location;if(r)return {host:r.host,path:r.pathname,title:document.title}}var Ue='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m16.5 6.5-7.8 7.8a2.1 2.1 0 0 0 3 3l8.1-8.1a4.2 4.2 0 0 0-6-6L5.7 11.3a6.3 6.3 0 0 0 8.9 8.9l6.6-6.6"/></svg>',Be='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.88 9.29 12 13.17 8.12 9.29a.996.996 0 0 0-1.41 0c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0l4.59-4.59c.39-.39.39-1.02 0-1.41-.39-.38-1.03-.39-1.42 0"/></svg>',w=class{constructor(e,t,n={},a$1={},o={}){this.host=e;this.client=t;a(this,"root");a(this,"strings");a(this,"settings");a(this,"appearance");a(this,"launcher");a(this,"badge");a(this,"panel",null);a(this,"lastFocused",null);a(this,"unread",0);a(this,"pendingTurns",0);a(this,"openNow");a(this,"style");a(this,"scheme");a(this,"picked",null);a(this,"objectUrls",[]);this.strings={...ve,...n},this.appearance={...k,...a$1},this.settings=E({...k,...a$1}),this.root=e.attachShadow({mode:o.shadowMode??"closed"}),this.openNow=L(this.appearance.availability,new Date),this.scheme=o.scheme,this.style=document.createElement("style"),this.style.textContent=F(this.appearance,this.scheme),this.root.append(this.style),this.launcher=document.createElement("button"),this.launcher.className="launcher",this.launcher.type="button",this.launcher.setAttribute("aria-haspopup","dialog"),this.launcher.addEventListener("click",()=>this.toggle()),this.badge=document.createElement("span"),this.badge.className="badge",this.badge.hidden=true,this.drawLauncher(),this.root.append(this.launcher);}drawLauncher(){if(this.launcher.setAttribute("aria-label",this.strings.launcherLabel),this.launcher.replaceChildren(),this.launcher.append(q(this.settings.launcherContent,this.strings,this.appearance.team,e=>this.client.avatarUrl(e))),this.settings.launcherShape==="pill"){let e=document.createElement("span");e.className="label",e.textContent=this.settings.launcherContent==="team_faces"?this.strings.agentLabel:this.strings.launcherLabel,this.launcher.append(e);}this.launcher.append(this.badge),this.launcher.classList.toggle("closed",!this.openNow);}update(e,t){this.appearance={...k,...e},this.settings=E(this.appearance),t!==void 0&&(this.scheme=t),this.style.textContent=F(this.appearance,this.scheme),this.drawLauncher(),this.panel&&(this.close(),this.open());}toggle(){this.panel?this.close():this.open();}setOpenNow(e){this.openNow=e,this.launcher.classList.toggle("closed",!e),this.panel?.classList.toggle("closed",!e);}async open(){if(this.panel)return;this.lastFocused=this.host.ownerDocument.activeElement,this.unread=0,this.renderBadge();let e=document.createElement("section");e.className=this.openNow?"panel":"panel closed",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label",this.strings.title);let t=document.createElement("div");t.className="header";let n=this.appearance.team??[];n.length>0&&t.append(_(n,this.strings,f=>this.client.avatarUrl(f)));let a=document.createElement("div");a.className="headmain";let o=document.createElement("h2");o.textContent=this.strings.title;let i=document.createElement("p");i.className="status";let s=document.createElement("span");s.className="live",s.setAttribute("aria-hidden","true"),i.append(s,this.strings.replyTime),a.append(o,i);let d=document.createElement("button");d.className="close",d.type="button",d.setAttribute("aria-label",this.strings.closeLabel),d.innerHTML=Be,d.addEventListener("click",()=>this.close()),t.append(a,d);let h=document.createElement("div");h.className="log",h.setAttribute("role","log"),h.setAttribute("aria-live","polite"),h.setAttribute("aria-label",this.strings.title);let p=document.createElement("form");p.className="composer";let l=document.createElement("input");l.type="text",l.setAttribute("aria-label",this.strings.inputPlaceholder),l.placeholder=this.strings.inputPlaceholder;let m=document.createElement("button");m.type="submit",m.setAttribute("aria-label",this.strings.sendLabel),m.innerHTML='<svg class="sendglyph" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 12 20 4.5 15 20l-3.6-5.4L4.5 12Z"/></svg>';let y=document.createElement("span");y.className="sendtext",y.textContent=this.strings.sendLabel,m.append(y);let v=this.appearance.attachments;if(v?.enabled&&this.client.upload){let f=document.createElement("span");f.className="field";let u=document.createElement("input");u.type="file",u.accept=v.accept.join(","),u.hidden=true,u.addEventListener("change",()=>{let H=u.files?.[0];u.value="",H&&this.pick(h,p,v,H);});let b=document.createElement("button");b.type="button",b.className="clip",b.setAttribute("aria-label",this.strings.attachLabel),b.innerHTML=Ue,b.addEventListener("click",()=>u.click()),f.append(b,l,u),p.append(f,m);}else p.append(l,m);p.addEventListener("submit",f=>{f.preventDefault(),this.submit(l,h);}),e.append(t,h,p),e.addEventListener("keydown",f=>this.onKeydown(f,e,d)),this.root.append(e),this.panel=e,l.focus();let S=await this.client.load();S&&S.turns.length>0?this.renderThread(h,S):this.renderFirstRun(h,l),this.openNow||this.renderAway(t);}renderFirstRun(e,t){let n=document.createElement("div");n.className="empty";let a=document.createElement("h3");a.textContent=this.appearance.greeting.trim()||this.strings.emptyTitle;let o=document.createElement("p");o.textContent=this.strings.emptyBody,n.append(a,o);for(let i of this.appearance.starterPrompts){let s=document.createElement("button");s.className="prompt",s.type="button",s.textContent=i,s.addEventListener("click",()=>{t.value=i,this.submit(t,e);}),n.append(s);}e.replaceChildren(n);}renderAway(e){let t=document.createElement("div");t.className="away";let n=document.createElement("span");n.className="awayglyph",n.setAttribute("aria-hidden","true");let a=document.createElement("span");a.textContent=this.appearance.awayMessage.trim()||this.strings.awayBody,t.append(n,a),e.after(t);}pick(e,t,n,a){let o=a.size>n.maxBytes||!n.accept.includes(a.type);for(let l of this.root.querySelectorAll(o?".ferr":".file,.ferr"))l.remove();if(o){let l=document.createElement("p");l.className="ferr",l.setAttribute("role","alert"),l.textContent=this.strings.fileRefusal(N(a.size),`${n.maxBytes/1e6} MB`),t.before(l),e.scrollTop=e.scrollHeight;return}this.picked=a;let i=document.createElement("span");i.className="file";let s;if(a.type==="application/pdf")s=document.createElement("b"),s.textContent="PDF";else {let l=document.createElement("img");l.className="th",l.alt="",l.src=this.objectUrl(a),s=l;}let d=document.createElement("span");d.className="name",d.textContent=a.name;let h=document.createElement("span");h.className="sz",h.textContent=`\xB7 ${N(a.size)}`;let p=document.createElement("button");p.type="button",p.className="x",p.setAttribute("aria-label",this.strings.removeFileLabel),p.textContent="\xD7",p.addEventListener("click",()=>{this.picked=null,i.remove();}),i.append(s,d,h,p),t.before(i),e.scrollTop=e.scrollHeight;}objectUrl(e){let t=URL.createObjectURL(e);return this.objectUrls.push(t),t}close(){if(this.panel){this.panel.remove(),this.panel=null,this.picked=null;for(let e of this.objectUrls)URL.revokeObjectURL(e);this.objectUrls=[],this.lastFocused instanceof HTMLElement?this.lastFocused.focus():this.launcher.focus();}}onIncomingTurn(e){if(this.panel){let t=this.panel.querySelector(".log");t instanceof HTMLElement&&!this.hasTurn(t,e.id)&&this.appendTurn(t,e);return}e.authorKind!=="end_user"&&(this.unread+=1,this.renderBadge());}async submit(e,t){let n=e.value.trim(),a=this.picked;if(!(!n&&!a)){e.value="",this.picked=null;for(let o of this.root.querySelectorAll(".file,.ferr"))o.remove();await this.sendBody(t,n,a);}}async sendBody(e,t,n=null){e.querySelector(".empty")?.remove(),this.pendingTurns+=1;let a=this.appendTurn(e,{authorId:null,authorKind:"end_user",body:t,createdAt:new Date().toISOString(),id:`pending-${this.pendingTurns}`},n);a.setAttribute("data-pending","");let o=n?await this.client.upload?.(n):void 0,i=o===null?null:await this.client.send(t,ze(),o?[o.id]:void 0);if(a.removeAttribute("data-pending"),i){a.dataset.turnId=i.id;return}this.markFailed(e,a,t,n);}markFailed(e,t,n,a){t.setAttribute("data-failed","");let o=document.createElement("button");o.type="button",o.className="retry",o.textContent=this.strings.retryLabel,o.addEventListener("click",()=>{t.remove(),this.sendBody(e,n,a);}),(t.querySelector(".body")??t).append(o);}hasTurn(e,t){for(let n of e.children)if(n instanceof HTMLElement&&n.dataset.turnId===t)return true;return false}renderThread(e,t){e.replaceChildren();for(let n of t.turns)this.appendTurn(e,n);}appendTurn(e,t,n=null){e.querySelector(".empty")?.remove();let a=Me.includes(t.authorKind)?t.authorKind:"agent",o=this.settings,i=document.createElement("div");if(i.className=`turn ${a}`,i.dataset.turnId=t.id,a!=="end_user"&&o.nameAvatar){let l=document.createElement("span");if(l.className=a==="ai"?"av bot":"av",l.setAttribute("aria-hidden","true"),a==="agent"&&t.authorAvatarUrl){let m=document.createElement("img");m.alt="",m.src=this.client.avatarUrl(t.authorAvatarUrl),l.append(m);}else {l.textContent=a==="ai"?this.strings.aiLabel:O(this.agentName(t));let m=a==="agent"?this.appearance.team?.find(y=>y.name===t.authorName)?.tone:void 0;m&&(l.style.background=m);}i.append(l);}let d=document.createElement("div");if(d.className="body",a==="end_user"){n&&this.drawFile(d,n.name,n.type,n.size,Promise.resolve(n));for(let l of t.attachments??[])this.drawFile(d,l.name,l.contentType,l.bytes,this.client.file?.(l.url)??Promise.resolve(null));}let h=a!=="end_user"&&o.namePlacement!=="hidden",p=document.createElement("div");if(a==="ai"?$e(p,t.body):p.textContent=t.body,h||a==="ai"&&o.namePlacement==="hidden"){let l=document.createElement("div");l.className=a==="ai"?"author ai":"author",l.textContent=a==="ai"?this.strings.aiLabel:this.agentName(t),o.stampPlacement==="beside_name"&&l.append(this.stamp(t)),o.namePlacement==="inline"?(l.classList.add("below"),d.append(p,l)):d.append(l,p);}else t.body&&d.append(p);return o.stampPlacement==="under_turn"&&d.append(this.stamp(t)),i.append(d),e.append(i),e.scrollTop=e.scrollHeight,i}drawFile(e,t,n,a,o){let i=document.createElement("a");if(n==="application/pdf"){i.className="pdfc",i.download=t;let s=document.createElement("b");s.textContent="PDF",i.append(s,`${t} \xB7 ${N(a)}`);}else {i.className="att",i.target="_blank",i.rel="noopener noreferrer";let s=document.createElement("img");s.alt=t,s.addEventListener("load",()=>{let d=i.closest(".log");d&&(d.scrollTop=d.scrollHeight);}),i.append(s);}e.append(i),o.then(s=>{s&&(i.href=this.objectUrl(s),i.querySelector("img")?.setAttribute("src",i.href));});}agentName(e){return e.authorName||this.strings.agentLabel}stamp(e){let t=document.createElement("span");return t.className="stamp",t.textContent=this.strings.timeLabel(e.createdAt),t}onKeydown(e,t,n){if(e.key==="Escape"){e.preventDefault(),this.close();return}if(e.key!=="Tab")return;let a=t.querySelectorAll('button, input, [tabindex]:not([tabindex="-1"])');if(a.length===0)return;let o=a[0],i=a[a.length-1],s=this.root.activeElement;e.shiftKey&&s===o?(e.preventDefault(),i.focus()):!e.shiftKey&&s===i?(e.preventDefault(),o.focus()):s===null&&(e.preventDefault(),n.focus());}renderBadge(){this.unread>0?(this.badge.hidden=false,this.badge.textContent=String(this.unread),this.launcher.setAttribute("aria-label",`${this.strings.launcherLabel}, ${this.strings.unreadLabel(this.unread)}`)):(this.badge.hidden=true,this.badge.textContent="",this.launcher.setAttribute("aria-label",this.strings.launcherLabel));}};var Oe="/socket.io/?EIO=4&transport=websocket",T=class{constructor(e){this.options=e;a(this,"socket",null);a(this,"heartbeat",null);a(this,"ready",false);a(this,"closed",false);a(this,"heartbeatWindow",45e3);a(this,"factory");a(this,"setTimer");a(this,"clearTimer");this.factory=e.socketFactory??De,this.setTimer=e.setTimer??((t,n)=>setTimeout(t,n)),this.clearTimer=e.clearTimer??(t=>clearTimeout(t));}open(){if(this.socket||this.closed)return;let e=`${this.options.host.replace(/^http/,"ws").replace(/\/+$/,"")}${Oe}`,t;try{t=this.factory(e);}catch{this.options.onClosed(false);return}this.socket=t,t.onmessage=n=>this.receive(String(n.data)),t.onerror=()=>t.close(),t.onclose=()=>this.fell();}close(){this.closed=true,this.stopHeartbeat();let e=this.socket;this.socket=null,e?.close();}receive(e){let t=c(e);if(t.kind==="open"){this.armHeartbeat(t.pingInterval+t.pingTimeout),this.socket?.send(a$2(this.options.auth));return}if(t.kind==="ping"){this.armHeartbeat(),this.socket?.send(b());return}if(t.kind==="connectError"||t.kind==="disconnect"){this.stopHeartbeat(),this.socket?.close();return}if(t.kind==="event"){if(t.name==="ready"){this.ready=true,this.options.onReady();return}if(t.name==="conversation.turn"){let n=t.payload?.turn;n&&this.options.onTurn(n);}}}fell(){this.stopHeartbeat();let e=this.ready;this.socket=null,this.ready=false,this.closed||this.options.onClosed(e);}armHeartbeat(e){e!==void 0&&(this.heartbeatWindow=e),this.stopHeartbeat(),this.heartbeat=this.setTimer(()=>this.socket?.close(),this.heartbeatWindow);}stopHeartbeat(){this.heartbeat!==null&&this.clearTimer(this.heartbeat),this.heartbeat=null;}};function De(r){let e=globalThis.WebSocket;if(!e)throw new Error("no WebSocket");return new e(r)}var qe=6e4;function lt(r){let e=globalThis.document;if(!e)throw new Error("prodantix chat requires a document; mount it in the browser");let t=r.mountPoint??e.createElement("div");r.mountPoint||e.body.append(t);let n=new C(r),a=new w(t,n,r.strings,r.appearance),o=r.appearance?.availability??k.availability,i,s=()=>{a.setOpenNow(L(o,new Date)),i=setTimeout(s,qe);};s();let d=new Set,h,p=null,l=r.pollIntervalMs??15e3,m=u=>{d.has(u.id)||u.authorKind==="end_user"||(d.add(u.id),a.onIncomingTurn(u));},y=async()=>{if(!n.hasThread)return;let u=await n.load();if(u){for(let b of u.turns)m(b);d=new Set(u.turns.map(b=>b.id));}},v=()=>{h||l<=0||(h=setInterval(()=>void y(),l));},S=()=>{h&&clearInterval(h),h=void 0;},f=()=>{if(p||!r.socketHost)return;let u=n.socketAuth;u&&(p=new T({auth:u,host:r.socketHost,onClosed:b=>{p=null,v(),b&&f();},onReady:S,onTurn:m,socketFactory:r.socketFactory}),p.open());};return v(),f(),{close:()=>a.close(),destroy:()=>{S(),clearTimeout(i),p?.close(),p=null,a.close(),t.remove();},identify:u=>n.identify(u),open:()=>{a.open().then(f);}}}export{C as ChatClient,w as ChatPanel,k as DEFAULT_APPEARANCE,g as DEFAULT_APPEARANCE_SETTINGS,lt as mountChat,F as panelStyles,E as resolveAppearance};//# sourceMappingURL=chat.js.map
105
+ `}${ke[t.composerShape]}${Se[t.skin]}${D(t.launcherShape,t.launcherFill,t.launcherContent,t.launcherSize)}${Ce[t.bubbleShape]}${we[t.bubbleFill]}${Ee[t.namePlacement]}${t.nameAvatar?Le:""}${t.dayDividers?Te:""}${Ae[t.stampPlacement]}${t.stampContent==="time_and_latency"?Pe:""}${_e}${a.attachments?.enabled?Ne(t.composerShape):""}`}var Oe=["end_user","agent","ai"];function De(){let a=globalThis.location;if(a)return {host:a.host,path:a.pathname,title:document.title}}var qe='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m16.5 6.5-7.8 7.8a2.1 2.1 0 0 0 3 3l8.1-8.1a4.2 4.2 0 0 0-6-6L5.7 11.3a6.3 6.3 0 0 0 8.9 8.9l6.6-6.6"/></svg>',Ke='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.88 9.29 12 13.17 8.12 9.29a.996.996 0 0 0-1.41 0c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0l4.59-4.59c.39-.39.39-1.02 0-1.41-.39-.38-1.03-.39-1.42 0"/></svg>',E=class{constructor(e,t,n={},r={},o={}){this.host=e;this.client=t;a(this,"root");a(this,"strings");a(this,"settings");a(this,"appearance");a(this,"launcher");a(this,"badge");a(this,"panel",null);a(this,"lastFocused",null);a(this,"unread",0);a(this,"pendingTurns",0);a(this,"openNow");a(this,"style");a(this,"scheme");a(this,"picked",null);a(this,"objectUrls",[]);this.strings={...ve,...n},this.appearance={...k,...r},this.settings=w({...k,...r}),this.root=e.attachShadow({mode:o.shadowMode??"closed"}),this.openNow=L(this.appearance.availability,new Date),this.scheme=o.scheme,this.style=document.createElement("style"),this.style.textContent=F(this.appearance,this.scheme),this.root.append(this.style),this.launcher=document.createElement("button"),this.launcher.className="launcher",this.launcher.type="button",this.launcher.setAttribute("aria-haspopup","dialog"),this.launcher.addEventListener("click",()=>this.toggle()),this.badge=document.createElement("span"),this.badge.className="badge",this.badge.hidden=true,this.drawLauncher(),this.root.append(this.launcher);}drawLauncher(){if(this.launcher.setAttribute("aria-label",this.strings.launcherLabel),this.launcher.replaceChildren(),this.launcher.append(q(this.settings.launcherContent,this.strings,this.appearance.team,e=>this.client.avatarUrl(e))),this.settings.launcherShape==="pill"){let e=document.createElement("span");e.className="label",e.textContent=this.settings.launcherContent==="team_faces"?this.strings.agentLabel:this.strings.launcherLabel,this.launcher.append(e);}this.launcher.append(this.badge),this.launcher.classList.toggle("closed",!this.openNow);}update(e,t){this.appearance={...k,...e},this.settings=w(this.appearance),t!==void 0&&(this.scheme=t),this.style.textContent=F(this.appearance,this.scheme),this.drawLauncher(),this.panel&&(this.close(),this.open());}toggle(){this.panel?this.close():this.open();}setOpenNow(e){this.openNow=e,this.launcher.classList.toggle("closed",!e),this.panel?.classList.toggle("closed",!e);}async open(){if(this.panel)return;this.lastFocused=this.host.ownerDocument.activeElement,this.unread=0,this.renderBadge();let e=document.createElement("section");e.className=this.openNow?"panel":"panel closed",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label",this.strings.title);let t=document.createElement("div");t.className="header";let n=this.appearance.team??[];n.length>0&&t.append(_(n,this.strings,f=>this.client.avatarUrl(f)));let r=document.createElement("div");r.className="headmain";let o=document.createElement("h2");o.textContent=this.strings.title;let i=document.createElement("p");i.className="status";let s=document.createElement("span");s.className="live",s.setAttribute("aria-hidden","true"),i.append(s,this.strings.replyTime),r.append(o,i);let d=document.createElement("button");d.className="close",d.type="button",d.setAttribute("aria-label",this.strings.closeLabel),d.innerHTML=Ke,d.addEventListener("click",()=>this.close()),t.append(r,d);let u=document.createElement("div");u.className="log",u.setAttribute("role","log"),u.setAttribute("aria-live","polite"),u.setAttribute("aria-label",this.strings.title);let c=document.createElement("form");c.className="composer";let l=document.createElement("input");l.type="text",l.setAttribute("aria-label",this.strings.inputPlaceholder),l.placeholder=this.strings.inputPlaceholder;let h=document.createElement("button");h.type="submit",h.setAttribute("aria-label",this.strings.sendLabel),h.innerHTML='<svg class="sendglyph" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 12 20 4.5 15 20l-3.6-5.4L4.5 12Z"/></svg>';let y=document.createElement("span");y.className="sendtext",y.textContent=this.strings.sendLabel,h.append(y);let v=this.appearance.attachments;if(v?.enabled&&this.client.upload){let f=document.createElement("span");f.className="field";let m=document.createElement("input");m.type="file",m.accept=v.accept.join(","),m.hidden=true,m.addEventListener("change",()=>{let H=m.files?.[0];m.value="",H&&this.pick(u,c,v,H);});let b=document.createElement("button");b.type="button",b.className="clip",b.setAttribute("aria-label",this.strings.attachLabel),b.innerHTML=qe,b.addEventListener("click",()=>m.click()),f.append(b,l,m),c.append(f,h);}else c.append(l,h);c.addEventListener("submit",f=>{f.preventDefault(),this.submit(l,u);}),e.append(t,u,c),e.addEventListener("keydown",f=>this.onKeydown(f,e,d)),this.root.append(e),this.panel=e,l.focus();let S=await this.client.load();S&&S.turns.length>0?this.renderThread(u,S):this.renderFirstRun(u,l),this.openNow||this.renderAway(t);}renderFirstRun(e,t){let n=document.createElement("div");n.className="empty";let r=document.createElement("h3");r.textContent=this.appearance.greeting.trim()||this.strings.emptyTitle;let o=document.createElement("p");o.textContent=this.strings.emptyBody,n.append(r,o),this.appearance.starterPrompts.filter(ze).forEach((s,d)=>{let u=document.createElement("div");u.className="prompt";let c=document.createElement("div");c.className="promptwords",c.id=`prompt-${d}`;let l=document.createElement("template");l.innerHTML=s.html,Be(l.content)?c.append(l.content):c.textContent=s.text;for(let y of c.querySelectorAll("a"))y.target="_blank",y.rel="noopener noreferrer";let h=document.createElement("button");h.className="promptpress",h.type="button",h.setAttribute("aria-labelledby",c.id),h.addEventListener("click",()=>{t.value=s.text,this.submit(t,e);}),u.append(c,h),n.append(u);}),e.replaceChildren(n);}renderAway(e){let t=document.createElement("div");t.className="away";let n=document.createElement("span");n.className="awayglyph",n.setAttribute("aria-hidden","true");let r=document.createElement("span");r.textContent=this.appearance.awayMessage.trim()||this.strings.awayBody,t.append(n,r),e.after(t);}pick(e,t,n,r){let o=r.size>n.maxBytes||!n.accept.includes(r.type);for(let l of this.root.querySelectorAll(o?".ferr":".file,.ferr"))l.remove();if(o){let l=document.createElement("p");l.className="ferr",l.setAttribute("role","alert"),l.textContent=this.strings.fileRefusal(N(r.size),`${n.maxBytes/1e6} MB`),t.before(l),e.scrollTop=e.scrollHeight;return}this.picked=r;let i=document.createElement("span");i.className="file";let s;if(r.type==="application/pdf")s=document.createElement("b"),s.textContent="PDF";else {let l=document.createElement("img");l.className="th",l.alt="",l.src=this.objectUrl(r),s=l;}let d=document.createElement("span");d.className="name",d.textContent=r.name;let u=document.createElement("span");u.className="sz",u.textContent=`\xB7 ${N(r.size)}`;let c=document.createElement("button");c.type="button",c.className="x",c.setAttribute("aria-label",this.strings.removeFileLabel),c.textContent="\xD7",c.addEventListener("click",()=>{this.picked=null,i.remove();}),i.append(s,d,u,c),t.before(i),e.scrollTop=e.scrollHeight;}objectUrl(e){let t=URL.createObjectURL(e);return this.objectUrls.push(t),t}close(){if(this.panel){this.panel.remove(),this.panel=null,this.picked=null;for(let e of this.objectUrls)URL.revokeObjectURL(e);this.objectUrls=[],this.lastFocused instanceof HTMLElement?this.lastFocused.focus():this.launcher.focus();}}onIncomingTurn(e){if(this.panel){let t=this.panel.querySelector(".log");t instanceof HTMLElement&&!this.hasTurn(t,e.id)&&this.appendTurn(t,e);return}e.authorKind!=="end_user"&&(this.unread+=1,this.renderBadge());}async submit(e,t){let n=e.value.trim(),r=this.picked;if(!(!n&&!r)){e.value="",this.picked=null;for(let o of this.root.querySelectorAll(".file,.ferr"))o.remove();await this.sendBody(t,n,r);}}async sendBody(e,t,n=null){e.querySelector(".empty")?.remove(),this.pendingTurns+=1;let r=this.appendTurn(e,{authorId:null,authorKind:"end_user",body:t,createdAt:new Date().toISOString(),id:`pending-${this.pendingTurns}`},n);r.setAttribute("data-pending","");let o=n?await this.client.upload?.(n):void 0,i=o===null?null:await this.client.send(t,De(),o?[o.id]:void 0);if(r.removeAttribute("data-pending"),i){r.dataset.turnId=i.id;return}this.markFailed(e,r,t,n);}markFailed(e,t,n,r){t.setAttribute("data-failed","");let o=document.createElement("button");o.type="button",o.className="retry",o.textContent=this.strings.retryLabel,o.addEventListener("click",()=>{t.remove(),this.sendBody(e,n,r);}),(t.querySelector(".body")??t).append(o);}hasTurn(e,t){for(let n of e.children)if(n instanceof HTMLElement&&n.dataset.turnId===t)return true;return false}renderThread(e,t){e.replaceChildren();for(let n of t.turns)this.appendTurn(e,n);}appendTurn(e,t,n=null){e.querySelector(".empty")?.remove();let r=Oe.includes(t.authorKind)?t.authorKind:"agent",o=this.settings,i=document.createElement("div");if(i.className=`turn ${r}`,i.dataset.turnId=t.id,r!=="end_user"&&o.nameAvatar){let l=document.createElement("span");if(l.className=r==="ai"?"av bot":"av",l.setAttribute("aria-hidden","true"),r==="agent"&&t.authorAvatarUrl){let h=document.createElement("img");h.alt="",h.src=this.client.avatarUrl(t.authorAvatarUrl),l.append(h);}else {l.textContent=r==="ai"?this.strings.aiLabel:O(this.agentName(t));let h=r==="agent"?this.appearance.team?.find(y=>y.name===t.authorName)?.tone:void 0;h&&(l.style.background=h);}i.append(l);}let d=document.createElement("div");if(d.className="body",r==="end_user"){n&&this.drawFile(d,n.name,n.type,n.size,Promise.resolve(n));for(let l of t.attachments??[])this.drawFile(d,l.name,l.contentType,l.bytes,this.client.file?.(l.url)??Promise.resolve(null));}let u=r!=="end_user"&&o.namePlacement!=="hidden",c=document.createElement("div");if(r==="ai"?$e(c,t.body):c.textContent=t.body,u||r==="ai"&&o.namePlacement==="hidden"){let l=document.createElement("div");l.className=r==="ai"?"author ai":"author",l.textContent=r==="ai"?this.strings.aiLabel:this.agentName(t),o.stampPlacement==="beside_name"&&l.append(this.stamp(t)),o.namePlacement==="inline"?(l.classList.add("below"),d.append(c,l)):d.append(l,c);}else t.body&&d.append(c);return o.stampPlacement==="under_turn"&&d.append(this.stamp(t)),i.append(d),e.append(i),e.scrollTop=e.scrollHeight,i}drawFile(e,t,n,r,o){let i=document.createElement("a");if(n==="application/pdf"){i.className="pdfc",i.download=t;let s=document.createElement("b");s.textContent="PDF",i.append(s,`${t} \xB7 ${N(r)}`);}else {i.className="att",i.target="_blank",i.rel="noopener noreferrer";let s=document.createElement("img");s.alt=t,s.addEventListener("load",()=>{let d=i.closest(".log");d&&(d.scrollTop=d.scrollHeight);}),i.append(s);}e.append(i),o.then(s=>{s&&(i.href=this.objectUrl(s),i.querySelector("img")?.setAttribute("src",i.href));});}agentName(e){return e.authorName||this.strings.agentLabel}stamp(e){let t=document.createElement("span");return t.className="stamp",t.textContent=this.strings.timeLabel(e.createdAt),t}onKeydown(e,t,n){if(e.key==="Escape"){e.preventDefault(),this.close();return}if(e.key!=="Tab")return;let r=t.querySelectorAll('button, input, [tabindex]:not([tabindex="-1"])');if(r.length===0)return;let o=r[0],i=r[r.length-1],s=this.root.activeElement;e.shiftKey&&s===o?(e.preventDefault(),i.focus()):!e.shiftKey&&s===i?(e.preventDefault(),o.focus()):s===null&&(e.preventDefault(),n.focus());}renderBadge(){this.unread>0?(this.badge.hidden=false,this.badge.textContent=String(this.unread),this.launcher.setAttribute("aria-label",`${this.strings.launcherLabel}, ${this.strings.unreadLabel(this.unread)}`)):(this.badge.hidden=true,this.badge.textContent="",this.launcher.setAttribute("aria-label",this.strings.launcherLabel));}};var je="/socket.io/?EIO=4&transport=websocket",T=class{constructor(e){this.options=e;a(this,"socket",null);a(this,"heartbeat",null);a(this,"ready",false);a(this,"closed",false);a(this,"heartbeatWindow",45e3);a(this,"factory");a(this,"setTimer");a(this,"clearTimer");this.factory=e.socketFactory??Ge,this.setTimer=e.setTimer??((t,n)=>setTimeout(t,n)),this.clearTimer=e.clearTimer??(t=>clearTimeout(t));}open(){if(this.socket||this.closed)return;let e=`${this.options.host.replace(/^http/,"ws").replace(/\/+$/,"")}${je}`,t;try{t=this.factory(e);}catch{this.options.onClosed(false);return}this.socket=t,t.onmessage=n=>this.receive(String(n.data)),t.onerror=()=>t.close(),t.onclose=()=>this.fell();}close(){this.closed=true,this.stopHeartbeat();let e=this.socket;this.socket=null,e?.close();}receive(e){let t=c(e);if(t.kind==="open"){this.armHeartbeat(t.pingInterval+t.pingTimeout),this.socket?.send(a$2(this.options.auth));return}if(t.kind==="ping"){this.armHeartbeat(),this.socket?.send(b());return}if(t.kind==="connectError"||t.kind==="disconnect"){this.stopHeartbeat(),this.socket?.close();return}if(t.kind==="event"){if(t.name==="ready"){this.ready=true,this.options.onReady();return}if(t.name==="conversation.turn"){let n=t.payload?.turn;n&&this.options.onTurn(n);}}}fell(){this.stopHeartbeat();let e=this.ready;this.socket=null,this.ready=false,this.closed||this.options.onClosed(e);}armHeartbeat(e){e!==void 0&&(this.heartbeatWindow=e),this.stopHeartbeat(),this.heartbeat=this.setTimer(()=>this.socket?.close(),this.heartbeatWindow);}stopHeartbeat(){this.heartbeat!==null&&this.clearTimer(this.heartbeat),this.heartbeat=null;}};function Ge(a){let e=globalThis.WebSocket;if(!e)throw new Error("no WebSocket");return new e(a)}var Ye=6e4;function ut(a){let e=globalThis.document;if(!e)throw new Error("prodantix chat requires a document; mount it in the browser");let t=a.mountPoint??e.createElement("div");a.mountPoint||e.body.append(t);let n=new C(a),r=new E(t,n,a.strings,a.appearance),o=a.appearance?.availability??k.availability,i,s=()=>{r.setOpenNow(L(o,new Date)),i=setTimeout(s,Ye);};s();let d=new Set,u,c=null,l=a.pollIntervalMs??15e3,h=m=>{d.has(m.id)||m.authorKind==="end_user"||(d.add(m.id),r.onIncomingTurn(m));},y=async()=>{if(!n.hasThread)return;let m=await n.load();if(m){for(let b of m.turns)h(b);d=new Set(m.turns.map(b=>b.id));}},v=()=>{u||l<=0||(u=setInterval(()=>void y(),l));},S=()=>{u&&clearInterval(u),u=void 0;},f=()=>{if(c||!a.socketHost)return;let m=n.socketAuth;m&&(c=new T({auth:m,host:a.socketHost,onClosed:b=>{c=null,v(),b&&f();},onReady:S,onTurn:h,socketFactory:a.socketFactory}),c.open());};return v(),f(),{close:()=>r.close(),destroy:()=>{S(),clearTimeout(i),c?.close(),c=null,r.close(),t.remove();},identify:m=>n.identify(m),open:()=>{r.open().then(f);}}}export{C as ChatClient,E as ChatPanel,k as DEFAULT_APPEARANCE,g as DEFAULT_APPEARANCE_SETTINGS,ut as mountChat,F as panelStyles,w as resolveAppearance};//# sourceMappingURL=chat.js.map
99
106
  //# sourceMappingURL=chat.js.map
@@ -131,6 +131,10 @@ interface TeamFace {
131
131
  avatarUrl: string | null;
132
132
  }
133
133
 
134
+ interface StarterPrompt {
135
+ html: string;
136
+ text: string;
137
+ }
134
138
  interface MessengerConfig extends AppearanceSettings {
135
139
  enabled: boolean;
136
140
  launcherPosition: 'bottom_left' | 'bottom_right';
@@ -141,7 +145,7 @@ interface MessengerConfig extends AppearanceSettings {
141
145
  awayMessage: string;
142
146
  availability: Availability;
143
147
  version: string;
144
- starterPrompts: string[];
148
+ starterPrompts: StarterPrompt[];
145
149
  team: TeamFace[];
146
150
  socketUrl: string;
147
151
  attachments?: MessengerAttachments;
@@ -165,4 +169,4 @@ declare const cacheKeyFor: (apiKey: string, locale: string | undefined) => strin
165
169
  declare function cachedMessengerConfig(storage: ChatStorage | undefined, apiKey: string, locale?: string): MessengerConfig | null;
166
170
  declare function fetchMessengerConfig(options: MessengerConfigOptions): Promise<MessengerConfig | null>;
167
171
 
168
- export { type AppearanceSettings as A, type BubbleFill as B, type ChatThread as C, DEFAULT_APPEARANCE_SETTINGS as D, type FileFetchLike as F, type LauncherContent as L, type MessengerConfig as M, type NamePlacement as N, type PageContext as P, type StampContent as S, type ChatTurn as a, type ChatUpload as b, type ChatIdentity as c, type ChatClientOptions as d, type BubbleShape as e, type ChatAttachment as f, ChatClient as g, type ChatStorage as h, type ComposerShape as i, type FileResponseLike as j, type LauncherFill as k, type LauncherShape as l, type LauncherSize as m, type MessengerSkin as n, type StampPlacement as o, MESSENGER_CACHE_KEY as p, type MessengerAttachments as q, resolveAppearance as r, type MessengerConfigOptions as s, cacheKeyFor as t, cachedMessengerConfig as u, fetchMessengerConfig as v, localeCandidates as w };
172
+ export { type AppearanceSettings as A, type BubbleFill as B, type ChatThread as C, DEFAULT_APPEARANCE_SETTINGS as D, type FileFetchLike as F, type LauncherContent as L, type MessengerConfig as M, type NamePlacement as N, type PageContext as P, type StampContent as S, type ChatTurn as a, type ChatUpload as b, type ChatIdentity as c, type ChatClientOptions as d, type BubbleShape as e, type ChatAttachment as f, ChatClient as g, type ChatStorage as h, type ComposerShape as i, type FileResponseLike as j, type LauncherFill as k, type LauncherShape as l, type LauncherSize as m, type MessengerSkin as n, type StampPlacement as o, MESSENGER_CACHE_KEY as p, type MessengerAttachments as q, resolveAppearance as r, type MessengerConfigOptions as s, type StarterPrompt as t, cacheKeyFor as u, cachedMessengerConfig as v, fetchMessengerConfig as w, localeCandidates as x };
@@ -131,6 +131,10 @@ interface TeamFace {
131
131
  avatarUrl: string | null;
132
132
  }
133
133
 
134
+ interface StarterPrompt {
135
+ html: string;
136
+ text: string;
137
+ }
134
138
  interface MessengerConfig extends AppearanceSettings {
135
139
  enabled: boolean;
136
140
  launcherPosition: 'bottom_left' | 'bottom_right';
@@ -141,7 +145,7 @@ interface MessengerConfig extends AppearanceSettings {
141
145
  awayMessage: string;
142
146
  availability: Availability;
143
147
  version: string;
144
- starterPrompts: string[];
148
+ starterPrompts: StarterPrompt[];
145
149
  team: TeamFace[];
146
150
  socketUrl: string;
147
151
  attachments?: MessengerAttachments;
@@ -165,4 +169,4 @@ declare const cacheKeyFor: (apiKey: string, locale: string | undefined) => strin
165
169
  declare function cachedMessengerConfig(storage: ChatStorage | undefined, apiKey: string, locale?: string): MessengerConfig | null;
166
170
  declare function fetchMessengerConfig(options: MessengerConfigOptions): Promise<MessengerConfig | null>;
167
171
 
168
- export { type AppearanceSettings as A, type BubbleFill as B, type ChatThread as C, DEFAULT_APPEARANCE_SETTINGS as D, type FileFetchLike as F, type LauncherContent as L, type MessengerConfig as M, type NamePlacement as N, type PageContext as P, type StampContent as S, type ChatTurn as a, type ChatUpload as b, type ChatIdentity as c, type ChatClientOptions as d, type BubbleShape as e, type ChatAttachment as f, ChatClient as g, type ChatStorage as h, type ComposerShape as i, type FileResponseLike as j, type LauncherFill as k, type LauncherShape as l, type LauncherSize as m, type MessengerSkin as n, type StampPlacement as o, MESSENGER_CACHE_KEY as p, type MessengerAttachments as q, resolveAppearance as r, type MessengerConfigOptions as s, cacheKeyFor as t, cachedMessengerConfig as u, fetchMessengerConfig as v, localeCandidates as w };
172
+ export { type AppearanceSettings as A, type BubbleFill as B, type ChatThread as C, DEFAULT_APPEARANCE_SETTINGS as D, type FileFetchLike as F, type LauncherContent as L, type MessengerConfig as M, type NamePlacement as N, type PageContext as P, type StampContent as S, type ChatTurn as a, type ChatUpload as b, type ChatIdentity as c, type ChatClientOptions as d, type BubbleShape as e, type ChatAttachment as f, ChatClient as g, type ChatStorage as h, type ComposerShape as i, type FileResponseLike as j, type LauncherFill as k, type LauncherShape as l, type LauncherSize as m, type MessengerSkin as n, type StampPlacement as o, MESSENGER_CACHE_KEY as p, type MessengerAttachments as q, resolveAppearance as r, type MessengerConfigOptions as s, type StarterPrompt as t, cacheKeyFor as u, cachedMessengerConfig as v, fetchMessengerConfig as w, localeCandidates as x };
@@ -1,2 +1,2 @@
1
- 'use strict';function s(e){if(e)return e;let t=globalThis.fetch;if(typeof t=="function")return t.bind(globalThis)}function c(e){return e.replace(/\/+$/,"")}var g="prodantix.messenger.config",h=e=>{let t=e.navigator?.languages;return Array.isArray(t)&&t.length>0?t.join(","):e.navigator?.language||e.document?.documentElement?.lang||void 0},l=(e,t)=>`${g}:${e}:${t??""}`;function d(e,t,a){let r=e?.get(l(t,a));if(!r)return null;try{let o=JSON.parse(r);return o?.apiKey===t?o.config:null}catch{return null}}async function m(e){let t=s(e.fetchImpl);if(!t)return e.onError?.(new Error("no fetch available for the prodantix messenger")),null;let a=c(e.host),r=l(e.apiKey,e.locale),o=e.locale?`?locale=${encodeURIComponent(e.locale)}`:"";try{let n=await t(`${a}/v1/messenger/config${o}`,{headers:{authorization:`Bearer ${e.apiKey}`},method:"GET"});if(!n.ok)return e.onError?.(new Error(`prodantix messenger config: ${n.status}`)),null;let i=JSON.parse(await n.text());return i.enabled?(e.storage?.set(r,JSON.stringify({apiKey:e.apiKey,config:i})),i):(e.storage?.remove(r),i)}catch(n){return e.onError?.(n),null}}exports.MESSENGER_CACHE_KEY=g;exports.cacheKeyFor=l;exports.cachedMessengerConfig=d;exports.fetchMessengerConfig=m;exports.localeCandidates=h;//# sourceMappingURL=messenger.cjs.map
1
+ 'use strict';function s(e){if(e)return e;let t=globalThis.fetch;if(typeof t=="function")return t.bind(globalThis)}function c(e){return e.replace(/\/+$/,"")}var g="prodantix.messenger.config",u=e=>{let t=e.navigator?.languages;return Array.isArray(t)&&t.length>0?t.join(","):e.navigator?.language||e.document?.documentElement?.lang||void 0},l=(e,t)=>`${g}:${e}:${t??""}`;function m(e,t,i){let r=e?.get(l(t,i));if(!r)return null;try{let o=JSON.parse(r);return o?.apiKey===t?o.config:null}catch{return null}}async function p(e){let t=s(e.fetchImpl);if(!t)return e.onError?.(new Error("no fetch available for the prodantix messenger")),null;let i=c(e.host),r=l(e.apiKey,e.locale),o=e.locale?`?locale=${encodeURIComponent(e.locale)}`:"";try{let n=await t(`${i}/v1/messenger/config${o}`,{headers:{authorization:`Bearer ${e.apiKey}`},method:"GET"});if(!n.ok)return e.onError?.(new Error(`prodantix messenger config: ${n.status}`)),null;let a=JSON.parse(await n.text());return a.enabled?(e.storage?.set(r,JSON.stringify({apiKey:e.apiKey,config:a})),a):(e.storage?.remove(r),a)}catch(n){return e.onError?.(n),null}}exports.MESSENGER_CACHE_KEY=g;exports.cacheKeyFor=l;exports.cachedMessengerConfig=m;exports.fetchMessengerConfig=p;exports.localeCandidates=u;//# sourceMappingURL=messenger.cjs.map
2
2
  //# sourceMappingURL=messenger.cjs.map
@@ -1,2 +1,2 @@
1
- export { p as MESSENGER_CACHE_KEY, q as MessengerAttachments, M as MessengerConfig, s as MessengerConfigOptions, t as cacheKeyFor, u as cachedMessengerConfig, v as fetchMessengerConfig, w as localeCandidates } from './config-CM4nTGof.cjs';
1
+ export { p as MESSENGER_CACHE_KEY, q as MessengerAttachments, M as MessengerConfig, s as MessengerConfigOptions, t as StarterPrompt, u as cacheKeyFor, v as cachedMessengerConfig, w as fetchMessengerConfig, x as localeCandidates } from './config-CMF9zz1a.cjs';
2
2
  import './http-BCh716Vs.cjs';
@@ -1,2 +1,2 @@
1
- export { p as MESSENGER_CACHE_KEY, q as MessengerAttachments, M as MessengerConfig, s as MessengerConfigOptions, t as cacheKeyFor, u as cachedMessengerConfig, v as fetchMessengerConfig, w as localeCandidates } from './config-DJX2zFaa.js';
1
+ export { p as MESSENGER_CACHE_KEY, q as MessengerAttachments, M as MessengerConfig, s as MessengerConfigOptions, t as StarterPrompt, u as cacheKeyFor, v as cachedMessengerConfig, w as fetchMessengerConfig, x as localeCandidates } from './config-DqC0lcr7.js';
2
2
  import './http-BCh716Vs.js';
@@ -1,10 +1,10 @@
1
- (function(){'use strict';var se=Object.defineProperty;var le=(n,e,t)=>e in n?se(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t;var h=(n,e,t)=>le(n,typeof e!="symbol"?e+"":e,t);function L(n){if(n)return n;let e=globalThis.fetch;if(typeof e=="function")return e.bind(globalThis)}function P(n){return n.replace(/\/+$/,"")}var D="X-Prodantix-Conversation-Token",H="prodantix.chat.handle";function ce(){let n=globalThis.localStorage;if(n)return {get:e=>n.getItem(e),remove:e=>n.removeItem(e),set:(e,t)=>n.setItem(e,t)}}var N=class{constructor(e){this.options=e;h(this,"fetchImpl");h(this,"fileFetchImpl");h(this,"host");h(this,"storage");h(this,"handle");h(this,"identity",null);var t,r;this.fetchImpl=L(e.fetchImpl),this.fileFetchImpl=(t=e.fileFetchImpl)!=null?t:((i,o)=>fetch(i,o)),this.host=P(e.host),this.storage=(r=e.storage)!=null?r:ce(),this.handle=this.readHandle();}get hasThread(){return this.handle!==null}avatarUrl(e){return e.startsWith("/")?`${this.host}${e}?api_key=${encodeURIComponent(this.options.apiKey)}`:e}get socketAuth(){return this.handle?{conversationId:this.handle.conversationId,conversationToken:this.handle.token,projectKey:this.options.apiKey}:null}identify(e){this.identity=e;}async ensureThread(e){var r,i,o;if(this.handle)return true;let t=await this.request("POST","/v1/conversations",{body:{distinctId:this.options.distinctId,subject:e,userHash:(r=this.identity)==null?void 0:r.userHash,userId:(i=this.identity)==null?void 0:i.userId}});return !(t!=null&&t.conversationId)||!t.token?false:(this.handle={conversationId:t.conversationId,token:t.token},(o=this.storage)==null||o.set(H,JSON.stringify(this.handle)),true)}async send(e,t,r){var a;if(!await this.ensureThread())return null;let i=this.handle;if(!i)return null;let o=await this.request("POST",`/v1/conversations/${encodeURIComponent(i.conversationId)}/turns`,{body:{attachmentIds:r,body:e,pageContext:t},token:i.token});return (a=o==null?void 0:o.turn)!=null?a:null}async upload(e){if(!await this.ensureThread())return null;let t=this.handle;return t?this.fileRequest("POST",`/v1/conversations/${encodeURIComponent(t.conversationId)}/attachments?name=${encodeURIComponent(e.name)}`,t.token,async r=>JSON.parse(await r.text()),e):null}async file(e){let t=this.handle;return t?this.fileRequest("GET",e,t.token,r=>r.blob()):null}async load(){let e=this.handle;return e?this.request("GET",`/v1/conversations/${encodeURIComponent(e.conversationId)}`,{token:e.token}):null}readHandle(){var t,r;let e=(t=this.storage)==null?void 0:t.get(H);if(!e)return null;try{let i=JSON.parse(e);if(typeof i.conversationId=="string"&&typeof i.token=="string")return {conversationId:i.conversationId,token:i.token}}catch(i){}return (r=this.storage)==null||r.remove(H),null}async fileRequest(e,t,r,i,o){var s,c,p,d;let a={authorization:`Bearer ${this.options.apiKey}`,[D]:r};o&&(a["content-type"]=o.type||"application/octet-stream");try{let l=await this.fileFetchImpl(`${this.host}${t}`,{body:o,headers:a,method:e});if(l.ok)return await i(l);(c=(s=this.options).onError)==null||c.call(s,new Error(`prodantix chat ${t}: ${l.status}`));}catch(l){(d=(p=this.options).onError)==null||d.call(p,l);}return null}async request(e,t,r={}){var a,s,c,p,d,l;let i=this.fetchImpl;if(!i)return (s=(a=this.options).onError)==null||s.call(a,new Error("no fetch available for prodantix chat")),null;let o={authorization:`Bearer ${this.options.apiKey}`,"content-type":"application/json"};r.token&&(o[D]=r.token);try{let m=await i(`${this.host}${t}`,{body:r.body===void 0?void 0:JSON.stringify(r.body),headers:o,method:e}),g=await m.text();return m.ok?g?JSON.parse(g):{}:((p=(c=this.options).onError)==null||p.call(c,new Error(`prodantix chat ${t}: ${m.status}`)),null)}catch(m){return (l=(d=this.options).onError)==null||l.call(d,m),null}}};var de={Fri:"fri",Mon:"mon",Sat:"sat",Sun:"sun",Thu:"thu",Tue:"tue",Wed:"wed"};function _(n,e){var s,c,p,d,l,m;let t=new Intl.DateTimeFormat(void 0,{hour:"2-digit",hour12:false,minute:"2-digit",timeZone:n.timezone,weekday:"short"}).formatToParts(e),r=de[(c=(s=t.find(g=>g.type==="weekday"))==null?void 0:s.value)!=null?c:""];if(!r)return false;let i=(d=(p=t.find(g=>g.type==="hour"))==null?void 0:p.value)!=null?d:"",o=(m=(l=t.find(g=>g.type==="minute"))==null?void 0:l.value)!=null?m:"",a=`${i}:${o}`;return n.windows.some(g=>g.days.includes(r)&&g.open<=a&&a<g.close)}var k={bubbleFill:"filled",bubbleShape:"tailed",composerShape:"round",dayDividers:true,launcherContent:"glyph",launcherFill:"outlined",launcherShape:"circle",launcherSize:"small",nameAvatar:true,namePlacement:"hidden",skin:"standard",stampContent:"time",stampPlacement:"none"},pe=["quiet","standard"],ue=["round","square"],he=["rounded","tailed"],me=["filled","outlined"],ge=["circle","pill","squircle"],fe=["filled","outlined"],be=["avatar","glyph","team_faces"],xe=["large","medium","small"],ye=["above","hidden","inline"],ve=["beside_name","none","under_turn"],Se=["time","time_and_latency"],C=(n,e,t)=>typeof n=="string"&&e.includes(n)?n:t,G=(n,e)=>typeof n=="boolean"?n:e,ke={avatar_circle:["circle","outlined","avatar","large"],circle_filled:["circle","filled","glyph","medium"],circle_outlined:["circle","outlined","glyph","small"],pill_labelled:["pill","filled","glyph","medium"],pill_team:["pill","outlined","team_faces","medium"],squircle_filled:["squircle","filled","glyph","medium"]},Ce={above:["above",false],avatar_only:["hidden",true],gutter:["above",true],hidden:["hidden",false],inline:["inline",false]},Ee={cluster:[true,"none","time"],latency:[false,"beside_name","time_and_latency"],none:[false,"none","time"],trailing:[false,"under_turn","time"],with_name:[false,"beside_name","time"]},we={concierge:["standard","round"],console:["standard","square"],quiet:["quiet","square"]},Te={hairline:["rounded","outlined"],outlined:["rounded","outlined"],rounded:["rounded","filled"],tailed:["tailed","filled"]};function F(n){var g,v,S,f,b,u,x,E,y,w,z,B,K;let e=typeof n=="object"&&n!==null?n:{},t=typeof e.launcherStyle=="string"?e.launcherStyle:void 0,r=t===void 0?void 0:ke[t],i=typeof e.namePlacement=="string"?e.namePlacement:void 0,o=i===void 0?void 0:Ce[i],a=typeof e.timestampStyle=="string"?e.timestampStyle:void 0,s=a===void 0?void 0:Ee[a],c=typeof e.skin=="string"?e.skin:void 0,p=c===void 0?void 0:we[c],d=typeof e.bubbleStyle=="string"?e.bubbleStyle:void 0,l=d===void 0?void 0:Te[d],m={bubbleFill:C(e.bubbleFill,me,(g=l==null?void 0:l[1])!=null?g:k.bubbleFill),bubbleShape:C(e.bubbleShape,he,(v=l==null?void 0:l[0])!=null?v:k.bubbleShape),composerShape:C(e.composerShape,ue,(S=p==null?void 0:p[1])!=null?S:k.composerShape),dayDividers:G(e.dayDividers,(f=s==null?void 0:s[0])!=null?f:k.dayDividers),launcherContent:C(e.launcherContent,be,(b=r==null?void 0:r[2])!=null?b:k.launcherContent),launcherFill:C(e.launcherFill,fe,(u=r==null?void 0:r[1])!=null?u:k.launcherFill),launcherShape:C(e.launcherShape,ge,(x=r==null?void 0:r[0])!=null?x:k.launcherShape),launcherSize:C(e.launcherSize,xe,(E=r==null?void 0:r[3])!=null?E:k.launcherSize),nameAvatar:G(e.nameAvatar,(y=o==null?void 0:o[1])!=null?y:k.nameAvatar),namePlacement:C(e.namePlacement,ye,(w=o==null?void 0:o[0])!=null?w:k.namePlacement),skin:C(e.skin,pe,(z=p==null?void 0:p[0])!=null?z:k.skin),stampContent:C(e.stampContent,Se,(B=s==null?void 0:s[2])!=null?B:k.stampContent),stampPlacement:C(e.stampPlacement,ve,(K=s==null?void 0:s[1])!=null?K:k.stampPlacement)};return m.stampPlacement==="beside_name"&&m.namePlacement==="hidden"&&(m.stampPlacement="under_turn"),m}function q(n){var r,i,o,a;let e=n.split(/\s+/).filter(s=>s.length>0);return (e.length>1?`${(r=e[0])==null?void 0:r.slice(0,1)}${(i=e[1])==null?void 0:i.slice(0,1)}`:(a=(o=e[0])==null?void 0:o.slice(0,2))!=null?a:"").toUpperCase()}var Ae="M20 11.6a7.4 7.4 0 0 1-7.4 7.4H8.2L4 21.8l1-4.1A7.4 7.4 0 1 1 20 11.6Z",Le={large:66,medium:56,small:46},Pe={circle:"width:var(--fab-size);height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);",pill:"width:auto;height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);padding:0 22px;gap:10px;",squircle:"width:var(--fab-size);height:var(--fab-size);border-radius:16px;"},Ne={filled:"background:var(--a);color:#fff;",outlined:"background:var(--paper);border:1px solid var(--hairline);color:var(--ink-2);box-shadow:0 1px 2px rgba(0,0,0,.08);"},_e={avatar:"",glyph:".launcher svg{width:calc(var(--fab-size) * 0.375);height:calc(var(--fab-size) * 0.375);}",team_faces:".launcher .faces{display:flex;}.launcher .faces .av{box-shadow:0 0 0 2px var(--paper);}.launcher .faces .av+.av{margin-left:-10px;}"},Fe=".launcher .live{width:10px;height:10px;position:absolute;right:3px;bottom:3px;border-radius:50%;background:var(--online);box-shadow:0 0 0 2px var(--paper);}.launcher.closed .live{display:none}",Ie={circle:"",pill:".badge{position:static;box-shadow:none}",squircle:""},Me={filled:"",outlined:".badge{background:var(--a);top:-7px;right:-7px;min-width:19px;height:19px;font-size:11.5px}"},He={circle:"",pill:".launcher .label{font-size:14px;font-weight:600;white-space:nowrap;}",squircle:""},$e={circle:"",pill:"@media (max-width:480px){.launcher{width:var(--fab-size);padding:0}.launcher .label{display:none}}",squircle:""};function j(n,e,t,r){return `.launcher{--fab-size:${Le[r]}px;${Pe[n]}${Ne[e]}}${_e[t]}${Fe}${Ie[n]}${Me[e]}${He[n]}${$e[n]}`}function W(n,e,t,r=i=>i){let i=document.createDocumentFragment();if(n==="glyph"||t.length===0){let o=document.createElement("span");return o.innerHTML=`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="${Ae}"/></svg>`,i.append(...o.childNodes,$()),i}return n==="avatar"?(i.append(Y(t[0],e,r),$()),i):(i.append(R(t,e,r),$()),i)}function R(n,e,t=r=>r){let r=document.createElement("span");r.className="faces";for(let i of n.slice(0,2))r.append(Y(i,e,t));return r}function Y(n,e,t){let r=document.createElement("span");if(r.className="av",r.setAttribute("aria-hidden","true"),n&&(r.style.background=n.tone),n!=null&&n.avatarUrl){let i=document.createElement("img");return i.alt="",i.src=t(n.avatarUrl),r.append(i),r}return r.textContent=n?n.initials:e.agentLabel.slice(0,2).toUpperCase(),r}function $(){let n=document.createElement("span");return n.className="live",n.setAttribute("aria-hidden","true"),n}var Re={agentLabel:"Agent",aiLabel:"AI",attachLabel:"Attach a file",awayBody:"We are away right now, but we will reply as soon as we are back.",closeLabel:"Close chat",emptyBody:"We usually reply within a few minutes.",emptyTitle:"Ask us anything.",fileRefusal:(n,e)=>`That file is ${n}. Send a PNG, JPEG, WebP, GIF or PDF up to ${e}.`,inputPlaceholder:"Type a message",launcherLabel:"Chat with us",removeFileLabel:"Remove file",replyTime:"Usually replying in a few minutes",retryLabel:"Not delivered. Retry",sendLabel:"Send",timeLabel:n=>{let e=new Date(n);return Number.isNaN(e.getTime())?"":`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},title:"Support",unreadLabel:n=>`${n} unread`},T={accentColor:"#5b5bff",availability:{timezone:"UTC",windows:[]},awayMessage:"",greeting:"",launcherOffsetX:20,launcherOffsetY:20,launcherPosition:"bottom_right",starterPrompts:[],team:[],...k},Oe={quiet:".composer{position:relative;padding:8px 10px 10px}.composer input{padding-right:36px}.composer button{position:absolute;top:50%;right:14px;width:28px;min-width:28px;height:28px;padding:0;background:transparent;color:var(--ink);border-radius:7px;transform:translateY(-50%)}.composer button .sendglyph{display:block;width:16px;height:16px}.composer button .sendtext{display:none}.panel{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.12)}.header{background:var(--paper);color:var(--ink);height:44px;padding:0 8px 0 16px;border-bottom:1px solid var(--hairline)}.header h2{font-size:11px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3)}.header .faces,.header .status{display:none}.header .close{top:6px}.close{color:var(--ink-2)}",standard:".panel{border-radius:16px;box-shadow:0 16px 40px rgba(0,0,0,.2)}.header{background:var(--a);color:#fff;flex-direction:column;align-items:flex-start;gap:14px;padding:18px 14px 20px 20px}.header h2{font-size:19px;font-weight:640}"},Ue={round:".composer{padding:10px 10px 12px;gap:6px}.composer input{height:36px;border-radius:18px;padding:0 14px}.composer button{width:36px;min-width:36px;height:36px;padding:0;border-radius:18px}.composer button .sendglyph{display:block}.composer button .sendtext{display:none}",square:".composer input{height:36px;border-radius:8px;padding:0 12px}"},ze={rounded:".turn{border-radius:18px;padding:10px 15px}",tailed:".turn.agent,.turn.ai{border-radius:12px 12px 12px 4px}.turn.end_user{border-radius:12px 12px 4px 12px}"},Be={filled:"",outlined:".turn{background:none;border:1px solid var(--hairline)}.turn.end_user{background:none;border-color:var(--a);color:var(--ink)}"},Ke={above:"",hidden:".turn.agent .author,.turn.ai .author:not(.ai){display:none}",inline:".body .author.below{display:block;margin:4px 0 0;font-size:11.5px;font-weight:500;color:var(--ink-2);text-transform:none;letter-spacing:0;opacity:1}"},De=".turn.agent,.turn.ai{display:flex;gap:10px;max-width:100%;background:none;padding:0}.turn.agent .body,.turn.ai .body{background:var(--fill);padding:9px 13px;border-radius:inherit}.author{text-transform:none;letter-spacing:0;font-size:12.5px;font-weight:600;opacity:1}",Ge='.divider{display:flex;align-items:center;gap:10px;margin:0;font-size:11px;opacity:.6}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--hairline)}',qe={beside_name:".stamp{font-size:11px;opacity:.7;margin-left:6px}",none:"",under_turn:".stamp{display:block;font-size:11px;opacity:.7;margin-top:4px}.turn.end_user .stamp{text-align:right}"},je=".lat{font-size:11px;opacity:.7;margin-left:6px}",We=".att{display:block;width:180px;margin-bottom:6px;border-radius:8px;overflow:hidden}.att img{display:block;width:100%}.pdfc{display:inline-flex;gap:8px;align-items:center;margin-bottom:6px;padding:6px 8px;border-radius:8px;background:color-mix(in srgb,currentColor 16%,transparent);color:inherit;font-size:12.5px;text-decoration:none;overflow-wrap:anywhere}.pdfc b,.file b{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:4px;font-size:9px;letter-spacing:.04em;background:color-mix(in srgb,currentColor 22%,transparent)}.att:last-child,.pdfc:last-child{margin-bottom:0}";function Ye(n){let e=n==="round"?14:12;return `.field{position:relative;flex:1;min-width:0;display:flex}.composer .field input{padding-left:${e+26}px}.composer button.clip{position:absolute;top:50%;left:${e-5}px;right:auto;width:28px;min-width:28px;height:28px;padding:0;border-radius:7px;background:none;color:var(--ink-2);transform:translateY(-50%)}.composer button.clip:hover{background:color-mix(in srgb,currentColor 14%,transparent)}.clip svg{display:block;width:18px;height:18px}.file{display:inline-flex;gap:8px;align-items:center;align-self:flex-start;max-width:calc(100% - 20px);margin:0 10px 8px;padding:6px 10px 6px 6px;font-size:12.5px;color:var(--ink);border:1px solid var(--hairline);border-radius:8px}.file .th{flex:none;width:28px;height:28px;border-radius:4px;object-fit:cover}.file .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file .sz,.file .x{flex:none;color:var(--ink-3)}.file .x{margin-left:4px;padding:0;border:0;background:none;font:inherit;font-size:16px;line-height:1;cursor:pointer}.ferr{margin:0 10px 6px;font-size:12px;color:oklch(60% 0.2 27)}`}function O(n){return n<999500?`${Math.max(1,Math.round(n/1e3))} KB`:`${(n/1e6).toFixed(1)} MB`}var J=`--paper: oklch(24.6% 0.015 257); --ink: #fff; --ink-3: rgba(255,255,255,.55);
1
+ (function(){'use strict';var se=Object.defineProperty;var le=(n,e,t)=>e in n?se(n,e,{enumerable:true,configurable:true,writable:true,value:t}):n[e]=t;var m=(n,e,t)=>le(n,typeof e!="symbol"?e+"":e,t);function L(n){if(n)return n;let e=globalThis.fetch;if(typeof e=="function")return e.bind(globalThis)}function P(n){return n.replace(/\/+$/,"")}var K="X-Prodantix-Conversation-Token",H="prodantix.chat.handle";function ce(){let n=globalThis.localStorage;if(n)return {get:e=>n.getItem(e),remove:e=>n.removeItem(e),set:(e,t)=>n.setItem(e,t)}}var N=class{constructor(e){this.options=e;m(this,"fetchImpl");m(this,"fileFetchImpl");m(this,"host");m(this,"storage");m(this,"handle");m(this,"identity",null);var t,r;this.fetchImpl=L(e.fetchImpl),this.fileFetchImpl=(t=e.fileFetchImpl)!=null?t:((i,a)=>fetch(i,a)),this.host=P(e.host),this.storage=(r=e.storage)!=null?r:ce(),this.handle=this.readHandle();}get hasThread(){return this.handle!==null}avatarUrl(e){return e.startsWith("/")?`${this.host}${e}?api_key=${encodeURIComponent(this.options.apiKey)}`:e}get socketAuth(){return this.handle?{conversationId:this.handle.conversationId,conversationToken:this.handle.token,projectKey:this.options.apiKey}:null}identify(e){this.identity=e;}async ensureThread(e){var r,i,a;if(this.handle)return true;let t=await this.request("POST","/v1/conversations",{body:{distinctId:this.options.distinctId,subject:e,userHash:(r=this.identity)==null?void 0:r.userHash,userId:(i=this.identity)==null?void 0:i.userId}});return !(t!=null&&t.conversationId)||!t.token?false:(this.handle={conversationId:t.conversationId,token:t.token},(a=this.storage)==null||a.set(H,JSON.stringify(this.handle)),true)}async send(e,t,r){var o;if(!await this.ensureThread())return null;let i=this.handle;if(!i)return null;let a=await this.request("POST",`/v1/conversations/${encodeURIComponent(i.conversationId)}/turns`,{body:{attachmentIds:r,body:e,pageContext:t},token:i.token});return (o=a==null?void 0:a.turn)!=null?o:null}async upload(e){if(!await this.ensureThread())return null;let t=this.handle;return t?this.fileRequest("POST",`/v1/conversations/${encodeURIComponent(t.conversationId)}/attachments?name=${encodeURIComponent(e.name)}`,t.token,async r=>JSON.parse(await r.text()),e):null}async file(e){let t=this.handle;return t?this.fileRequest("GET",e,t.token,r=>r.blob()):null}async load(){let e=this.handle;return e?this.request("GET",`/v1/conversations/${encodeURIComponent(e.conversationId)}`,{token:e.token}):null}readHandle(){var t,r;let e=(t=this.storage)==null?void 0:t.get(H);if(!e)return null;try{let i=JSON.parse(e);if(typeof i.conversationId=="string"&&typeof i.token=="string")return {conversationId:i.conversationId,token:i.token}}catch(i){}return (r=this.storage)==null||r.remove(H),null}async fileRequest(e,t,r,i,a){var s,d,p,c;let o={authorization:`Bearer ${this.options.apiKey}`,[K]:r};a&&(o["content-type"]=a.type||"application/octet-stream");try{let l=await this.fileFetchImpl(`${this.host}${t}`,{body:a,headers:o,method:e});if(l.ok)return await i(l);(d=(s=this.options).onError)==null||d.call(s,new Error(`prodantix chat ${t}: ${l.status}`));}catch(l){(c=(p=this.options).onError)==null||c.call(p,l);}return null}async request(e,t,r={}){var o,s,d,p,c,l;let i=this.fetchImpl;if(!i)return (s=(o=this.options).onError)==null||s.call(o,new Error("no fetch available for prodantix chat")),null;let a={authorization:`Bearer ${this.options.apiKey}`,"content-type":"application/json"};r.token&&(a[K]=r.token);try{let h=await i(`${this.host}${t}`,{body:r.body===void 0?void 0:JSON.stringify(r.body),headers:a,method:e}),g=await h.text();return h.ok?g?JSON.parse(g):{}:((p=(d=this.options).onError)==null||p.call(d,new Error(`prodantix chat ${t}: ${h.status}`)),null)}catch(h){return (l=(c=this.options).onError)==null||l.call(c,h),null}}};var de={Fri:"fri",Mon:"mon",Sat:"sat",Sun:"sun",Thu:"thu",Tue:"tue",Wed:"wed"};function _(n,e){var s,d,p,c,l,h;let t=new Intl.DateTimeFormat(void 0,{hour:"2-digit",hour12:false,minute:"2-digit",timeZone:n.timezone,weekday:"short"}).formatToParts(e),r=de[(d=(s=t.find(g=>g.type==="weekday"))==null?void 0:s.value)!=null?d:""];if(!r)return false;let i=(c=(p=t.find(g=>g.type==="hour"))==null?void 0:p.value)!=null?c:"",a=(h=(l=t.find(g=>g.type==="minute"))==null?void 0:l.value)!=null?h:"",o=`${i}:${a}`;return n.windows.some(g=>g.days.includes(r)&&g.open<=o&&o<g.close)}var k={bubbleFill:"filled",bubbleShape:"tailed",composerShape:"round",dayDividers:true,launcherContent:"glyph",launcherFill:"outlined",launcherShape:"circle",launcherSize:"small",nameAvatar:true,namePlacement:"hidden",skin:"standard",stampContent:"time",stampPlacement:"none"},pe=["quiet","standard"],ue=["round","square"],he=["rounded","tailed"],me=["filled","outlined"],ge=["circle","pill","squircle"],fe=["filled","outlined"],be=["avatar","glyph","team_faces"],xe=["large","medium","small"],ye=["above","hidden","inline"],ve=["beside_name","none","under_turn"],Se=["time","time_and_latency"],C=(n,e,t)=>typeof n=="string"&&e.includes(n)?n:t,G=(n,e)=>typeof n=="boolean"?n:e,ke={avatar_circle:["circle","outlined","avatar","large"],circle_filled:["circle","filled","glyph","medium"],circle_outlined:["circle","outlined","glyph","small"],pill_labelled:["pill","filled","glyph","medium"],pill_team:["pill","outlined","team_faces","medium"],squircle_filled:["squircle","filled","glyph","medium"]},Ce={above:["above",false],avatar_only:["hidden",true],gutter:["above",true],hidden:["hidden",false],inline:["inline",false]},Ee={cluster:[true,"none","time"],latency:[false,"beside_name","time_and_latency"],none:[false,"none","time"],trailing:[false,"under_turn","time"],with_name:[false,"beside_name","time"]},we={concierge:["standard","round"],console:["standard","square"],quiet:["quiet","square"]},Te={hairline:["rounded","outlined"],outlined:["rounded","outlined"],rounded:["rounded","filled"],tailed:["tailed","filled"]};function F(n){var g,v,S,f,b,u,x,E,y,w,z,B,D;let e=typeof n=="object"&&n!==null?n:{},t=typeof e.launcherStyle=="string"?e.launcherStyle:void 0,r=t===void 0?void 0:ke[t],i=typeof e.namePlacement=="string"?e.namePlacement:void 0,a=i===void 0?void 0:Ce[i],o=typeof e.timestampStyle=="string"?e.timestampStyle:void 0,s=o===void 0?void 0:Ee[o],d=typeof e.skin=="string"?e.skin:void 0,p=d===void 0?void 0:we[d],c=typeof e.bubbleStyle=="string"?e.bubbleStyle:void 0,l=c===void 0?void 0:Te[c],h={bubbleFill:C(e.bubbleFill,me,(g=l==null?void 0:l[1])!=null?g:k.bubbleFill),bubbleShape:C(e.bubbleShape,he,(v=l==null?void 0:l[0])!=null?v:k.bubbleShape),composerShape:C(e.composerShape,ue,(S=p==null?void 0:p[1])!=null?S:k.composerShape),dayDividers:G(e.dayDividers,(f=s==null?void 0:s[0])!=null?f:k.dayDividers),launcherContent:C(e.launcherContent,be,(b=r==null?void 0:r[2])!=null?b:k.launcherContent),launcherFill:C(e.launcherFill,fe,(u=r==null?void 0:r[1])!=null?u:k.launcherFill),launcherShape:C(e.launcherShape,ge,(x=r==null?void 0:r[0])!=null?x:k.launcherShape),launcherSize:C(e.launcherSize,xe,(E=r==null?void 0:r[3])!=null?E:k.launcherSize),nameAvatar:G(e.nameAvatar,(y=a==null?void 0:a[1])!=null?y:k.nameAvatar),namePlacement:C(e.namePlacement,ye,(w=a==null?void 0:a[0])!=null?w:k.namePlacement),skin:C(e.skin,pe,(z=p==null?void 0:p[0])!=null?z:k.skin),stampContent:C(e.stampContent,Se,(B=s==null?void 0:s[2])!=null?B:k.stampContent),stampPlacement:C(e.stampPlacement,ve,(D=s==null?void 0:s[1])!=null?D:k.stampPlacement)};return h.stampPlacement==="beside_name"&&h.namePlacement==="hidden"&&(h.stampPlacement="under_turn"),h}function q(n){var r,i,a,o;let e=n.split(/\s+/).filter(s=>s.length>0);return (e.length>1?`${(r=e[0])==null?void 0:r.slice(0,1)}${(i=e[1])==null?void 0:i.slice(0,1)}`:(o=(a=e[0])==null?void 0:a.slice(0,2))!=null?o:"").toUpperCase()}var Ae="M20 11.6a7.4 7.4 0 0 1-7.4 7.4H8.2L4 21.8l1-4.1A7.4 7.4 0 1 1 20 11.6Z",Le={large:66,medium:56,small:46},Pe={circle:"width:var(--fab-size);height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);",pill:"width:auto;height:var(--fab-size);border-radius:calc(var(--fab-size) / 2);padding:0 22px;gap:10px;",squircle:"width:var(--fab-size);height:var(--fab-size);border-radius:16px;"},Ne={filled:"background:var(--a);color:#fff;",outlined:"background:var(--paper);border:1px solid var(--hairline);color:var(--ink-2);box-shadow:0 1px 2px rgba(0,0,0,.08);"},_e={avatar:"",glyph:".launcher svg{width:calc(var(--fab-size) * 0.375);height:calc(var(--fab-size) * 0.375);}",team_faces:".launcher .faces{display:flex;}.launcher .faces .av{box-shadow:0 0 0 2px var(--paper);}.launcher .faces .av+.av{margin-left:-10px;}"},Fe=".launcher .live{width:10px;height:10px;position:absolute;right:3px;bottom:3px;border-radius:50%;background:var(--online);box-shadow:0 0 0 2px var(--paper);}.launcher.closed .live{display:none}",Ie={circle:"",pill:".badge{position:static;box-shadow:none}",squircle:""},Me={filled:"",outlined:".badge{background:var(--a);top:-7px;right:-7px;min-width:19px;height:19px;font-size:11.5px}"},He={circle:"",pill:".launcher .label{font-size:14px;font-weight:600;white-space:nowrap;}",squircle:""},$e={circle:"",pill:"@media (max-width:480px){.launcher{width:var(--fab-size);padding:0}.launcher .label{display:none}}",squircle:""};function j(n,e,t,r){return `.launcher{--fab-size:${Le[r]}px;${Pe[n]}${Ne[e]}}${_e[t]}${Fe}${Ie[n]}${Me[e]}${He[n]}${$e[n]}`}function W(n,e,t,r=i=>i){let i=document.createDocumentFragment();if(n==="glyph"||t.length===0){let a=document.createElement("span");return a.innerHTML=`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="${Ae}"/></svg>`,i.append(...a.childNodes,$()),i}return n==="avatar"?(i.append(Y(t[0],e,r),$()),i):(i.append(R(t,e,r),$()),i)}function R(n,e,t=r=>r){let r=document.createElement("span");r.className="faces";for(let i of n.slice(0,2))r.append(Y(i,e,t));return r}function Y(n,e,t){let r=document.createElement("span");if(r.className="av",r.setAttribute("aria-hidden","true"),n&&(r.style.background=n.tone),n!=null&&n.avatarUrl){let i=document.createElement("img");return i.alt="",i.src=t(n.avatarUrl),r.append(i),r}return r.textContent=n?n.initials:e.agentLabel.slice(0,2).toUpperCase(),r}function $(){let n=document.createElement("span");return n.className="live",n.setAttribute("aria-hidden","true"),n}var Re={agentLabel:"Agent",aiLabel:"AI",attachLabel:"Attach a file",awayBody:"We are away right now, but we will reply as soon as we are back.",closeLabel:"Close chat",emptyBody:"We usually reply within a few minutes.",emptyTitle:"Ask us anything.",fileRefusal:(n,e)=>`That file is ${n}. Send a PNG, JPEG, WebP, GIF or PDF up to ${e}.`,inputPlaceholder:"Type a message",launcherLabel:"Chat with us",removeFileLabel:"Remove file",replyTime:"Usually replying in a few minutes",retryLabel:"Not delivered. Retry",sendLabel:"Send",timeLabel:n=>{let e=new Date(n);return Number.isNaN(e.getTime())?"":`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`},title:"Support",unreadLabel:n=>`${n} unread`},T={accentColor:"#5b5bff",availability:{timezone:"UTC",windows:[]},awayMessage:"",greeting:"",launcherOffsetX:20,launcherOffsetY:20,launcherPosition:"bottom_right",starterPrompts:[],team:[],...k},Oe={quiet:".composer{position:relative;padding:8px 10px 10px}.composer input{padding-right:36px}.composer button{position:absolute;top:50%;right:14px;width:28px;min-width:28px;height:28px;padding:0;background:transparent;color:var(--ink);border-radius:7px;transform:translateY(-50%)}.composer button .sendglyph{display:block;width:16px;height:16px}.composer button .sendtext{display:none}.panel{border-radius:8px;box-shadow:0 2px 8px rgba(0,0,0,.12)}.header{background:var(--paper);color:var(--ink);height:44px;padding:0 8px 0 16px;border-bottom:1px solid var(--hairline)}.header h2{font-size:11px;letter-spacing:.11em;text-transform:uppercase;color:var(--ink-3)}.header .faces,.header .status{display:none}.header .close{top:6px}.close{color:var(--ink-2)}",standard:".panel{border-radius:16px;box-shadow:0 16px 40px rgba(0,0,0,.2)}.header{background:var(--a);color:#fff;flex-direction:column;align-items:flex-start;gap:14px;padding:18px 14px 20px 20px}.header h2{font-size:19px;font-weight:640}"},Ue={round:".composer{padding:10px 10px 12px;gap:6px}.composer input{height:36px;border-radius:18px;padding:0 14px}.composer button{width:36px;min-width:36px;height:36px;padding:0;border-radius:18px}.composer button .sendglyph{display:block}.composer button .sendtext{display:none}",square:".composer input{height:36px;border-radius:8px;padding:0 12px}"},ze={rounded:".turn{border-radius:18px;padding:10px 15px}",tailed:".turn.agent,.turn.ai{border-radius:12px 12px 12px 4px}.turn.end_user{border-radius:12px 12px 4px 12px}"},Be={filled:"",outlined:".turn{background:none;border:1px solid var(--hairline)}.turn.end_user{background:none;border-color:var(--a);color:var(--ink)}"},De={above:"",hidden:".turn.agent .author,.turn.ai .author:not(.ai){display:none}",inline:".body .author.below{display:block;margin:4px 0 0;font-size:11.5px;font-weight:500;color:var(--ink-2);text-transform:none;letter-spacing:0;opacity:1}"},Ke=".turn.agent,.turn.ai{display:flex;gap:10px;max-width:100%;background:none;padding:0}.turn.agent .body,.turn.ai .body{background:var(--fill);padding:9px 13px;border-radius:inherit}.author{text-transform:none;letter-spacing:0;font-size:12.5px;font-weight:600;opacity:1}",Ge='.divider{display:flex;align-items:center;gap:10px;margin:0;font-size:11px;opacity:.6}.divider:before,.divider:after{content:"";flex:1;height:1px;background:var(--hairline)}',qe={beside_name:".stamp{font-size:11px;opacity:.7;margin-left:6px}",none:"",under_turn:".stamp{display:block;font-size:11px;opacity:.7;margin-top:4px}.turn.end_user .stamp{text-align:right}"},je=".lat{font-size:11px;opacity:.7;margin-left:6px}",We=".att{display:block;width:180px;margin-bottom:6px;border-radius:8px;overflow:hidden}.att img{display:block;width:100%}.pdfc{display:inline-flex;gap:8px;align-items:center;margin-bottom:6px;padding:6px 8px;border-radius:8px;background:color-mix(in srgb,currentColor 16%,transparent);color:inherit;font-size:12.5px;text-decoration:none;overflow-wrap:anywhere}.pdfc b,.file b{flex:none;display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:4px;font-size:9px;letter-spacing:.04em;background:color-mix(in srgb,currentColor 22%,transparent)}.att:last-child,.pdfc:last-child{margin-bottom:0}";function Ye(n){let e=n==="round"?14:12;return `.field{position:relative;flex:1;min-width:0;display:flex}.composer .field input{padding-left:${e+26}px}.composer button.clip{position:absolute;top:50%;left:${e-5}px;right:auto;width:28px;min-width:28px;height:28px;padding:0;border-radius:7px;background:none;color:var(--ink-2);transform:translateY(-50%)}.composer button.clip:hover{background:color-mix(in srgb,currentColor 14%,transparent)}.clip svg{display:block;width:18px;height:18px}.file{display:inline-flex;gap:8px;align-items:center;align-self:flex-start;max-width:calc(100% - 20px);margin:0 10px 8px;padding:6px 10px 6px 6px;font-size:12.5px;color:var(--ink);border:1px solid var(--hairline);border-radius:8px}.file .th{flex:none;width:28px;height:28px;border-radius:4px;object-fit:cover}.file .name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file .sz,.file .x{flex:none;color:var(--ink-3)}.file .x{margin-left:4px;padding:0;border:0;background:none;font:inherit;font-size:16px;line-height:1;cursor:pointer}.ferr{margin:0 10px 6px;font-size:12px;color:oklch(60% 0.2 27)}`}function O(n){return n<999500?`${Math.max(1,Math.round(n/1e3))} KB`:`${(n/1e6).toFixed(1)} MB`}var J=`--paper: oklch(24.6% 0.015 257); --ink: #fff; --ink-3: rgba(255,255,255,.55);
2
2
  --fill: rgba(255,255,255,.06); --hairline: rgba(255,255,255,.13); --ink-2: rgba(255,255,255,.70);
3
3
  --online: oklch(72% 0.13 163.23);`;function Je(n){return n==="light"?"":n==="dark"?`:host { ${J} }`:`@media (prefers-color-scheme: dark) {
4
4
  :host {
5
5
  ${J}
6
6
  }
7
- }`}var Xe=/https?:\/\/[^\s<>"]+/g,Ve=/[.,;:!?)]$/,Qe=n=>{let e=n;for(;Ve.test(e);){let t=e.split("(").length-1,r=e.split(")").length-1;if(e.endsWith(")")&&t>=r)break;e=e.slice(0,-1);}return e};function Ze(n,e){var r;let t=0;for(let i of e.matchAll(Xe)){let o=(r=i.index)!=null?r:0,a=Qe(i[0]);o>t&&n.append(e.slice(t,o));let s=document.createElement("a");s.href=a,s.target="_blank",s.rel="noopener noreferrer",s.textContent=a,n.append(s),t=o+a.length;}t<e.length&&n.append(e.slice(t));}function X(n,e="system"){var a;let t=F(n),r=n.launcherPosition==="bottom_left"?"left":"right",i=n.accentColor;return `${`
7
+ }`}var Xe=/https?:\/\/[^\s<>"]+/g,Ve=/[.,;:!?)]$/,Qe=n=>{let e=n;for(;Ve.test(e);){let t=e.split("(").length-1,r=e.split(")").length-1;if(e.endsWith(")")&&t>=r)break;e=e.slice(0,-1);}return e};function Ze(n,e){var r;let t=0;for(let i of e.matchAll(Xe)){let a=(r=i.index)!=null?r:0,o=Qe(i[0]);a>t&&n.append(e.slice(t,a));let s=document.createElement("a");s.href=o,s.target="_blank",s.rel="noopener noreferrer",s.textContent=o,n.append(s),t=a+o.length;}t<e.length&&n.append(e.slice(t));}var et=["P","BR","STRONG","EM","A","UL","OL","LI"],tt=n=>typeof n=="object"&&n!==null&&"html"in n&&typeof n.html=="string"&&"text"in n&&typeof n.text=="string",nt=(n,e)=>e.name==="class"||e.name==="data-block-type"?true:n!=="A"?false:e.name==="target"||e.name==="rel"?true:e.name==="href"&&/^https?:\/\//i.test(e.value.trim()),rt=n=>[...n.querySelectorAll("*")].every(e=>et.includes(e.tagName)&&[...e.attributes].every(t=>nt(e.tagName,t)));function X(n,e="system"){var o;let t=F(n),r=n.launcherPosition==="bottom_left"?"left":"right",i=n.accentColor;return `${`
8
8
  :host {
9
9
  all: initial; z-index: 2147483000; --a: ${i};
10
10
  --paper: #fff; --ink: #0f172a; --ink-3: rgba(0,0,0,.55);
@@ -73,13 +73,20 @@ ${Je(e)}
73
73
  .awayglyph { flex: none; width: 16px; height: 16px; margin-top: 1px; border: 1.5px solid currentColor; border-radius: 50%; }
74
74
  .empty { display: flex; flex-direction: column; gap: 8px; padding: 20px 16px; }
75
75
  .empty h3 { margin: 0; font-size: 18px; font-weight: 640; letter-spacing: -.015em; }
76
- .empty p { margin: 0 0 8px; font-size: 13.5px; color: var(--ink-2); }
76
+ .empty > p { margin: 0 0 8px; font-size: 13.5px; color: var(--ink-2); }
77
77
  .prompt {
78
- display: flex; align-items: center; min-height: 44px; padding: 0 14px; text-align: left;
78
+ position: relative; display: flex; align-items: center; min-height: 44px; padding: 10px 14px; text-align: left;
79
79
  font-family: inherit; font-size: 13.5px; font-weight: 500; color: var(--ink);
80
80
  background: none; border: 1px solid var(--hairline); border-radius: 8px; cursor: pointer;
81
81
  }
82
- .prompt:focus-visible { outline: 2px solid ${i}; outline-offset: 2px; }
82
+ .promptwords { min-width: 0; overflow-wrap: anywhere; }
83
+ .promptwords > :last-child { margin-bottom: 0; }
84
+ .prompt p { margin: 0 0 16px; line-height: 1.6; }
85
+ .prompt ul, .prompt ol { margin: 0 0 16px; padding-left: 32px; }
86
+ .prompt li { margin: 8px 0; line-height: 1.6; }
87
+ .prompt a { position: relative; z-index: 1; color: ${i}; text-decoration: underline; overflow-wrap: anywhere; }
88
+ .promptpress { position: absolute; inset: 0; padding: 0; background: none; border: 0; border-radius: inherit; cursor: pointer; }
89
+ .promptpress:focus-visible { outline: 2px solid ${i}; outline-offset: 2px; }
83
90
  .av { width: 30px; height: 30px; border-radius: 50%; flex: none; display: inline-flex; align-items: center; justify-content: center; font-size: 11.5px; font-weight: 650; color: #fff; background: oklch(52% 0.17 22); }
84
91
  .av.bot { border-radius: 9px; background: var(--fill); color: var(--ink); }
85
92
  .av img { width: 100%; height: 100%; display: block; object-fit: cover; border-radius: inherit; }
@@ -95,5 +102,5 @@ ${Je(e)}
95
102
  .panel { animation: rise 180ms ease-out; }
96
103
  @keyframes rise { from { transform: translateY(8px); opacity: 0; } to { transform: none; opacity: 1; } }
97
104
  }
98
- `}${Ue[t.composerShape]}${Oe[t.skin]}${j(t.launcherShape,t.launcherFill,t.launcherContent,t.launcherSize)}${ze[t.bubbleShape]}${Be[t.bubbleFill]}${Ke[t.namePlacement]}${t.nameAvatar?De:""}${t.dayDividers?Ge:""}${qe[t.stampPlacement]}${t.stampContent==="time_and_latency"?je:""}${We}${(a=n.attachments)!=null&&a.enabled?Ye(t.composerShape):""}`}var et=["end_user","agent","ai"];function tt(){let n=globalThis.location;if(n)return {host:n.host,path:n.pathname,title:document.title}}var nt='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m16.5 6.5-7.8 7.8a2.1 2.1 0 0 0 3 3l8.1-8.1a4.2 4.2 0 0 0-6-6L5.7 11.3a6.3 6.3 0 0 0 8.9 8.9l6.6-6.6"/></svg>',rt='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.88 9.29 12 13.17 8.12 9.29a.996.996 0 0 0-1.41 0c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0l4.59-4.59c.39-.39.39-1.02 0-1.41-.39-.38-1.03-.39-1.42 0"/></svg>',I=class{constructor(e,t,r={},i={},o={}){this.host=e;this.client=t;h(this,"root");h(this,"strings");h(this,"settings");h(this,"appearance");h(this,"launcher");h(this,"badge");h(this,"panel",null);h(this,"lastFocused",null);h(this,"unread",0);h(this,"pendingTurns",0);h(this,"openNow");h(this,"style");h(this,"scheme");h(this,"picked",null);h(this,"objectUrls",[]);var a;this.strings={...Re,...r},this.appearance={...T,...i},this.settings=F({...T,...i}),this.root=e.attachShadow({mode:(a=o.shadowMode)!=null?a:"closed"}),this.openNow=_(this.appearance.availability,new Date),this.scheme=o.scheme,this.style=document.createElement("style"),this.style.textContent=X(this.appearance,this.scheme),this.root.append(this.style),this.launcher=document.createElement("button"),this.launcher.className="launcher",this.launcher.type="button",this.launcher.setAttribute("aria-haspopup","dialog"),this.launcher.addEventListener("click",()=>this.toggle()),this.badge=document.createElement("span"),this.badge.className="badge",this.badge.hidden=true,this.drawLauncher(),this.root.append(this.launcher);}drawLauncher(){if(this.launcher.setAttribute("aria-label",this.strings.launcherLabel),this.launcher.replaceChildren(),this.launcher.append(W(this.settings.launcherContent,this.strings,this.appearance.team,e=>this.client.avatarUrl(e))),this.settings.launcherShape==="pill"){let e=document.createElement("span");e.className="label",e.textContent=this.settings.launcherContent==="team_faces"?this.strings.agentLabel:this.strings.launcherLabel,this.launcher.append(e);}this.launcher.append(this.badge),this.launcher.classList.toggle("closed",!this.openNow);}update(e,t){this.appearance={...T,...e},this.settings=F(this.appearance),t!==void 0&&(this.scheme=t),this.style.textContent=X(this.appearance,this.scheme),this.drawLauncher(),this.panel&&(this.close(),this.open());}toggle(){this.panel?this.close():this.open();}setOpenNow(e){var t;this.openNow=e,this.launcher.classList.toggle("closed",!e),(t=this.panel)==null||t.classList.toggle("closed",!e);}async open(){var f;if(this.panel)return;this.lastFocused=this.host.ownerDocument.activeElement,this.unread=0,this.renderBadge();let e=document.createElement("section");e.className=this.openNow?"panel":"panel closed",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label",this.strings.title);let t=document.createElement("div");t.className="header";let r=(f=this.appearance.team)!=null?f:[];r.length>0&&t.append(R(r,this.strings,b=>this.client.avatarUrl(b)));let i=document.createElement("div");i.className="headmain";let o=document.createElement("h2");o.textContent=this.strings.title;let a=document.createElement("p");a.className="status";let s=document.createElement("span");s.className="live",s.setAttribute("aria-hidden","true"),a.append(s,this.strings.replyTime),i.append(o,a);let c=document.createElement("button");c.className="close",c.type="button",c.setAttribute("aria-label",this.strings.closeLabel),c.innerHTML=rt,c.addEventListener("click",()=>this.close()),t.append(i,c);let p=document.createElement("div");p.className="log",p.setAttribute("role","log"),p.setAttribute("aria-live","polite"),p.setAttribute("aria-label",this.strings.title);let d=document.createElement("form");d.className="composer";let l=document.createElement("input");l.type="text",l.setAttribute("aria-label",this.strings.inputPlaceholder),l.placeholder=this.strings.inputPlaceholder;let m=document.createElement("button");m.type="submit",m.setAttribute("aria-label",this.strings.sendLabel),m.innerHTML='<svg class="sendglyph" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 12 20 4.5 15 20l-3.6-5.4L4.5 12Z"/></svg>';let g=document.createElement("span");g.className="sendtext",g.textContent=this.strings.sendLabel,m.append(g);let v=this.appearance.attachments;if(v!=null&&v.enabled&&this.client.upload){let b=document.createElement("span");b.className="field";let u=document.createElement("input");u.type="file",u.accept=v.accept.join(","),u.hidden=true,u.addEventListener("change",()=>{var y;let E=(y=u.files)==null?void 0:y[0];u.value="",E&&this.pick(p,d,v,E);});let x=document.createElement("button");x.type="button",x.className="clip",x.setAttribute("aria-label",this.strings.attachLabel),x.innerHTML=nt,x.addEventListener("click",()=>u.click()),b.append(x,l,u),d.append(b,m);}else d.append(l,m);d.addEventListener("submit",b=>{b.preventDefault(),this.submit(l,p);}),e.append(t,p,d),e.addEventListener("keydown",b=>this.onKeydown(b,e,c)),this.root.append(e),this.panel=e,l.focus();let S=await this.client.load();S&&S.turns.length>0?this.renderThread(p,S):this.renderFirstRun(p,l),this.openNow||this.renderAway(t);}renderFirstRun(e,t){let r=document.createElement("div");r.className="empty";let i=document.createElement("h3");i.textContent=this.appearance.greeting.trim()||this.strings.emptyTitle;let o=document.createElement("p");o.textContent=this.strings.emptyBody,r.append(i,o);for(let a of this.appearance.starterPrompts){let s=document.createElement("button");s.className="prompt",s.type="button",s.textContent=a,s.addEventListener("click",()=>{t.value=a,this.submit(t,e);}),r.append(s);}e.replaceChildren(r);}renderAway(e){let t=document.createElement("div");t.className="away";let r=document.createElement("span");r.className="awayglyph",r.setAttribute("aria-hidden","true");let i=document.createElement("span");i.textContent=this.appearance.awayMessage.trim()||this.strings.awayBody,t.append(r,i),e.after(t);}pick(e,t,r,i){let o=i.size>r.maxBytes||!r.accept.includes(i.type);for(let l of this.root.querySelectorAll(o?".ferr":".file,.ferr"))l.remove();if(o){let l=document.createElement("p");l.className="ferr",l.setAttribute("role","alert"),l.textContent=this.strings.fileRefusal(O(i.size),`${r.maxBytes/1e6} MB`),t.before(l),e.scrollTop=e.scrollHeight;return}this.picked=i;let a=document.createElement("span");a.className="file";let s;if(i.type==="application/pdf")s=document.createElement("b"),s.textContent="PDF";else {let l=document.createElement("img");l.className="th",l.alt="",l.src=this.objectUrl(i),s=l;}let c=document.createElement("span");c.className="name",c.textContent=i.name;let p=document.createElement("span");p.className="sz",p.textContent=`\xB7 ${O(i.size)}`;let d=document.createElement("button");d.type="button",d.className="x",d.setAttribute("aria-label",this.strings.removeFileLabel),d.textContent="\xD7",d.addEventListener("click",()=>{this.picked=null,a.remove();}),a.append(s,c,p,d),t.before(a),e.scrollTop=e.scrollHeight;}objectUrl(e){let t=URL.createObjectURL(e);return this.objectUrls.push(t),t}close(){if(this.panel){this.panel.remove(),this.panel=null,this.picked=null;for(let e of this.objectUrls)URL.revokeObjectURL(e);this.objectUrls=[],this.lastFocused instanceof HTMLElement?this.lastFocused.focus():this.launcher.focus();}}onIncomingTurn(e){if(this.panel){let t=this.panel.querySelector(".log");t instanceof HTMLElement&&!this.hasTurn(t,e.id)&&this.appendTurn(t,e);return}e.authorKind!=="end_user"&&(this.unread+=1,this.renderBadge());}async submit(e,t){let r=e.value.trim(),i=this.picked;if(!(!r&&!i)){e.value="",this.picked=null;for(let o of this.root.querySelectorAll(".file,.ferr"))o.remove();await this.sendBody(t,r,i);}}async sendBody(e,t,r=null){var s,c,p;(s=e.querySelector(".empty"))==null||s.remove(),this.pendingTurns+=1;let i=this.appendTurn(e,{authorId:null,authorKind:"end_user",body:t,createdAt:new Date().toISOString(),id:`pending-${this.pendingTurns}`},r);i.setAttribute("data-pending","");let o=r?await((p=(c=this.client).upload)==null?void 0:p.call(c,r)):void 0,a=o===null?null:await this.client.send(t,tt(),o?[o.id]:void 0);if(i.removeAttribute("data-pending"),a){i.dataset.turnId=a.id;return}this.markFailed(e,i,t,r);}markFailed(e,t,r,i){var a;t.setAttribute("data-failed","");let o=document.createElement("button");o.type="button",o.className="retry",o.textContent=this.strings.retryLabel,o.addEventListener("click",()=>{t.remove(),this.sendBody(e,r,i);}),((a=t.querySelector(".body"))!=null?a:t).append(o);}hasTurn(e,t){for(let r of e.children)if(r instanceof HTMLElement&&r.dataset.turnId===t)return true;return false}renderThread(e,t){e.replaceChildren();for(let r of t.turns)this.appendTurn(e,r);}appendTurn(e,t,r=null){var l,m,g,v,S,f,b;(l=e.querySelector(".empty"))==null||l.remove();let i=et.includes(t.authorKind)?t.authorKind:"agent",o=this.settings,a=document.createElement("div");if(a.className=`turn ${i}`,a.dataset.turnId=t.id,i!=="end_user"&&o.nameAvatar){let u=document.createElement("span");if(u.className=i==="ai"?"av bot":"av",u.setAttribute("aria-hidden","true"),i==="agent"&&t.authorAvatarUrl){let x=document.createElement("img");x.alt="",x.src=this.client.avatarUrl(t.authorAvatarUrl),u.append(x);}else {u.textContent=i==="ai"?this.strings.aiLabel:q(this.agentName(t));let x=i==="agent"?(g=(m=this.appearance.team)==null?void 0:m.find(E=>E.name===t.authorName))==null?void 0:g.tone:void 0;x&&(u.style.background=x);}a.append(u);}let c=document.createElement("div");if(c.className="body",i==="end_user"){r&&this.drawFile(c,r.name,r.type,r.size,Promise.resolve(r));for(let u of (v=t.attachments)!=null?v:[])this.drawFile(c,u.name,u.contentType,u.bytes,(b=(f=(S=this.client).file)==null?void 0:f.call(S,u.url))!=null?b:Promise.resolve(null));}let p=i!=="end_user"&&o.namePlacement!=="hidden",d=document.createElement("div");if(i==="ai"?Ze(d,t.body):d.textContent=t.body,p||i==="ai"&&o.namePlacement==="hidden"){let u=document.createElement("div");u.className=i==="ai"?"author ai":"author",u.textContent=i==="ai"?this.strings.aiLabel:this.agentName(t),o.stampPlacement==="beside_name"&&u.append(this.stamp(t)),o.namePlacement==="inline"?(u.classList.add("below"),c.append(d,u)):c.append(u,d);}else t.body&&c.append(d);return o.stampPlacement==="under_turn"&&c.append(this.stamp(t)),a.append(c),e.append(a),e.scrollTop=e.scrollHeight,a}drawFile(e,t,r,i,o){let a=document.createElement("a");if(r==="application/pdf"){a.className="pdfc",a.download=t;let s=document.createElement("b");s.textContent="PDF",a.append(s,`${t} \xB7 ${O(i)}`);}else {a.className="att",a.target="_blank",a.rel="noopener noreferrer";let s=document.createElement("img");s.alt=t,s.addEventListener("load",()=>{let c=a.closest(".log");c&&(c.scrollTop=c.scrollHeight);}),a.append(s);}e.append(a),o.then(s=>{var c;s&&(a.href=this.objectUrl(s),(c=a.querySelector("img"))==null||c.setAttribute("src",a.href));});}agentName(e){return e.authorName||this.strings.agentLabel}stamp(e){let t=document.createElement("span");return t.className="stamp",t.textContent=this.strings.timeLabel(e.createdAt),t}onKeydown(e,t,r){if(e.key==="Escape"){e.preventDefault(),this.close();return}if(e.key!=="Tab")return;let i=t.querySelectorAll('button, input, [tabindex]:not([tabindex="-1"])');if(i.length===0)return;let o=i[0],a=i[i.length-1],s=this.root.activeElement;e.shiftKey&&s===o?(e.preventDefault(),a.focus()):!e.shiftKey&&s===a?(e.preventDefault(),o.focus()):s===null&&(e.preventDefault(),r.focus());}renderBadge(){this.unread>0?(this.badge.hidden=false,this.badge.textContent=String(this.unread),this.launcher.setAttribute("aria-label",`${this.strings.launcherLabel}, ${this.strings.unreadLabel(this.unread)}`)):(this.badge.hidden=true,this.badge.textContent="",this.launcher.setAttribute("aria-label",this.strings.launcherLabel));}};function V(n){return `40${JSON.stringify(n)}`}function Q(){return "3"}function Z(n){let e=n.charAt(0),t=n.slice(1);if(e==="2")return {kind:"ping"};if(e==="1")return {kind:"disconnect"};if(e==="0"){let a=U(t);return {kind:"open",pingInterval:typeof(a==null?void 0:a.pingInterval)=="number"?a.pingInterval:25e3,pingTimeout:typeof(a==null?void 0:a.pingTimeout)=="number"?a.pingTimeout:2e4}}if(e!=="4")return {kind:"other"};let r=t.charAt(0),i=t.slice(1);if(r==="0")return {kind:"connected"};if(r==="1")return {kind:"disconnect"};if(r==="4"){let a=U(i);return {kind:"connectError",message:typeof(a==null?void 0:a.message)=="string"?a.message:"refused"}}if(r!=="2")return {kind:"other"};let o=U(i);return !Array.isArray(o)||typeof o[0]!="string"?{kind:"other"}:{kind:"event",name:o[0],payload:o[1]}}function U(n){try{return JSON.parse(n)}catch(e){return null}}var it="/socket.io/?EIO=4&transport=websocket",M=class{constructor(e){this.options=e;h(this,"socket",null);h(this,"heartbeat",null);h(this,"ready",false);h(this,"closed",false);h(this,"heartbeatWindow",45e3);h(this,"factory");h(this,"setTimer");h(this,"clearTimer");var t,r,i;this.factory=(t=e.socketFactory)!=null?t:at,this.setTimer=(r=e.setTimer)!=null?r:((o,a)=>setTimeout(o,a)),this.clearTimer=(i=e.clearTimer)!=null?i:(o=>clearTimeout(o));}open(){if(this.socket||this.closed)return;let e=`${this.options.host.replace(/^http/,"ws").replace(/\/+$/,"")}${it}`,t;try{t=this.factory(e);}catch(r){this.options.onClosed(false);return}this.socket=t,t.onmessage=r=>this.receive(String(r.data)),t.onerror=()=>t.close(),t.onclose=()=>this.fell();}close(){this.closed=true,this.stopHeartbeat();let e=this.socket;this.socket=null,e==null||e.close();}receive(e){var r,i,o,a;let t=Z(e);if(t.kind==="open"){this.armHeartbeat(t.pingInterval+t.pingTimeout),(r=this.socket)==null||r.send(V(this.options.auth));return}if(t.kind==="ping"){this.armHeartbeat(),(i=this.socket)==null||i.send(Q());return}if(t.kind==="connectError"||t.kind==="disconnect"){this.stopHeartbeat(),(o=this.socket)==null||o.close();return}if(t.kind==="event"){if(t.name==="ready"){this.ready=true,this.options.onReady();return}if(t.name==="conversation.turn"){let s=(a=t.payload)==null?void 0:a.turn;s&&this.options.onTurn(s);}}}fell(){this.stopHeartbeat();let e=this.ready;this.socket=null,this.ready=false,this.closed||this.options.onClosed(e);}armHeartbeat(e){e!==void 0&&(this.heartbeatWindow=e),this.stopHeartbeat(),this.heartbeat=this.setTimer(()=>{var t;return (t=this.socket)==null?void 0:t.close()},this.heartbeatWindow);}stopHeartbeat(){this.heartbeat!==null&&this.clearTimer(this.heartbeat),this.heartbeat=null;}};function at(n){let e=globalThis.WebSocket;if(!e)throw new Error("no WebSocket");return new e(n)}var ot=6e4;function ee(n){var b,u,x,E;let e=globalThis.document;if(!e)throw new Error("prodantix chat requires a document; mount it in the browser");let t=(b=n.mountPoint)!=null?b:e.createElement("div");n.mountPoint||e.body.append(t);let r=new N(n),i=new I(t,r,n.strings,n.appearance),o=(x=(u=n.appearance)==null?void 0:u.availability)!=null?x:T.availability,a,s=()=>{i.setOpenNow(_(o,new Date)),a=setTimeout(s,ot);};s();let c=new Set,p,d=null,l=(E=n.pollIntervalMs)!=null?E:15e3,m=y=>{c.has(y.id)||y.authorKind==="end_user"||(c.add(y.id),i.onIncomingTurn(y));},g=async()=>{if(!r.hasThread)return;let y=await r.load();if(y){for(let w of y.turns)m(w);c=new Set(y.turns.map(w=>w.id));}},v=()=>{p||l<=0||(p=setInterval(()=>void g(),l));},S=()=>{p&&clearInterval(p),p=void 0;},f=()=>{if(d||!n.socketHost)return;let y=r.socketAuth;y&&(d=new M({auth:y,host:n.socketHost,onClosed:w=>{d=null,v(),w&&f();},onReady:S,onTurn:m,socketFactory:n.socketFactory}),d.open());};return v(),f(),{close:()=>i.close(),destroy:()=>{S(),clearTimeout(a),d==null||d.close(),d=null,i.close(),t.remove();},identify:y=>r.identify(y),open:()=>{i.open().then(f);}}}var st="prodantix.messenger.config",te=n=>{var t,r,i,o;let e=(t=n.navigator)==null?void 0:t.languages;return Array.isArray(e)&&e.length>0?e.join(","):((r=n.navigator)==null?void 0:r.language)||((o=(i=n.document)==null?void 0:i.documentElement)==null?void 0:o.lang)||void 0},ne=(n,e)=>`${st}:${n}:${e!=null?e:""}`;function re(n,e,t){let r=n==null?void 0:n.get(ne(e,t));if(!r)return null;try{let i=JSON.parse(r);return (i==null?void 0:i.apiKey)===e?i.config:null}catch(i){return null}}async function ie(n){var o,a,s,c,p;let e=L(n.fetchImpl);if(!e)return (o=n.onError)==null||o.call(n,new Error("no fetch available for the prodantix messenger")),null;let t=P(n.host),r=ne(n.apiKey,n.locale),i=n.locale?`?locale=${encodeURIComponent(n.locale)}`:"";try{let d=await e(`${t}/v1/messenger/config${i}`,{headers:{authorization:`Bearer ${n.apiKey}`},method:"GET"});if(!d.ok)return (a=n.onError)==null||a.call(n,new Error(`prodantix messenger config: ${d.status}`)),null;let l=JSON.parse(await d.text());return l.enabled?((c=n.storage)==null||c.set(r,JSON.stringify({apiKey:n.apiKey,config:l})),l):((s=n.storage)==null||s.remove(r),l)}catch(d){return (p=n.onError)==null||p.call(n,d),null}}var lt=["close","identify","open","shutdown","toggle"],A="[prodantix/messenger]";function ct(n,e){for(let t of n){let[r,...i]=t!=null?t:[];typeof r!="string"||!lt.includes(r)||e(r,...i);}}function dt(n){if(!n)return null;try{return new URL(n).origin}catch(e){return null}}async function oe(n,e={}){var g,v,S;let t=(g=e.warn)!=null?g:(f=>console.warn(f)),r=n.prodantix,i=r==null?void 0:r.k;if(!i)return t(`${A} no project key on the install snippet; nothing will load.`),null;let o=dt((v=e.scriptSrc)!=null?v:pt(n));if(!o)return t(`${A} could not tell which host served this script; nothing will load.`),null;let a=ut(n),s=te(n),c=re(a,i,s),p=await ie({apiKey:i,host:o,locale:s,onError:f=>t(`${A} settings could not be read: ${String(f)}`),storage:a}),d=p!=null?p:c;if(!d)return t(`${A} no settings available; the messenger will not render.`),null;if(!d.enabled)return null;let l=ee({apiKey:i,appearance:d,distinctId:mt(n,a),host:o,socketHost:d.socketUrl||void 0}),m=(f,...b)=>{if((f==="open"||f==="toggle")&&l.open(),f==="close"&&l.close(),f==="shutdown"&&l.destroy(),f==="identify"){let u=ht(b[0]);if(!u){console.error(`${A} identify needs { userId, userHash }: the hash is HMAC-SHA256 of the user id under the project signing secret, computed on your server. Without it the visitor stays anonymous.`);return}l.identify(u);}};return ct((S=r==null?void 0:r.q)!=null?S:[],m),n.prodantix=Object.assign((f,...b)=>m(f,...b),{k:i,q:[]}),l}function pt(n){var t;let e=(t=n.document)==null?void 0:t.currentScript;return e==null?void 0:e.src}function ut(n){let e=n.localStorage;if(e)return {get:t=>e.getItem(t),remove:t=>e.removeItem(t),set:(t,r)=>e.setItem(t,r)}}function ht(n){if(typeof n!="object"||n===null)return null;let{userHash:e,userId:t}=n;return typeof t!="string"||typeof e!="string"||t.trim()===""||e.trim()===""?null:{userHash:e,userId:t}}var ae="prodantix.messenger.anon";function mt(n,e){var i,o,a;let t=e==null?void 0:e.get(ae);if(t)return t;let r=`anon_${(a=(o=(i=n.crypto)==null?void 0:i.randomUUID)==null?void 0:o.call(i))!=null?a:Math.random().toString(36).slice(2)}`;return e==null||e.set(ae,r),r}oe(globalThis);})();//# sourceMappingURL=messenger.iife.js.map
105
+ `}${Ue[t.composerShape]}${Oe[t.skin]}${j(t.launcherShape,t.launcherFill,t.launcherContent,t.launcherSize)}${ze[t.bubbleShape]}${Be[t.bubbleFill]}${De[t.namePlacement]}${t.nameAvatar?Ke:""}${t.dayDividers?Ge:""}${qe[t.stampPlacement]}${t.stampContent==="time_and_latency"?je:""}${We}${(o=n.attachments)!=null&&o.enabled?Ye(t.composerShape):""}`}var it=["end_user","agent","ai"];function at(){let n=globalThis.location;if(n)return {host:n.host,path:n.pathname,title:document.title}}var ot='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m16.5 6.5-7.8 7.8a2.1 2.1 0 0 0 3 3l8.1-8.1a4.2 4.2 0 0 0-6-6L5.7 11.3a6.3 6.3 0 0 0 8.9 8.9l6.6-6.6"/></svg>',st='<svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M15.88 9.29 12 13.17 8.12 9.29a.996.996 0 0 0-1.41 0c-.39.39-.39 1.02 0 1.41l4.59 4.59c.39.39 1.02.39 1.41 0l4.59-4.59c.39-.39.39-1.02 0-1.41-.39-.38-1.03-.39-1.42 0"/></svg>',I=class{constructor(e,t,r={},i={},a={}){this.host=e;this.client=t;m(this,"root");m(this,"strings");m(this,"settings");m(this,"appearance");m(this,"launcher");m(this,"badge");m(this,"panel",null);m(this,"lastFocused",null);m(this,"unread",0);m(this,"pendingTurns",0);m(this,"openNow");m(this,"style");m(this,"scheme");m(this,"picked",null);m(this,"objectUrls",[]);var o;this.strings={...Re,...r},this.appearance={...T,...i},this.settings=F({...T,...i}),this.root=e.attachShadow({mode:(o=a.shadowMode)!=null?o:"closed"}),this.openNow=_(this.appearance.availability,new Date),this.scheme=a.scheme,this.style=document.createElement("style"),this.style.textContent=X(this.appearance,this.scheme),this.root.append(this.style),this.launcher=document.createElement("button"),this.launcher.className="launcher",this.launcher.type="button",this.launcher.setAttribute("aria-haspopup","dialog"),this.launcher.addEventListener("click",()=>this.toggle()),this.badge=document.createElement("span"),this.badge.className="badge",this.badge.hidden=true,this.drawLauncher(),this.root.append(this.launcher);}drawLauncher(){if(this.launcher.setAttribute("aria-label",this.strings.launcherLabel),this.launcher.replaceChildren(),this.launcher.append(W(this.settings.launcherContent,this.strings,this.appearance.team,e=>this.client.avatarUrl(e))),this.settings.launcherShape==="pill"){let e=document.createElement("span");e.className="label",e.textContent=this.settings.launcherContent==="team_faces"?this.strings.agentLabel:this.strings.launcherLabel,this.launcher.append(e);}this.launcher.append(this.badge),this.launcher.classList.toggle("closed",!this.openNow);}update(e,t){this.appearance={...T,...e},this.settings=F(this.appearance),t!==void 0&&(this.scheme=t),this.style.textContent=X(this.appearance,this.scheme),this.drawLauncher(),this.panel&&(this.close(),this.open());}toggle(){this.panel?this.close():this.open();}setOpenNow(e){var t;this.openNow=e,this.launcher.classList.toggle("closed",!e),(t=this.panel)==null||t.classList.toggle("closed",!e);}async open(){var f;if(this.panel)return;this.lastFocused=this.host.ownerDocument.activeElement,this.unread=0,this.renderBadge();let e=document.createElement("section");e.className=this.openNow?"panel":"panel closed",e.setAttribute("role","dialog"),e.setAttribute("aria-modal","true"),e.setAttribute("aria-label",this.strings.title);let t=document.createElement("div");t.className="header";let r=(f=this.appearance.team)!=null?f:[];r.length>0&&t.append(R(r,this.strings,b=>this.client.avatarUrl(b)));let i=document.createElement("div");i.className="headmain";let a=document.createElement("h2");a.textContent=this.strings.title;let o=document.createElement("p");o.className="status";let s=document.createElement("span");s.className="live",s.setAttribute("aria-hidden","true"),o.append(s,this.strings.replyTime),i.append(a,o);let d=document.createElement("button");d.className="close",d.type="button",d.setAttribute("aria-label",this.strings.closeLabel),d.innerHTML=st,d.addEventListener("click",()=>this.close()),t.append(i,d);let p=document.createElement("div");p.className="log",p.setAttribute("role","log"),p.setAttribute("aria-live","polite"),p.setAttribute("aria-label",this.strings.title);let c=document.createElement("form");c.className="composer";let l=document.createElement("input");l.type="text",l.setAttribute("aria-label",this.strings.inputPlaceholder),l.placeholder=this.strings.inputPlaceholder;let h=document.createElement("button");h.type="submit",h.setAttribute("aria-label",this.strings.sendLabel),h.innerHTML='<svg class="sendglyph" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M4.5 12 20 4.5 15 20l-3.6-5.4L4.5 12Z"/></svg>';let g=document.createElement("span");g.className="sendtext",g.textContent=this.strings.sendLabel,h.append(g);let v=this.appearance.attachments;if(v!=null&&v.enabled&&this.client.upload){let b=document.createElement("span");b.className="field";let u=document.createElement("input");u.type="file",u.accept=v.accept.join(","),u.hidden=true,u.addEventListener("change",()=>{var y;let E=(y=u.files)==null?void 0:y[0];u.value="",E&&this.pick(p,c,v,E);});let x=document.createElement("button");x.type="button",x.className="clip",x.setAttribute("aria-label",this.strings.attachLabel),x.innerHTML=ot,x.addEventListener("click",()=>u.click()),b.append(x,l,u),c.append(b,h);}else c.append(l,h);c.addEventListener("submit",b=>{b.preventDefault(),this.submit(l,p);}),e.append(t,p,c),e.addEventListener("keydown",b=>this.onKeydown(b,e,d)),this.root.append(e),this.panel=e,l.focus();let S=await this.client.load();S&&S.turns.length>0?this.renderThread(p,S):this.renderFirstRun(p,l),this.openNow||this.renderAway(t);}renderFirstRun(e,t){let r=document.createElement("div");r.className="empty";let i=document.createElement("h3");i.textContent=this.appearance.greeting.trim()||this.strings.emptyTitle;let a=document.createElement("p");a.textContent=this.strings.emptyBody,r.append(i,a),this.appearance.starterPrompts.filter(tt).forEach((s,d)=>{let p=document.createElement("div");p.className="prompt";let c=document.createElement("div");c.className="promptwords",c.id=`prompt-${d}`;let l=document.createElement("template");l.innerHTML=s.html,rt(l.content)?c.append(l.content):c.textContent=s.text;for(let g of c.querySelectorAll("a"))g.target="_blank",g.rel="noopener noreferrer";let h=document.createElement("button");h.className="promptpress",h.type="button",h.setAttribute("aria-labelledby",c.id),h.addEventListener("click",()=>{t.value=s.text,this.submit(t,e);}),p.append(c,h),r.append(p);}),e.replaceChildren(r);}renderAway(e){let t=document.createElement("div");t.className="away";let r=document.createElement("span");r.className="awayglyph",r.setAttribute("aria-hidden","true");let i=document.createElement("span");i.textContent=this.appearance.awayMessage.trim()||this.strings.awayBody,t.append(r,i),e.after(t);}pick(e,t,r,i){let a=i.size>r.maxBytes||!r.accept.includes(i.type);for(let l of this.root.querySelectorAll(a?".ferr":".file,.ferr"))l.remove();if(a){let l=document.createElement("p");l.className="ferr",l.setAttribute("role","alert"),l.textContent=this.strings.fileRefusal(O(i.size),`${r.maxBytes/1e6} MB`),t.before(l),e.scrollTop=e.scrollHeight;return}this.picked=i;let o=document.createElement("span");o.className="file";let s;if(i.type==="application/pdf")s=document.createElement("b"),s.textContent="PDF";else {let l=document.createElement("img");l.className="th",l.alt="",l.src=this.objectUrl(i),s=l;}let d=document.createElement("span");d.className="name",d.textContent=i.name;let p=document.createElement("span");p.className="sz",p.textContent=`\xB7 ${O(i.size)}`;let c=document.createElement("button");c.type="button",c.className="x",c.setAttribute("aria-label",this.strings.removeFileLabel),c.textContent="\xD7",c.addEventListener("click",()=>{this.picked=null,o.remove();}),o.append(s,d,p,c),t.before(o),e.scrollTop=e.scrollHeight;}objectUrl(e){let t=URL.createObjectURL(e);return this.objectUrls.push(t),t}close(){if(this.panel){this.panel.remove(),this.panel=null,this.picked=null;for(let e of this.objectUrls)URL.revokeObjectURL(e);this.objectUrls=[],this.lastFocused instanceof HTMLElement?this.lastFocused.focus():this.launcher.focus();}}onIncomingTurn(e){if(this.panel){let t=this.panel.querySelector(".log");t instanceof HTMLElement&&!this.hasTurn(t,e.id)&&this.appendTurn(t,e);return}e.authorKind!=="end_user"&&(this.unread+=1,this.renderBadge());}async submit(e,t){let r=e.value.trim(),i=this.picked;if(!(!r&&!i)){e.value="",this.picked=null;for(let a of this.root.querySelectorAll(".file,.ferr"))a.remove();await this.sendBody(t,r,i);}}async sendBody(e,t,r=null){var s,d,p;(s=e.querySelector(".empty"))==null||s.remove(),this.pendingTurns+=1;let i=this.appendTurn(e,{authorId:null,authorKind:"end_user",body:t,createdAt:new Date().toISOString(),id:`pending-${this.pendingTurns}`},r);i.setAttribute("data-pending","");let a=r?await((p=(d=this.client).upload)==null?void 0:p.call(d,r)):void 0,o=a===null?null:await this.client.send(t,at(),a?[a.id]:void 0);if(i.removeAttribute("data-pending"),o){i.dataset.turnId=o.id;return}this.markFailed(e,i,t,r);}markFailed(e,t,r,i){var o;t.setAttribute("data-failed","");let a=document.createElement("button");a.type="button",a.className="retry",a.textContent=this.strings.retryLabel,a.addEventListener("click",()=>{t.remove(),this.sendBody(e,r,i);}),((o=t.querySelector(".body"))!=null?o:t).append(a);}hasTurn(e,t){for(let r of e.children)if(r instanceof HTMLElement&&r.dataset.turnId===t)return true;return false}renderThread(e,t){e.replaceChildren();for(let r of t.turns)this.appendTurn(e,r);}appendTurn(e,t,r=null){var l,h,g,v,S,f,b;(l=e.querySelector(".empty"))==null||l.remove();let i=it.includes(t.authorKind)?t.authorKind:"agent",a=this.settings,o=document.createElement("div");if(o.className=`turn ${i}`,o.dataset.turnId=t.id,i!=="end_user"&&a.nameAvatar){let u=document.createElement("span");if(u.className=i==="ai"?"av bot":"av",u.setAttribute("aria-hidden","true"),i==="agent"&&t.authorAvatarUrl){let x=document.createElement("img");x.alt="",x.src=this.client.avatarUrl(t.authorAvatarUrl),u.append(x);}else {u.textContent=i==="ai"?this.strings.aiLabel:q(this.agentName(t));let x=i==="agent"?(g=(h=this.appearance.team)==null?void 0:h.find(E=>E.name===t.authorName))==null?void 0:g.tone:void 0;x&&(u.style.background=x);}o.append(u);}let d=document.createElement("div");if(d.className="body",i==="end_user"){r&&this.drawFile(d,r.name,r.type,r.size,Promise.resolve(r));for(let u of (v=t.attachments)!=null?v:[])this.drawFile(d,u.name,u.contentType,u.bytes,(b=(f=(S=this.client).file)==null?void 0:f.call(S,u.url))!=null?b:Promise.resolve(null));}let p=i!=="end_user"&&a.namePlacement!=="hidden",c=document.createElement("div");if(i==="ai"?Ze(c,t.body):c.textContent=t.body,p||i==="ai"&&a.namePlacement==="hidden"){let u=document.createElement("div");u.className=i==="ai"?"author ai":"author",u.textContent=i==="ai"?this.strings.aiLabel:this.agentName(t),a.stampPlacement==="beside_name"&&u.append(this.stamp(t)),a.namePlacement==="inline"?(u.classList.add("below"),d.append(c,u)):d.append(u,c);}else t.body&&d.append(c);return a.stampPlacement==="under_turn"&&d.append(this.stamp(t)),o.append(d),e.append(o),e.scrollTop=e.scrollHeight,o}drawFile(e,t,r,i,a){let o=document.createElement("a");if(r==="application/pdf"){o.className="pdfc",o.download=t;let s=document.createElement("b");s.textContent="PDF",o.append(s,`${t} \xB7 ${O(i)}`);}else {o.className="att",o.target="_blank",o.rel="noopener noreferrer";let s=document.createElement("img");s.alt=t,s.addEventListener("load",()=>{let d=o.closest(".log");d&&(d.scrollTop=d.scrollHeight);}),o.append(s);}e.append(o),a.then(s=>{var d;s&&(o.href=this.objectUrl(s),(d=o.querySelector("img"))==null||d.setAttribute("src",o.href));});}agentName(e){return e.authorName||this.strings.agentLabel}stamp(e){let t=document.createElement("span");return t.className="stamp",t.textContent=this.strings.timeLabel(e.createdAt),t}onKeydown(e,t,r){if(e.key==="Escape"){e.preventDefault(),this.close();return}if(e.key!=="Tab")return;let i=t.querySelectorAll('button, input, [tabindex]:not([tabindex="-1"])');if(i.length===0)return;let a=i[0],o=i[i.length-1],s=this.root.activeElement;e.shiftKey&&s===a?(e.preventDefault(),o.focus()):!e.shiftKey&&s===o?(e.preventDefault(),a.focus()):s===null&&(e.preventDefault(),r.focus());}renderBadge(){this.unread>0?(this.badge.hidden=false,this.badge.textContent=String(this.unread),this.launcher.setAttribute("aria-label",`${this.strings.launcherLabel}, ${this.strings.unreadLabel(this.unread)}`)):(this.badge.hidden=true,this.badge.textContent="",this.launcher.setAttribute("aria-label",this.strings.launcherLabel));}};function V(n){return `40${JSON.stringify(n)}`}function Q(){return "3"}function Z(n){let e=n.charAt(0),t=n.slice(1);if(e==="2")return {kind:"ping"};if(e==="1")return {kind:"disconnect"};if(e==="0"){let o=U(t);return {kind:"open",pingInterval:typeof(o==null?void 0:o.pingInterval)=="number"?o.pingInterval:25e3,pingTimeout:typeof(o==null?void 0:o.pingTimeout)=="number"?o.pingTimeout:2e4}}if(e!=="4")return {kind:"other"};let r=t.charAt(0),i=t.slice(1);if(r==="0")return {kind:"connected"};if(r==="1")return {kind:"disconnect"};if(r==="4"){let o=U(i);return {kind:"connectError",message:typeof(o==null?void 0:o.message)=="string"?o.message:"refused"}}if(r!=="2")return {kind:"other"};let a=U(i);return !Array.isArray(a)||typeof a[0]!="string"?{kind:"other"}:{kind:"event",name:a[0],payload:a[1]}}function U(n){try{return JSON.parse(n)}catch(e){return null}}var lt="/socket.io/?EIO=4&transport=websocket",M=class{constructor(e){this.options=e;m(this,"socket",null);m(this,"heartbeat",null);m(this,"ready",false);m(this,"closed",false);m(this,"heartbeatWindow",45e3);m(this,"factory");m(this,"setTimer");m(this,"clearTimer");var t,r,i;this.factory=(t=e.socketFactory)!=null?t:ct,this.setTimer=(r=e.setTimer)!=null?r:((a,o)=>setTimeout(a,o)),this.clearTimer=(i=e.clearTimer)!=null?i:(a=>clearTimeout(a));}open(){if(this.socket||this.closed)return;let e=`${this.options.host.replace(/^http/,"ws").replace(/\/+$/,"")}${lt}`,t;try{t=this.factory(e);}catch(r){this.options.onClosed(false);return}this.socket=t,t.onmessage=r=>this.receive(String(r.data)),t.onerror=()=>t.close(),t.onclose=()=>this.fell();}close(){this.closed=true,this.stopHeartbeat();let e=this.socket;this.socket=null,e==null||e.close();}receive(e){var r,i,a,o;let t=Z(e);if(t.kind==="open"){this.armHeartbeat(t.pingInterval+t.pingTimeout),(r=this.socket)==null||r.send(V(this.options.auth));return}if(t.kind==="ping"){this.armHeartbeat(),(i=this.socket)==null||i.send(Q());return}if(t.kind==="connectError"||t.kind==="disconnect"){this.stopHeartbeat(),(a=this.socket)==null||a.close();return}if(t.kind==="event"){if(t.name==="ready"){this.ready=true,this.options.onReady();return}if(t.name==="conversation.turn"){let s=(o=t.payload)==null?void 0:o.turn;s&&this.options.onTurn(s);}}}fell(){this.stopHeartbeat();let e=this.ready;this.socket=null,this.ready=false,this.closed||this.options.onClosed(e);}armHeartbeat(e){e!==void 0&&(this.heartbeatWindow=e),this.stopHeartbeat(),this.heartbeat=this.setTimer(()=>{var t;return (t=this.socket)==null?void 0:t.close()},this.heartbeatWindow);}stopHeartbeat(){this.heartbeat!==null&&this.clearTimer(this.heartbeat),this.heartbeat=null;}};function ct(n){let e=globalThis.WebSocket;if(!e)throw new Error("no WebSocket");return new e(n)}var dt=6e4;function ee(n){var b,u,x,E;let e=globalThis.document;if(!e)throw new Error("prodantix chat requires a document; mount it in the browser");let t=(b=n.mountPoint)!=null?b:e.createElement("div");n.mountPoint||e.body.append(t);let r=new N(n),i=new I(t,r,n.strings,n.appearance),a=(x=(u=n.appearance)==null?void 0:u.availability)!=null?x:T.availability,o,s=()=>{i.setOpenNow(_(a,new Date)),o=setTimeout(s,dt);};s();let d=new Set,p,c=null,l=(E=n.pollIntervalMs)!=null?E:15e3,h=y=>{d.has(y.id)||y.authorKind==="end_user"||(d.add(y.id),i.onIncomingTurn(y));},g=async()=>{if(!r.hasThread)return;let y=await r.load();if(y){for(let w of y.turns)h(w);d=new Set(y.turns.map(w=>w.id));}},v=()=>{p||l<=0||(p=setInterval(()=>void g(),l));},S=()=>{p&&clearInterval(p),p=void 0;},f=()=>{if(c||!n.socketHost)return;let y=r.socketAuth;y&&(c=new M({auth:y,host:n.socketHost,onClosed:w=>{c=null,v(),w&&f();},onReady:S,onTurn:h,socketFactory:n.socketFactory}),c.open());};return v(),f(),{close:()=>i.close(),destroy:()=>{S(),clearTimeout(o),c==null||c.close(),c=null,i.close(),t.remove();},identify:y=>r.identify(y),open:()=>{i.open().then(f);}}}var pt="prodantix.messenger.config",te=n=>{var t,r,i,a;let e=(t=n.navigator)==null?void 0:t.languages;return Array.isArray(e)&&e.length>0?e.join(","):((r=n.navigator)==null?void 0:r.language)||((a=(i=n.document)==null?void 0:i.documentElement)==null?void 0:a.lang)||void 0},ne=(n,e)=>`${pt}:${n}:${e!=null?e:""}`;function re(n,e,t){let r=n==null?void 0:n.get(ne(e,t));if(!r)return null;try{let i=JSON.parse(r);return (i==null?void 0:i.apiKey)===e?i.config:null}catch(i){return null}}async function ie(n){var a,o,s,d,p;let e=L(n.fetchImpl);if(!e)return (a=n.onError)==null||a.call(n,new Error("no fetch available for the prodantix messenger")),null;let t=P(n.host),r=ne(n.apiKey,n.locale),i=n.locale?`?locale=${encodeURIComponent(n.locale)}`:"";try{let c=await e(`${t}/v1/messenger/config${i}`,{headers:{authorization:`Bearer ${n.apiKey}`},method:"GET"});if(!c.ok)return (o=n.onError)==null||o.call(n,new Error(`prodantix messenger config: ${c.status}`)),null;let l=JSON.parse(await c.text());return l.enabled?((d=n.storage)==null||d.set(r,JSON.stringify({apiKey:n.apiKey,config:l})),l):((s=n.storage)==null||s.remove(r),l)}catch(c){return (p=n.onError)==null||p.call(n,c),null}}var ut=["close","identify","open","shutdown","toggle"],A="[prodantix/messenger]";function ht(n,e){for(let t of n){let[r,...i]=t!=null?t:[];typeof r!="string"||!ut.includes(r)||e(r,...i);}}function mt(n){if(!n)return null;try{return new URL(n).origin}catch(e){return null}}async function oe(n,e={}){var g,v,S;let t=(g=e.warn)!=null?g:(f=>console.warn(f)),r=n.prodantix,i=r==null?void 0:r.k;if(!i)return t(`${A} no project key on the install snippet; nothing will load.`),null;let a=mt((v=e.scriptSrc)!=null?v:gt(n));if(!a)return t(`${A} could not tell which host served this script; nothing will load.`),null;let o=ft(n),s=te(n),d=re(o,i,s),p=await ie({apiKey:i,host:a,locale:s,onError:f=>t(`${A} settings could not be read: ${String(f)}`),storage:o}),c=p!=null?p:d;if(!c)return t(`${A} no settings available; the messenger will not render.`),null;if(!c.enabled)return null;let l=ee({apiKey:i,appearance:c,distinctId:xt(n,o),host:a,socketHost:c.socketUrl||void 0}),h=(f,...b)=>{if((f==="open"||f==="toggle")&&l.open(),f==="close"&&l.close(),f==="shutdown"&&l.destroy(),f==="identify"){let u=bt(b[0]);if(!u){console.error(`${A} identify needs { userId, userHash }: the hash is HMAC-SHA256 of the user id under the project signing secret, computed on your server. Without it the visitor stays anonymous.`);return}l.identify(u);}};return ht((S=r==null?void 0:r.q)!=null?S:[],h),n.prodantix=Object.assign((f,...b)=>h(f,...b),{k:i,q:[]}),l}function gt(n){var t;let e=(t=n.document)==null?void 0:t.currentScript;return e==null?void 0:e.src}function ft(n){let e=n.localStorage;if(e)return {get:t=>e.getItem(t),remove:t=>e.removeItem(t),set:(t,r)=>e.setItem(t,r)}}function bt(n){if(typeof n!="object"||n===null)return null;let{userHash:e,userId:t}=n;return typeof t!="string"||typeof e!="string"||t.trim()===""||e.trim()===""?null:{userHash:e,userId:t}}var ae="prodantix.messenger.anon";function xt(n,e){var i,a,o;let t=e==null?void 0:e.get(ae);if(t)return t;let r=`anon_${(o=(a=(i=n.crypto)==null?void 0:i.randomUUID)==null?void 0:a.call(i))!=null?o:Math.random().toString(36).slice(2)}`;return e==null||e.set(ae,r),r}oe(globalThis);})();//# sourceMappingURL=messenger.iife.js.map
99
106
  //# sourceMappingURL=messenger.iife.js.map
package/dist/messenger.js CHANGED
@@ -1,2 +1,2 @@
1
- import {a,d}from'./chunk-VG77TYVX.js';import'./chunk-5XGN7UAV.js';var l="prodantix.messenger.config",h=e=>{let r=e.navigator?.languages;return Array.isArray(r)&&r.length>0?r.join(","):e.navigator?.language||e.document?.documentElement?.lang||void 0},g=(e,r)=>`${l}:${e}:${r??""}`;function u(e,r,s){let t=e?.get(g(r,s));if(!t)return null;try{let a=JSON.parse(t);return a?.apiKey===r?a.config:null}catch{return null}}async function m(e){let r=a(e.fetchImpl);if(!r)return e.onError?.(new Error("no fetch available for the prodantix messenger")),null;let s=d(e.host),t=g(e.apiKey,e.locale),a$1=e.locale?`?locale=${encodeURIComponent(e.locale)}`:"";try{let n=await r(`${s}/v1/messenger/config${a$1}`,{headers:{authorization:`Bearer ${e.apiKey}`},method:"GET"});if(!n.ok)return e.onError?.(new Error(`prodantix messenger config: ${n.status}`)),null;let o=JSON.parse(await n.text());return o.enabled?(e.storage?.set(t,JSON.stringify({apiKey:e.apiKey,config:o})),o):(e.storage?.remove(t),o)}catch(n){return e.onError?.(n),null}}export{l as MESSENGER_CACHE_KEY,g as cacheKeyFor,u as cachedMessengerConfig,m as fetchMessengerConfig,h as localeCandidates};//# sourceMappingURL=messenger.js.map
1
+ import {a,d}from'./chunk-VG77TYVX.js';import'./chunk-5XGN7UAV.js';var l="prodantix.messenger.config",h=e=>{let r=e.navigator?.languages;return Array.isArray(r)&&r.length>0?r.join(","):e.navigator?.language||e.document?.documentElement?.lang||void 0},g=(e,r)=>`${l}:${e}:${r??""}`;function m(e,r,i){let t=e?.get(g(r,i));if(!t)return null;try{let a=JSON.parse(t);return a?.apiKey===r?a.config:null}catch{return null}}async function u(e){let r=a(e.fetchImpl);if(!r)return e.onError?.(new Error("no fetch available for the prodantix messenger")),null;let i=d(e.host),t=g(e.apiKey,e.locale),a$1=e.locale?`?locale=${encodeURIComponent(e.locale)}`:"";try{let n=await r(`${i}/v1/messenger/config${a$1}`,{headers:{authorization:`Bearer ${e.apiKey}`},method:"GET"});if(!n.ok)return e.onError?.(new Error(`prodantix messenger config: ${n.status}`)),null;let o=JSON.parse(await n.text());return o.enabled?(e.storage?.set(t,JSON.stringify({apiKey:e.apiKey,config:o})),o):(e.storage?.remove(t),o)}catch(n){return e.onError?.(n),null}}export{l as MESSENGER_CACHE_KEY,g as cacheKeyFor,m as cachedMessengerConfig,u as fetchMessengerConfig,h as localeCandidates};//# sourceMappingURL=messenger.js.map
2
2
  //# sourceMappingURL=messenger.js.map
package/package.json CHANGED
@@ -63,5 +63,5 @@
63
63
  "sideEffects": false,
64
64
  "type": "module",
65
65
  "types": "./dist/index.d.ts",
66
- "version": "0.5.0-beta.395"
66
+ "version": "0.5.0-beta.397"
67
67
  }