@bitpalm/ai-agents 0.1.2 → 0.1.3
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/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- 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.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 +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var E=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var R=(s,a)=>{for(var c in a)E(s,c,{get:a[c],enumerable:!0})},U=(s,a,c,f)=>{if(a&&typeof a=="object"||typeof a=="function")for(let d of P(a))!z.call(s,d)&&d!==c&&E(s,d,{get:()=>a[d],enumerable:!(f=O(a,d))||f.enumerable});return s};var D=s=>U(E({},"__esModule",{value:!0}),s);var J={};R(J,{createWidget:()=>x});module.exports=D(J);var N="https://agents.bitpalm.ae",l="_bp_";function j(){if(typeof document<"u"){let s=document.documentElement.lang;if(s)return s.slice(0,2).toLowerCase()}return"en"}function x(s){let{slug:a,locale:c=j(),baseUrl:f=N,zIndex:d=9999}=s,n=document,e=n.createElement("iframe"),I=`${f}/t/${a}/widget`;e.src=`${I}${I.includes("?")?"&":"?"}locale=${c}`,e.allow="clipboard-write",e.setAttribute("allowtransparency","true"),e.style.cssText=`position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${d};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`,n.body.appendChild(e);let H=new URL(e.src).origin,o=n.createElement("div");if(o.setAttribute("role","button"),o.setAttribute("aria-label","Chat"),o.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:${d-1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`,o.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>',o.onmouseenter=()=>{o.style.transform="scale(1.1)"},o.onmouseleave=()=>{o.style.transform="scale(1)"},o.onclick=()=>B(),n.body.appendChild(o),!n.getElementById("_bp_fade")){let t=n.createElement("style");t.id="_bp_fade",t.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",n.head.appendChild(t)}let p=null,g=()=>{p&&(p.remove(),p=null)},L=t=>{if(t.origin===H){if(t.data?.type==="bitpalm-widget-config"){t.data.primaryColor&&(o.style.background=t.data.primaryColor,o.style.boxShadow=t.data.chatShadow==="none"?"none":`0 0 15px ${t.data.primaryColor}50`);let r=t.data.chatButtonIconColor||"black";if(t.data.chatButtonIconSvg){o.innerHTML="";let i=n.createElement("span");i.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${r}`,i.innerHTML=t.data.chatButtonIconSvg;let h=i.querySelector("svg");h&&(h.setAttribute("width","24"),h.setAttribute("height","24"),h.style.display="block"),o.appendChild(i)}else{let i=o.querySelector("svg");i&&(i.style.stroke=r)}o.style.display="flex"}if(t.data?.type==="bitpalm-widget-resize"){let r=t.data.width>0,i=window.innerWidth<=640;e.style.width=r?i?"100vw":`${t.data.width}px`:"0",e.style.height=r?i?"100vh":`${t.data.height}px`:"0",i&&r?(e.style.height="100dvh",e.style.left="0",e.style.top="0"):(e.style.left="",e.style.top=""),o.style.display=r?"none":"flex"}if(t.data?.type==="bitpalm-trigger-show"){g(),p=n.createElement("div"),p.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:${d-1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;let r=(t.data.message||"").replace(/</g,"<");p.innerHTML=`<p style="font-size:14px;color:#1f2937;margin:0;">${r}</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 i=n.createElement("button");i.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;",i.innerHTML="✕",i.onclick=h=>{h.stopPropagation(),g(),e.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},p.onclick=()=>{g(),o.style.display="none",e.contentWindow?.postMessage({type:"bitpalm-trigger-engaged"},"*")},p.appendChild(i),n.body.appendChild(p)}t.data?.type==="bitpalm-trigger-hide"&&g()}};window.addEventListener("message",L);let u=parseInt(sessionStorage.getItem(`${l}pages`)||"0")+1;sessionStorage.setItem(`${l}pages`,String(u));let m=JSON.parse(sessionStorage.getItem(`${l}hist`)||"[]");m.push(location.href),m.length>20&&(m=m.slice(-20)),sessionStorage.setItem(`${l}hist`,JSON.stringify(m));let T=Date.now(),y=parseInt(sessionStorage.getItem(`${l}site_start`)||"0");y||(y=T,sessionStorage.setItem(`${l}site_start`,String(y))),e.addEventListener("load",()=>{let t=!!localStorage.getItem(`${l}visited`);e.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:n.title,returning:t,pageCount:u,pageHistory:m,loadedAt:T,siteStart:y,locale:c},"*"),t||localStorage.setItem(`${l}visited`,"1")});let M=history.pushState.bind(history),$=history.replaceState.bind(history),b=()=>{u++,sessionStorage.setItem(`${l}pages`,String(u));let t=JSON.parse(sessionStorage.getItem(`${l}hist`)||"[]");t.push(location.href),t.length>20&&t.splice(0,t.length-20),sessionStorage.setItem(`${l}hist`,JSON.stringify(t)),e.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:n.title,pageCount:u,pageHistory:t,loadedAt:Date.now()},"*")};history.pushState=function(...t){M(...t),b()},history.replaceState=function(...t){$(...t),b()},window.addEventListener("popstate",b);let k=-1,w,A=()=>{clearTimeout(w),w=setTimeout(()=>{let t=Math.max(n.documentElement.scrollHeight,n.body.scrollHeight)-window.innerHeight,r=t>0?Math.round(window.scrollY/t*100):100;r!==k&&(k=r,e.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:r},"*"))},500)};window.addEventListener("scroll",A,{passive:!0});let W=t=>{t.clientY<=0&&e.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};n.addEventListener("mouseout",W);let v,_=!1,S=()=>{clearTimeout(v),!_&&(v=setTimeout(()=>{_=!0,e.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},C=["mousemove","keydown","scroll","touchstart"];C.forEach(t=>n.addEventListener(t,S,{passive:!0})),S();let B=()=>{o.style.display="none",g(),e.contentWindow?.postMessage({type:"bitpalm-open"},"*")};return{open:B,close:()=>{e.contentWindow?.postMessage({type:"bitpalm-close"},"*")},destroy:()=>{window.removeEventListener("message",L),window.removeEventListener("scroll",A),window.removeEventListener("popstate",b),n.removeEventListener("mouseout",W),C.forEach(t=>n.removeEventListener(t,S)),clearTimeout(w),clearTimeout(v),history.pushState=M,history.replaceState=$,g(),o.remove(),e.remove()}}}if(typeof document<"u"){let s=document.currentScript;if(s?.dataset.slug){let a=()=>{x({slug:s.dataset.slug,locale:s.dataset.locale,baseUrl:s.dataset.baseUrl,zIndex:s.dataset.zIndex?Number(s.dataset.zIndex):void 0})};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",a):a()}}0&&(module.exports={createWidget});
|
|
2
2
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/widget.ts"],"sourcesContent":["export { createWidget } from \"./widget\";\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nimport { createWidget } from \"./widget\";\n\n/**\n * Auto-init from script tag:\n * <script src=\"https://cdn.bitpalm.ae/widget.js\" data-slug=\"my-agent\"></script>\n */\nif (typeof document !== \"undefined\") {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script?.dataset.slug) {\n const init = () => {\n createWidget({\n slug: script!.dataset.slug!,\n locale: script!.dataset.locale,\n baseUrl: script!.dataset.baseUrl,\n zIndex: script!.dataset.zIndex ? Number(script!.dataset.zIndex) : undefined,\n });\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n } else {\n init();\n }\n }\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize\n if (e.data?.type === \"bitpalm-widget-resize\") {\n iframe.style.width = `${e.data.width}px`;\n iframe.style.height = `${e.data.height}px`;\n btn.style.display = e.data.width > 0 ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["src_exports","__export","createWidget","__toCommonJS","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","sv","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","script","init","createWidget"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/widget.ts"],"sourcesContent":["export { createWidget } from \"./widget\";\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nimport { createWidget } from \"./widget\";\n\n/**\n * Auto-init from script tag:\n * <script src=\"https://cdn.bitpalm.ae/widget.js\" data-slug=\"my-agent\"></script>\n */\nif (typeof document !== \"undefined\") {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script?.dataset.slug) {\n const init = () => {\n createWidget({\n slug: script!.dataset.slug!,\n locale: script!.dataset.locale,\n baseUrl: script!.dataset.baseUrl,\n zIndex: script!.dataset.zIndex ? Number(script!.dataset.zIndex) : undefined,\n });\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n } else {\n init();\n }\n }\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n const svg = sp.querySelector(\"svg\");\n if (svg) {\n svg.setAttribute(\"width\", \"24\");\n svg.setAttribute(\"height\", \"24\");\n svg.style.display = \"block\";\n }\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize — use full viewport on mobile\n if (e.data?.type === \"bitpalm-widget-resize\") {\n const isOpen = e.data.width > 0;\n const mobile = window.innerWidth <= 640;\n iframe.style.width = isOpen ? (mobile ? \"100vw\" : `${e.data.width}px`) : \"0\";\n iframe.style.height = isOpen ? (mobile ? \"100vh\" : `${e.data.height}px`) : \"0\";\n if (mobile && isOpen) {\n iframe.style.height = \"100dvh\";\n iframe.style.left = \"0\";\n iframe.style.top = \"0\";\n } else {\n iframe.style.left = \"\";\n iframe.style.top = \"\";\n }\n btn.style.display = isOpen ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["src_exports","__export","createWidget","__toCommonJS","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","svg","sv","isOpen","mobile","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","script","init","createWidget"]}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var H="https://agents.bitpalm.ae",
|
|
1
|
+
var H="https://agents.bitpalm.ae",r="_bp_";function O(){if(typeof document<"u"){let a=document.documentElement.lang;if(a)return a.slice(0,2).toLowerCase()}return"en"}function w(a){let{slug:m,locale:v=O(),baseUrl:C=H,zIndex:f=9999}=a,s=document,e=s.createElement("iframe"),S=`${C}/t/${m}/widget`;e.src=`${S}${S.includes("?")?"&":"?"}locale=${v}`,e.allow="clipboard-write",e.setAttribute("allowtransparency","true"),e.style.cssText=`position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${f};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`,s.body.appendChild(e);let B=new URL(e.src).origin,o=s.createElement("div");if(o.setAttribute("role","button"),o.setAttribute("aria-label","Chat"),o.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:${f-1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`,o.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>',o.onmouseenter=()=>{o.style.transform="scale(1.1)"},o.onmouseleave=()=>{o.style.transform="scale(1)"},o.onclick=()=>_(),s.body.appendChild(o),!s.getElementById("_bp_fade")){let t=s.createElement("style");t.id="_bp_fade",t.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",s.head.appendChild(t)}let l=null,d=()=>{l&&(l.remove(),l=null)},E=t=>{if(t.origin===B){if(t.data?.type==="bitpalm-widget-config"){t.data.primaryColor&&(o.style.background=t.data.primaryColor,o.style.boxShadow=t.data.chatShadow==="none"?"none":`0 0 15px ${t.data.primaryColor}50`);let i=t.data.chatButtonIconColor||"black";if(t.data.chatButtonIconSvg){o.innerHTML="";let n=s.createElement("span");n.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${i}`,n.innerHTML=t.data.chatButtonIconSvg;let c=n.querySelector("svg");c&&(c.setAttribute("width","24"),c.setAttribute("height","24"),c.style.display="block"),o.appendChild(n)}else{let n=o.querySelector("svg");n&&(n.style.stroke=i)}o.style.display="flex"}if(t.data?.type==="bitpalm-widget-resize"){let i=t.data.width>0,n=window.innerWidth<=640;e.style.width=i?n?"100vw":`${t.data.width}px`:"0",e.style.height=i?n?"100vh":`${t.data.height}px`:"0",n&&i?(e.style.height="100dvh",e.style.left="0",e.style.top="0"):(e.style.left="",e.style.top=""),o.style.display=i?"none":"flex"}if(t.data?.type==="bitpalm-trigger-show"){d(),l=s.createElement("div"),l.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:${f-1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;let i=(t.data.message||"").replace(/</g,"<");l.innerHTML=`<p style="font-size:14px;color:#1f2937;margin:0;">${i}</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 n=s.createElement("button");n.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;",n.innerHTML="✕",n.onclick=c=>{c.stopPropagation(),d(),e.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},l.onclick=()=>{d(),o.style.display="none",e.contentWindow?.postMessage({type:"bitpalm-trigger-engaged"},"*")},l.appendChild(n),s.body.appendChild(l)}t.data?.type==="bitpalm-trigger-hide"&&d()}};window.addEventListener("message",E);let g=parseInt(sessionStorage.getItem(`${r}pages`)||"0")+1;sessionStorage.setItem(`${r}pages`,String(g));let p=JSON.parse(sessionStorage.getItem(`${r}hist`)||"[]");p.push(location.href),p.length>20&&(p=p.slice(-20)),sessionStorage.setItem(`${r}hist`,JSON.stringify(p));let I=Date.now(),h=parseInt(sessionStorage.getItem(`${r}site_start`)||"0");h||(h=I,sessionStorage.setItem(`${r}site_start`,String(h))),e.addEventListener("load",()=>{let t=!!localStorage.getItem(`${r}visited`);e.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:s.title,returning:t,pageCount:g,pageHistory:p,loadedAt:I,siteStart:h,locale:v},"*"),t||localStorage.setItem(`${r}visited`,"1")});let L=history.pushState.bind(history),T=history.replaceState.bind(history),u=()=>{g++,sessionStorage.setItem(`${r}pages`,String(g));let t=JSON.parse(sessionStorage.getItem(`${r}hist`)||"[]");t.push(location.href),t.length>20&&t.splice(0,t.length-20),sessionStorage.setItem(`${r}hist`,JSON.stringify(t)),e.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:s.title,pageCount:g,pageHistory:t,loadedAt:Date.now()},"*")};history.pushState=function(...t){L(...t),u()},history.replaceState=function(...t){T(...t),u()},window.addEventListener("popstate",u);let M=-1,y,$=()=>{clearTimeout(y),y=setTimeout(()=>{let t=Math.max(s.documentElement.scrollHeight,s.body.scrollHeight)-window.innerHeight,i=t>0?Math.round(window.scrollY/t*100):100;i!==M&&(M=i,e.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:i},"*"))},500)};window.addEventListener("scroll",$,{passive:!0});let k=t=>{t.clientY<=0&&e.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};s.addEventListener("mouseout",k);let b,A=!1,x=()=>{clearTimeout(b),!A&&(b=setTimeout(()=>{A=!0,e.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},W=["mousemove","keydown","scroll","touchstart"];W.forEach(t=>s.addEventListener(t,x,{passive:!0})),x();let _=()=>{o.style.display="none",d(),e.contentWindow?.postMessage({type:"bitpalm-open"},"*")};return{open:_,close:()=>{e.contentWindow?.postMessage({type:"bitpalm-close"},"*")},destroy:()=>{window.removeEventListener("message",E),window.removeEventListener("scroll",$),window.removeEventListener("popstate",u),s.removeEventListener("mouseout",k),W.forEach(t=>s.removeEventListener(t,x)),clearTimeout(y),clearTimeout(b),history.pushState=L,history.replaceState=T,d(),o.remove(),e.remove()}}}if(typeof document<"u"){let a=document.currentScript;if(a?.dataset.slug){let m=()=>{w({slug:a.dataset.slug,locale:a.dataset.locale,baseUrl:a.dataset.baseUrl,zIndex:a.dataset.zIndex?Number(a.dataset.zIndex):void 0})};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",m):m()}}export{w as createWidget};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize\n if (e.data?.type === \"bitpalm-widget-resize\") {\n iframe.style.width = `${e.data.width}px`;\n iframe.style.height = `${e.data.height}px`;\n btn.style.display = e.data.width > 0 ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n","export { createWidget } from \"./widget\";\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nimport { createWidget } from \"./widget\";\n\n/**\n * Auto-init from script tag:\n * <script src=\"https://cdn.bitpalm.ae/widget.js\" data-slug=\"my-agent\"></script>\n */\nif (typeof document !== \"undefined\") {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script?.dataset.slug) {\n const init = () => {\n createWidget({\n slug: script!.dataset.slug!,\n locale: script!.dataset.locale,\n baseUrl: script!.dataset.baseUrl,\n zIndex: script!.dataset.zIndex ? Number(script!.dataset.zIndex) : undefined,\n });\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n } else {\n init();\n }\n }\n}\n"],"mappings":"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","names":["DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","sv","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","script","init","createWidget"]}
|
|
1
|
+
{"version":3,"sources":["../src/widget.ts","../src/index.ts"],"sourcesContent":["import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n const svg = sp.querySelector(\"svg\");\n if (svg) {\n svg.setAttribute(\"width\", \"24\");\n svg.setAttribute(\"height\", \"24\");\n svg.style.display = \"block\";\n }\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize — use full viewport on mobile\n if (e.data?.type === \"bitpalm-widget-resize\") {\n const isOpen = e.data.width > 0;\n const mobile = window.innerWidth <= 640;\n iframe.style.width = isOpen ? (mobile ? \"100vw\" : `${e.data.width}px`) : \"0\";\n iframe.style.height = isOpen ? (mobile ? \"100vh\" : `${e.data.height}px`) : \"0\";\n if (mobile && isOpen) {\n iframe.style.height = \"100dvh\";\n iframe.style.left = \"0\";\n iframe.style.top = \"0\";\n } else {\n iframe.style.left = \"\";\n iframe.style.top = \"\";\n }\n btn.style.display = isOpen ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n","export { createWidget } from \"./widget\";\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nimport { createWidget } from \"./widget\";\n\n/**\n * Auto-init from script tag:\n * <script src=\"https://cdn.bitpalm.ae/widget.js\" data-slug=\"my-agent\"></script>\n */\nif (typeof document !== \"undefined\") {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script?.dataset.slug) {\n const init = () => {\n createWidget({\n slug: script!.dataset.slug!,\n locale: script!.dataset.locale,\n baseUrl: script!.dataset.baseUrl,\n zIndex: script!.dataset.zIndex ? Number(script!.dataset.zIndex) : undefined,\n });\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n } else {\n init();\n }\n }\n}\n"],"mappings":"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","names":["DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","svg","sv","isOpen","mobile","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","script","init","createWidget"]}
|
package/dist/react.cjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var E=Object.defineProperty;var H=Object.getOwnPropertyDescriptor;var R=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var D=(r,i)=>{for(var l in i)E(r,l,{get:i[l],enumerable:!0})},N=(r,i,l,y)=>{if(i&&typeof i=="object"||typeof i=="function")for(let c of R(i))!z.call(r,c)&&c!==l&&E(r,c,{get:()=>i[c],enumerable:!(y=H(i,c))||y.enumerable});return r};var U=r=>N(E({},"__esModule",{value:!0}),r);var F={};D(F,{BitPalmAgent:()=>Y});module.exports=U(F);var f=require("react");var j="https://agents.bitpalm.ae",p="_bp_";function J(){if(typeof document<"u"){let r=document.documentElement.lang;if(r)return r.slice(0,2).toLowerCase()}return"en"}function C(r){let{slug:i,locale:l=J(),baseUrl:y=j,zIndex:c=9999}=r,o=document,e=o.createElement("iframe"),I=`${y}/t/${i}/widget`;e.src=`${I}${I.includes("?")?"&":"?"}locale=${l}`,e.allow="clipboard-write",e.setAttribute("allowtransparency","true"),e.style.cssText=`position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${c};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`,o.body.appendChild(e);let O=new URL(e.src).origin,n=o.createElement("div");if(n.setAttribute("role","button"),n.setAttribute("aria-label","Chat"),n.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:${c-1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`,n.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>',n.onmouseenter=()=>{n.style.transform="scale(1.1)"},n.onmouseleave=()=>{n.style.transform="scale(1)"},n.onclick=()=>W(),o.body.appendChild(n),!o.getElementById("_bp_fade")){let t=o.createElement("style");t.id="_bp_fade",t.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",o.head.appendChild(t)}let d=null,g=()=>{d&&(d.remove(),d=null)},T=t=>{if(t.origin===O){if(t.data?.type==="bitpalm-widget-config"){t.data.primaryColor&&(n.style.background=t.data.primaryColor,n.style.boxShadow=t.data.chatShadow==="none"?"none":`0 0 15px ${t.data.primaryColor}50`);let a=t.data.chatButtonIconColor||"black";if(t.data.chatButtonIconSvg){n.innerHTML="";let s=o.createElement("span");s.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${a}`,s.innerHTML=t.data.chatButtonIconSvg;let h=s.querySelector("svg");h&&(h.setAttribute("width","24"),h.setAttribute("height","24"),h.style.display="block"),n.appendChild(s)}else{let s=n.querySelector("svg");s&&(s.style.stroke=a)}n.style.display="flex"}if(t.data?.type==="bitpalm-widget-resize"){let a=t.data.width>0,s=window.innerWidth<=640;e.style.width=a?s?"100vw":`${t.data.width}px`:"0",e.style.height=a?s?"100vh":`${t.data.height}px`:"0",s&&a?(e.style.height="100dvh",e.style.left="0",e.style.top="0"):(e.style.left="",e.style.top=""),n.style.display=a?"none":"flex"}if(t.data?.type==="bitpalm-trigger-show"){g(),d=o.createElement("div"),d.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:${c-1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;let a=(t.data.message||"").replace(/</g,"<");d.innerHTML=`<p style="font-size:14px;color:#1f2937;margin:0;">${a}</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 s=o.createElement("button");s.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;",s.innerHTML="✕",s.onclick=h=>{h.stopPropagation(),g(),e.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},d.onclick=()=>{g(),n.style.display="none",e.contentWindow?.postMessage({type:"bitpalm-trigger-engaged"},"*")},d.appendChild(s),o.body.appendChild(d)}t.data?.type==="bitpalm-trigger-hide"&&g()}};window.addEventListener("message",T);let u=parseInt(sessionStorage.getItem(`${p}pages`)||"0")+1;sessionStorage.setItem(`${p}pages`,String(u));let m=JSON.parse(sessionStorage.getItem(`${p}hist`)||"[]");m.push(location.href),m.length>20&&(m=m.slice(-20)),sessionStorage.setItem(`${p}hist`,JSON.stringify(m));let A=Date.now(),b=parseInt(sessionStorage.getItem(`${p}site_start`)||"0");b||(b=A,sessionStorage.setItem(`${p}site_start`,String(b))),e.addEventListener("load",()=>{let t=!!localStorage.getItem(`${p}visited`);e.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:o.title,returning:t,pageCount:u,pageHistory:m,loadedAt:A,siteStart:b,locale:l},"*"),t||localStorage.setItem(`${p}visited`,"1")});let $=history.pushState.bind(history),L=history.replaceState.bind(history),x=()=>{u++,sessionStorage.setItem(`${p}pages`,String(u));let t=JSON.parse(sessionStorage.getItem(`${p}hist`)||"[]");t.push(location.href),t.length>20&&t.splice(0,t.length-20),sessionStorage.setItem(`${p}hist`,JSON.stringify(t)),e.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:o.title,pageCount:u,pageHistory:t,loadedAt:Date.now()},"*")};history.pushState=function(...t){$(...t),x()},history.replaceState=function(...t){L(...t),x()},window.addEventListener("popstate",x);let M=-1,w,B=()=>{clearTimeout(w),w=setTimeout(()=>{let t=Math.max(o.documentElement.scrollHeight,o.body.scrollHeight)-window.innerHeight,a=t>0?Math.round(window.scrollY/t*100):100;a!==M&&(M=a,e.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:a},"*"))},500)};window.addEventListener("scroll",B,{passive:!0});let P=t=>{t.clientY<=0&&e.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};o.addEventListener("mouseout",P);let v,k=!1,S=()=>{clearTimeout(v),!k&&(v=setTimeout(()=>{k=!0,e.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},_=["mousemove","keydown","scroll","touchstart"];_.forEach(t=>o.addEventListener(t,S,{passive:!0})),S();let W=()=>{n.style.display="none",g(),e.contentWindow?.postMessage({type:"bitpalm-open"},"*")};return{open:W,close:()=>{e.contentWindow?.postMessage({type:"bitpalm-close"},"*")},destroy:()=>{window.removeEventListener("message",T),window.removeEventListener("scroll",B),window.removeEventListener("popstate",x),o.removeEventListener("mouseout",P),_.forEach(t=>o.removeEventListener(t,S)),clearTimeout(w),clearTimeout(v),history.pushState=$,history.replaceState=L,g(),n.remove(),e.remove()}}}function Y(r){let i=(0,f.useRef)(null),l=(0,f.useRef)(!1);return(0,f.useEffect)(()=>{if(!l.current)return l.current=!0,i.current=C(r),()=>{i.current?.destroy(),i.current=null,l.current=!1}},[]),null}0&&(module.exports={BitPalmAgent});
|
|
2
2
|
//# sourceMappingURL=react.cjs.map
|
package/dist/react.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.ts","../src/widget.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { createWidget } from \"./widget\";\nimport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type BitPalmAgentProps = BitPalmAgentOptions;\n\n/**\n * React component that mounts the BitPalm AI agent widget.\n *\n * @example\n * ```tsx\n * import { BitPalmAgent } from '@bitpalm/ai-agents/react';\n *\n * export default function App() {\n * return <BitPalmAgent slug=\"my-agent\" />;\n * }\n * ```\n */\nexport function BitPalmAgent(props: BitPalmAgentProps): null {\n const instanceRef = useRef<BitPalmAgentInstance | null>(null);\n const mountedRef = useRef(false);\n\n useEffect(() => {\n if (mountedRef.current) return;\n mountedRef.current = true;\n\n instanceRef.current = createWidget(props);\n\n return () => {\n instanceRef.current?.destroy();\n instanceRef.current = null;\n mountedRef.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return null;\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize\n if (e.data?.type === \"bitpalm-widget-resize\") {\n iframe.style.width = `${e.data.width}px`;\n iframe.style.height = `${e.data.height}px`;\n btn.style.display = e.data.width > 0 ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["react_exports","__export","BitPalmAgent","__toCommonJS","import_react","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","sv","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","BitPalmAgent","props","instanceRef","mountedRef","createWidget"]}
|
|
1
|
+
{"version":3,"sources":["../src/react.ts","../src/widget.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { createWidget } from \"./widget\";\nimport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type BitPalmAgentProps = BitPalmAgentOptions;\n\n/**\n * React component that mounts the BitPalm AI agent widget.\n *\n * @example\n * ```tsx\n * import { BitPalmAgent } from '@bitpalm/ai-agents/react';\n *\n * export default function App() {\n * return <BitPalmAgent slug=\"my-agent\" />;\n * }\n * ```\n */\nexport function BitPalmAgent(props: BitPalmAgentProps): null {\n const instanceRef = useRef<BitPalmAgentInstance | null>(null);\n const mountedRef = useRef(false);\n\n useEffect(() => {\n if (mountedRef.current) return;\n mountedRef.current = true;\n\n instanceRef.current = createWidget(props);\n\n return () => {\n instanceRef.current?.destroy();\n instanceRef.current = null;\n mountedRef.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return null;\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n const svg = sp.querySelector(\"svg\");\n if (svg) {\n svg.setAttribute(\"width\", \"24\");\n svg.setAttribute(\"height\", \"24\");\n svg.style.display = \"block\";\n }\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize — use full viewport on mobile\n if (e.data?.type === \"bitpalm-widget-resize\") {\n const isOpen = e.data.width > 0;\n const mobile = window.innerWidth <= 640;\n iframe.style.width = isOpen ? (mobile ? \"100vw\" : `${e.data.width}px`) : \"0\";\n iframe.style.height = isOpen ? (mobile ? \"100vh\" : `${e.data.height}px`) : \"0\";\n if (mobile && isOpen) {\n iframe.style.height = \"100dvh\";\n iframe.style.left = \"0\";\n iframe.style.top = \"0\";\n } else {\n iframe.style.left = \"\";\n iframe.style.top = \"\";\n }\n btn.style.display = isOpen ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["react_exports","__export","BitPalmAgent","__toCommonJS","import_react","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","svg","sv","isOpen","mobile","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","BitPalmAgent","props","instanceRef","mountedRef","createWidget"]}
|
package/dist/react.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{useEffect as R,useRef as
|
|
1
|
+
import{useEffect as R,useRef as _}from"react";var O="https://agents.bitpalm.ae",r="_bp_";function H(){if(typeof document<"u"){let l=document.documentElement.lang;if(l)return l.slice(0,2).toLowerCase()}return"en"}function k(l){let{slug:m,locale:p=H(),baseUrl:W=O,zIndex:y=9999}=l,o=document,e=o.createElement("iframe"),v=`${W}/t/${m}/widget`;e.src=`${v}${v.includes("?")?"&":"?"}locale=${p}`,e.allow="clipboard-write",e.setAttribute("allowtransparency","true"),e.style.cssText=`position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${y};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`,o.body.appendChild(e);let C=new URL(e.src).origin,n=o.createElement("div");if(n.setAttribute("role","button"),n.setAttribute("aria-label","Chat"),n.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:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`,n.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>',n.onmouseenter=()=>{n.style.transform="scale(1.1)"},n.onmouseleave=()=>{n.style.transform="scale(1)"},n.onclick=()=>P(),o.body.appendChild(n),!o.getElementById("_bp_fade")){let t=o.createElement("style");t.id="_bp_fade",t.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",o.head.appendChild(t)}let a=null,c=()=>{a&&(a.remove(),a=null)},S=t=>{if(t.origin===C){if(t.data?.type==="bitpalm-widget-config"){t.data.primaryColor&&(n.style.background=t.data.primaryColor,n.style.boxShadow=t.data.chatShadow==="none"?"none":`0 0 15px ${t.data.primaryColor}50`);let i=t.data.chatButtonIconColor||"black";if(t.data.chatButtonIconSvg){n.innerHTML="";let s=o.createElement("span");s.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${i}`,s.innerHTML=t.data.chatButtonIconSvg;let g=s.querySelector("svg");g&&(g.setAttribute("width","24"),g.setAttribute("height","24"),g.style.display="block"),n.appendChild(s)}else{let s=n.querySelector("svg");s&&(s.style.stroke=i)}n.style.display="flex"}if(t.data?.type==="bitpalm-widget-resize"){let i=t.data.width>0,s=window.innerWidth<=640;e.style.width=i?s?"100vw":`${t.data.width}px`:"0",e.style.height=i?s?"100vh":`${t.data.height}px`:"0",s&&i?(e.style.height="100dvh",e.style.left="0",e.style.top="0"):(e.style.left="",e.style.top=""),n.style.display=i?"none":"flex"}if(t.data?.type==="bitpalm-trigger-show"){c(),a=o.createElement("div"),a.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 i=(t.data.message||"").replace(/</g,"<");a.innerHTML=`<p style="font-size:14px;color:#1f2937;margin:0;">${i}</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 s=o.createElement("button");s.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;",s.innerHTML="✕",s.onclick=g=>{g.stopPropagation(),c(),e.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},a.onclick=()=>{c(),n.style.display="none",e.contentWindow?.postMessage({type:"bitpalm-trigger-engaged"},"*")},a.appendChild(s),o.body.appendChild(a)}t.data?.type==="bitpalm-trigger-hide"&&c()}};window.addEventListener("message",S);let h=parseInt(sessionStorage.getItem(`${r}pages`)||"0")+1;sessionStorage.setItem(`${r}pages`,String(h));let d=JSON.parse(sessionStorage.getItem(`${r}hist`)||"[]");d.push(location.href),d.length>20&&(d=d.slice(-20)),sessionStorage.setItem(`${r}hist`,JSON.stringify(d));let E=Date.now(),u=parseInt(sessionStorage.getItem(`${r}site_start`)||"0");u||(u=E,sessionStorage.setItem(`${r}site_start`,String(u))),e.addEventListener("load",()=>{let t=!!localStorage.getItem(`${r}visited`);e.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:o.title,returning:t,pageCount:h,pageHistory:d,loadedAt:E,siteStart:u,locale:p},"*"),t||localStorage.setItem(`${r}visited`,"1")});let I=history.pushState.bind(history),T=history.replaceState.bind(history),f=()=>{h++,sessionStorage.setItem(`${r}pages`,String(h));let t=JSON.parse(sessionStorage.getItem(`${r}hist`)||"[]");t.push(location.href),t.length>20&&t.splice(0,t.length-20),sessionStorage.setItem(`${r}hist`,JSON.stringify(t)),e.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:o.title,pageCount:h,pageHistory:t,loadedAt:Date.now()},"*")};history.pushState=function(...t){I(...t),f()},history.replaceState=function(...t){T(...t),f()},window.addEventListener("popstate",f);let A=-1,b,$=()=>{clearTimeout(b),b=setTimeout(()=>{let t=Math.max(o.documentElement.scrollHeight,o.body.scrollHeight)-window.innerHeight,i=t>0?Math.round(window.scrollY/t*100):100;i!==A&&(A=i,e.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:i},"*"))},500)};window.addEventListener("scroll",$,{passive:!0});let L=t=>{t.clientY<=0&&e.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};o.addEventListener("mouseout",L);let x,M=!1,w=()=>{clearTimeout(x),!M&&(x=setTimeout(()=>{M=!0,e.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},B=["mousemove","keydown","scroll","touchstart"];B.forEach(t=>o.addEventListener(t,w,{passive:!0})),w();let P=()=>{n.style.display="none",c(),e.contentWindow?.postMessage({type:"bitpalm-open"},"*")};return{open:P,close:()=>{e.contentWindow?.postMessage({type:"bitpalm-close"},"*")},destroy:()=>{window.removeEventListener("message",S),window.removeEventListener("scroll",$),window.removeEventListener("popstate",f),o.removeEventListener("mouseout",L),B.forEach(t=>o.removeEventListener(t,w)),clearTimeout(b),clearTimeout(x),history.pushState=I,history.replaceState=T,c(),n.remove(),e.remove()}}}function J(l){let m=_(null),p=_(!1);return R(()=>{if(!p.current)return p.current=!0,m.current=k(l),()=>{m.current?.destroy(),m.current=null,p.current=!1}},[]),null}export{J as BitPalmAgent};
|
|
2
2
|
//# sourceMappingURL=react.js.map
|
package/dist/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/react.ts","../src/widget.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { createWidget } from \"./widget\";\nimport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type BitPalmAgentProps = BitPalmAgentOptions;\n\n/**\n * React component that mounts the BitPalm AI agent widget.\n *\n * @example\n * ```tsx\n * import { BitPalmAgent } from '@bitpalm/ai-agents/react';\n *\n * export default function App() {\n * return <BitPalmAgent slug=\"my-agent\" />;\n * }\n * ```\n */\nexport function BitPalmAgent(props: BitPalmAgentProps): null {\n const instanceRef = useRef<BitPalmAgentInstance | null>(null);\n const mountedRef = useRef(false);\n\n useEffect(() => {\n if (mountedRef.current) return;\n mountedRef.current = true;\n\n instanceRef.current = createWidget(props);\n\n return () => {\n instanceRef.current?.destroy();\n instanceRef.current = null;\n mountedRef.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return null;\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize\n if (e.data?.type === \"bitpalm-widget-resize\") {\n iframe.style.width = `${e.data.width}px`;\n iframe.style.height = `${e.data.height}px`;\n btn.style.display = e.data.width > 0 ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["useEffect","useRef","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","sv","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","BitPalmAgent","props","instanceRef","useRef","mountedRef","useEffect","createWidget"]}
|
|
1
|
+
{"version":3,"sources":["../src/react.ts","../src/widget.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { createWidget } from \"./widget\";\nimport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nexport type BitPalmAgentProps = BitPalmAgentOptions;\n\n/**\n * React component that mounts the BitPalm AI agent widget.\n *\n * @example\n * ```tsx\n * import { BitPalmAgent } from '@bitpalm/ai-agents/react';\n *\n * export default function App() {\n * return <BitPalmAgent slug=\"my-agent\" />;\n * }\n * ```\n */\nexport function BitPalmAgent(props: BitPalmAgentProps): null {\n const instanceRef = useRef<BitPalmAgentInstance | null>(null);\n const mountedRef = useRef(false);\n\n useEffect(() => {\n if (mountedRef.current) return;\n mountedRef.current = true;\n\n instanceRef.current = createWidget(props);\n\n return () => {\n instanceRef.current?.destroy();\n instanceRef.current = null;\n mountedRef.current = false;\n };\n }, []); // eslint-disable-line react-hooks/exhaustive-deps\n\n return null;\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n const svg = sp.querySelector(\"svg\");\n if (svg) {\n svg.setAttribute(\"width\", \"24\");\n svg.setAttribute(\"height\", \"24\");\n svg.style.display = \"block\";\n }\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize — use full viewport on mobile\n if (e.data?.type === \"bitpalm-widget-resize\") {\n const isOpen = e.data.width > 0;\n const mobile = window.innerWidth <= 640;\n iframe.style.width = isOpen ? (mobile ? \"100vw\" : `${e.data.width}px`) : \"0\";\n iframe.style.height = isOpen ? (mobile ? \"100vh\" : `${e.data.height}px`) : \"0\";\n if (mobile && isOpen) {\n iframe.style.height = \"100dvh\";\n iframe.style.left = \"0\";\n iframe.style.top = \"0\";\n } else {\n iframe.style.left = \"\";\n iframe.style.top = \"\";\n }\n btn.style.display = isOpen ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["useEffect","useRef","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","svg","sv","isOpen","mobile","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","BitPalmAgent","props","instanceRef","useRef","mountedRef","useEffect","createWidget"]}
|
package/dist/widget.global.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var BitPalmAgents=(()=>{var
|
|
1
|
+
"use strict";var BitPalmAgents=(()=>{var E=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var P=Object.getOwnPropertyNames;var z=Object.prototype.hasOwnProperty;var R=(s,a)=>{for(var c in a)E(s,c,{get:a[c],enumerable:!0})},U=(s,a,c,f)=>{if(a&&typeof a=="object"||typeof a=="function")for(let d of P(a))!z.call(s,d)&&d!==c&&E(s,d,{get:()=>a[d],enumerable:!(f=O(a,d))||f.enumerable});return s};var D=s=>U(E({},"__esModule",{value:!0}),s);var J={};R(J,{createWidget:()=>x});var N="https://agents.bitpalm.ae",l="_bp_";function j(){if(typeof document<"u"){let s=document.documentElement.lang;if(s)return s.slice(0,2).toLowerCase()}return"en"}function x(s){let{slug:a,locale:c=j(),baseUrl:f=N,zIndex:d=9999}=s,n=document,e=n.createElement("iframe"),I=`${f}/t/${a}/widget`;e.src=`${I}${I.includes("?")?"&":"?"}locale=${c}`,e.allow="clipboard-write",e.setAttribute("allowtransparency","true"),e.style.cssText=`position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${d};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`,n.body.appendChild(e);let H=new URL(e.src).origin,o=n.createElement("div");if(o.setAttribute("role","button"),o.setAttribute("aria-label","Chat"),o.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:${d-1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`,o.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>',o.onmouseenter=()=>{o.style.transform="scale(1.1)"},o.onmouseleave=()=>{o.style.transform="scale(1)"},o.onclick=()=>B(),n.body.appendChild(o),!n.getElementById("_bp_fade")){let t=n.createElement("style");t.id="_bp_fade",t.textContent="@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}",n.head.appendChild(t)}let p=null,g=()=>{p&&(p.remove(),p=null)},L=t=>{if(t.origin===H){if(t.data?.type==="bitpalm-widget-config"){t.data.primaryColor&&(o.style.background=t.data.primaryColor,o.style.boxShadow=t.data.chatShadow==="none"?"none":`0 0 15px ${t.data.primaryColor}50`);let r=t.data.chatButtonIconColor||"black";if(t.data.chatButtonIconSvg){o.innerHTML="";let i=n.createElement("span");i.style.cssText=`display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${r}`,i.innerHTML=t.data.chatButtonIconSvg;let h=i.querySelector("svg");h&&(h.setAttribute("width","24"),h.setAttribute("height","24"),h.style.display="block"),o.appendChild(i)}else{let i=o.querySelector("svg");i&&(i.style.stroke=r)}o.style.display="flex"}if(t.data?.type==="bitpalm-widget-resize"){let r=t.data.width>0,i=window.innerWidth<=640;e.style.width=r?i?"100vw":`${t.data.width}px`:"0",e.style.height=r?i?"100vh":`${t.data.height}px`:"0",i&&r?(e.style.height="100dvh",e.style.left="0",e.style.top="0"):(e.style.left="",e.style.top=""),o.style.display=r?"none":"flex"}if(t.data?.type==="bitpalm-trigger-show"){g(),p=n.createElement("div"),p.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:${d-1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;let r=(t.data.message||"").replace(/</g,"<");p.innerHTML=`<p style="font-size:14px;color:#1f2937;margin:0;">${r}</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 i=n.createElement("button");i.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;",i.innerHTML="✕",i.onclick=h=>{h.stopPropagation(),g(),e.contentWindow?.postMessage({type:"bitpalm-trigger-dismiss"},"*")},p.onclick=()=>{g(),o.style.display="none",e.contentWindow?.postMessage({type:"bitpalm-trigger-engaged"},"*")},p.appendChild(i),n.body.appendChild(p)}t.data?.type==="bitpalm-trigger-hide"&&g()}};window.addEventListener("message",L);let u=parseInt(sessionStorage.getItem(`${l}pages`)||"0")+1;sessionStorage.setItem(`${l}pages`,String(u));let m=JSON.parse(sessionStorage.getItem(`${l}hist`)||"[]");m.push(location.href),m.length>20&&(m=m.slice(-20)),sessionStorage.setItem(`${l}hist`,JSON.stringify(m));let T=Date.now(),y=parseInt(sessionStorage.getItem(`${l}site_start`)||"0");y||(y=T,sessionStorage.setItem(`${l}site_start`,String(y))),e.addEventListener("load",()=>{let t=!!localStorage.getItem(`${l}visited`);e.contentWindow?.postMessage({type:"bitpalm-parent-context",url:location.href,title:n.title,returning:t,pageCount:u,pageHistory:m,loadedAt:T,siteStart:y,locale:c},"*"),t||localStorage.setItem(`${l}visited`,"1")});let M=history.pushState.bind(history),$=history.replaceState.bind(history),b=()=>{u++,sessionStorage.setItem(`${l}pages`,String(u));let t=JSON.parse(sessionStorage.getItem(`${l}hist`)||"[]");t.push(location.href),t.length>20&&t.splice(0,t.length-20),sessionStorage.setItem(`${l}hist`,JSON.stringify(t)),e.contentWindow?.postMessage({type:"bitpalm-page-change",url:location.href,title:n.title,pageCount:u,pageHistory:t,loadedAt:Date.now()},"*")};history.pushState=function(...t){M(...t),b()},history.replaceState=function(...t){$(...t),b()},window.addEventListener("popstate",b);let k=-1,w,A=()=>{clearTimeout(w),w=setTimeout(()=>{let t=Math.max(n.documentElement.scrollHeight,n.body.scrollHeight)-window.innerHeight,r=t>0?Math.round(window.scrollY/t*100):100;r!==k&&(k=r,e.contentWindow?.postMessage({type:"bitpalm-scroll-depth",percent:r},"*"))},500)};window.addEventListener("scroll",A,{passive:!0});let W=t=>{t.clientY<=0&&e.contentWindow?.postMessage({type:"bitpalm-exit-intent"},"*")};n.addEventListener("mouseout",W);let v,_=!1,S=()=>{clearTimeout(v),!_&&(v=setTimeout(()=>{_=!0,e.contentWindow?.postMessage({type:"bitpalm-inactivity"},"*")},15e3))},C=["mousemove","keydown","scroll","touchstart"];C.forEach(t=>n.addEventListener(t,S,{passive:!0})),S();let B=()=>{o.style.display="none",g(),e.contentWindow?.postMessage({type:"bitpalm-open"},"*")};return{open:B,close:()=>{e.contentWindow?.postMessage({type:"bitpalm-close"},"*")},destroy:()=>{window.removeEventListener("message",L),window.removeEventListener("scroll",A),window.removeEventListener("popstate",b),n.removeEventListener("mouseout",W),C.forEach(t=>n.removeEventListener(t,S)),clearTimeout(w),clearTimeout(v),history.pushState=M,history.replaceState=$,g(),o.remove(),e.remove()}}}if(typeof document<"u"){let s=document.currentScript;if(s?.dataset.slug){let a=()=>{x({slug:s.dataset.slug,locale:s.dataset.locale,baseUrl:s.dataset.baseUrl,zIndex:s.dataset.zIndex?Number(s.dataset.zIndex):void 0})};document.readyState==="loading"?document.addEventListener("DOMContentLoaded",a):a()}}return D(J);})();
|
|
2
2
|
//# sourceMappingURL=widget.global.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/widget.ts"],"sourcesContent":["export { createWidget } from \"./widget\";\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nimport { createWidget } from \"./widget\";\n\n/**\n * Auto-init from script tag:\n * <script src=\"https://cdn.bitpalm.ae/widget.js\" data-slug=\"my-agent\"></script>\n */\nif (typeof document !== \"undefined\") {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script?.dataset.slug) {\n const init = () => {\n createWidget({\n slug: script!.dataset.slug!,\n locale: script!.dataset.locale,\n baseUrl: script!.dataset.baseUrl,\n zIndex: script!.dataset.zIndex ? Number(script!.dataset.zIndex) : undefined,\n });\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n } else {\n init();\n }\n }\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize\n if (e.data?.type === \"bitpalm-widget-resize\") {\n iframe.style.width = `${e.data.width}px`;\n iframe.style.height = `${e.data.height}px`;\n btn.style.display = e.data.width > 0 ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["src_exports","__export","createWidget","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","sv","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","script","init","createWidget"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/widget.ts"],"sourcesContent":["export { createWidget } from \"./widget\";\nexport type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nimport { createWidget } from \"./widget\";\n\n/**\n * Auto-init from script tag:\n * <script src=\"https://cdn.bitpalm.ae/widget.js\" data-slug=\"my-agent\"></script>\n */\nif (typeof document !== \"undefined\") {\n const script = document.currentScript as HTMLScriptElement | null;\n if (script?.dataset.slug) {\n const init = () => {\n createWidget({\n slug: script!.dataset.slug!,\n locale: script!.dataset.locale,\n baseUrl: script!.dataset.baseUrl,\n zIndex: script!.dataset.zIndex ? Number(script!.dataset.zIndex) : undefined,\n });\n };\n\n if (document.readyState === \"loading\") {\n document.addEventListener(\"DOMContentLoaded\", init);\n } else {\n init();\n }\n }\n}\n","import type { BitPalmAgentOptions, BitPalmAgentInstance } from \"./types\";\n\nconst DEFAULT_BASE_URL = \"https://agents.bitpalm.ae\";\nconst STORAGE_PREFIX = \"_bp_\";\n\nfunction detectLocale(): string {\n if (typeof document !== \"undefined\") {\n const lang = document.documentElement.lang;\n if (lang) return lang.slice(0, 2).toLowerCase();\n }\n return \"en\";\n}\n\nexport function createWidget(options: BitPalmAgentOptions): BitPalmAgentInstance {\n const {\n slug,\n locale = detectLocale(),\n baseUrl = DEFAULT_BASE_URL,\n zIndex = 9999,\n } = options;\n\n const d = document;\n\n // --- Iframe ---\n const iframe = d.createElement(\"iframe\");\n const widgetUrl = `${baseUrl}/t/${slug}/widget`;\n iframe.src = `${widgetUrl}${widgetUrl.includes(\"?\") ? \"&\" : \"?\"}locale=${locale}`;\n iframe.allow = \"clipboard-write\";\n iframe.setAttribute(\"allowtransparency\", \"true\");\n iframe.style.cssText = `position:fixed;bottom:0;right:0;width:0;height:0;border:none;z-index:${zIndex};background:transparent;color-scheme:normal;transition:width .3s,height .3s;`;\n d.body.appendChild(iframe);\n\n const origin = new URL(iframe.src).origin;\n\n // --- Native launcher button ---\n const btn = d.createElement(\"div\");\n btn.setAttribute(\"role\", \"button\");\n btn.setAttribute(\"aria-label\", \"Chat\");\n btn.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:${zIndex - 1};background:#00ff41;box-shadow:0 0 15px rgba(0,255,65,0.31);transition:transform .2s;`;\n btn.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>';\n btn.onmouseenter = () => { btn.style.transform = \"scale(1.1)\"; };\n btn.onmouseleave = () => { btn.style.transform = \"scale(1)\"; };\n btn.onclick = () => openWidget();\n d.body.appendChild(btn);\n\n // --- Fade animation for trigger bubbles ---\n if (!d.getElementById(\"_bp_fade\")) {\n const s = d.createElement(\"style\");\n s.id = \"_bp_fade\";\n s.textContent = \"@keyframes _bp_fade{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\";\n d.head.appendChild(s);\n }\n\n // --- Trigger bubble ---\n let bubble: HTMLDivElement | null = null;\n const removeBubble = () => {\n if (bubble) { bubble.remove(); bubble = null; }\n };\n\n // --- postMessage handler ---\n const handleMessage = (e: MessageEvent) => {\n if (e.origin !== origin) return;\n\n // Widget config (colors, icon)\n if (e.data?.type === \"bitpalm-widget-config\") {\n if (e.data.primaryColor) {\n btn.style.background = e.data.primaryColor;\n btn.style.boxShadow = e.data.chatShadow === \"none\" ? \"none\" : `0 0 15px ${e.data.primaryColor}50`;\n }\n const ic = e.data.chatButtonIconColor || \"black\";\n if (e.data.chatButtonIconSvg) {\n btn.innerHTML = \"\";\n const sp = d.createElement(\"span\");\n sp.style.cssText = `display:flex;align-items:center;justify-content:center;width:24px;height:24px;color:${ic}`;\n sp.innerHTML = e.data.chatButtonIconSvg;\n const svg = sp.querySelector(\"svg\");\n if (svg) {\n svg.setAttribute(\"width\", \"24\");\n svg.setAttribute(\"height\", \"24\");\n svg.style.display = \"block\";\n }\n btn.appendChild(sp);\n } else {\n const sv = btn.querySelector(\"svg\");\n if (sv) (sv as SVGElement).style.stroke = ic;\n }\n btn.style.display = \"flex\";\n }\n\n // Resize — use full viewport on mobile\n if (e.data?.type === \"bitpalm-widget-resize\") {\n const isOpen = e.data.width > 0;\n const mobile = window.innerWidth <= 640;\n iframe.style.width = isOpen ? (mobile ? \"100vw\" : `${e.data.width}px`) : \"0\";\n iframe.style.height = isOpen ? (mobile ? \"100vh\" : `${e.data.height}px`) : \"0\";\n if (mobile && isOpen) {\n iframe.style.height = \"100dvh\";\n iframe.style.left = \"0\";\n iframe.style.top = \"0\";\n } else {\n iframe.style.left = \"\";\n iframe.style.top = \"\";\n }\n btn.style.display = isOpen ? \"none\" : \"flex\";\n }\n\n // Trigger bubble show\n if (e.data?.type === \"bitpalm-trigger-show\") {\n removeBubble();\n bubble = d.createElement(\"div\");\n bubble.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:${zIndex - 1};font-family:system-ui,sans-serif;animation:_bp_fade .3s;`;\n const msg = (e.data.message || \"\").replace(/</g, \"<\");\n bubble.innerHTML = `<p style=\"font-size:14px;color:#1f2937;margin:0;\">${msg}</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>`;\n const close = d.createElement(\"button\");\n close.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;\";\n close.innerHTML = \"✕\";\n close.onclick = (ev) => { ev.stopPropagation(); removeBubble(); iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-dismiss\" }, \"*\"); };\n bubble.onclick = () => { removeBubble(); btn.style.display = \"none\"; iframe.contentWindow?.postMessage({ type: \"bitpalm-trigger-engaged\" }, \"*\"); };\n bubble.appendChild(close);\n d.body.appendChild(bubble);\n }\n\n // Trigger bubble hide\n if (e.data?.type === \"bitpalm-trigger-hide\") { removeBubble(); }\n };\n window.addEventListener(\"message\", handleMessage);\n\n // --- Visitor Intelligence: page counter + history ---\n let pageCount = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}pages`) || \"0\") + 1;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n\n let hist: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n hist.push(location.href);\n if (hist.length > 20) hist = hist.slice(-20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(hist));\n\n const loadedAt = Date.now();\n let siteStart = parseInt(sessionStorage.getItem(`${STORAGE_PREFIX}site_start`) || \"0\");\n if (!siteStart) {\n siteStart = loadedAt;\n sessionStorage.setItem(`${STORAGE_PREFIX}site_start`, String(siteStart));\n }\n\n // --- Send parent context on iframe load ---\n iframe.addEventListener(\"load\", () => {\n const returning = !!localStorage.getItem(`${STORAGE_PREFIX}visited`);\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-parent-context\",\n url: location.href,\n title: d.title,\n returning,\n pageCount,\n pageHistory: hist,\n loadedAt,\n siteStart,\n locale,\n }, \"*\");\n if (!returning) localStorage.setItem(`${STORAGE_PREFIX}visited`, \"1\");\n });\n\n // --- SPA navigation detection ---\n const origPush = history.pushState.bind(history);\n const origReplace = history.replaceState.bind(history);\n\n const onNav = () => {\n pageCount++;\n sessionStorage.setItem(`${STORAGE_PREFIX}pages`, String(pageCount));\n const h: string[] = JSON.parse(sessionStorage.getItem(`${STORAGE_PREFIX}hist`) || \"[]\");\n h.push(location.href);\n if (h.length > 20) h.splice(0, h.length - 20);\n sessionStorage.setItem(`${STORAGE_PREFIX}hist`, JSON.stringify(h));\n iframe.contentWindow?.postMessage({\n type: \"bitpalm-page-change\",\n url: location.href,\n title: d.title,\n pageCount,\n pageHistory: h,\n loadedAt: Date.now(),\n }, \"*\");\n };\n\n history.pushState = function (...args: Parameters<typeof history.pushState>) {\n origPush(...args);\n onNav();\n };\n history.replaceState = function (...args: Parameters<typeof history.replaceState>) {\n origReplace(...args);\n onNav();\n };\n window.addEventListener(\"popstate\", onNav);\n\n // --- Scroll depth tracking ---\n let lastScrollDepth = -1;\n let scrollTimeout: ReturnType<typeof setTimeout>;\n const handleScroll = () => {\n clearTimeout(scrollTimeout);\n scrollTimeout = setTimeout(() => {\n const total = Math.max(d.documentElement.scrollHeight, d.body.scrollHeight) - window.innerHeight;\n const pct = total > 0 ? Math.round(window.scrollY / total * 100) : 100;\n if (pct !== lastScrollDepth) {\n lastScrollDepth = pct;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-scroll-depth\", percent: pct }, \"*\");\n }\n }, 500);\n };\n window.addEventListener(\"scroll\", handleScroll, { passive: true });\n\n // --- Exit intent ---\n const handleMouseOut = (e: MouseEvent) => {\n if (e.clientY <= 0) {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-exit-intent\" }, \"*\");\n }\n };\n d.addEventListener(\"mouseout\", handleMouseOut);\n\n // --- Inactivity detection (15s) ---\n let idleTimer: ReturnType<typeof setTimeout>;\n let idleFired = false;\n const resetIdle = () => {\n clearTimeout(idleTimer);\n if (idleFired) return;\n idleTimer = setTimeout(() => {\n idleFired = true;\n iframe.contentWindow?.postMessage({ type: \"bitpalm-inactivity\" }, \"*\");\n }, 15_000);\n };\n const idleEvents = [\"mousemove\", \"keydown\", \"scroll\", \"touchstart\"] as const;\n idleEvents.forEach((ev) => d.addEventListener(ev, resetIdle, { passive: true }));\n resetIdle();\n\n // --- Public API ---\n const openWidget = () => {\n btn.style.display = \"none\";\n removeBubble();\n iframe.contentWindow?.postMessage({ type: \"bitpalm-open\" }, \"*\");\n };\n\n const closeWidget = () => {\n iframe.contentWindow?.postMessage({ type: \"bitpalm-close\" }, \"*\");\n };\n\n const destroy = () => {\n window.removeEventListener(\"message\", handleMessage);\n window.removeEventListener(\"scroll\", handleScroll);\n window.removeEventListener(\"popstate\", onNav);\n d.removeEventListener(\"mouseout\", handleMouseOut);\n idleEvents.forEach((ev) => d.removeEventListener(ev, resetIdle));\n clearTimeout(scrollTimeout);\n clearTimeout(idleTimer);\n history.pushState = origPush;\n history.replaceState = origReplace;\n removeBubble();\n btn.remove();\n iframe.remove();\n };\n\n return { open: openWidget, close: closeWidget, destroy };\n}\n"],"mappings":"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","names":["src_exports","__export","createWidget","DEFAULT_BASE_URL","STORAGE_PREFIX","detectLocale","lang","createWidget","options","slug","locale","baseUrl","zIndex","d","iframe","widgetUrl","origin","btn","openWidget","s","bubble","removeBubble","handleMessage","e","ic","sp","svg","sv","isOpen","mobile","msg","close","ev","pageCount","hist","loadedAt","siteStart","returning","origPush","origReplace","onNav","h","args","lastScrollDepth","scrollTimeout","handleScroll","total","pct","handleMouseOut","idleTimer","idleFired","resetIdle","idleEvents","script","init","createWidget"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bitpalm/ai-agents",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Drop-in AI chat agent widget for any website. Includes visitor intelligence, SPA navigation tracking, trigger bubbles, and more.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "BitPalm <agents@bitpalm.ae>",
|