@bitpalm/ai-agents 0.4.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/README.md +57 -193
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +50 -2
- package/dist/index.d.ts +50 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/react.cjs +1 -1
- package/dist/react.cjs.map +1 -1
- package/dist/react.d.cts +47 -2
- package/dist/react.d.ts +47 -2
- package/dist/react.js +1 -1
- package/dist/react.js.map +1 -1
- package/dist/widget.global.js +1 -1
- package/dist/widget.global.js.map +1 -1
- package/package.json +10 -18
package/dist/react.d.cts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget color theme. "auto" follows the website: theme classes or
|
|
3
|
+
* attributes like class="dark" or data-theme="dark" on <html> or <body>,
|
|
4
|
+
* the page background, or a declared color-scheme.
|
|
5
|
+
*/
|
|
6
|
+
type BitPalmTheme = "auto" | "light" | "dark";
|
|
1
7
|
interface BitPalmAgentOptions {
|
|
2
8
|
/** Your agent slug from the BitPalm dashboard. */
|
|
3
9
|
slug: string;
|
|
@@ -15,6 +21,23 @@ interface BitPalmAgentOptions {
|
|
|
15
21
|
* Defaults to true.
|
|
16
22
|
*/
|
|
17
23
|
autoIdentify?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Light or dark widget colors. Defaults to "auto", which follows the
|
|
26
|
+
* website's theme and switches live when the site switches. Only has an
|
|
27
|
+
* effect when the agent has a dark theme set up in the dashboard.
|
|
28
|
+
*/
|
|
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";
|
|
18
41
|
}
|
|
19
42
|
interface BitPalmIdentifyPayload {
|
|
20
43
|
/** Stable user id from the host platform (required for signed identify). */
|
|
@@ -46,7 +69,11 @@ interface BitPalmIdentifyPayload {
|
|
|
46
69
|
*/
|
|
47
70
|
type BitPalmCustomContext = Record<string, unknown>;
|
|
48
71
|
/** Event types emitted by the widget. */
|
|
49
|
-
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";
|
|
50
77
|
/** Callback for widget events. */
|
|
51
78
|
type BitPalmEventCallback = (data?: Record<string, unknown>) => void;
|
|
52
79
|
interface BitPalmAgentInstance {
|
|
@@ -95,11 +122,29 @@ interface BitPalmAgentInstance {
|
|
|
95
122
|
on: (event: BitPalmEventType, callback: BitPalmEventCallback) => () => void;
|
|
96
123
|
/** Unsubscribe from a widget event. */
|
|
97
124
|
off: (event: BitPalmEventType, callback: BitPalmEventCallback) => void;
|
|
125
|
+
/**
|
|
126
|
+
* Switch the widget theme. "auto" goes back to following the website.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* widget.setTheme('dark');
|
|
130
|
+
*/
|
|
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;
|
|
98
136
|
/** Remove the widget and clean up all event listeners. */
|
|
99
137
|
destroy: () => void;
|
|
100
138
|
}
|
|
101
139
|
|
|
102
|
-
|
|
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
|
+
}
|
|
103
148
|
/**
|
|
104
149
|
* React component that mounts the BitPalm AI agent widget.
|
|
105
150
|
*
|
package/dist/react.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Widget color theme. "auto" follows the website: theme classes or
|
|
3
|
+
* attributes like class="dark" or data-theme="dark" on <html> or <body>,
|
|
4
|
+
* the page background, or a declared color-scheme.
|
|
5
|
+
*/
|
|
6
|
+
type BitPalmTheme = "auto" | "light" | "dark";
|
|
1
7
|
interface BitPalmAgentOptions {
|
|
2
8
|
/** Your agent slug from the BitPalm dashboard. */
|
|
3
9
|
slug: string;
|
|
@@ -15,6 +21,23 @@ interface BitPalmAgentOptions {
|
|
|
15
21
|
* Defaults to true.
|
|
16
22
|
*/
|
|
17
23
|
autoIdentify?: boolean;
|
|
24
|
+
/**
|
|
25
|
+
* Light or dark widget colors. Defaults to "auto", which follows the
|
|
26
|
+
* website's theme and switches live when the site switches. Only has an
|
|
27
|
+
* effect when the agent has a dark theme set up in the dashboard.
|
|
28
|
+
*/
|
|
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";
|
|
18
41
|
}
|
|
19
42
|
interface BitPalmIdentifyPayload {
|
|
20
43
|
/** Stable user id from the host platform (required for signed identify). */
|
|
@@ -46,7 +69,11 @@ interface BitPalmIdentifyPayload {
|
|
|
46
69
|
*/
|
|
47
70
|
type BitPalmCustomContext = Record<string, unknown>;
|
|
48
71
|
/** Event types emitted by the widget. */
|
|
49
|
-
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";
|
|
50
77
|
/** Callback for widget events. */
|
|
51
78
|
type BitPalmEventCallback = (data?: Record<string, unknown>) => void;
|
|
52
79
|
interface BitPalmAgentInstance {
|
|
@@ -95,11 +122,29 @@ interface BitPalmAgentInstance {
|
|
|
95
122
|
on: (event: BitPalmEventType, callback: BitPalmEventCallback) => () => void;
|
|
96
123
|
/** Unsubscribe from a widget event. */
|
|
97
124
|
off: (event: BitPalmEventType, callback: BitPalmEventCallback) => void;
|
|
125
|
+
/**
|
|
126
|
+
* Switch the widget theme. "auto" goes back to following the website.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* widget.setTheme('dark');
|
|
130
|
+
*/
|
|
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;
|
|
98
136
|
/** Remove the widget and clean up all event listeners. */
|
|
99
137
|
destroy: () => void;
|
|
100
138
|
}
|
|
101
139
|
|
|
102
|
-
|
|
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
|
+
}
|
|
103
148
|
/**
|
|
104
149
|
* React component that mounts the BitPalm AI agent widget.
|
|
105
150
|
*
|
package/dist/react.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useEffect as tt,useRef as De}from"react";var ze="https://agents.bitpalm.ai",h="_bp_",Ye=new Set(["password","file","checkbox","radio","submit","button","reset","image"]),Je=8e3,$e=4096,Oe=`${h}identify_signature`,He=`${h}identify_fingerprint`,Re=`${h}identify_sent_at`;function Ge(s){return[s.external_user_id||"",s.email||"",s.phone||"",s.name||"",s.company||"",s.signature||"",s.signed_at!=null?String(s.signed_at):"",s.signature_version||"",s.identify_source||""].join("|").toLowerCase()}function d(s,i=180){return s?s.replace(/\s+/g," ").trim().slice(0,i):""}function Ve(s){return s?` ${s.toLowerCase().replace(/[_-]+/g," ").replace(/[^a-z0-9\s@.]/g," ").replace(/\s+/g," ").trim()} `:""}function W(s,i){for(let m of i)if(s.includes(m))return!0;return!1}function A(s){return/^[^\s@]+@[^\s@]+\.[^\s@]{2,}$/i.test(s)}function _(s){let i=d(s,50);if(!i)return"";let m=i.startsWith("+"),a=i.replace(/\D/g,"");return a.length<6?"":`${m?"+":""}${a.slice(0,20)}`}function Ne(s){let i=d(s,140).toLowerCase();return!i||!A(i)?"":i}function j(s,i){for(let m of i){let a=s.querySelector(m),g=d(a?.value);if(g)return g}return""}function Ke(s){return d(s.getAttribute("data-bp-field")||s.getAttribute("data-bitpalm-field"),64).toLowerCase().replace(/[_\s]+/g,"-")}function Xe(s){return s.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function Ze(s,i){let m=[],a=(n,x=140)=>{let l=d(n,x);l&&m.push(l)};a(i.name),a(i.id),a(i.getAttribute("autocomplete")),a(i.getAttribute("placeholder")),a(i.getAttribute("aria-label")),a(i.getAttribute("data-field")),a(i.getAttribute("data-name")),a(i.getAttribute("data-label")),a(i.getAttribute("data-bp-field")),a(i.getAttribute("data-bitpalm-field"));let g=new Set,w=n=>{let x=d(n,200);!x||g.has(x)||(g.add(x),m.push(x))};for(let n of Array.from(i.labels||[]))w(n.textContent);if(i.id){let n=s.querySelector(`label[for="${Xe(i.id)}"]`);w(n?.textContent)}let y=i.closest("label");w(y?.textContent);let r=i.getAttribute("aria-labelledby");if(r)for(let n of r.split(/\s+/)){if(!n)continue;let x=s.ownerDocument.getElementById(n);w(x?.textContent)}return m}function Qe(s){let i=d(j(s,["[data-bp-email]","[data-bitpalm-email]"]),140).toLowerCase(),m=_(j(s,["[data-bp-phone]","[data-bitpalm-phone]"])),a=d(j(s,["[data-bp-name]","[data-bitpalm-name]","[data-bp-full-name]","[data-bitpalm-full-name]"])),g=d(j(s,["[data-bp-first-name]","[data-bitpalm-first-name]"])),w=d(j(s,["[data-bp-last-name]","[data-bitpalm-last-name]"])),y=d(j(s,["[data-bp-company]","[data-bitpalm-company]"]));for(let l of Array.from(s.elements)){if(!(l instanceof HTMLInputElement||l instanceof HTMLTextAreaElement||l instanceof HTMLSelectElement)||l.disabled||l instanceof HTMLInputElement&&Ye.has(l.type.toLowerCase()))continue;let p=Ke(l),u=l.hasAttribute("data-bp-email")||l.hasAttribute("data-bitpalm-email")||l.hasAttribute("data-bp-phone")||l.hasAttribute("data-bitpalm-phone")||l.hasAttribute("data-bp-name")||l.hasAttribute("data-bitpalm-name")||l.hasAttribute("data-bp-full-name")||l.hasAttribute("data-bitpalm-full-name")||l.hasAttribute("data-bp-first-name")||l.hasAttribute("data-bitpalm-first-name")||l.hasAttribute("data-bp-last-name")||l.hasAttribute("data-bitpalm-last-name")||l.hasAttribute("data-bp-company")||l.hasAttribute("data-bitpalm-company")||!!p;if(l instanceof HTMLInputElement&&l.type.toLowerCase()==="hidden"&&!u)continue;let c=d(l.value);if(!c)continue;let $=l instanceof HTMLInputElement?l.type.toLowerCase():"",S=Ve(Ze(s,l).join(" "));if(!i&&p==="email"&&A(c)){i=c.toLowerCase();continue}if(!m&&(p==="phone"||p==="tel"||p==="mobile"||p==="whatsapp")){let T=_(c);if(T){m=T;continue}}if(!y&&p==="company"){y=d(c,160);continue}if(!g&&(p==="first-name"||p==="firstname")){g=d(c,100);continue}if(!w&&(p==="last-name"||p==="lastname"||p==="surname")){w=d(c,100);continue}if(!a&&(p==="name"||p==="full-name"||p==="fullname")){!A(c)&&!_(c)&&(a=d(c,140));continue}let U=$==="email"||W(S,[" email "," e mail "," mail "," email adresse "," mailadresse "," correo "]),O=$==="tel"||W(S,[" phone "," phone number "," mobile "," tel "," telefon "," telefonnummer "," whatsapp "," handy "," kontakt "," nummer "]),H=W(S,[" company "," company name "," firma "," firmenname "," organization "," organisation "," business "," unternehmen "," agency "," brokerage "]),R=W(S,[" first name "," firstname "," given name "," givenname "," vorname "," fname "]),N=W(S,[" last name "," lastname "," family name "," familyname "," surname "," nachname "," lname "]),q=W(S,[" full name "," fullname "," contact name "," name "])&&!U&&!O;if(!i&&U&&A(c)){i=c.toLowerCase();continue}if(!m&&O){let T=_(c);if(T){m=T;continue}}if(!y&&H){y=d(c,160);continue}if(!g&&R){g=d(c,100);continue}if(!w&&N){w=d(c,100);continue}if(!a&&q&&!A(c)&&!_(c)){a=d(c,140);continue}!i&&A(c)&&(i=c.toLowerCase())}if(a&&(A(a)||_(a))&&(a=""),y&&(A(y)||_(y))&&(y=""),a||(a=d([g,w].filter(Boolean).join(" "),140)),a&&i&&a.toLowerCase()===i.toLowerCase()&&(a=""),!!!(i||m)&&!!!(a&&y))return null;let x={...a?{name:a}:{},...i?{email:i}:{},...m?{phone:m}:{},...y?{company:y}:{}};return Object.keys(x).length>0?x:null}function et(){if(typeof document<"u"){let s=document.documentElement.lang;if(s)return s.slice(0,2).toLowerCase()}return"en"}function de(s,i=1200){if(typeof window<"u"&&"requestIdleCallback"in window){window.requestIdleCallback(s,{timeout:i});return}setTimeout(s,Math.min(i,300))}function me(){if(typeof window>"u")return!1;let s=typeof navigator<"u"?navigator.userAgent:"";if(/Android|iPhone|iPad|iPod|IEMobile|Windows Phone|Mobile/i.test(s))return!0;let m=window.matchMedia("(pointer: coarse)").matches,a=window.matchMedia("(hover: none)").matches,g=Math.min(window.screen?.width||window.innerWidth,window.screen?.height||window.innerHeight);return m&&a&&g<=900}function Fe(s){let{slug:i,locale:m=et(),baseUrl:a=ze,token:g,zIndex:w=9999,autoIdentify:y=!0}=s,r=document,n=r.createElement("iframe"),x=`${a}/t/${i}/widget`,l=new URLSearchParams({locale:m});g&&l.set("token",g),n.src=`${x}?${l.toString()}`,n.allow="clipboard-write; microphone",n.setAttribute("allowtransparency","true"),n.loading="lazy",n.style.cssText=`position:fixed;bottom:0;right:0;width:1px;height:1px;border:none;z-index:${w};background:transparent;color-scheme:normal;opacity:0;pointer-events:none;`;let p=new URL(n.src).origin,u=r.createElement("div");if(u.setAttribute("role","button"),u.setAttribute("aria-label","Chat"),u.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:${w-1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s,opacity .3s;opacity:0;`,u.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M7.9 20A9 9 0 1 0 4 16.1L2 22Z"/></svg>',u.onmouseenter=()=>{u.style.transform="scale(1.1)"},u.onmouseleave=()=>{u.style.transform="scale(1)"},u.onclick=()=>X(),r.body.appendChild(u),!r.getElementById("_bp_fade")){let e=r.createElement("style");e.id="_bp_fade",e.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",r.head.appendChild(e)}let c=null,$=!1,S=!1,U=!1,O=!1,H=!1,R=()=>{U||(U=!0,r.body.appendChild(n))},N=!1,q=0,T={overflow:"",overscrollBehavior:""},v={overflow:"",overscrollBehavior:"",position:"",top:"",left:"",right:"",width:""},ue=()=>{if(N||!me())return;let o=r.documentElement,t=r.body;q=window.scrollY||window.pageYOffset||0,T.overflow=o.style.overflow,T.overscrollBehavior=o.style.overscrollBehavior,v.overflow=t.style.overflow,v.overscrollBehavior=t.style.overscrollBehavior,v.position=t.style.position,v.top=t.style.top,v.left=t.style.left,v.right=t.style.right,v.width=t.style.width,o.style.overflow="hidden",o.style.overscrollBehavior="none",t.style.overflow="hidden",t.style.overscrollBehavior="none",t.style.position="fixed",t.style.top=`-${q}px`,t.style.left="0",t.style.right="0",t.style.width="100%",N=!0},F=()=>{if(!N)return;let e=r.documentElement,o=r.body;e.style.overflow=T.overflow,e.style.overscrollBehavior=T.overscrollBehavior,o.style.overflow=v.overflow,o.style.overscrollBehavior=v.overscrollBehavior,o.style.position=v.position,o.style.top=v.top,o.style.left=v.left,o.style.right=v.right,o.style.width=v.width,window.scrollTo(0,q),N=!1},fe=()=>{let e=me();n.style.display==="none"&&(n.style.display=""),e?(n.style.width="100vw",n.style.height="100dvh",n.style.left="0",n.style.top="0",n.style.bottom="0",n.style.right="0",ue()):(n.style.width="420px",n.style.height="620px",n.style.bottom="24px",n.style.right="24px",n.style.left="",n.style.top="",F()),n.style.opacity="1",n.style.pointerEvents="auto"},P=()=>{c&&(c.remove(),c=null)},J=()=>{},Q=()=>{},D=!1,C=new Map;function ee(e,o){let t=C.get(e);if(t)for(let f of t)try{f(o)}catch{}}let pe=e=>{if(e.origin===p){if(e.data?.type==="bitpalm-widget-config"){S=!1,$=!0,n.style.display==="none"&&(n.style.display=""),e.data.primaryColor&&(u.style.background=e.data.primaryColor,u.style.boxShadow=e.data.chatShadow==="none"?"none":`0 0 15px ${e.data.primaryColor}50`);let o=e.data.chatButtonIconColor||"black";if(e.data.chatButtonIconSvg){u.innerHTML="";let t=r.createElement("span");t.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${o}`;let b=new DOMParser().parseFromString(e.data.chatButtonIconSvg,"image/svg+xml").querySelector("svg");b?(b.querySelectorAll("script,foreignObject").forEach(M=>M.remove()),b.querySelectorAll("*").forEach(M=>{for(let k of[...M.attributes])(k.name.startsWith("on")||k.value&&k.value.includes("javascript:"))&&M.removeAttribute(k.name)}),b.setAttribute("width","24"),b.setAttribute("height","24"),b.style.display="block",t.appendChild(b)):t.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>',u.appendChild(t)}else{let t=u.querySelector("svg");t&&(t.style.stroke=o)}u.style.display="flex",requestAnimationFrame(()=>{u.style.opacity="1"})}if(e.data?.type==="bitpalm-widget-resize"){let o=e.data.width>0,t=D;D=o,o&&!t&&ee("widget_opened"),!o&&t&&ee("widget_closed");let f=me();o?(n.style.width=f?"100vw":`${e.data.width}px`,n.style.height=f?"100dvh":`${e.data.height}px`,f?(n.style.left="0",n.style.top="0",n.style.bottom="0",n.style.right="0",ue()):F(),n.style.opacity="1",n.style.pointerEvents="auto"):(F(),n.style.width="1px",n.style.height="1px",n.style.left="",n.style.top="",n.style.opacity="0",n.style.pointerEvents="none"),u.style.display=o?"none":"flex"}if(e.data?.type==="bitpalm-trigger-show"){if(S||!$)return;P(),c=r.createElement("div"),c.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:${w-1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;let o=(e.data.message||"").replace(/</g,"<");c.innerHTML=`<p style="font-size:14px;color:#1f2937;margin:0;">${o}</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 t=r.createElement("button");t.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;",t.innerHTML="✕",t.onclick=f=>{f.stopPropagation(),P(),n.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},c.onclick=()=>{if(P(),u.style.display="none",fe(),R(),!O){H=!0;return}n.contentWindow?.postMessage({type:"bitpalm-trigger-engaged",message:o},"*")},c.appendChild(t),r.body.appendChild(c)}e.data?.type==="bitpalm-trigger-hide"&&P(),e.data?.type==="bitpalm-request-context"&&J(),e.data?.type==="bitpalm-chat-event"&&e.data.event&&ee(e.data.event,e.data.data),e.data?.type==="bitpalm-widget-blocked"&&(S=!0,$=!1,u.style.display="none",P(),F(),n.style.display="none")}};window.addEventListener("message",pe);let I=!1;try{I=localStorage.getItem(`${h}optout`)==="1"}catch{}let G=`${h}vid`,E="";if(!I){try{E=localStorage.getItem(G)||""}catch{}if(!E){let e=r.cookie.match(new RegExp(`(?:^|; )${G}=([^;]+)`));E=e?decodeURIComponent(e[1]):""}E||(E=crypto.randomUUID?crypto.randomUUID():`${Date.now()}-${Math.random().toString(36).slice(2,11)}`);try{localStorage.setItem(G,E)}catch{}try{r.cookie=`${G}=${encodeURIComponent(E)};path=/;max-age=31536000;SameSite=Lax`}catch{}}I||de(()=>{try{let e=new URLSearchParams(location.search),o={};for(let L of["utm_source","utm_medium","utm_campaign","utm_term","utm_content"]){let b=e.get(L);b&&(o[L]=b)}let t=JSON.stringify({tenant_slug:i,visitor_id:E,url:location.href,referrer:r.referrer||void 0,...Object.keys(o).length>0?{utm:o}:{}}),f=`${a}/api/widget/impression`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(f,new Blob([t],{type:"application/json"})):fetch(f,{method:"POST",body:t,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}},2e3);let te="",ne="",oe=0;try{te=sessionStorage.getItem(Oe)||"",ne=sessionStorage.getItem(He)||"";let e=parseInt(sessionStorage.getItem(Re)||"0",10);Number.isFinite(e)&&e>0&&(oe=e)}catch{}let ge=(e,o="")=>{if(I||!E)return;let t={},f=d(e.name,140),L=Ne(e.email),b=_(e.phone),M=d(e.company,160),k=d(e.external_user_id,140),Be=d(e.signature,260),re=Number(e.signed_at);if(f&&(t.name=f),L&&(t.email=L),b&&(t.phone=b),M&&(t.company=M),k&&(t.external_user_id=k),Be&&(t.signature=Be),Number.isFinite(re)&&re>0&&(t.signed_at=Math.floor(re)),(e.signature_version==="v1"||t.signature)&&(t.signature_version="v1"),(e.identify_source==="manual"||e.identify_source==="form")&&(t.identify_source=e.identify_source),!t.name&&!t.email&&!t.phone&&!t.company&&!t.external_user_id)return;let Z=Ge(t),le=[o.toLowerCase(),Z].filter(Boolean).join("|"),ce=Date.now();if(!(ce-oe<Je&&(le===te||Z===ne))){te=le,ne=Z,oe=ce;try{sessionStorage.setItem(Oe,le),sessionStorage.setItem(He,Z),sessionStorage.setItem(Re,String(ce))}catch{}try{let Me=JSON.stringify({tenant_slug:i,visitor_id:E,url:location.href,referrer:r.referrer||void 0,...t}),ke=`${a}/api/widget/identify`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(ke,new Blob([Me],{type:"application/json"})):fetch(ke,{method:"POST",body:Me,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}}},ye=e=>{if(I||!y||!E)return;let o=e.target instanceof HTMLFormElement?e.target:e.target instanceof Element?e.target.closest("form"):null;if(!(o instanceof HTMLFormElement))return;let t=(o.getAttribute("data-bp-identify")||o.getAttribute("data-bitpalm-identify")||"").toLowerCase();if(t==="off"||t==="false"||t==="0")return;let f=Qe(o);if(!f)return;let L=[o.getAttribute("id")||"",o.getAttribute("name")||"",o.getAttribute("action")||""].join("|");ge({...f,identify_source:"form"},L)};!I&&y&&r.addEventListener("submit",ye,!0);let z=parseInt(sessionStorage.getItem(`${h}pages`)||"0")+1;sessionStorage.setItem(`${h}pages`,String(z));let B=JSON.parse(sessionStorage.getItem(`${h}hist`)||"[]");B.push(location.href),B.length>20&&(B=B.slice(-20)),sessionStorage.setItem(`${h}hist`,JSON.stringify(B));let he=Date.now(),V=parseInt(sessionStorage.getItem(`${h}site_start`)||"0");V||(V=he,sessionStorage.setItem(`${h}site_start`,String(V)));let be=[];J=()=>{let e=!1;try{e=!!localStorage.getItem(`${h}visited`)}catch{e=!1}if(n.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:r.title,returning:e,pageCount:z,pageHistory:B,loadedAt:he,siteStart:V,locale:m,visitorId:I?"":E},"*"),!e&&!I)try{localStorage.setItem(`${h}visited`,"1")}catch{}},n.addEventListener("load",()=>{O=!0,J(),[120,450,1100].forEach(e=>{let o=setTimeout(()=>J(),e);be.push(o)}),H&&(H=!1,Q())}),r.readyState==="loading"?r.addEventListener("DOMContentLoaded",()=>de(R,1600),{once:!0}):de(R,1600);let we=history.pushState.bind(history),ve=history.replaceState.bind(history),K=()=>{z++,sessionStorage.setItem(`${h}pages`,String(z));let e=JSON.parse(sessionStorage.getItem(`${h}hist`)||"[]");if(e.push(location.href),e.length>20&&e.splice(0,e.length-20),B=e,sessionStorage.setItem(`${h}hist`,JSON.stringify(e)),n.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:r.title,pageCount:z,pageHistory:e,loadedAt:Date.now()},"*"),!I)try{let o=JSON.stringify({tenant_slug:i,visitor_id:E,url:location.href}),t=`${a}/api/widget/impression`;typeof navigator.sendBeacon=="function"?navigator.sendBeacon(t,new Blob([o],{type:"application/json"})):fetch(t,{method:"POST",body:o,headers:{"Content-Type":"application/json"},keepalive:!0}).catch(()=>{})}catch{}};history.pushState=function(...e){we(...e),K()},history.replaceState=function(...e){ve(...e),K()},window.addEventListener("popstate",K);let xe=-1,ie,Ee=()=>{clearTimeout(ie),ie=setTimeout(()=>{let e=Math.max(r.documentElement.scrollHeight,r.body.scrollHeight)-window.innerHeight,o=e>0?Math.round(window.scrollY/e*100):100;o!==xe&&(xe=o,n.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:o},"*"))},500)};window.addEventListener("scroll",Ee,{passive:!0});let Se=e=>{e.clientY<=0&&n.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};r.addEventListener("mouseout",Se);let se,Te=!1,ae=()=>{clearTimeout(se),!Te&&(se=setTimeout(()=>{Te=!0,n.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},Ie=["mousemove","keydown","scroll","touchstart"];Ie.forEach(e=>r.addEventListener(e,ae,{passive:!0})),ae(),Q=()=>{n.contentWindow?.postMessage({type:"bitpalm-open"},"*");let e=n.src.split("#")[0];n.src=`${e}#bp-open-${Date.now()}`};let X=()=>{if(u.style.display="none",P(),fe(),R(),!O){H=!0;return}Q()},Le=()=>{F(),n.contentWindow?.postMessage({type:"bitpalm-close"},"*")},_e=e=>{!e||typeof e!="object"||ge({external_user_id:d(e.externalUserId,140)||void 0,name:d(e.name,140)||void 0,email:Ne(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")},We=()=>{D?Le():X()},je=()=>D,Ue=e=>{if(!e||typeof e!="string")return;let o=e.trim().slice(0,1e4);o&&(D||X(),setTimeout(()=>{n.contentWindow?.postMessage({type:"bitpalm-send-message",message:o},"*")},D?50:500))},Y={},Ae=e=>{if(!e||typeof e!="object"||Array.isArray(e))return;Y={...Y,...e};let o=JSON.stringify(Y);o.length>$e&&console.warn(`[BitPalm] Custom context exceeds ${$e} bytes (${o.length}). It may be truncated.`),n.contentWindow?.postMessage({type:"bitpalm-custom-context",data:Y},"*")},qe=()=>{Y={},n.contentWindow?.postMessage({type:"bitpalm-custom-context",data:{}},"*")},Pe=e=>{let t=e.detail;if(!t||typeof t!="object")return;let f=d(t.slug,120);if(f&&f!==i)return;let{slug:L,...b}=t;Ae(b)};window.addEventListener("bitpalm-context",Pe);let Ce=e=>{let t=e.detail;if(!t||typeof t!="object")return;let f=d(t.slug,120);f&&f!==i||_e(t)};return window.addEventListener("bitpalm-identify",Ce),{open:X,close:Le,toggle:We,isOpen:je,identify:_e,context:Ae,resetContext:qe,send:Ue,on:(e,o)=>(C.has(e)||C.set(e,new Set),C.get(e).add(o),()=>C.get(e)?.delete(o)),off:(e,o)=>{C.get(e)?.delete(o)},destroy:()=>{window.removeEventListener("message",pe),window.removeEventListener("scroll",Ee),window.removeEventListener("popstate",K),r.removeEventListener("mouseout",Se),r.removeEventListener("submit",ye,!0),Ie.forEach(e=>r.removeEventListener(e,ae)),clearTimeout(ie),clearTimeout(se),be.forEach(e=>clearTimeout(e)),history.pushState=we,history.replaceState=ve,window.removeEventListener("bitpalm-identify",Ce),window.removeEventListener("bitpalm-context",Pe),C.clear(),F(),P(),u.remove(),n.remove()}}}function ct(s){let i=De(null),m=De(!1);return tt(()=>{if(!m.current)return m.current=!0,i.current=Fe(s),()=>{i.current?.destroy(),i.current=null,m.current=!1}},[]),null}export{ct 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
|