copilot-chat-widget 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
- (function(){"use strict";(()=>{if(typeof window>"u"||typeof document>"u"||window.__copilotWidgetLoaded)return;window.__copilotWidgetLoaded=!0;const T="http://localhost:3000",b=64,y=720,x=document.currentScript,k=t=>{if(!t?.src)return{};try{const s=new URL(t.src,window.location.href),n={};return s.searchParams.forEach((l,c)=>{n[c]=l}),n}catch(s){return console.warn("[CopilotChat] Failed to parse script query params:",s),{}}},I=t=>{document.readyState==="complete"||document.readyState==="interactive"?setTimeout(t,0):document.addEventListener("DOMContentLoaded",t)},v=()=>x||Array.from(document.querySelectorAll("script")).reverse().find(n=>n.dataset?.token||n.src&&n.src.includes("chat-widget"))||null,U=({iframeUrl:t,launcherIcon:s})=>{const n=document.querySelector("[data-copilot-widget-root]");n&&n.remove();const l=w=>{const a=document.querySelector("[data-copilot-checkout-toast]");a&&a.remove();const h=document.createElement("div");h.setAttribute("data-copilot-checkout-toast","true"),h.innerText=w,Object.assign(h.style,{position:"fixed",top:"20px",left:"50%",transform:"translateX(-50%)",padding:"12px 16px",background:"#0f172a",color:"white",borderRadius:"12px",boxShadow:"0 8px 24px rgba(0,0,0,0.25)",zIndex:2147483647,fontSize:"14px",fontWeight:"600",maxWidth:"420px",lineHeight:"1.4",textAlign:"center"}),document.body.appendChild(h),setTimeout(()=>{h.remove()},4500)},c=document.createElement("div");c.setAttribute("data-copilot-widget-root","true");const C=c.attachShadow({mode:"open"});document.body.appendChild(c);const e=document.createElement("button");e.type="button",e.setAttribute("aria-label","Open Copilot chat"),e.innerHTML=`
1
+ (function(){"use strict";(()=>{if(typeof window>"u"||typeof document>"u"||window.__copilotWidgetLoaded)return;window.__copilotWidgetLoaded=!0;const T="http://localhost:3000",b=64,x=720,y=document.currentScript,k=t=>{if(!t?.src)return{};try{const s=new URL(t.src,window.location.href),n={};return s.searchParams.forEach((l,c)=>{n[c]=l}),n}catch(s){return console.warn("[CopilotChat] Failed to parse script query params:",s),{}}},I=t=>{document.readyState==="complete"||document.readyState==="interactive"?setTimeout(t,0):document.addEventListener("DOMContentLoaded",t)},E=()=>y||Array.from(document.querySelectorAll("script")).reverse().find(n=>n.dataset?.token||n.src&&n.src.includes("chat-widget"))||null,U=({iframeUrl:t,launcherIcon:s})=>{const n=document.querySelector("[data-copilot-widget-root]");n&&n.remove();const l=w=>{const a=document.querySelector("[data-copilot-checkout-toast]");a&&a.remove();const h=document.createElement("div");h.setAttribute("data-copilot-checkout-toast","true"),h.innerText=w,Object.assign(h.style,{position:"fixed",top:"20px",left:"50%",transform:"translateX(-50%)",padding:"12px 16px",background:"#0f172a",color:"white",borderRadius:"12px",boxShadow:"0 8px 24px rgba(0,0,0,0.25)",zIndex:2147483647,fontSize:"14px",fontWeight:"600",maxWidth:"420px",lineHeight:"1.4",textAlign:"center"}),document.body.appendChild(h),setTimeout(()=>{h.remove()},4500)},c=document.createElement("div");c.setAttribute("data-copilot-widget-root","true");const C=c.attachShadow({mode:"open"});document.body.appendChild(c);const e=document.createElement("button");e.type="button",e.setAttribute("aria-label","Open Copilot chat"),e.innerHTML=`
2
2
  <img
3
3
  src="${s}"
4
4
  alt="Copilot chat launcher"
5
5
  style="width: 38px; height: 38px; object-fit: contain; border-radius: 50%; pointer-events: none;"
6
6
  />
7
- `,Object.assign(e.style,{position:"fixed",bottom:"24px",right:"24px",width:`${b}px`,height:`${b}px`,borderRadius:"50%",border:"none",background:"linear-gradient(135deg, #0078ff, #00c6ff)",color:"white",cursor:"pointer",zIndex:999998,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 6px 14px rgba(0,0,0,0.25)",transition:"all 0.25s ease"}),e.onmouseover=()=>{e.style.transform="scale(1.12)",e.style.boxShadow="0 10px 25px rgba(0,0,0,0.3)"},e.onmouseout=()=>{e.style.transform="scale(1)",e.style.boxShadow="0 6px 14px rgba(0,0,0,0.25)"};const i=document.createElement("div");i.setAttribute("data-copilot-widget-root","true"),Object.assign(i.style,{display:"none",position:"fixed",bottom:`${b+36}px`,right:"24px",zIndex:"999999",transformOrigin:"bottom right",transform:"scale(0.8) translateY(20px)",opacity:"0",transition:"all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55)"});const o=document.createElement("div"),r=document.createElement("div"),m=document.createElement("div");Object.assign(o.style,{position:"absolute",bottom:"-14px",right:"28px",width:"30px",height:"20px",pointerEvents:"none",display:"none",zIndex:"1"}),Object.assign(r.style,{position:"absolute",bottom:"0",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"15px solid transparent",borderRight:"15px solid transparent",borderTop:"15px solid rgba(15,23,42,0.1)"}),Object.assign(m.style,{position:"absolute",bottom:"2px",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"13px solid transparent",borderRight:"13px solid transparent",borderTop:"13px solid white",boxShadow:"0 6px 16px rgba(15,23,42,0.12)",borderRadius:"2px"}),o.appendChild(r),o.appendChild(m);const p=document.createElement("div");Object.assign(p.style,{width:`${y}px`,maxWidth:"calc(100vw - 48px)",height:`${Math.min(y,Math.max(320,window.innerHeight-140))}px`,maxHeight:"calc(100vh - 150px)",borderRadius:"20px",background:"white",border:"1px solid rgba(15,23,42,0.12)",boxShadow:"0 18px 45px rgba(15,23,42,0.16)",overflow:"hidden"}),C.appendChild(p);const d=document.createElement("iframe");d.src=t,d.title="Copilot chat widget",d.allow="clipboard-read; clipboard-write; microphone; camera; display-capture",d.setAttribute("scrolling","no"),Object.assign(d.style,{width:"100%",height:"100%",border:"none",display:"block",background:"transparent",overflow:"hidden"}),C.appendChild(p),p.appendChild(d),i.appendChild(o),i.appendChild(p),document.body.appendChild(e),document.body.appendChild(i);let u=!1;const f=()=>{u&&(u=!1,i.style.opacity="0",i.style.transform="scale(0.8) translateY(20px)",o.style.display="none",setTimeout(()=>{i.style.display="none"},250),e.style.transform="scale(1)")},O=w=>{const{data:a,source:h}=w||{};if(a?.type){if(a.type==="CART_CHECKOUT"&&h===d.contentWindow){console.log("[CopilotChat] Received checkout payload from widget:",a),l("Checkout message received from chat widget. Check console for payload.");return}if(a.type==="WIDGET_READY"&&h===d.contentWindow){d.contentWindow.postMessage({type:"INIT_WIDGET"},"*");return}a.type==="CHAT_CLOSED"&&f()}};e.onclick=w=>{w.stopPropagation(),u=!u,u?(i.style.display="block",o.style.display="block",requestAnimationFrame(()=>{i.style.opacity="1",i.style.transform="scale(1) translateY(0)"})):f()},window.addEventListener("message",O),document.addEventListener("click",w=>{const a=w.target;a&&u&&!i.contains(a)&&a!==e&&f()});const g={close:f,open:()=>{u||e.click()}};return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.close=g.close,window.CopilotChat.open=g.open,window.CopilotChat.controls=g,g},E=t=>{console.error(`[CopilotChat] ${t}`)},A=()=>{const t=v();if(!t)return!1;const s=k(t),n=t.dataset||{},l=n.token||s.token,c=typeof window<"u"&&window.CopilotChatConfig&&window.CopilotChatConfig.token;return(l||c)&&n.autoload!=="false"},S=async(t={})=>{const s=t.scriptEl||v(),n=window.CopilotChatConfig||{},l=s?.dataset||{},c=k(s),e=(()=>{const o=t.token||n.token||l.token||c.token;if(o)return o;try{const r=window.localStorage.getItem("copilotChatToken");if(r)return r}catch{}if(typeof window<"u"&&typeof window.prompt=="function"){const r=window.prompt("Enter your Copilot Chat token:");if(r){try{window.localStorage.setItem("copilotChatToken",r)}catch{}return r}}return null})();if(!e)return E("Missing token (provide via init config, window.CopilotChatConfig.token, or data-token attribute)."),null;const i=t.baseUrl||n.baseUrl||l.baseUrl||c.baseUrl||T;try{const o=await fetch(`${i}/api/chat-widget/config?token=${encodeURIComponent(e)}`,{credentials:"omit",mode:"cors"});if(!o.ok)throw new Error(`Server responded with ${o.status}`);const r=await o.json();if(!r?.iframeUrl||!r?.launcherIcon)throw new Error("Received incomplete widget configuration from server.");return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.init=(p={})=>{const d={iframeUrl:p.iframeUrl||r.iframeUrl,launcherIcon:p.launcherIcon||r.launcherIcon};return U(d)},window.CopilotChat.init(t)}catch(o){return E(o instanceof Error?o.message:"Unknown error during widget bootstrap."),null}};A()&&I(()=>{S()}),window.CopilotChat=window.CopilotChat||{},window.CopilotChat.load=S})()})();
7
+ `,Object.assign(e.style,{position:"fixed",bottom:"24px",right:"24px",width:`${b}px`,height:`${b}px`,borderRadius:"50%",border:"none",background:"linear-gradient(135deg, #0078ff, #00c6ff)",color:"white",cursor:"pointer",zIndex:999998,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 6px 14px rgba(0,0,0,0.25)",transition:"all 0.25s ease"}),e.onmouseover=()=>{e.style.transform="scale(1.12)",e.style.boxShadow="0 10px 25px rgba(0,0,0,0.3)"},e.onmouseout=()=>{e.style.transform="scale(1)",e.style.boxShadow="0 6px 14px rgba(0,0,0,0.25)"};const i=document.createElement("div");i.setAttribute("data-copilot-widget-root","true"),Object.assign(i.style,{display:"none",position:"fixed",bottom:`${b+36}px`,right:"24px",zIndex:"999999",transformOrigin:"bottom right",transform:"scale(0.8) translateY(20px)",opacity:"0",transition:"all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55)"});const o=document.createElement("div"),r=document.createElement("div"),m=document.createElement("div");Object.assign(o.style,{position:"absolute",bottom:"-14px",right:"28px",width:"30px",height:"20px",pointerEvents:"none",display:"none",zIndex:"1"}),Object.assign(r.style,{position:"absolute",bottom:"0",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"15px solid transparent",borderRight:"15px solid transparent",borderTop:"15px solid rgba(15,23,42,0.1)"}),Object.assign(m.style,{position:"absolute",bottom:"2px",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"13px solid transparent",borderRight:"13px solid transparent",borderTop:"13px solid white",boxShadow:"0 6px 16px rgba(15,23,42,0.12)",borderRadius:"2px"}),o.appendChild(r),o.appendChild(m);const p=document.createElement("div");Object.assign(p.style,{width:`${x}px`,maxWidth:"calc(100vw - 48px)",height:`${Math.min(x,Math.max(320,window.innerHeight-140))}px`,maxHeight:"calc(100vh - 150px)",borderRadius:"20px",background:"white",border:"1px solid rgba(15,23,42,0.12)",boxShadow:"0 18px 45px rgba(15,23,42,0.16)",overflow:"hidden"}),C.appendChild(p);const d=document.createElement("iframe");d.src=t,d.title="Copilot chat widget",d.allow="clipboard-read; clipboard-write; microphone; camera; display-capture",d.setAttribute("scrolling","no"),Object.assign(d.style,{width:"100%",height:"100%",border:"none",display:"block",background:"transparent",overflow:"hidden"}),C.appendChild(p),p.appendChild(d),i.appendChild(o),i.appendChild(p),document.body.appendChild(e),document.body.appendChild(i);let u=!1;const f=()=>{u&&(u=!1,i.style.opacity="0",i.style.transform="scale(0.8) translateY(20px)",o.style.display="none",setTimeout(()=>{i.style.display="none"},250),e.style.transform="scale(1)")},O=w=>{const{data:a,source:h}=w||{};if(a?.type){if(a.type==="CART_CHECKOUT"&&h===d.contentWindow){console.log("[CopilotChat] Received checkout payload from widget:",a),l("Data:");return}if(a.type==="WIDGET_READY"&&h===d.contentWindow){d.contentWindow.postMessage({type:"INIT_WIDGET"},"*");return}a.type==="CHAT_CLOSED"&&f()}};e.onclick=w=>{w.stopPropagation(),u=!u,u?(i.style.display="block",o.style.display="block",requestAnimationFrame(()=>{i.style.opacity="1",i.style.transform="scale(1) translateY(0)"})):f()},window.addEventListener("message",O),document.addEventListener("click",w=>{const a=w.target;a&&u&&!i.contains(a)&&a!==e&&f()});const g={close:f,open:()=>{u||e.click()}};return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.close=g.close,window.CopilotChat.open=g.open,window.CopilotChat.controls=g,g},v=t=>{console.error(`[CopilotChat] ${t}`)},A=()=>{const t=E();if(!t)return!1;const s=k(t),n=t.dataset||{},l=n.token||s.token,c=typeof window<"u"&&window.CopilotChatConfig&&window.CopilotChatConfig.token;return(l||c)&&n.autoload!=="false"},S=async(t={})=>{const s=t.scriptEl||E(),n=window.CopilotChatConfig||{},l=s?.dataset||{},c=k(s),e=(()=>{const o=t.token||n.token||l.token||c.token;if(o)return o;try{const r=window.localStorage.getItem("copilotChatToken");if(r)return r}catch{}if(typeof window<"u"&&typeof window.prompt=="function"){const r=window.prompt("Enter your Copilot Chat token:");if(r){try{window.localStorage.setItem("copilotChatToken",r)}catch{}return r}}return null})();if(!e)return v("Missing token (provide via init config, window.CopilotChatConfig.token, or data-token attribute)."),null;const i=t.baseUrl||n.baseUrl||l.baseUrl||c.baseUrl||T;try{const o=await fetch(`${i}/api/chat-widget/config?token=${encodeURIComponent(e)}`,{credentials:"omit",mode:"cors"});if(!o.ok)throw new Error(`Server responded with ${o.status}`);const r=await o.json();if(!r?.iframeUrl||!r?.launcherIcon)throw new Error("Received incomplete widget configuration from server.");return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.init=(p={})=>{const d={iframeUrl:p.iframeUrl||r.iframeUrl,launcherIcon:p.launcherIcon||r.launcherIcon};return U(d)},window.CopilotChat.init(t)}catch(o){return v(o instanceof Error?o.message:"Unknown error during widget bootstrap."),null}};A()&&I(()=>{S()}),window.CopilotChat=window.CopilotChat||{},window.CopilotChat.load=S})()})();
package/dist/index.cjs CHANGED
@@ -1,7 +1,7 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const E="http://localhost:3000",w=64,C=720,k=({iframeUrl:h,launcherIcon:u})=>{const d=document.querySelector("[data-copilot-widget-root]");d&&d.remove();const g=s=>{const o=document.querySelector("[data-copilot-checkout-toast]");o&&o.remove();const r=document.createElement("div");r.setAttribute("data-copilot-checkout-toast","true"),r.innerText=s,Object.assign(r.style,{position:"fixed",top:"20px",left:"50%",transform:"translateX(-50%)",padding:"12px 16px",background:"#0f172a",color:"white",borderRadius:"12px",boxShadow:"0 8px 24px rgba(0,0,0,0.25)",zIndex:2147483647,fontSize:"14px",fontWeight:"600",maxWidth:"420px",lineHeight:"1.4",textAlign:"center"}),document.body.appendChild(r),setTimeout(()=>{r.remove()},4500)},c=document.createElement("div");c.setAttribute("data-copilot-widget-root","true");const n=c.attachShadow({mode:"open"});document.body.appendChild(c);const t=document.createElement("button");t.type="button",t.setAttribute("aria-label","Open Copilot chat"),t.innerHTML=`
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const v="http://localhost:3000",w=64,C=720,E=({iframeUrl:c,launcherIcon:p})=>{const r=document.querySelector("[data-copilot-widget-root]");r&&r.remove();const a=document.createElement("div");a.setAttribute("data-copilot-widget-root","true");const h=a.attachShadow({mode:"open"});document.body.appendChild(a);const t=document.createElement("button");t.type="button",t.setAttribute("aria-label","Open Copilot chat"),t.innerHTML=`
2
2
  <img
3
- src="${u}"
3
+ src="${p}"
4
4
  alt="Copilot chat launcher"
5
5
  style="width: 38px; height: 38px; object-fit: contain; border-radius: 50%; pointer-events: none;"
6
6
  />
7
- `,Object.assign(t.style,{position:"fixed",bottom:"24px",right:"24px",width:`${w}px`,height:`${w}px`,borderRadius:"50%",border:"none",background:"linear-gradient(135deg, #0078ff, #00c6ff)",color:"white",cursor:"pointer",zIndex:999998,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 6px 14px rgba(0,0,0,0.25)",transition:"all 0.25s ease"}),t.onmouseover=()=>{t.style.transform="scale(1.12)",t.style.boxShadow="0 10px 25px rgba(0,0,0,0.3)"},t.onmouseout=()=>{t.style.transform="scale(1)",t.style.boxShadow="0 6px 14px rgba(0,0,0,0.25)"};const e=document.createElement("div");e.setAttribute("data-copilot-widget-root","true"),Object.assign(e.style,{display:"none",position:"fixed",bottom:`${w+36}px`,right:"24px",zIndex:"999999",transformOrigin:"bottom right",transform:"scale(0.8) translateY(20px)",opacity:"0",transition:"all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55)"});const l=document.createElement("div"),f=document.createElement("div"),x=document.createElement("div");Object.assign(l.style,{position:"absolute",bottom:"-14px",right:"28px",width:"30px",height:"20px",pointerEvents:"none",display:"none",zIndex:"1"}),Object.assign(f.style,{position:"absolute",bottom:"0",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"15px solid transparent",borderRight:"15px solid transparent",borderTop:"15px solid rgba(15,23,42,0.1)"}),Object.assign(x.style,{position:"absolute",bottom:"2px",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"13px solid transparent",borderRight:"13px solid transparent",borderTop:"13px solid white",boxShadow:"0 6px 16px rgba(15,23,42,0.12)",borderRadius:"2px"}),l.appendChild(f),l.appendChild(x);const p=document.createElement("div");Object.assign(p.style,{width:`${C}px`,maxWidth:"calc(100vw - 48px)",height:`${Math.min(C,Math.max(320,window.innerHeight-140))}px`,maxHeight:"calc(100vh - 150px)",borderRadius:"20px",background:"white",border:"1px solid rgba(15,23,42,0.12)",boxShadow:"0 18px 45px rgba(15,23,42,0.16)",overflow:"hidden"}),n.appendChild(p);const i=document.createElement("iframe");i.src=h,i.title="Copilot chat widget",i.allow="clipboard-read; clipboard-write; microphone; camera; display-capture",i.setAttribute("scrolling","no"),Object.assign(i.style,{width:"100%",height:"100%",border:"none",display:"block",background:"transparent",overflow:"hidden"}),n.appendChild(p),p.appendChild(i),e.appendChild(l),e.appendChild(p),document.body.appendChild(t),document.body.appendChild(e);let a=!1;const b=()=>{a&&(a=!1,e.style.opacity="0",e.style.transform="scale(0.8) translateY(20px)",l.style.display="none",setTimeout(()=>{e.style.display="none"},250),t.style.transform="scale(1)")},v=s=>{const{data:o,source:r}=s||{};if(o?.type){if(o.type==="CART_CHECKOUT"&&r===i.contentWindow){console.log("[CopilotChat] Received checkout payload from widget:",o),g("Data:");return}if(o.type==="WIDGET_READY"&&r===i.contentWindow){i.contentWindow.postMessage({type:"INIT_WIDGET"},"*");return}o.type==="CHAT_CLOSED"&&b()}};window.addEventListener("message",v),t.onclick=s=>{s.stopPropagation(),a=!a,a?(e.style.display="block",l.style.display="block",requestAnimationFrame(()=>{e.style.opacity="1",e.style.transform="scale(1) translateY(0)"})):b()},document.addEventListener("click",s=>{const o=s.target;o&&a&&!e.contains(o)&&o!==t&&b()});const m={close:b,open:()=>{a||t.click()}};return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.close=m.close,window.CopilotChat.open=m.open,window.CopilotChat.controls=m,m};async function y(h={}){if(typeof window>"u"||typeof document>"u")return null;const u=window.CopilotChatConfig||{},d=h.token||u.token||typeof window<"u"&&window.localStorage?.getItem("copilotChatToken")||null;if(!d)return console.error("[CopilotChat] Missing token (provide via loadCopilotChatWidget({ token }) or window.CopilotChatConfig.token)."),null;const g=h.baseUrl||u.baseUrl||E,c=`${g.replace(/\/$/,"")}/api/chat-widget/config?token=${encodeURIComponent(d)}`;try{const n=await fetch(c,{credentials:"omit",mode:"cors"});if(!n.ok)throw new Error(`Server responded with ${n.status}`);const t=await n.json();if(!t?.iframeUrl||!t?.launcherIcon)throw new Error("Received incomplete widget configuration from server.");return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.token=d,window.CopilotChat.baseUrl=g,k({iframeUrl:t.iframeUrl,launcherIcon:t.launcherIcon})}catch(n){return console.error("[CopilotChat] Error during widget bootstrap:",n instanceof Error?n.message:n),null}}exports.default=y;exports.loadCopilotChatWidget=y;
7
+ `,Object.assign(t.style,{position:"fixed",bottom:"24px",right:"24px",width:`${w}px`,height:`${w}px`,borderRadius:"50%",border:"none",background:"linear-gradient(135deg, #0078ff, #00c6ff)",color:"white",cursor:"pointer",zIndex:999998,display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 6px 14px rgba(0,0,0,0.25)",transition:"all 0.25s ease"}),t.onmouseover=()=>{t.style.transform="scale(1.12)",t.style.boxShadow="0 10px 25px rgba(0,0,0,0.3)"},t.onmouseout=()=>{t.style.transform="scale(1)",t.style.boxShadow="0 6px 14px rgba(0,0,0,0.25)"};const e=document.createElement("div");e.setAttribute("data-copilot-widget-root","true"),Object.assign(e.style,{display:"none",position:"fixed",bottom:`${w+36}px`,right:"24px",zIndex:"999999",transformOrigin:"bottom right",transform:"scale(0.8) translateY(20px)",opacity:"0",transition:"all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55)"});const s=document.createElement("div"),b=document.createElement("div"),m=document.createElement("div");Object.assign(s.style,{position:"absolute",bottom:"-14px",right:"28px",width:"30px",height:"20px",pointerEvents:"none",display:"none",zIndex:"1"}),Object.assign(b.style,{position:"absolute",bottom:"0",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"15px solid transparent",borderRight:"15px solid transparent",borderTop:"15px solid rgba(15,23,42,0.1)"}),Object.assign(m.style,{position:"absolute",bottom:"2px",left:"0",right:"0",margin:"0 auto",width:"0",height:"0",borderLeft:"13px solid transparent",borderRight:"13px solid transparent",borderTop:"13px solid white",boxShadow:"0 6px 16px rgba(15,23,42,0.12)",borderRadius:"2px"}),s.appendChild(b),s.appendChild(m);const l=document.createElement("div");Object.assign(l.style,{width:`${C}px`,maxWidth:"calc(100vw - 48px)",height:`${Math.min(C,Math.max(320,window.innerHeight-140))}px`,maxHeight:"calc(100vh - 150px)",borderRadius:"20px",background:"white",border:"1px solid rgba(15,23,42,0.12)",boxShadow:"0 18px 45px rgba(15,23,42,0.16)",overflow:"hidden"}),h.appendChild(l);const o=document.createElement("iframe");o.src=c,o.title="Copilot chat widget",o.allow="clipboard-read; clipboard-write; microphone; camera; display-capture",o.setAttribute("scrolling","no"),Object.assign(o.style,{width:"100%",height:"100%",border:"none",display:"block",background:"transparent",overflow:"hidden"}),h.appendChild(l),l.appendChild(o),e.appendChild(s),e.appendChild(l),document.body.appendChild(t),document.body.appendChild(e);let i=!1;const u=()=>{i&&(i=!1,e.style.opacity="0",e.style.transform="scale(0.8) translateY(20px)",s.style.display="none",setTimeout(()=>{e.style.display="none"},250),t.style.transform="scale(1)")},y=d=>{const{data:n,source:f}=d||{};if(n?.type){if(n.type==="CART_CHECKOUT"&&f===o.contentWindow){console.log("[CopilotChat] Received checkout payload from widget:",n);return}if(n.type==="WIDGET_READY"&&f===o.contentWindow){o.contentWindow.postMessage({type:"INIT_WIDGET"},"*");return}n.type==="CHAT_CLOSED"&&u()}};window.addEventListener("message",y),t.onclick=d=>{d.stopPropagation(),i=!i,i?(e.style.display="block",s.style.display="block",requestAnimationFrame(()=>{e.style.opacity="1",e.style.transform="scale(1) translateY(0)"})):u()},document.addEventListener("click",d=>{const n=d.target;n&&i&&!e.contains(n)&&n!==t&&u()});const g={close:u,open:()=>{i||t.click()}};return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.close=g.close,window.CopilotChat.open=g.open,window.CopilotChat.controls=g,g};async function x(c={}){if(typeof window>"u"||typeof document>"u")return null;const p=window.CopilotChatConfig||{},r=c.token||p.token||typeof window<"u"&&window.localStorage?.getItem("copilotChatToken")||null;if(!r)return console.error("[CopilotChat] Missing token (provide via loadCopilotChatWidget({ token }) or window.CopilotChatConfig.token)."),null;const a=c.baseUrl||p.baseUrl||v,h=`${a.replace(/\/$/,"")}/api/chat-widget/config?token=${encodeURIComponent(r)}`;try{const t=await fetch(h,{credentials:"omit",mode:"cors"});if(!t.ok)throw new Error(`Server responded with ${t.status}`);const e=await t.json();if(!e?.iframeUrl||!e?.launcherIcon)throw new Error("Received incomplete widget configuration from server.");return window.CopilotChat=window.CopilotChat||{},window.CopilotChat.token=r,window.CopilotChat.baseUrl=a,E({iframeUrl:e.iframeUrl,launcherIcon:e.launcherIcon})}catch(t){return console.error("[CopilotChat] Error during widget bootstrap:",t instanceof Error?t.message:t),null}}exports.default=x;exports.loadCopilotChatWidget=x;
package/dist/index.mjs CHANGED
@@ -1,38 +1,15 @@
1
1
  const C = "http://localhost:3000";
2
- const y = ({ iframeUrl: h, launcherIcon: u }) => {
3
- const d = document.querySelector("[data-copilot-widget-root]");
4
- d && d.remove();
5
- const g = (s) => {
6
- const o = document.querySelector("[data-copilot-checkout-toast]");
7
- o && o.remove();
8
- const r = document.createElement("div");
9
- r.setAttribute("data-copilot-checkout-toast", "true"), r.innerText = s, Object.assign(r.style, {
10
- position: "fixed",
11
- top: "20px",
12
- left: "50%",
13
- transform: "translateX(-50%)",
14
- padding: "12px 16px",
15
- background: "#0f172a",
16
- color: "white",
17
- borderRadius: "12px",
18
- boxShadow: "0 8px 24px rgba(0,0,0,0.25)",
19
- zIndex: 2147483647,
20
- fontSize: "14px",
21
- fontWeight: "600",
22
- maxWidth: "420px",
23
- lineHeight: "1.4",
24
- textAlign: "center"
25
- }), document.body.appendChild(r), setTimeout(() => {
26
- r.remove();
27
- }, 4500);
28
- }, c = document.createElement("div");
29
- c.setAttribute("data-copilot-widget-root", "true");
30
- const n = c.attachShadow({ mode: "open" });
31
- document.body.appendChild(c);
2
+ const x = ({ iframeUrl: c, launcherIcon: p }) => {
3
+ const r = document.querySelector("[data-copilot-widget-root]");
4
+ r && r.remove();
5
+ const a = document.createElement("div");
6
+ a.setAttribute("data-copilot-widget-root", "true");
7
+ const h = a.attachShadow({ mode: "open" });
8
+ document.body.appendChild(a);
32
9
  const t = document.createElement("button");
33
10
  t.type = "button", t.setAttribute("aria-label", "Open Copilot chat"), t.innerHTML = `
34
11
  <img
35
- src="${u}"
12
+ src="${p}"
36
13
  alt="Copilot chat launcher"
37
14
  style="width: 38px; height: 38px; object-fit: contain; border-radius: 50%; pointer-events: none;"
38
15
  />
@@ -70,8 +47,8 @@ const y = ({ iframeUrl: h, launcherIcon: u }) => {
70
47
  opacity: "0",
71
48
  transition: "all 0.3s cubic-bezier(0.68, -0.55, 0.265, 1.55)"
72
49
  });
73
- const l = document.createElement("div"), m = document.createElement("div"), f = document.createElement("div");
74
- Object.assign(l.style, {
50
+ const s = document.createElement("div"), g = document.createElement("div"), b = document.createElement("div");
51
+ Object.assign(s.style, {
75
52
  position: "absolute",
76
53
  bottom: "-14px",
77
54
  right: "28px",
@@ -80,7 +57,7 @@ const y = ({ iframeUrl: h, launcherIcon: u }) => {
80
57
  pointerEvents: "none",
81
58
  display: "none",
82
59
  zIndex: "1"
83
- }), Object.assign(m.style, {
60
+ }), Object.assign(g.style, {
84
61
  position: "absolute",
85
62
  bottom: "0",
86
63
  left: "0",
@@ -91,7 +68,7 @@ const y = ({ iframeUrl: h, launcherIcon: u }) => {
91
68
  borderLeft: "15px solid transparent",
92
69
  borderRight: "15px solid transparent",
93
70
  borderTop: "15px solid rgba(15,23,42,0.1)"
94
- }), Object.assign(f.style, {
71
+ }), Object.assign(b.style, {
95
72
  position: "absolute",
96
73
  bottom: "2px",
97
74
  left: "0",
@@ -104,9 +81,9 @@ const y = ({ iframeUrl: h, launcherIcon: u }) => {
104
81
  borderTop: "13px solid white",
105
82
  boxShadow: "0 6px 16px rgba(15,23,42,0.12)",
106
83
  borderRadius: "2px"
107
- }), l.appendChild(m), l.appendChild(f);
108
- const p = document.createElement("div");
109
- Object.assign(p.style, {
84
+ }), s.appendChild(g), s.appendChild(b);
85
+ const l = document.createElement("div");
86
+ Object.assign(l.style, {
110
87
  width: "720px",
111
88
  maxWidth: "calc(100vw - 48px)",
112
89
  height: `${Math.min(720, Math.max(320, window.innerHeight - 140))}px`,
@@ -116,84 +93,84 @@ const y = ({ iframeUrl: h, launcherIcon: u }) => {
116
93
  border: "1px solid rgba(15,23,42,0.12)",
117
94
  boxShadow: "0 18px 45px rgba(15,23,42,0.16)",
118
95
  overflow: "hidden"
119
- }), n.appendChild(p);
120
- const i = document.createElement("iframe");
121
- i.src = h, i.title = "Copilot chat widget", i.allow = "clipboard-read; clipboard-write; microphone; camera; display-capture", i.setAttribute("scrolling", "no"), Object.assign(i.style, {
96
+ }), h.appendChild(l);
97
+ const o = document.createElement("iframe");
98
+ o.src = c, o.title = "Copilot chat widget", o.allow = "clipboard-read; clipboard-write; microphone; camera; display-capture", o.setAttribute("scrolling", "no"), Object.assign(o.style, {
122
99
  width: "100%",
123
100
  height: "100%",
124
101
  border: "none",
125
102
  display: "block",
126
103
  background: "transparent",
127
104
  overflow: "hidden"
128
- }), n.appendChild(p), p.appendChild(i), e.appendChild(l), e.appendChild(p), document.body.appendChild(t), document.body.appendChild(e);
129
- let a = !1;
130
- const w = () => {
131
- a && (a = !1, e.style.opacity = "0", e.style.transform = "scale(0.8) translateY(20px)", l.style.display = "none", setTimeout(() => {
105
+ }), h.appendChild(l), l.appendChild(o), e.appendChild(s), e.appendChild(l), document.body.appendChild(t), document.body.appendChild(e);
106
+ let i = !1;
107
+ const u = () => {
108
+ i && (i = !1, e.style.opacity = "0", e.style.transform = "scale(0.8) translateY(20px)", s.style.display = "none", setTimeout(() => {
132
109
  e.style.display = "none";
133
110
  }, 250), t.style.transform = "scale(1)");
134
- }, x = (s) => {
135
- const { data: o, source: r } = s || {};
136
- if (o?.type) {
137
- if (o.type === "CART_CHECKOUT" && r === i.contentWindow) {
138
- console.log("[CopilotChat] Received checkout payload from widget:", o), g("Data:");
111
+ }, f = (d) => {
112
+ const { data: n, source: m } = d || {};
113
+ if (n?.type) {
114
+ if (n.type === "CART_CHECKOUT" && m === o.contentWindow) {
115
+ console.log("[CopilotChat] Received checkout payload from widget:", n);
139
116
  return;
140
117
  }
141
- if (o.type === "WIDGET_READY" && r === i.contentWindow) {
142
- i.contentWindow.postMessage({ type: "INIT_WIDGET" }, "*");
118
+ if (n.type === "WIDGET_READY" && m === o.contentWindow) {
119
+ o.contentWindow.postMessage({ type: "INIT_WIDGET" }, "*");
143
120
  return;
144
121
  }
145
- o.type === "CHAT_CLOSED" && w();
122
+ n.type === "CHAT_CLOSED" && u();
146
123
  }
147
124
  };
148
- window.addEventListener("message", x), t.onclick = (s) => {
149
- s.stopPropagation(), a = !a, a ? (e.style.display = "block", l.style.display = "block", requestAnimationFrame(() => {
125
+ window.addEventListener("message", f), t.onclick = (d) => {
126
+ d.stopPropagation(), i = !i, i ? (e.style.display = "block", s.style.display = "block", requestAnimationFrame(() => {
150
127
  e.style.opacity = "1", e.style.transform = "scale(1) translateY(0)";
151
- })) : w();
152
- }, document.addEventListener("click", (s) => {
153
- const o = s.target;
154
- o && a && !e.contains(o) && o !== t && w();
128
+ })) : u();
129
+ }, document.addEventListener("click", (d) => {
130
+ const n = d.target;
131
+ n && i && !e.contains(n) && n !== t && u();
155
132
  });
156
- const b = {
157
- close: w,
133
+ const w = {
134
+ close: u,
158
135
  open: () => {
159
- a || t.click();
136
+ i || t.click();
160
137
  }
161
138
  };
162
- return window.CopilotChat = window.CopilotChat || {}, window.CopilotChat.close = b.close, window.CopilotChat.open = b.open, window.CopilotChat.controls = b, b;
139
+ return window.CopilotChat = window.CopilotChat || {}, window.CopilotChat.close = w.close, window.CopilotChat.open = w.open, window.CopilotChat.controls = w, w;
163
140
  };
164
- async function E(h = {}) {
141
+ async function y(c = {}) {
165
142
  if (typeof window > "u" || typeof document > "u")
166
143
  return null;
167
- const u = window.CopilotChatConfig || {}, d = h.token || u.token || typeof window < "u" && window.localStorage?.getItem("copilotChatToken") || null;
168
- if (!d)
144
+ const p = window.CopilotChatConfig || {}, r = c.token || p.token || typeof window < "u" && window.localStorage?.getItem("copilotChatToken") || null;
145
+ if (!r)
169
146
  return console.error(
170
147
  "[CopilotChat] Missing token (provide via loadCopilotChatWidget({ token }) or window.CopilotChatConfig.token)."
171
148
  ), null;
172
- const g = h.baseUrl || u.baseUrl || C, c = `${g.replace(/\/$/, "")}/api/chat-widget/config?token=${encodeURIComponent(
173
- d
149
+ const a = c.baseUrl || p.baseUrl || C, h = `${a.replace(/\/$/, "")}/api/chat-widget/config?token=${encodeURIComponent(
150
+ r
174
151
  )}`;
175
152
  try {
176
- const n = await fetch(c, {
153
+ const t = await fetch(h, {
177
154
  credentials: "omit",
178
155
  mode: "cors"
179
156
  });
180
- if (!n.ok)
181
- throw new Error(`Server responded with ${n.status}`);
182
- const t = await n.json();
183
- if (!t?.iframeUrl || !t?.launcherIcon)
157
+ if (!t.ok)
158
+ throw new Error(`Server responded with ${t.status}`);
159
+ const e = await t.json();
160
+ if (!e?.iframeUrl || !e?.launcherIcon)
184
161
  throw new Error("Received incomplete widget configuration from server.");
185
- return window.CopilotChat = window.CopilotChat || {}, window.CopilotChat.token = d, window.CopilotChat.baseUrl = g, y({
186
- iframeUrl: t.iframeUrl,
187
- launcherIcon: t.launcherIcon
162
+ return window.CopilotChat = window.CopilotChat || {}, window.CopilotChat.token = r, window.CopilotChat.baseUrl = a, x({
163
+ iframeUrl: e.iframeUrl,
164
+ launcherIcon: e.launcherIcon
188
165
  });
189
- } catch (n) {
166
+ } catch (t) {
190
167
  return console.error(
191
168
  "[CopilotChat] Error during widget bootstrap:",
192
- n instanceof Error ? n.message : n
169
+ t instanceof Error ? t.message : t
193
170
  ), null;
194
171
  }
195
172
  }
196
173
  export {
197
- E as default,
198
- E as loadCopilotChatWidget
174
+ y as default,
175
+ y as loadCopilotChatWidget
199
176
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "copilot-chat-widget",
3
- "version": "0.1.27",
3
+ "version": "0.1.29",
4
4
  "description": "Embeddable Copilot chat widget that can be loaded via NPM or a script tag.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
package/src/index.js CHANGED
@@ -209,7 +209,6 @@ const buildWidget = ({ iframeUrl, launcherIcon }) => {
209
209
 
210
210
  if (data.type === "CART_CHECKOUT" && source === iframe.contentWindow) {
211
211
  console.log("[CopilotChat] Received checkout payload from widget:", data);
212
- showCheckoutToast("Data:",data);
213
212
  return;
214
213
  }
215
214
 
@@ -27,7 +27,10 @@
27
27
  };
28
28
 
29
29
  const ready = (fn) => {
30
- if (document.readyState === "complete" || document.readyState === "interactive") {
30
+ if (
31
+ document.readyState === "complete" ||
32
+ document.readyState === "interactive"
33
+ ) {
31
34
  setTimeout(fn, 0);
32
35
  } else {
33
36
  document.addEventListener("DOMContentLoaded", fn);
@@ -40,7 +43,10 @@
40
43
  const srcUrl = new URL(scriptEl.src, window.location.href);
41
44
  return `${srcUrl.protocol}//${srcUrl.host}`;
42
45
  } catch (error) {
43
- console.warn("[CopilotChat] Unable to infer base URL from script source.", error);
46
+ console.warn(
47
+ "[CopilotChat] Unable to infer base URL from script source.",
48
+ error
49
+ );
44
50
  return null;
45
51
  }
46
52
  };
@@ -53,7 +59,11 @@
53
59
  const scripts = Array.from(document.querySelectorAll("script"));
54
60
  const candidate = scripts
55
61
  .reverse()
56
- .find((script) => script.dataset?.token || (script.src && script.src.includes("chat-widget")));
62
+ .find(
63
+ (script) =>
64
+ script.dataset?.token ||
65
+ (script.src && script.src.includes("chat-widget"))
66
+ );
57
67
 
58
68
  return candidate || null;
59
69
  };
@@ -65,7 +75,9 @@
65
75
  }
66
76
 
67
77
  const showCheckoutToast = (message) => {
68
- const existingToast = document.querySelector("[data-copilot-checkout-toast]");
78
+ const existingToast = document.querySelector(
79
+ "[data-copilot-checkout-toast]"
80
+ );
69
81
  if (existingToast) {
70
82
  existingToast.remove();
71
83
  }
@@ -223,7 +235,8 @@
223
235
  const iframe = document.createElement("iframe");
224
236
  iframe.src = iframeUrl;
225
237
  iframe.title = "Copilot chat widget";
226
- iframe.allow = "clipboard-read; clipboard-write; microphone; camera; display-capture";
238
+ iframe.allow =
239
+ "clipboard-read; clipboard-write; microphone; camera; display-capture";
227
240
  iframe.setAttribute("scrolling", "no");
228
241
  Object.assign(iframe.style, {
229
242
  width: "100%",
@@ -261,8 +274,12 @@
261
274
  if (!data?.type) return;
262
275
 
263
276
  if (data.type === "CART_CHECKOUT" && source === iframe.contentWindow) {
264
- console.log("[CopilotChat] Received checkout payload from widget:", data);
265
- showCheckoutToast("Checkout message received from chat widget. Check console for payload.");
277
+ console.log(
278
+ "[CopilotChat] Received checkout payload from widget:",
279
+ data
280
+ );
281
+ showCheckoutToast("Data:", data);
282
+
266
283
  return;
267
284
  }
268
285
 
@@ -328,7 +345,10 @@
328
345
  const queryConfig = readQueryConfig(scriptEl);
329
346
  const dataset = scriptEl.dataset || {};
330
347
  const hasTokenHint = dataset.token || queryConfig.token;
331
- const hasGlobalToken = typeof window !== "undefined" && window.CopilotChatConfig && window.CopilotChatConfig.token;
348
+ const hasGlobalToken =
349
+ typeof window !== "undefined" &&
350
+ window.CopilotChatConfig &&
351
+ window.CopilotChatConfig.token;
332
352
  return (hasTokenHint || hasGlobalToken) && dataset.autoload !== "false";
333
353
  };
334
354
 
@@ -339,7 +359,11 @@
339
359
  const queryConfig = readQueryConfig(scriptEl);
340
360
 
341
361
  const resolveToken = () => {
342
- const fromConfig = config.token || globalConfig.token || datasetConfig.token || queryConfig.token;
362
+ const fromConfig =
363
+ config.token ||
364
+ globalConfig.token ||
365
+ datasetConfig.token ||
366
+ queryConfig.token;
343
367
  if (fromConfig) return fromConfig;
344
368
 
345
369
  try {
@@ -349,7 +373,10 @@
349
373
  // ignore storage errors
350
374
  }
351
375
 
352
- if (typeof window !== "undefined" && typeof window.prompt === "function") {
376
+ if (
377
+ typeof window !== "undefined" &&
378
+ typeof window.prompt === "function"
379
+ ) {
353
380
  const entered = window.prompt("Enter your Copilot Chat token:");
354
381
  if (entered) {
355
382
  try {
@@ -367,7 +394,9 @@
367
394
  const token = resolveToken();
368
395
 
369
396
  if (!token) {
370
- handleError("Missing token (provide via init config, window.CopilotChatConfig.token, or data-token attribute).");
397
+ handleError(
398
+ "Missing token (provide via init config, window.CopilotChatConfig.token, or data-token attribute)."
399
+ );
371
400
  return null;
372
401
  }
373
402
 
@@ -382,15 +411,20 @@
382
411
  null;
383
412
 
384
413
  if (!baseUrl) {
385
- handleError("Unable to resolve base URL from embedding script or window.location.");
414
+ handleError(
415
+ "Unable to resolve base URL from embedding script or window.location."
416
+ );
386
417
  return null;
387
418
  }
388
419
 
389
420
  try {
390
- const response = await fetch(`${baseUrl}/api/chat-widget/config?token=${encodeURIComponent(token)}`, {
391
- credentials: "omit",
392
- mode: "cors",
393
- });
421
+ const response = await fetch(
422
+ `${baseUrl}/api/chat-widget/config?token=${encodeURIComponent(token)}`,
423
+ {
424
+ credentials: "omit",
425
+ mode: "cors",
426
+ }
427
+ );
394
428
 
395
429
  if (!response.ok) {
396
430
  throw new Error(`Server responded with ${response.status}`);
@@ -398,7 +432,9 @@
398
432
 
399
433
  const remoteConfig = await response.json();
400
434
  if (!remoteConfig?.iframeUrl || !remoteConfig?.launcherIcon) {
401
- throw new Error("Received incomplete widget configuration from server.");
435
+ throw new Error(
436
+ "Received incomplete widget configuration from server."
437
+ );
402
438
  }
403
439
 
404
440
  window.CopilotChat = window.CopilotChat || {};
@@ -414,7 +450,11 @@
414
450
  const controls = window.CopilotChat.init(config);
415
451
  return controls;
416
452
  } catch (error) {
417
- handleError(error instanceof Error ? error.message : "Unknown error during widget bootstrap.");
453
+ handleError(
454
+ error instanceof Error
455
+ ? error.message
456
+ : "Unknown error during widget bootstrap."
457
+ );
418
458
  return null;
419
459
  }
420
460
  };