@bitpalm/ai-agents 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.cts CHANGED
@@ -27,6 +27,17 @@ interface BitPalmAgentOptions {
27
27
  * effect when the agent has a dark theme set up in the dashboard.
28
28
  */
29
29
  theme?: BitPalmTheme;
30
+ /**
31
+ * Show the round chat button. Set to false when your site has a chat
32
+ * button of its own that calls open() or toggle(). Defaults to true.
33
+ */
34
+ launcher?: boolean;
35
+ /**
36
+ * Proactive messages set up in the dashboard. true shows them as a
37
+ * bubble (default), "events" shows nothing and fires trigger_shown so
38
+ * you can show the message yourself, false switches them off.
39
+ */
40
+ triggers?: boolean | "events";
30
41
  }
31
42
  interface BitPalmIdentifyPayload {
32
43
  /** Stable user id from the host platform (required for signed identify). */
@@ -58,7 +69,11 @@ interface BitPalmIdentifyPayload {
58
69
  */
59
70
  type BitPalmCustomContext = Record<string, unknown>;
60
71
  /** Event types emitted by the widget. */
61
- type BitPalmEventType = "widget_opened" | "widget_closed" | "conversation_started" | "message_sent" | "message_received" | "lead_captured";
72
+ type BitPalmEventType = "widget_opened" | "widget_closed" | "conversation_started" | "message_sent" | "message_received" | "lead_captured"
73
+ /** A proactive message is waiting, with { message, triggerId, triggerType }. Only with triggers: "events". */
74
+ | "trigger_shown"
75
+ /** The waiting message is gone: the chat was opened, or triggers were switched off. */
76
+ | "trigger_hidden";
62
77
  /** Callback for widget events. */
63
78
  type BitPalmEventCallback = (data?: Record<string, unknown>) => void;
64
79
  interface BitPalmAgentInstance {
@@ -114,11 +129,22 @@ interface BitPalmAgentInstance {
114
129
  * widget.setTheme('dark');
115
130
  */
116
131
  setTheme: (theme: BitPalmTheme) => void;
132
+ /** Switch proactive messages off, for example while a checkout is open. */
133
+ disableTriggers: () => void;
134
+ /** Switch them back on, as a bubble or as events, the way the triggers option says. */
135
+ enableTriggers: () => void;
117
136
  /** Remove the widget and clean up all event listeners. */
118
137
  destroy: () => void;
119
138
  }
120
139
 
121
- type BitPalmAgentProps = BitPalmAgentOptions;
140
+ interface BitPalmAgentProps extends BitPalmAgentOptions {
141
+ /**
142
+ * Called once with the widget, for open(), on('trigger_shown', …) and
143
+ * the rest of the API. Needed with launcher={false} and a button of
144
+ * your own.
145
+ */
146
+ onReady?: (widget: BitPalmAgentInstance) => void;
147
+ }
122
148
  /**
123
149
  * React component that mounts the BitPalm AI agent widget.
124
150
  *
package/dist/react.d.ts CHANGED
@@ -27,6 +27,17 @@ interface BitPalmAgentOptions {
27
27
  * effect when the agent has a dark theme set up in the dashboard.
28
28
  */
29
29
  theme?: BitPalmTheme;
30
+ /**
31
+ * Show the round chat button. Set to false when your site has a chat
32
+ * button of its own that calls open() or toggle(). Defaults to true.
33
+ */
34
+ launcher?: boolean;
35
+ /**
36
+ * Proactive messages set up in the dashboard. true shows them as a
37
+ * bubble (default), "events" shows nothing and fires trigger_shown so
38
+ * you can show the message yourself, false switches them off.
39
+ */
40
+ triggers?: boolean | "events";
30
41
  }
31
42
  interface BitPalmIdentifyPayload {
32
43
  /** Stable user id from the host platform (required for signed identify). */
@@ -58,7 +69,11 @@ interface BitPalmIdentifyPayload {
58
69
  */
59
70
  type BitPalmCustomContext = Record<string, unknown>;
60
71
  /** Event types emitted by the widget. */
61
- type BitPalmEventType = "widget_opened" | "widget_closed" | "conversation_started" | "message_sent" | "message_received" | "lead_captured";
72
+ type BitPalmEventType = "widget_opened" | "widget_closed" | "conversation_started" | "message_sent" | "message_received" | "lead_captured"
73
+ /** A proactive message is waiting, with { message, triggerId, triggerType }. Only with triggers: "events". */
74
+ | "trigger_shown"
75
+ /** The waiting message is gone: the chat was opened, or triggers were switched off. */
76
+ | "trigger_hidden";
62
77
  /** Callback for widget events. */
63
78
  type BitPalmEventCallback = (data?: Record<string, unknown>) => void;
64
79
  interface BitPalmAgentInstance {
@@ -114,11 +129,22 @@ interface BitPalmAgentInstance {
114
129
  * widget.setTheme('dark');
115
130
  */
116
131
  setTheme: (theme: BitPalmTheme) => void;
132
+ /** Switch proactive messages off, for example while a checkout is open. */
133
+ disableTriggers: () => void;
134
+ /** Switch them back on, as a bubble or as events, the way the triggers option says. */
135
+ enableTriggers: () => void;
117
136
  /** Remove the widget and clean up all event listeners. */
118
137
  destroy: () => void;
119
138
  }
120
139
 
121
- type BitPalmAgentProps = BitPalmAgentOptions;
140
+ interface BitPalmAgentProps extends BitPalmAgentOptions {
141
+ /**
142
+ * Called once with the widget, for open(), on('trigger_shown', …) and
143
+ * the rest of the API. Needed with launcher={false} and a button of
144
+ * your own.
145
+ */
146
+ onReady?: (widget: BitPalmAgentInstance) => void;
147
+ }
122
148
  /**
123
149
  * React component that mounts the BitPalm AI agent widget.
124
150
  *
package/dist/react.js CHANGED
@@ -1,2 +1,2 @@
1
- import{useEffect as rt,useRef as lt}from"react";var ut=["dark","dark-mode","dark-theme","theme-dark"],ft=["light","light-mode","light-theme","theme-light"],Ze=["data-theme","data-color-scheme","data-color-mode","data-mode","data-bs-theme"],Qe="(prefers-color-scheme: dark)";function ne(n){return n==="light"||n==="dark"?n:"auto"}function Ve(n){if(!n)return null;if(ut.some(t=>n.classList.contains(t)))return"dark";if(ft.some(t=>n.classList.contains(t)))return"light";for(let t of Ze){let r=(n.getAttribute(t)||"").toLowerCase();if(r.includes("dark"))return"dark";if(r.includes("light"))return"light"}return null}function be(n){let t=n/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function Xe(n,t){if(!n)return null;let r=t.getComputedStyle(n).backgroundColor.match(/rgba?\(([^)]+)\)/);if(!r)return null;let[a,u,y,p=1]=r[1].split(/[\s,/]+/).filter(Boolean).map(Number);return[a,u,y,p].some(g=>Number.isNaN(g))||p<.5?null:.2126*be(a)+.7152*be(u)+.0722*be(y)<.2?"dark":"light"}function pt(n,t){let r=t.getComputedStyle(n.documentElement).colorScheme||"",a=n.querySelector('meta[name="color-scheme"]')?.getAttribute("content")||"",u=`${r} ${a}`.toLowerCase();return u.includes("dark")?u.includes("light")?t.matchMedia?.(Qe).matches?"dark":"light":"dark":null}function z(n=document,t=window){return Ve(n.documentElement)??Ve(n.body)??Xe(n.body,t)??Xe(n.documentElement,t)??pt(n,t)??"light"}function ve(n,t=document,r=window){let a=z(t,r),u=!1,y=()=>{u=!1;let c=z(t,r);c!==a&&(a=c,n(c))},p=()=>{u||(u=!0,typeof r.requestAnimationFrame=="function"?r.requestAnimationFrame(y):setTimeout(y,16))},l=typeof MutationObserver<"u"?new MutationObserver(p):null,g={attributes:!0,attributeFilter:["class","style",...Ze]};l?.observe(t.documentElement,g),t.body&&l?.observe(t.body,g);let b=typeof r.matchMedia=="function"?r.matchMedia(Qe):null;return b?.addEventListener?.("change",p),()=>{l?.disconnect(),b?.removeEventListener?.("change",p)}}var gt="https://agents.bitpalm.ai",v="_bp_",ht=new Set(["password","file","checkbox","radio","submit","button","reset","image"]),yt=8e3,et=4096,tt=`${v}identify_signature`,nt=`${v}identify_fingerprint`,ot=`${v}identify_sent_at`,it="0 4px 14px rgba(0,0,0,0.18)";function bt(n){return[n.external_user_id||"",n.email||"",n.phone||"",n.name||"",n.company||"",n.signature||"",n.signed_at!=null?String(n.signed_at):"",n.signature_version||"",n.identify_source||""].join("|").toLowerCase()}function d(n,t=180){return n?n.replace(/\s+/g," ").trim().slice(0,t):""}function vt(n){return n?` ${n.toLowerCase().replace(/[_-]+/g," ").replace(/[^a-z0-9\s@.]/g," ").replace(/\s+/g," ").trim()} `:""}function N(n,t){for(let r of t)if(n.includes(r))return!0;return!1}function I(n){return/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i.test(n)}function _(n){let t=d(n,50);if(!t)return"";let r=t.startsWith("+"),a=t.replace(/\D/g,"");return a.length<6?"":`${r?"+":""}${a.slice(0,20)}`}function st(n){let t=d(n,140).toLowerCase();return!t||!I(t)?"":t}function W(n,t){for(let r of t){let a=n.querySelector(r),u=d(a?.value);if(u)return u}return""}function wt(n){return d(n.getAttribute("data-bp-field")||n.getAttribute("data-bitpalm-field"),64).toLowerCase().replace(/[_\s]+/g,"-")}function Et(n){return n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function xt(n,t){let r=[],a=(g,b=140)=>{let c=d(g,b);c&&r.push(c)};a(t.name),a(t.id),a(t.getAttribute("autocomplete")),a(t.getAttribute("placeholder")),a(t.getAttribute("aria-label")),a(t.getAttribute("data-field")),a(t.getAttribute("data-name")),a(t.getAttribute("data-label")),a(t.getAttribute("data-bp-field")),a(t.getAttribute("data-bitpalm-field"));let u=new Set,y=g=>{let b=d(g,200);!b||u.has(b)||(u.add(b),r.push(b))};for(let g of Array.from(t.labels||[]))y(g.textContent);if(t.id){let g=n.querySelector(`label[for="${Et(t.id)}"]`);y(g?.textContent)}let p=t.closest("label");y(p?.textContent);let l=t.getAttribute("aria-labelledby");if(l)for(let g of l.split(/\s+/)){if(!g)continue;let b=n.ownerDocument.getElementById(g);y(b?.textContent)}return r}function Tt(n){let t=d(W(n,["[data-bp-email]","[data-bitpalm-email]"]),140).toLowerCase(),r=_(W(n,["[data-bp-phone]","[data-bitpalm-phone]"])),a=d(W(n,["[data-bp-name]","[data-bitpalm-name]","[data-bp-full-name]","[data-bitpalm-full-name]"])),u=d(W(n,["[data-bp-first-name]","[data-bitpalm-first-name]"])),y=d(W(n,["[data-bp-last-name]","[data-bitpalm-last-name]"])),p=d(W(n,["[data-bp-company]","[data-bitpalm-company]"]));for(let c of Array.from(n.elements)){if(!(c instanceof HTMLInputElement||c instanceof HTMLTextAreaElement||c instanceof HTMLSelectElement)||c.disabled||c instanceof HTMLInputElement&&ht.has(c.type.toLowerCase()))continue;let i=wt(c),oe=c.hasAttribute("data-bp-email")||c.hasAttribute("data-bitpalm-email")||c.hasAttribute("data-bp-phone")||c.hasAttribute("data-bitpalm-phone")||c.hasAttribute("data-bp-name")||c.hasAttribute("data-bitpalm-name")||c.hasAttribute("data-bp-full-name")||c.hasAttribute("data-bitpalm-full-name")||c.hasAttribute("data-bp-first-name")||c.hasAttribute("data-bitpalm-first-name")||c.hasAttribute("data-bp-last-name")||c.hasAttribute("data-bitpalm-last-name")||c.hasAttribute("data-bp-company")||c.hasAttribute("data-bitpalm-company")||!!i;if(c instanceof HTMLInputElement&&c.type.toLowerCase()==="hidden"&&!oe)continue;let f=d(c.value);if(!f)continue;let Y=c instanceof HTMLInputElement?c.type.toLowerCase():"",m=vt(xt(n,c).join(" "));if(!t&&i==="email"&&I(f)){t=f.toLowerCase();continue}if(!r&&(i==="phone"||i==="tel"||i==="mobile"||i==="whatsapp")){let S=_(f);if(S){r=S;continue}}if(!p&&i==="company"){p=d(f,160);continue}if(!u&&(i==="first-name"||i==="firstname")){u=d(f,100);continue}if(!y&&(i==="last-name"||i==="lastname"||i==="surname")){y=d(f,100);continue}if(!a&&(i==="name"||i==="full-name"||i==="fullname")){!I(f)&&!_(f)&&(a=d(f,140));continue}let T=Y==="email"||N(m,[" email "," e mail "," mail "," email adresse "," mailadresse "," correo "]),H=Y==="tel"||N(m,[" phone "," phone number "," mobile "," tel "," telefon "," telefonnummer "," whatsapp "," handy "," kontakt "," nummer "]),D=N(m,[" company "," company name "," firma "," firmenname "," organization "," organisation "," business "," unternehmen "," agency "," brokerage "]),J=N(m,[" first name "," firstname "," given name "," givenname "," vorname "," fname "]),F=N(m,[" last name "," lastname "," family name "," familyname "," surname "," nachname "," lname "]),$=N(m,[" full name "," fullname "," contact name "," name "])&&!T&&!H;if(!t&&T&&I(f)){t=f.toLowerCase();continue}if(!r&&H){let S=_(f);if(S){r=S;continue}}if(!p&&D){p=d(f,160);continue}if(!u&&J){u=d(f,100);continue}if(!y&&F){y=d(f,100);continue}if(!a&&$&&!I(f)&&!_(f)){a=d(f,140);continue}!t&&I(f)&&(t=f.toLowerCase())}if(a&&(I(a)||_(a))&&(a=""),p&&(I(p)||_(p))&&(p=""),a||(a=d([u,y].filter(Boolean).join(" "),140)),a&&t&&a.toLowerCase()===t.toLowerCase()&&(a=""),!!!(t||r)&&!!!(a&&p))return null;let b={...a?{name:a}:{},...t?{email:t}:{},...r?{phone:r}:{},...p?{company:p}:{}};return Object.keys(b).length>0?b:null}function St(){if(typeof document<"u"){let n=document.documentElement.lang;if(n)return n.slice(0,2).toLowerCase()}return"en"}function we(n,t=1200){if(typeof window<"u"&&"requestIdleCallback"in window){window.requestIdleCallback(n,{timeout:t});return}setTimeout(n,Math.min(t,300))}function Ee(){if(typeof window>"u")return!1;let n=typeof navigator<"u"?navigator.userAgent:"";if(/Android|iPhone|iPad|iPod|IEMobile|Windows Phone|Mobile/i.test(n))return!0;let r=window.matchMedia("(pointer: coarse)").matches,a=window.matchMedia("(hover: none)").matches,u=Math.min(window.screen?.width||window.innerWidth,window.screen?.height||window.innerHeight);return r&&a&&u<=900}function at(n){let{slug:t,locale:r=St(),baseUrl:a=gt,token:u,zIndex:y=9999,autoIdentify:p=!0}=n,l=document,g=ne(n.theme),b=g==="auto"?z():g,c=null,i=l.createElement("iframe"),oe=`${a}/t/${t}/widget`,f=new URLSearchParams({locale:r,theme:b});u&&f.set("token",u),i.src=`${oe}?${f.toString()}`,i.allow="clipboard-write; microphone",i.setAttribute("allowtransparency","true"),i.loading="lazy",i.style.cssText=`position:fixed;bottom:0;right:0;width:1px;height:1px;border:none;z-index:${y};background:transparent;color-scheme:normal;opacity:0;pointer-events:none;`;let Y=new URL(i.src).origin,m=l.createElement("div");if(m.setAttribute("role","button"),m.setAttribute("aria-label","Chat"),m.style.cssText=`position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;display:none;align-items:center;justify-content:center;cursor:pointer;z-index:${y-1};background:#171717;box-shadow:${it};transition:transform .2s,opacity .3s;opacity:0;`,m.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>',m.onmouseenter=()=>{m.style.transform="scale(1.05)"},m.onmouseleave=()=>{m.style.transform="scale(1)"},m.onclick=()=>j(),l.body.appendChild(m),!l.getElementById("_bp_fade")){let e=l.createElement("style");e.id="_bp_fade",e.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",l.head.appendChild(e)}let T=null,H=!1,D=!1,J=!1,F=!1,$=!1,S=()=>{J||(J=!0,l.body.appendChild(i))},G=!1,ie=0,K={overflow:"",overscrollBehavior:""},E={overflow:"",overscrollBehavior:"",position:"",top:"",left:"",right:"",width:""},xe=()=>{if(G||!Ee())return;let s=l.documentElement,o=l.body;ie=window.scrollY||window.pageYOffset||0,K.overflow=s.style.overflow,K.overscrollBehavior=s.style.overscrollBehavior,E.overflow=o.style.overflow,E.overscrollBehavior=o.style.overscrollBehavior,E.position=o.style.position,E.top=o.style.top,E.left=o.style.left,E.right=o.style.right,E.width=o.style.width,s.style.overflow="hidden",s.style.overscrollBehavior="none",o.style.overflow="hidden",o.style.overscrollBehavior="none",o.style.position="fixed",o.style.top=`-${ie}px`,o.style.left="0",o.style.right="0",o.style.width="100%",G=!0},O=()=>{if(!G)return;let e=l.documentElement,s=l.body;e.style.overflow=K.overflow,e.style.overscrollBehavior=K.overscrollBehavior,s.style.overflow=E.overflow,s.style.overscrollBehavior=E.overscrollBehavior,s.style.position=E.position,s.style.top=E.top,s.style.left=E.left,s.style.right=E.right,s.style.width=E.width,window.scrollTo(0,ie),G=!1},Te=()=>{let e=Ee();i.style.display==="none"&&(i.style.display=""),e?(i.style.width="100vw",i.style.height="100dvh",i.style.left="0",i.style.top="0",i.style.bottom="0",i.style.right="0",xe()):(i.style.width="420px",i.style.height="620px",i.style.bottom="24px",i.style.right="24px",i.style.left="",i.style.top="",O()),i.style.opacity="1",i.style.pointerEvents="auto"},C=()=>{T&&(T.remove(),T=null)},V=()=>{},se=()=>{},R=!1,P=new Map;function ae(e,s){let o=P.get(e);if(o)for(let h of o)try{h(s)}catch{}}let Se=e=>{if(e.origin===Y){if(e.data?.type==="bitpalm-widget-config"){D=!1,H=!0,i.style.display==="none"&&(i.style.display=""),e.data.primaryColor&&(m.style.background=e.data.primaryColor,m.style.boxShadow=e.data.chatShadow==="none"?"none":it);let s=e.data.chatButtonIconColor||"black";if(e.data.chatButtonIconSvg){m.innerHTML="";let o=l.createElement("span");o.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${s}`;let w=new DOMParser().parseFromString(e.data.chatButtonIconSvg,"image/svg+xml").querySelector("svg");w?(w.querySelectorAll("script,foreignObject").forEach(B=>B.remove()),w.querySelectorAll("*").forEach(B=>{for(let M of[...B.attributes])(M.name.startsWith("on")||M.value&&M.value.includes("javascript:"))&&B.removeAttribute(M.name)}),w.setAttribute("width","24"),w.setAttribute("height","24"),w.style.display="block",o.appendChild(w)):o.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>',m.appendChild(o)}else{let o=m.querySelector("svg");o&&(o.style.stroke=s)}m.style.display="flex",requestAnimationFrame(()=>{m.style.opacity="1"})}if(e.data?.type==="bitpalm-widget-resize"){let s=e.data.width>0,o=R;R=s,s&&!o&&ae("widget_opened"),!s&&o&&ae("widget_closed");let h=Ee();s?(i.style.width=h?"100vw":`${e.data.width}px`,i.style.height=h?"100dvh":`${e.data.height}px`,h?(i.style.left="0",i.style.top="0",i.style.bottom="0",i.style.right="0",xe()):O(),i.style.opacity="1",i.style.pointerEvents="auto"):(O(),i.style.width="1px",i.style.height="1px",i.style.left="",i.style.top="",i.style.opacity="0",i.style.pointerEvents="none"),m.style.display=s?"none":"flex"}if(e.data?.type==="bitpalm-trigger-show"){if(D||!H)return;C(),T=l.createElement("div"),T.style.cssText=`position:fixed;bottom:90px;right:24px;max-width:240px;background:#fff;border-radius:16px;padding:12px 32px 12px 12px;box-shadow:0 2px 20px rgba(0,0,0,0.08);cursor:pointer;z-index:${y-1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;let s=(e.data.message||"").replace(/</g,"&lt;");T.innerHTML=`<p style="font-size:14px;color:#1f2937;margin:0;">${s}</p><div style="position:absolute;bottom:-8px;right:20px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #fff;"></div>`;let o=l.createElement("button");o.style.cssText="position:absolute;top:-8px;right:-8px;width:28px;height:28px;border-radius:50%;background:#fff;border:none;box-shadow:0 1px 4px rgba(0,0,0,0.1);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;color:#9ca3af;",o.innerHTML="&#10005;",o.onclick=h=>{h.stopPropagation(),C(),i.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},T.onclick=()=>{if(C(),m.style.display="none",Te(),S(),!F){$=!0;return}i.contentWindow?.postMessage({type:"bitpalm-trigger-engaged",message:s},"*")},T.appendChild(o),l.body.appendChild(T)}e.data?.type==="bitpalm-trigger-hide"&&C(),e.data?.type==="bitpalm-request-context"&&V(),e.data?.type==="bitpalm-chat-event"&&e.data.event&&ae(e.data.event,e.data.data),e.data?.type==="bitpalm-widget-blocked"&&(D=!0,H=!1,m.style.display="none",C(),O(),i.style.display="none")}};window.addEventListener("message",Se);let L=!1;try{L=localStorage.getItem(`${v}optout`)==="1"}catch{}let X=`${v}vid`,x="";if(!L){try{x=localStorage.getItem(X)||""}catch{}if(!x){let e=l.cookie.match(new RegExp(`(?:^|; )${X}=([^;]+)`));x=e?decodeURIComponent(e[1]):""}x||(x=crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2,11)}`);try{localStorage.setItem(X,x)}catch{}try{l.cookie=`${X}=${encodeURIComponent(x)};path=/;max-age=31536000;SameSite=Lax`}catch{}}L||we(()=>{try{let e=new URLSearchParams(location.search),s={};for(let A of["utm_source","utm_medium","utm_campaign","utm_term","utm_content"]){let w=e.get(A);w&&(s[A]=w)}let o=JSON.stringify({tenant_slug:t,visitor_id:x,url:location.href,referrer:l.referrer||void 0,...Object.keys(s).length>0?{utm:s}:{}}),h=`${a}/api/widget/impression`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(h,new Blob([o],{type:"application/json"})):fetch(h,{method:"POST",body:o,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}},2e3);let re="",le="",ce=0;try{re=sessionStorage.getItem(tt)||"",le=sessionStorage.getItem(nt)||"";let e=parseInt(sessionStorage.getItem(ot)||"0",10);Number.isFinite(e)&&e>0&&(ce=e)}catch{}let Le=(e,s="")=>{if(L||!x)return;let o={},h=d(e.name,140),A=st(e.email),w=_(e.phone),B=d(e.company,160),M=d(e.external_user_id,140),Je=d(e.signature,260),ge=Number(e.signed_at);if(h&&(o.name=h),A&&(o.email=A),w&&(o.phone=w),B&&(o.company=B),M&&(o.external_user_id=M),Je&&(o.signature=Je),Number.isFinite(ge)&&ge>0&&(o.signed_at=Math.floor(ge)),(e.signature_version==="v1"||o.signature)&&(o.signature_version="v1"),(e.identify_source==="manual"||e.identify_source==="form")&&(o.identify_source=e.identify_source),!o.name&&!o.email&&!o.phone&&!o.company&&!o.external_user_id)return;let te=bt(o),he=[s.toLowerCase(),te].filter(Boolean).join("|"),ye=Date.now();if(!(ye-ce<yt&&(he===re||te===le))){re=he,le=te,ce=ye;try{sessionStorage.setItem(tt,he),sessionStorage.setItem(nt,te),sessionStorage.setItem(ot,String(ye))}catch{}try{let Ge=JSON.stringify({tenant_slug:t,visitor_id:x,url:location.href,referrer:l.referrer||void 0,...o}),Ke=`${a}/api/widget/identify`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(Ke,new Blob([Ge],{type:"application/json"})):fetch(Ke,{method:"POST",body:Ge,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}}},Ae=e=>{if(L||!p||!x)return;let s=e.target instanceof HTMLFormElement?e.target:e.target instanceof Element?e.target.closest("form"):null;if(!(s instanceof HTMLFormElement))return;let o=(s.getAttribute("data-bp-identify")||s.getAttribute("data-bitpalm-identify")||"").toLowerCase();if(o==="off"||o==="false"||o==="0")return;let h=Tt(s);if(!h)return;let A=[s.getAttribute("id")||"",s.getAttribute("name")||"",s.getAttribute("action")||""].join("|");Le({...h,identify_source:"form"},A)};!L&&p&&l.addEventListener("submit",Ae,!0);let U=parseInt(sessionStorage.getItem(`${v}pages`)||"0")+1;sessionStorage.setItem(`${v}pages`,String(U));let k=JSON.parse(sessionStorage.getItem(`${v}hist`)||"[]");k.push(location.href),k.length>20&&(k=k.slice(-20)),sessionStorage.setItem(`${v}hist`,JSON.stringify(k));let _e=Date.now(),Z=parseInt(sessionStorage.getItem(`${v}site_start`)||"0");Z||(Z=_e,sessionStorage.setItem(`${v}site_start`,String(Z)));let Ie=[];V=()=>{let e=!1;try{e=!!localStorage.getItem(`${v}visited`)}catch{e=!1}if(i.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:l.title,returning:e,pageCount:U,pageHistory:k,loadedAt:_e,siteStart:Z,locale:r,visitorId:L?"":x},"*"),Ne(),!e&&!L)try{localStorage.setItem(`${v}visited`,"1")}catch{}},i.addEventListener("load",()=>{F=!0,V(),[120,450,1100].forEach(e=>{let s=setTimeout(()=>V(),e);Ie.push(s)}),$&&($=!1,se())}),l.readyState==="loading"?l.addEventListener("DOMContentLoaded",()=>we(S,1600),{once:!0}):we(S,1600);let Ce=history.pushState.bind(history),Pe=history.replaceState.bind(history),Q=()=>{U++,sessionStorage.setItem(`${v}pages`,String(U));let e=JSON.parse(sessionStorage.getItem(`${v}hist`)||"[]");if(e.push(location.href),e.length>20&&e.splice(0,e.length-20),k=e,sessionStorage.setItem(`${v}hist`,JSON.stringify(e)),i.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:l.title,pageCount:U,pageHistory:e,loadedAt:Date.now()},"*"),!L)try{let s=JSON.stringify({tenant_slug:t,visitor_id:x,url:location.href}),o=`${a}/api/widget/impression`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(o,new Blob([s],{type:"application/json"})):fetch(o,{method:"POST",body:s,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}};history.pushState=function(...e){Ce(...e),Q()},history.replaceState=function(...e){Pe(...e),Q()},window.addEventListener("popstate",Q);let ke=-1,de,Be=()=>{clearTimeout(de),de=setTimeout(()=>{let e=Math.max(l.documentElement.scrollHeight,l.body.scrollHeight)-window.innerHeight,s=e>0?Math.round(window.scrollY/e*100):100;s!==ke&&(ke=s,i.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:s},"*"))},500)};window.addEventListener("scroll",Be,{passive:!0});let Me=e=>{e.clientY<=0&&i.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};l.addEventListener("mouseout",Me);let me,He=!1,ue=()=>{clearTimeout(me),!He&&(me=setTimeout(()=>{He=!0,i.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},$e=["mousemove","keydown","scroll","touchstart"];$e.forEach(e=>l.addEventListener(e,ue,{passive:!0})),ue(),se=()=>{i.contentWindow?.postMessage({type:"bitpalm-open"},"*");let e=i.src.split("#")[0];i.src=`${e}#bp-open-${Date.now()}`};let j=()=>{if(m.style.display="none",C(),Te(),S(),!F){$=!0;return}se()},fe=()=>{O(),i.contentWindow?.postMessage({type:"bitpalm-close"},"*")},Oe=e=>{!e||typeof e!="object"||Le({external_user_id:d(e.externalUserId,140)||void 0,name:d(e.name,140)||void 0,email:st(e.email)||void 0,phone:_(e.phone)||void 0,company:d(e.company,160)||void 0,signature:d(e.signature,260)||void 0,signed_at:Number.isFinite(Number(e.signedAt))?Math.floor(Number(e.signedAt)):void 0,signature_version:e.signatureVersion==="v1"?"v1":void 0,identify_source:"manual"},"manual")},ct=()=>{R?fe():j()},dt=()=>R,Re=e=>{if(!e||typeof e!="string")return;let s=e.trim().slice(0,1e4);s&&(R||j(),setTimeout(()=>{i.contentWindow?.postMessage({type:"bitpalm-send-message",message:s},"*")},R?50:500))};function Ne(){i.contentWindow?.postMessage({type:"bitpalm-theme",theme:b},"*")}let ee=e=>{e!==b&&(b=e,Ne())},We=e=>{g=ne(e),c?.(),c=null,g==="auto"?(c=ve(ee),ee(z())):ee(g)};g==="auto"&&(c=ve(ee));let De=e=>{let s=e.detail;if(!s||typeof s!="object")return;let o=d(s.slug,120);o&&o!==t||We(ne(s.theme))};window.addEventListener("bitpalm-theme",De);let q={},Fe=e=>{if(!e||typeof e!="object"||Array.isArray(e))return;q={...q,...e};let s=JSON.stringify(q);s.length>et&&console.warn(`[BitPalm] Custom context exceeds ${et} bytes (${s.length}). It may be truncated.`),i.contentWindow?.postMessage({type:"bitpalm-custom-context",data:q},"*")},mt=()=>{q={},i.contentWindow?.postMessage({type:"bitpalm-custom-context",data:{}},"*")},Ue=e=>{let o=e.detail;if(!o||typeof o!="object")return;let h=d(o.slug,120);if(h&&h!==t)return;let{slug:A,...w}=o;Fe(w)};window.addEventListener("bitpalm-context",Ue);let je=e=>{let o=e.detail;if(!o||typeof o!="object")return;let h=d(o.slug,120);h&&h!==t||Oe(o)};window.addEventListener("bitpalm-identify",je);let pe=e=>{let s=e.detail,o=d(s?.slug,120);return!o||o===t},qe=e=>{pe(e)&&j()},ze=e=>{pe(e)&&fe()},Ye=e=>{if(!pe(e))return;let s=e.detail?.message;typeof s=="string"&&Re(s)};return window.addEventListener("bitpalm-open",qe),window.addEventListener("bitpalm-close",ze),window.addEventListener("bitpalm-send",Ye),{open:j,close:fe,toggle:ct,isOpen:dt,identify:Oe,context:Fe,resetContext:mt,send:Re,on:(e,s)=>(P.has(e)||P.set(e,new Set),P.get(e).add(s),()=>P.get(e)?.delete(s)),off:(e,s)=>{P.get(e)?.delete(s)},setTheme:We,destroy:()=>{window.removeEventListener("message",Se),window.removeEventListener("scroll",Be),window.removeEventListener("popstate",Q),l.removeEventListener("mouseout",Me),l.removeEventListener("submit",Ae,!0),$e.forEach(e=>l.removeEventListener(e,ue)),clearTimeout(de),clearTimeout(me),Ie.forEach(e=>clearTimeout(e)),history.pushState=Ce,history.replaceState=Pe,window.removeEventListener("bitpalm-identify",je),window.removeEventListener("bitpalm-context",Ue),window.removeEventListener("bitpalm-theme",De),window.removeEventListener("bitpalm-open",qe),window.removeEventListener("bitpalm-close",ze),window.removeEventListener("bitpalm-send",Ye),c?.(),P.clear(),O(),C(),m.remove(),i.remove()}}}function Ht(n){let t=lt(null),r=lt(!1);return rt(()=>{t.current?.setTheme(n.theme??"auto")},[n.theme]),rt(()=>{if(!r.current)return r.current=!0,t.current=at(n),()=>{t.current?.destroy(),t.current=null,r.current=!1}},[]),null}export{Ht as BitPalmAgent};
1
+ import{useEffect as ht,useRef as yt}from"react";function ot(n){if(n===!1)return"off";if(typeof n=="string"){let t=n.trim().toLowerCase();if(["false","off","0","no","none"].includes(t))return"off";if(t==="events")return"events"}return"bubble"}function it(n,t){let a=n.createElement("div");a.setAttribute("data-bitpalm-trigger",""),a.style.cssText=`max-width:240px;background:#fff;border-radius:16px;padding:12px 32px 12px 12px;box-shadow:0 2px 20px rgba(0,0,0,0.08);cursor:pointer;z-index:${t.zIndex-1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`,a.style.position="fixed",a.style.right="24px",a.style.bottom=`${t.bottom}px`;let r=n.createElement("p");r.style.cssText="font-size:14px;color:#1f2937;margin:0;",r.textContent=t.message;let m=n.createElement("div");m.style.cssText="position:absolute;bottom:-8px;right:20px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #fff;";let u=n.createElement("button");return u.type="button",u.setAttribute("aria-label","Close"),u.style.cssText="position:absolute;top:-8px;right:-8px;width:28px;height:28px;border-radius:50%;background:#fff;border:none;box-shadow:0 1px 4px rgba(0,0,0,0.1);cursor:pointer;display:flex;align-items:center;justify-content:center;font-size:14px;color:#9ca3af;",u.textContent="\u2715",u.onclick=g=>{g.stopPropagation(),t.onDismiss()},a.onclick=()=>t.onEngage(),a.append(r,m,u),a}var xt=["dark","dark-mode","dark-theme","theme-dark"],St=["light","light-mode","light-theme","theme-light"],at=["data-theme","data-color-scheme","data-color-mode","data-mode","data-bs-theme"],lt="(prefers-color-scheme: dark)";function re(n){return n==="light"||n==="dark"?n:"auto"}function st(n){if(!n)return null;if(xt.some(t=>n.classList.contains(t)))return"dark";if(St.some(t=>n.classList.contains(t)))return"light";for(let t of at){let a=(n.getAttribute(t)||"").toLowerCase();if(a.includes("dark"))return"dark";if(a.includes("light"))return"light"}return null}function Te(n){let t=n/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}function rt(n,t){if(!n)return null;let a=t.getComputedStyle(n).backgroundColor.match(/rgba?\(([^)]+)\)/);if(!a)return null;let[r,m,u,g=1]=a[1].split(/[\s,/]+/).filter(Boolean).map(Number);return[r,m,u,g].some(l=>Number.isNaN(l))||g<.5?null:.2126*Te(r)+.7152*Te(m)+.0722*Te(u)<.2?"dark":"light"}function Lt(n,t){let a=t.getComputedStyle(n.documentElement).colorScheme||"",r=n.querySelector('meta[name="color-scheme"]')?.getAttribute("content")||"",m=`${a} ${r}`.toLowerCase();return m.includes("dark")?m.includes("light")?t.matchMedia?.(lt).matches?"dark":"light":"dark":null}function J(n=document,t=window){return st(n.documentElement)??st(n.body)??rt(n.body,t)??rt(n.documentElement,t)??Lt(n,t)??"light"}function xe(n,t=document,a=window){let r=J(t,a),m=!1,u=()=>{m=!1;let c=J(t,a);c!==r&&(r=c,n(c))},g=()=>{m||(m=!0,typeof a.requestAnimationFrame=="function"?a.requestAnimationFrame(u):setTimeout(u,16))},T=typeof MutationObserver<"u"?new MutationObserver(g):null,l={attributes:!0,attributeFilter:["class","style",...at]};T?.observe(t.documentElement,l),t.body&&T?.observe(t.body,l);let h=typeof a.matchMedia=="function"?a.matchMedia(lt):null;return h?.addEventListener?.("change",g),()=>{T?.disconnect(),h?.removeEventListener?.("change",g)}}var At="https://agents.bitpalm.ai",v="_bp_",It=new Set(["password","file","checkbox","radio","submit","button","reset","image"]),_t=8e3,ct=4096,dt=`${v}identify_signature`,mt=`${v}identify_fingerprint`,ut=`${v}identify_sent_at`,ft="0 4px 14px rgba(0,0,0,0.18)";function Mt(n){return[n.external_user_id||"",n.email||"",n.phone||"",n.name||"",n.company||"",n.signature||"",n.signed_at!=null?String(n.signed_at):"",n.signature_version||"",n.identify_source||""].join("|").toLowerCase()}function d(n,t=180){return n?n.replace(/\s+/g," ").trim().slice(0,t):""}function Ct(n){return n?` ${n.toLowerCase().replace(/[_-]+/g," ").replace(/[^a-z0-9\s@.]/g," ").replace(/\s+/g," ").trim()} `:""}function N(n,t){for(let a of t)if(n.includes(a))return!0;return!1}function C(n){return/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i.test(n)}function I(n){let t=d(n,50);if(!t)return"";let a=t.startsWith("+"),r=t.replace(/\D/g,"");return r.length<6?"":`${a?"+":""}${r.slice(0,20)}`}function gt(n){let t=d(n,140).toLowerCase();return!t||!C(t)?"":t}function W(n,t){for(let a of t){let r=n.querySelector(a),m=d(r?.value);if(m)return m}return""}function Pt(n){return d(n.getAttribute("data-bp-field")||n.getAttribute("data-bitpalm-field"),64).toLowerCase().replace(/[_\s]+/g,"-")}function Bt(n){return n.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function kt(n,t){let a=[],r=(l,h=140)=>{let c=d(l,h);c&&a.push(c)};r(t.name),r(t.id),r(t.getAttribute("autocomplete")),r(t.getAttribute("placeholder")),r(t.getAttribute("aria-label")),r(t.getAttribute("data-field")),r(t.getAttribute("data-name")),r(t.getAttribute("data-label")),r(t.getAttribute("data-bp-field")),r(t.getAttribute("data-bitpalm-field"));let m=new Set,u=l=>{let h=d(l,200);!h||m.has(h)||(m.add(h),a.push(h))};for(let l of Array.from(t.labels||[]))u(l.textContent);if(t.id){let l=n.querySelector(`label[for="${Bt(t.id)}"]`);u(l?.textContent)}let g=t.closest("label");u(g?.textContent);let T=t.getAttribute("aria-labelledby");if(T)for(let l of T.split(/\s+/)){if(!l)continue;let h=n.ownerDocument.getElementById(l);u(h?.textContent)}return a}function Ht(n){let t=d(W(n,["[data-bp-email]","[data-bitpalm-email]"]),140).toLowerCase(),a=I(W(n,["[data-bp-phone]","[data-bitpalm-phone]"])),r=d(W(n,["[data-bp-name]","[data-bitpalm-name]","[data-bp-full-name]","[data-bitpalm-full-name]"])),m=d(W(n,["[data-bp-first-name]","[data-bitpalm-first-name]"])),u=d(W(n,["[data-bp-last-name]","[data-bitpalm-last-name]"])),g=d(W(n,["[data-bp-company]","[data-bitpalm-company]"]));for(let c of Array.from(n.elements)){if(!(c instanceof HTMLInputElement||c instanceof HTMLTextAreaElement||c instanceof HTMLSelectElement)||c.disabled||c instanceof HTMLInputElement&&It.has(c.type.toLowerCase()))continue;let y=Pt(c),F=c.hasAttribute("data-bp-email")||c.hasAttribute("data-bitpalm-email")||c.hasAttribute("data-bp-phone")||c.hasAttribute("data-bitpalm-phone")||c.hasAttribute("data-bp-name")||c.hasAttribute("data-bitpalm-name")||c.hasAttribute("data-bp-full-name")||c.hasAttribute("data-bitpalm-full-name")||c.hasAttribute("data-bp-first-name")||c.hasAttribute("data-bitpalm-first-name")||c.hasAttribute("data-bp-last-name")||c.hasAttribute("data-bitpalm-last-name")||c.hasAttribute("data-bp-company")||c.hasAttribute("data-bitpalm-company")||!!y;if(c instanceof HTMLInputElement&&c.type.toLowerCase()==="hidden"&&!F)continue;let f=d(c.value);if(!f)continue;let _=c instanceof HTMLInputElement?c.type.toLowerCase():"",s=Ct(kt(n,c).join(" "));if(!t&&y==="email"&&C(f)){t=f.toLowerCase();continue}if(!a&&(y==="phone"||y==="tel"||y==="mobile"||y==="whatsapp")){let S=I(f);if(S){a=S;continue}}if(!g&&y==="company"){g=d(f,160);continue}if(!m&&(y==="first-name"||y==="firstname")){m=d(f,100);continue}if(!u&&(y==="last-name"||y==="lastname"||y==="surname")){u=d(f,100);continue}if(!r&&(y==="name"||y==="full-name"||y==="fullname")){!C(f)&&!I(f)&&(r=d(f,140));continue}let G=_==="email"||N(s,[" email "," e mail "," mail "," email adresse "," mailadresse "," correo "]),O=_==="tel"||N(s,[" phone "," phone number "," mobile "," tel "," telefon "," telefonnummer "," whatsapp "," handy "," kontakt "," nummer "]),ae=N(s,[" company "," company name "," firma "," firmenname "," organization "," organisation "," business "," unternehmen "," agency "," brokerage "]),p=N(s,[" first name "," firstname "," given name "," givenname "," vorname "," fname "]),P=N(s,[" last name "," lastname "," family name "," familyname "," surname "," nachname "," lname "]),U=N(s,[" full name "," fullname "," contact name "," name "])&&!G&&!O;if(!t&&G&&C(f)){t=f.toLowerCase();continue}if(!a&&O){let S=I(f);if(S){a=S;continue}}if(!g&&ae){g=d(f,160);continue}if(!m&&p){m=d(f,100);continue}if(!u&&P){u=d(f,100);continue}if(!r&&U&&!C(f)&&!I(f)){r=d(f,140);continue}!t&&C(f)&&(t=f.toLowerCase())}if(r&&(C(r)||I(r))&&(r=""),g&&(C(g)||I(g))&&(g=""),r||(r=d([m,u].filter(Boolean).join(" "),140)),r&&t&&r.toLowerCase()===t.toLowerCase()&&(r=""),!!!(t||a)&&!!!(r&&g))return null;let h={...r?{name:r}:{},...t?{email:t}:{},...a?{phone:a}:{},...g?{company:g}:{}};return Object.keys(h).length>0?h:null}function $t(){if(typeof document<"u"){let n=document.documentElement.lang;if(n)return n.slice(0,2).toLowerCase()}return"en"}function Se(n,t=1200){if(typeof window<"u"&&"requestIdleCallback"in window){window.requestIdleCallback(n,{timeout:t});return}setTimeout(n,Math.min(t,300))}function Le(){if(typeof window>"u")return!1;let n=typeof navigator<"u"?navigator.userAgent:"";if(/Android|iPhone|iPad|iPod|IEMobile|Windows Phone|Mobile/i.test(n))return!0;let a=window.matchMedia("(pointer: coarse)").matches,r=window.matchMedia("(hover: none)").matches,m=Math.min(window.screen?.width||window.innerWidth,window.screen?.height||window.innerHeight);return a&&r&&m<=900}function pt(n){let{slug:t,locale:a=$t(),baseUrl:r=At,token:m,zIndex:u=9999,autoIdentify:g=!0,launcher:T=!0}=n,l=document,h=re(n.theme),c=h==="auto"?J():h,y=null,F=ot(n.triggers),f=F,_=null,s=l.createElement("iframe");s.setAttribute("data-bitpalm-chat","");let G=`${r}/t/${t}/widget`,O=new URLSearchParams({locale:a,theme:c});m&&O.set("token",m),f==="off"&&O.set("triggers","off"),s.src=`${G}?${O.toString()}`,s.allow="clipboard-write; microphone",s.setAttribute("allowtransparency","true"),s.loading="lazy",s.style.cssText=`position:fixed;bottom:0;right:0;width:1px;height:1px;border:none;z-index:${u};background:transparent;color-scheme:normal;opacity:0;pointer-events:none;`;let ae=new URL(s.src).origin,p=l.createElement("div");if(p.setAttribute("role","button"),p.setAttribute("aria-label","Chat"),p.setAttribute("data-bitpalm-launcher",""),p.style.cssText=`position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;display:none;align-items:center;justify-content:center;cursor:pointer;z-index:${u-1};background:#171717;box-shadow:${ft};transition:transform .2s,opacity .3s;opacity:0;`,p.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>',p.onmouseenter=()=>{p.style.transform="scale(1.05)"},p.onmouseleave=()=>{p.style.transform="scale(1)"},p.onclick=()=>q(),T&&l.body.appendChild(p),!l.getElementById("_bp_fade")){let e=l.createElement("style");e.id="_bp_fade",e.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",l.head.appendChild(e)}let P=null,U=!1,S=!1,Ae=!1,le=!1,K=!1,V=()=>{Ae||(Ae=!0,l.body.appendChild(s))},X=!1,ce=0,Z={overflow:"",overscrollBehavior:""},E={overflow:"",overscrollBehavior:"",position:"",top:"",left:"",right:"",width:""},Ie=()=>{if(X||!Le())return;let o=l.documentElement,i=l.body;ce=window.scrollY||window.pageYOffset||0,Z.overflow=o.style.overflow,Z.overscrollBehavior=o.style.overscrollBehavior,E.overflow=i.style.overflow,E.overscrollBehavior=i.style.overscrollBehavior,E.position=i.style.position,E.top=i.style.top,E.left=i.style.left,E.right=i.style.right,E.width=i.style.width,o.style.overflow="hidden",o.style.overscrollBehavior="none",i.style.overflow="hidden",i.style.overscrollBehavior="none",i.style.position="fixed",i.style.top=`-${ce}px`,i.style.left="0",i.style.right="0",i.style.width="100%",X=!0},R=()=>{if(!X)return;let e=l.documentElement,o=l.body;e.style.overflow=Z.overflow,e.style.overscrollBehavior=Z.overscrollBehavior,o.style.overflow=E.overflow,o.style.overscrollBehavior=E.overscrollBehavior,o.style.position=E.position,o.style.top=E.top,o.style.left=E.left,o.style.right=E.right,o.style.width=E.width,window.scrollTo(0,ce),X=!1},_e=()=>{let e=Le();s.style.display==="none"&&(s.style.display=""),e?(s.style.width="100vw",s.style.height="100dvh",s.style.left="0",s.style.top="0",s.style.bottom="0",s.style.right="0",Ie()):(s.style.width="420px",s.style.height="620px",s.style.bottom="24px",s.style.right="24px",s.style.left="",s.style.top="",R()),s.style.opacity="1",s.style.pointerEvents="auto"},M=()=>{P&&(P.remove(),P=null)},Q=()=>{_!==null&&(_=null,j("trigger_hidden"))},Me=()=>{s.contentWindow?.postMessage({type:"bitpalm-triggers",enabled:f!=="off"},"*")},ee=()=>{},de=()=>{},D=!1,B=new Map;function j(e,o){let i=B.get(e);if(i)for(let b of i)try{b(o)}catch{}}let Ce=e=>{if(e.origin===ae){if(e.data?.type==="bitpalm-widget-config"){S=!1,U=!0,s.style.display==="none"&&(s.style.display=""),e.data.primaryColor&&(p.style.background=e.data.primaryColor,p.style.boxShadow=e.data.chatShadow==="none"?"none":ft);let o=e.data.chatButtonIconColor||"black";if(e.data.chatButtonIconSvg){p.innerHTML="";let i=l.createElement("span");i.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${o}`;let w=new DOMParser().parseFromString(e.data.chatButtonIconSvg,"image/svg+xml").querySelector("svg");w?(w.querySelectorAll("script,foreignObject").forEach(H=>H.remove()),w.querySelectorAll("*").forEach(H=>{for(let $ of[...H.attributes])($.name.startsWith("on")||$.value&&$.value.includes("javascript:"))&&H.removeAttribute($.name)}),w.setAttribute("width","24"),w.setAttribute("height","24"),w.style.display="block",i.appendChild(w)):i.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>',p.appendChild(i)}else{let i=p.querySelector("svg");i&&(i.style.stroke=o)}T&&(p.style.display="flex",requestAnimationFrame(()=>{p.style.opacity="1"})),Me()}if(e.data?.type==="bitpalm-widget-resize"){let o=e.data.width>0,i=D;D=o,o&&!i&&j("widget_opened"),!o&&i&&j("widget_closed");let b=Le();o?(s.style.width=b?"100vw":`${e.data.width}px`,s.style.height=b?"100dvh":`${e.data.height}px`,b?(s.style.left="0",s.style.top="0",s.style.bottom="0",s.style.right="0",Ie()):R(),s.style.opacity="1",s.style.pointerEvents="auto"):(R(),s.style.width="1px",s.style.height="1px",s.style.left="",s.style.top="",s.style.opacity="0",s.style.pointerEvents="none"),p.style.display=o||!T?"none":"flex"}if(e.data?.type==="bitpalm-trigger-show"){if(S||!U||f==="off")return;let o=typeof e.data.message=="string"?e.data.message:"";if(!o)return;if(f==="events"){_=o,j("trigger_shown",{message:o,triggerId:e.data.triggerId,triggerType:e.data.triggerType});return}M(),P=it(l,{message:o,zIndex:u,bottom:T?90:24,onDismiss:()=>{M(),s.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},onEngage:()=>{if(M(),p.style.display="none",_e(),V(),!le){K=!0;return}s.contentWindow?.postMessage({type:"bitpalm-trigger-engaged",message:o},"*")}}),l.body.appendChild(P)}e.data?.type==="bitpalm-trigger-hide"&&(M(),Q()),e.data?.type==="bitpalm-request-context"&&ee(),e.data?.type==="bitpalm-chat-event"&&e.data.event&&j(e.data.event,e.data.data),e.data?.type==="bitpalm-widget-blocked"&&(S=!0,U=!1,p.style.display="none",M(),Q(),R(),s.style.display="none")}};window.addEventListener("message",Ce);let L=!1;try{L=localStorage.getItem(`${v}optout`)==="1"}catch{}let te=`${v}vid`,x="";if(!L){try{x=localStorage.getItem(te)||""}catch{}if(!x){let e=l.cookie.match(new RegExp(`(?:^|; )${te}=([^;]+)`));x=e?decodeURIComponent(e[1]):""}x||(x=crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2,11)}`);try{localStorage.setItem(te,x)}catch{}try{l.cookie=`${te}=${encodeURIComponent(x)};path=/;max-age=31536000;SameSite=Lax`}catch{}}L||Se(()=>{try{let e=new URLSearchParams(location.search),o={};for(let A of["utm_source","utm_medium","utm_campaign","utm_term","utm_content"]){let w=e.get(A);w&&(o[A]=w)}let i=JSON.stringify({tenant_slug:t,visitor_id:x,url:location.href,referrer:l.referrer||void 0,...Object.keys(o).length>0?{utm:o}:{}}),b=`${r}/api/widget/impression`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(b,new Blob([i],{type:"application/json"})):fetch(b,{method:"POST",body:i,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}},2e3);let me="",ue="",fe=0;try{me=sessionStorage.getItem(dt)||"",ue=sessionStorage.getItem(mt)||"";let e=parseInt(sessionStorage.getItem(ut)||"0",10);Number.isFinite(e)&&e>0&&(fe=e)}catch{}let Pe=(e,o="")=>{if(L||!x)return;let i={},b=d(e.name,140),A=gt(e.email),w=I(e.phone),H=d(e.company,160),$=d(e.external_user_id,140),et=d(e.signature,260),ve=Number(e.signed_at);if(b&&(i.name=b),A&&(i.email=A),w&&(i.phone=w),H&&(i.company=H),$&&(i.external_user_id=$),et&&(i.signature=et),Number.isFinite(ve)&&ve>0&&(i.signed_at=Math.floor(ve)),(e.signature_version==="v1"||i.signature)&&(i.signature_version="v1"),(e.identify_source==="manual"||e.identify_source==="form")&&(i.identify_source=e.identify_source),!i.name&&!i.email&&!i.phone&&!i.company&&!i.external_user_id)return;let se=Mt(i),we=[o.toLowerCase(),se].filter(Boolean).join("|"),Ee=Date.now();if(!(Ee-fe<_t&&(we===me||se===ue))){me=we,ue=se,fe=Ee;try{sessionStorage.setItem(dt,we),sessionStorage.setItem(mt,se),sessionStorage.setItem(ut,String(Ee))}catch{}try{let tt=JSON.stringify({tenant_slug:t,visitor_id:x,url:location.href,referrer:l.referrer||void 0,...i}),nt=`${r}/api/widget/identify`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(nt,new Blob([tt],{type:"application/json"})):fetch(nt,{method:"POST",body:tt,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}}},Be=e=>{if(L||!g||!x)return;let o=e.target instanceof HTMLFormElement?e.target:e.target instanceof Element?e.target.closest("form"):null;if(!(o instanceof HTMLFormElement))return;let i=(o.getAttribute("data-bp-identify")||o.getAttribute("data-bitpalm-identify")||"").toLowerCase();if(i==="off"||i==="false"||i==="0")return;let b=Ht(o);if(!b)return;let A=[o.getAttribute("id")||"",o.getAttribute("name")||"",o.getAttribute("action")||""].join("|");Pe({...b,identify_source:"form"},A)};!L&&g&&l.addEventListener("submit",Be,!0);let z=parseInt(sessionStorage.getItem(`${v}pages`)||"0")+1;sessionStorage.setItem(`${v}pages`,String(z));let k=JSON.parse(sessionStorage.getItem(`${v}hist`)||"[]");k.push(location.href),k.length>20&&(k=k.slice(-20)),sessionStorage.setItem(`${v}hist`,JSON.stringify(k));let ke=Date.now(),ne=parseInt(sessionStorage.getItem(`${v}site_start`)||"0");ne||(ne=ke,sessionStorage.setItem(`${v}site_start`,String(ne)));let He=[];ee=()=>{let e=!1;try{e=!!localStorage.getItem(`${v}visited`)}catch{e=!1}if(s.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:l.title,returning:e,pageCount:z,pageHistory:k,loadedAt:ke,siteStart:ne,locale:a,visitorId:L?"":x},"*"),qe(),!e&&!L)try{localStorage.setItem(`${v}visited`,"1")}catch{}},s.addEventListener("load",()=>{le=!0,ee(),[120,450,1100].forEach(e=>{let o=setTimeout(()=>ee(),e);He.push(o)}),K&&(K=!1,de())}),l.readyState==="loading"?l.addEventListener("DOMContentLoaded",()=>Se(V,1600),{once:!0}):Se(V,1600);let $e=history.pushState.bind(history),Oe=history.replaceState.bind(history),oe=()=>{z++,sessionStorage.setItem(`${v}pages`,String(z));let e=JSON.parse(sessionStorage.getItem(`${v}hist`)||"[]");if(e.push(location.href),e.length>20&&e.splice(0,e.length-20),k=e,sessionStorage.setItem(`${v}hist`,JSON.stringify(e)),s.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:l.title,pageCount:z,pageHistory:e,loadedAt:Date.now()},"*"),!L)try{let o=JSON.stringify({tenant_slug:t,visitor_id:x,url:location.href}),i=`${r}/api/widget/impression`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(i,new Blob([o],{type:"application/json"})):fetch(i,{method:"POST",body:o,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}};history.pushState=function(...e){$e(...e),oe()},history.replaceState=function(...e){Oe(...e),oe()},window.addEventListener("popstate",oe);let Re=-1,ge,De=()=>{clearTimeout(ge),ge=setTimeout(()=>{let e=Math.max(l.documentElement.scrollHeight,l.body.scrollHeight)-window.innerHeight,o=e>0?Math.round(window.scrollY/e*100):100;o!==Re&&(Re=o,s.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:o},"*"))},500)};window.addEventListener("scroll",De,{passive:!0});let Ne=e=>{e.clientY<=0&&s.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};l.addEventListener("mouseout",Ne);let pe,We=!1,he=()=>{clearTimeout(pe),!We&&(pe=setTimeout(()=>{We=!0,s.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},Fe=["mousemove","keydown","scroll","touchstart"];Fe.forEach(e=>l.addEventListener(e,he,{passive:!0})),he(),de=()=>{s.contentWindow?.postMessage({type:"bitpalm-open"},"*");let e=s.src.split("#")[0];s.src=`${e}#bp-open-${Date.now()}`};let q=()=>{if(p.style.display="none",M(),_e(),V(),!le){K=!0;return}if(_!==null){let e=_;Q(),s.contentWindow?.postMessage({type:"bitpalm-trigger-engaged",message:e},"*");return}de()},Ue=e=>{f=e,e==="off"&&(M(),Q()),Me()},bt=()=>Ue("off"),vt=()=>Ue(F==="off"?"bubble":F),ye=()=>{R(),s.contentWindow?.postMessage({type:"bitpalm-close"},"*")},je=e=>{!e||typeof e!="object"||Pe({external_user_id:d(e.externalUserId,140)||void 0,name:d(e.name,140)||void 0,email:gt(e.email)||void 0,phone:I(e.phone)||void 0,company:d(e.company,160)||void 0,signature:d(e.signature,260)||void 0,signed_at:Number.isFinite(Number(e.signedAt))?Math.floor(Number(e.signedAt)):void 0,signature_version:e.signatureVersion==="v1"?"v1":void 0,identify_source:"manual"},"manual")},wt=()=>{D?ye():q()},Et=()=>D,ze=e=>{if(!e||typeof e!="string")return;let o=e.trim().slice(0,1e4);o&&(D||q(),setTimeout(()=>{s.contentWindow?.postMessage({type:"bitpalm-send-message",message:o},"*")},D?50:500))};function qe(){s.contentWindow?.postMessage({type:"bitpalm-theme",theme:c},"*")}let ie=e=>{e!==c&&(c=e,qe())},Ye=e=>{h=re(e),y?.(),y=null,h==="auto"?(y=xe(ie),ie(J())):ie(h)};h==="auto"&&(y=xe(ie));let Je=e=>{let o=e.detail;if(!o||typeof o!="object")return;let i=d(o.slug,120);i&&i!==t||Ye(re(o.theme))};window.addEventListener("bitpalm-theme",Je);let Y={},Ge=e=>{if(!e||typeof e!="object"||Array.isArray(e))return;Y={...Y,...e};let o=JSON.stringify(Y);o.length>ct&&console.warn(`[BitPalm] Custom context exceeds ${ct} bytes (${o.length}). It may be truncated.`),s.contentWindow?.postMessage({type:"bitpalm-custom-context",data:Y},"*")},Tt=()=>{Y={},s.contentWindow?.postMessage({type:"bitpalm-custom-context",data:{}},"*")},Ke=e=>{let i=e.detail;if(!i||typeof i!="object")return;let b=d(i.slug,120);if(b&&b!==t)return;let{slug:A,...w}=i;Ge(w)};window.addEventListener("bitpalm-context",Ke);let Ve=e=>{let i=e.detail;if(!i||typeof i!="object")return;let b=d(i.slug,120);b&&b!==t||je(i)};window.addEventListener("bitpalm-identify",Ve);let be=e=>{let o=e.detail,i=d(o?.slug,120);return!i||i===t},Xe=e=>{be(e)&&q()},Ze=e=>{be(e)&&ye()},Qe=e=>{if(!be(e))return;let o=e.detail?.message;typeof o=="string"&&ze(o)};return window.addEventListener("bitpalm-open",Xe),window.addEventListener("bitpalm-close",Ze),window.addEventListener("bitpalm-send",Qe),{open:q,close:ye,toggle:wt,isOpen:Et,identify:je,context:Ge,resetContext:Tt,send:ze,on:(e,o)=>(B.has(e)||B.set(e,new Set),B.get(e).add(o),()=>B.get(e)?.delete(o)),off:(e,o)=>{B.get(e)?.delete(o)},setTheme:Ye,disableTriggers:bt,enableTriggers:vt,destroy:()=>{window.removeEventListener("message",Ce),window.removeEventListener("scroll",De),window.removeEventListener("popstate",oe),l.removeEventListener("mouseout",Ne),l.removeEventListener("submit",Be,!0),Fe.forEach(e=>l.removeEventListener(e,he)),clearTimeout(ge),clearTimeout(pe),He.forEach(e=>clearTimeout(e)),history.pushState=$e,history.replaceState=Oe,window.removeEventListener("bitpalm-identify",Ve),window.removeEventListener("bitpalm-context",Ke),window.removeEventListener("bitpalm-theme",Je),window.removeEventListener("bitpalm-open",Xe),window.removeEventListener("bitpalm-close",Ze),window.removeEventListener("bitpalm-send",Qe),y?.(),B.clear(),R(),M(),p.remove(),s.remove()}}}function Jt(n){let t=yt(null),a=yt(!1);return ht(()=>{t.current?.setTheme(n.theme??"auto")},[n.theme]),ht(()=>{if(a.current)return;a.current=!0;let{onReady:r,...m}=n;return t.current=pt(m),r?.(t.current),()=>{t.current?.destroy(),t.current=null,a.current=!1}},[]),null}export{Jt as BitPalmAgent};
2
2
  //# sourceMappingURL=react.js.map