@heedb/web-sdk 1.0.2 → 1.0.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/widget.js +18 -18
- package/package.json +10 -3
- package/widget.js +18 -18
package/dist/widget.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/* Heedb Widget v1.0.
|
|
2
|
-
"use strict";(()=>{(function(){var
|
|
1
|
+
/* Heedb Widget v1.0.3 — https://heedb.com */
|
|
2
|
+
"use strict";(()=>{(function(){var ae,ne,se,oe,ie;let E=document.currentScript||document.querySelector("script[data-api-key]"),$=(ae=E==null?void 0:E.getAttribute("data-api-key"))!=null?ae:"",K=(ne=E==null?void 0:E.src)!=null?ne:"",I=(E==null?void 0:E.getAttribute("data-host"))||(K?new URL(K).origin:"");if(!$){console.warn("[Heedb] Missing data-api-key on <script> tag.");return}let re=1,l={},b=!1,de={primary:"#18181b",text:"#18181b",bg:"#ffffff"},le={primary:"#e4e4e7",text:"#e4e4e7",bg:"#1a1a1a"},B={en:{contactTab:"Message",privacyTab:"Privacy",messagesTab:"Messages",nameLabel:"Name",emailLabel:"Email",messageLabel:"Message",namePlaceholder:"Jane Smith",emailPlaceholder:"jane@example.com",messagePlaceholder:"How can we help?",sendMessage:"Send message",sending:"Sending\u2026",fillAllFields:"Please fill in all fields.",messageSentTitle:"Message sent!",messageSentBody:"We'll get back to you soon. Check your inbox for a confirmation email.",networkError:"Network error. Please try again.",somethingWrong:"Something went wrong.",rateLimited:"Too many messages. Please wait a moment.",requestType:"Request type",deleteData:"Delete my data",accessData:"Access my data",exportData:"Export my data",correctData:"Correct my data",restrictProcessing:"Restrict processing",objectProcessing:"Object to processing",other:"Other",submitRequest:"Submit request",submitting:"Submitting\u2026",requestSubmittedTitle:"Request submitted!",requestSubmittedBody:"Your privacy request has been received. We'll respond within 30 days.",contactUs:"Contact us",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Just now",minutesAgo:"{mins}m ago",hoursAgo:"{hours}h ago",send:"Send",backToMessages:"\u2190 Back to messages",noThreadsAuth:"Send a message below to view your message history.",sendAMessage:"+ Send a message",sendNewMessage:"+ Send a new message",noOpenMessages:"No open messages yet.",loading:"Loading\u2026",failedToLoad:"Failed to load messages.",failedToLoadConvo:"Failed to load conversation.",failedToSend:"Failed to send.",typeReply:"Type a reply\u2026",privacyRequest:"Privacy request",message:"Message"},es:{contactTab:"Mensaje",privacyTab:"Privacidad",messagesTab:"Mensajes",nameLabel:"Nombre",emailLabel:"Correo",messageLabel:"Mensaje",namePlaceholder:"Mar\xEDa Garc\xEDa",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"\xBFC\xF3mo podemos ayudarte?",sendMessage:"Enviar mensaje",sending:"Enviando\u2026",fillAllFields:"Por favor, completa todos los campos.",messageSentTitle:"\xA1Mensaje enviado!",messageSentBody:"Te responderemos pronto. Revisa tu bandeja de entrada para un correo de confirmaci\xF3n.",networkError:"Error de red. Int\xE9ntalo de nuevo.",somethingWrong:"Algo sali\xF3 mal.",rateLimited:"Demasiados mensajes. Espera un momento.",requestType:"Tipo de solicitud",deleteData:"Eliminar mis datos",accessData:"Acceder a mis datos",exportData:"Exportar mis datos",correctData:"Corregir mis datos",restrictProcessing:"Restringir procesamiento",objectProcessing:"Oponerse al procesamiento",other:"Otro",submitRequest:"Enviar solicitud",submitting:"Enviando\u2026",requestSubmittedTitle:"\xA1Solicitud enviada!",requestSubmittedBody:"Tu solicitud de privacidad ha sido recibida. Responderemos en un plazo de 30 d\xEDas.",contactUs:"Cont\xE1ctanos",feedback:"Comentarios",poweredBy:"Impulsado por Heedb",justNow:"Ahora",minutesAgo:"hace {mins}m",hoursAgo:"hace {hours}h",send:"Enviar",backToMessages:"\u2190 Volver a mensajes",noThreadsAuth:"Env\xEDa un mensaje para ver tu historial.",sendAMessage:"+ Enviar un mensaje",sendNewMessage:"+ Enviar un nuevo mensaje",noOpenMessages:"No hay mensajes a\xFAn.",loading:"Cargando\u2026",failedToLoad:"No se pudieron cargar los mensajes.",failedToLoadConvo:"No se pudo cargar la conversaci\xF3n.",failedToSend:"No se pudo enviar.",typeReply:"Escribe una respuesta\u2026",privacyRequest:"Solicitud de privacidad",message:"Mensaje"},pt:{contactTab:"Mensagem",privacyTab:"Privacidade",messagesTab:"Mensagens",nameLabel:"Nome",emailLabel:"Email",messageLabel:"Mensagem",namePlaceholder:"Maria Silva",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"Como podemos ajudar?",sendMessage:"Enviar mensagem",sending:"Enviando\u2026",fillAllFields:"Por favor, preencha todos os campos.",messageSentTitle:"Mensagem enviada!",messageSentBody:"Responderemos em breve. Verifique sua caixa de entrada para um email de confirma\xE7\xE3o.",networkError:"Erro de rede. Tente novamente.",somethingWrong:"Algo deu errado.",rateLimited:"Muitas mensagens. Aguarde um momento.",requestType:"Tipo de solicita\xE7\xE3o",deleteData:"Excluir meus dados",accessData:"Acessar meus dados",exportData:"Exportar meus dados",correctData:"Corrigir meus dados",restrictProcessing:"Restringir processamento",objectProcessing:"Opor-se ao processamento",other:"Outro",submitRequest:"Enviar solicita\xE7\xE3o",submitting:"Enviando\u2026",requestSubmittedTitle:"Solicita\xE7\xE3o enviada!",requestSubmittedBody:"Sua solicita\xE7\xE3o de privacidade foi recebida. Responderemos em at\xE9 30 dias.",contactUs:"Fale conosco",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Agora",minutesAgo:"h\xE1 {mins}m",hoursAgo:"h\xE1 {hours}h",send:"Enviar",backToMessages:"\u2190 Voltar \xE0s mensagens",noThreadsAuth:"Envie uma mensagem para ver seu hist\xF3rico.",sendAMessage:"+ Enviar uma mensagem",sendNewMessage:"+ Enviar uma nova mensagem",noOpenMessages:"Nenhuma mensagem ainda.",loading:"Carregando\u2026",failedToLoad:"N\xE3o foi poss\xEDvel carregar as mensagens.",failedToLoadConvo:"N\xE3o foi poss\xEDvel carregar a conversa.",failedToSend:"N\xE3o foi poss\xEDvel enviar.",typeReply:"Digite uma resposta\u2026",privacyRequest:"Solicita\xE7\xE3o de privacidade",message:"Mensagem"}},R="en";function n(e){var t,a,o;return(o=(a=(t=B[R])==null?void 0:t[e])!=null?a:B.en[e])!=null?o:e}function z(e){if(e)return e[R]||e.en}function Y(){var a;let e=E==null?void 0:E.getAttribute("data-lang");if(e&&e in B)return e;if(O&&O in B)return O;if(l.language&&l.language in B)return l.language;let t=(a=document.documentElement.lang)==null?void 0:a.slice(0,2);return t&&t in B?t:"en"}let O;function J(){return l.mode==="dark"?!0:l.mode==="light"?!1:l.mode==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:!1}function ce(){return b?le:de}function j(e,t){let a=l[e];return a!=null?String(a):t}let C=!1,T="contact",V="",H=(se=localStorage.getItem("heedb_name"))!=null?se:"",y=(oe=localStorage.getItem("heedb_email"))!=null?oe:"",L=(ie=localStorage.getItem("heedb_token"))!=null?ie:"",f=null,N=null;async function pe(e,t){try{let a=await F("/api/threads/token",{api_key:$,email:e,userHash:t});if(a.ok){let o=await a.json();if(o.widgetToken){L=o.widgetToken,localStorage.setItem("heedb_token",o.widgetToken);return}}L="",localStorage.removeItem("heedb_token")}catch(a){L="",localStorage.removeItem("heedb_token")}}window.Heedb={version:"1.0.3",init(e={}){e.lang&&(O=e.lang,R=Y(),ee(),C&&f&&M()),e.name&&(H=e.name,localStorage.setItem("heedb_name",e.name)),e.email&&(y=e.email,localStorage.setItem("heedb_email",e.email),e.userHash?pe(e.email,e.userHash).then(()=>{D(),C&&f&&M()}):(D(),C&&f&&M()))},reset(){H="",y="",L="",localStorage.removeItem("heedb_name"),localStorage.removeItem("heedb_email"),localStorage.removeItem("heedb_token"),T="contact",C=!1,f&&(f.style.display="none"),D()}};function F(e,t){return fetch(`${I}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}function me(e){let t=new URL(`${I}/api/threads`);return t.searchParams.set("api_key",$),t.searchParams.set("email",e),L&&t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ge(e){let t=new URL(`${I}/api/threads/${e}`);return t.searchParams.set("api_key",$),t.searchParams.set("email",y),t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ue(e,t){return F(`/api/threads/${e}/reply`,{api_key:$,email:y,token:L,message:t})}async function he(){var e;try{let t=new URL(`${I}/api/widget-config`);t.searchParams.set("api_key",$),t.searchParams.set("v",String(re));let a=await fetch(t.toString());if(a.ok)return(e=(await a.json()).config)!=null?e:{}}catch(t){}return{}}function X(){var u,v;let e=ce(),t=j(b?"darkPrimaryColor":"primaryColor",e.primary),a=j(b?"darkTextColor":"textColor",e.text),o=j(b?"darkBgColor":"bgColor",e.bg),i=(u=l.borderRadius)!=null?u:16,r=(v=l.buttonRadius)!=null?v:50,g=l.fontFamily||"system-ui, -apple-system, sans-serif",h=l.position==="bottom-left",p=r>=50?"50%":`${r}px`,m=Math.round(i*.5),c=l.triggerMode==="tag",d=l.triggerMode==="embedded"||c;return`
|
|
3
3
|
.heedb-btn {
|
|
4
4
|
position: fixed; bottom: 24px; ${h?"left: 24px":"right: 24px"}; z-index: 999998;
|
|
5
|
-
width: 52px; height: 52px; border-radius: ${
|
|
5
|
+
width: 52px; height: 52px; border-radius: ${p}; border: none;
|
|
6
6
|
background: ${t}; color: #fff; font-size: 22px; cursor: pointer;
|
|
7
7
|
box-shadow: 0 4px 16px rgba(0,0,0,.25);
|
|
8
|
-
display: ${
|
|
9
|
-
font-family: ${
|
|
8
|
+
display: ${d?"none":"flex"}; align-items: center; justify-content: center;
|
|
9
|
+
font-family: ${g}; transition: transform .15s;
|
|
10
10
|
}
|
|
11
11
|
.heedb-btn:hover { transform: scale(1.08); }
|
|
12
12
|
.heedb-btn-label { font-size: 14px; font-weight: 600; margin-left: 6px; }
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
transform-origin: ${h?"left bottom":"right bottom"} !important;
|
|
20
20
|
background: ${t}; color: #fff; border: none; cursor: pointer;
|
|
21
21
|
padding: 8px 18px; font-size: 13px; font-weight: 600;
|
|
22
|
-
font-family: ${
|
|
23
|
-
border-radius: ${Math.min(
|
|
22
|
+
font-family: ${g};
|
|
23
|
+
border-radius: ${Math.min(r,12)}px ${Math.min(r,12)}px 0 0;
|
|
24
24
|
box-shadow: 0 2px 12px rgba(0,0,0,.2);
|
|
25
25
|
display: flex; align-items: center; gap: 6px;
|
|
26
26
|
transition: opacity .15s;
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
width: 280px; max-height: 560px; border-radius: ${i}px;
|
|
34
34
|
background: ${o}; box-shadow: 0 8px 32px rgba(0,0,0,.18);
|
|
35
35
|
display: flex; flex-direction: column; overflow: hidden;
|
|
36
|
-
font-family: ${
|
|
36
|
+
font-family: ${g}; font-size: 14px; color: ${a};
|
|
37
37
|
transition: opacity .15s, transform .15s;
|
|
38
38
|
}
|
|
39
39
|
.heedb-header {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
.heedb-label { display: block; font-size: 12px; font-weight: 600; color: #52525b; margin-bottom: 4px; }
|
|
59
59
|
.heedb-input, .heedb-textarea, .heedb-select {
|
|
60
60
|
width: 100%; box-sizing: border-box; padding: 8px 10px;
|
|
61
|
-
border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${
|
|
61
|
+
border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${m}px;
|
|
62
62
|
font-size: 13px; color: ${a}; margin-bottom: 10px;
|
|
63
63
|
font-family: inherit; background: ${b?"#222":o};
|
|
64
64
|
}
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
}
|
|
69
69
|
.heedb-btn-submit {
|
|
70
70
|
width: 100%; padding: 10px; background: ${t}; color: #fff;
|
|
71
|
-
border: none; border-radius: ${
|
|
71
|
+
border: none; border-radius: ${m}px; font-size: 14px; font-weight: 600;
|
|
72
72
|
cursor: pointer; transition: opacity .15s;
|
|
73
73
|
}
|
|
74
74
|
.heedb-btn-submit:hover { opacity: .85; }
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
.heedb-success h3 { margin: 12px 0 6px; font-size: 15px; color: ${a}; }
|
|
80
80
|
.heedb-success p { margin: 0; color: #71717a; font-size: 13px; line-height: 1.5; }
|
|
81
81
|
.heedb-thread-item {
|
|
82
|
-
padding: 10px 12px; border: 1px solid ${b?"#333":"#e4e4e7"}; border-radius: ${
|
|
82
|
+
padding: 10px 12px; border: 1px solid ${b?"#333":"#e4e4e7"}; border-radius: ${m}px;
|
|
83
83
|
margin-bottom: 8px; cursor: pointer; display: block; color: inherit;
|
|
84
84
|
transition: background .1s; background: none;
|
|
85
85
|
}
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
.heedb-new-msg { margin-top: 12px; padding-top: 12px; border-top: 1px solid ${b?"#333":"#e4e4e7"}; }
|
|
94
94
|
.heedb-new-msg button {
|
|
95
95
|
width: 100%; padding: 8px; background: none; border: 1px solid ${b?"#444":"#d4d4d8"};
|
|
96
|
-
border-radius: ${
|
|
96
|
+
border-radius: ${m}px; font-size: 13px; cursor: pointer; color: ${b?"#999":"#52525b"};
|
|
97
97
|
}
|
|
98
98
|
.heedb-new-msg button:hover { background: ${b?"#252525":"#f4f4f5"}; }
|
|
99
99
|
.heedb-footer {
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
max-height: 320px; overflow-y: auto;
|
|
117
117
|
}
|
|
118
118
|
.heedb-chat-bubble {
|
|
119
|
-
padding: 8px 12px; border-radius: ${Math.max(
|
|
119
|
+
padding: 8px 12px; border-radius: ${Math.max(m,8)}px; font-size: 13px;
|
|
120
120
|
line-height: 1.45; max-width: 85%; word-wrap: break-word;
|
|
121
121
|
white-space: pre-wrap;
|
|
122
122
|
}
|
|
@@ -136,14 +136,14 @@
|
|
|
136
136
|
display: flex; gap: 8px; border-top: 1px solid ${b?"#333":"#e4e4e7"}; padding-top: 12px;
|
|
137
137
|
}
|
|
138
138
|
.heedb-chat-reply-input {
|
|
139
|
-
flex: 1; padding: 8px 10px; border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${
|
|
139
|
+
flex: 1; padding: 8px 10px; border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${m}px;
|
|
140
140
|
font-size: 13px; font-family: inherit; color: ${a}; background: ${b?"#222":o};
|
|
141
141
|
resize: none; min-height: 36px; max-height: 80px; box-sizing: border-box;
|
|
142
142
|
}
|
|
143
143
|
.heedb-chat-reply-input:focus { outline: none; border-color: ${t}; }
|
|
144
144
|
.heedb-chat-send {
|
|
145
145
|
padding: 8px 14px; background: ${t}; color: #fff; border: none;
|
|
146
|
-
border-radius: ${
|
|
146
|
+
border-radius: ${m}px; font-size: 13px; font-weight: 600; cursor: pointer;
|
|
147
147
|
transition: opacity .15s; white-space: nowrap; align-self: flex-end;
|
|
148
148
|
}
|
|
149
149
|
.heedb-chat-send:hover { opacity: .85; }
|
|
@@ -163,10 +163,10 @@
|
|
|
163
163
|
|
|
164
164
|
/* Body fade transition */
|
|
165
165
|
.heedb-body { transition: opacity .15s ease; }
|
|
166
|
-
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,
|
|
166
|
+
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,r]of Object.entries(t))i==="class"?o.className=r:i==="style"?o.setAttribute("style",r):i.startsWith("on")&&typeof r=="function"?o.addEventListener(i.slice(2),r):o.setAttribute(i,String(r));for(let i of a)o.appendChild(typeof i=="string"?document.createTextNode(i):i);return o}function Q(e){let a=new DOMParser().parseFromString(e,"image/svg+xml").querySelector("svg");if(!a)return null;a.querySelectorAll("script,foreignObject,iframe,object,embed").forEach(r=>r.remove());for(let r of Array.from(a.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&a.removeAttribute(r.name);let o=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT),i;for(;i=o.nextNode();)for(let r of Array.from(i.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&i.removeAttribute(r.name);return a}function W(e,t,a=""){let o=document.createElement("input");return o.type=e,o.id=t,o.placeholder=a,o.className="heedb-input",o}function be(e,t=""){let a=document.createElement("textarea");return a.id=e,a.placeholder=t,a.className="heedb-textarea",a}function fe(e,t){let a=document.createElement("select");a.id=e,a.className="heedb-select";for(let o of t){let i=document.createElement("option");i.value=o.value,i.textContent=o.label,a.appendChild(i)}return a}function M(){if(!f)return;let e=f.querySelector(".heedb-body");e.innerHTML="",T==="contact"?xe(e):T==="privacy"?ye(e):T==="threads"?ve(e):T==="thread-detail"&&we(e),S&&(S.style.display=T==="thread-detail"?"none":"flex")}function xe(e,t=""){let a=!!(H&&y),o=s("label",{class:"heedb-label"},[n("nameLabel")]),i=W("text","heedb-name",n("namePlaceholder"));H&&(i.value=H);let r=s("label",{class:"heedb-label"},[n("emailLabel")]),g=W("email","heedb-email",n("emailPlaceholder"));(t||y)&&(g.value=t||y);let h=z(l.messageLabel),p=h?s("label",{class:"heedb-label"},[h]):null,m=be("heedb-message",z(l.messagePlaceholder)||n("messagePlaceholder")),c=s("div",{class:"heedb-error",style:"display:none"}),d=s("button",{class:"heedb-btn-submit"},[n("sendMessage")]);d.onclick=async()=>{var w;let u=i.value.trim(),v=g.value.trim(),x=m.value.trim();if(c.style.display="none",!u||!v||!x){c.textContent=n("fillAllFields"),c.style.display="block";return}d.disabled=!0,d.textContent=n("sending");try{let k=await F("/api/contact",{api_key:$,name:u,email:v,message:x,lang:R});if(k.ok)y=v,localStorage.setItem("heedb_email",v),D(),Z(e,n("messageSentTitle"),n("messageSentBody"));else if(k.status===429){let P=parseInt((w=k.headers.get("Retry-After"))!=null?w:"60",10);c.textContent=n("rateLimited"),c.style.display="block",d.textContent=n("sendMessage"),setTimeout(()=>{d.disabled=!1,c.style.display="none"},P*1e3)}else{let P=await k.json();c.textContent=P.error||n("somethingWrong"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}}catch(k){c.textContent=n("networkError"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}},a?(p&&e.append(p),e.append(m,c,d)):(e.append(o,i,r,g),p&&e.append(p),e.append(m,c,d))}function ye(e){let t=!!(H&&y),a=s("label",{class:"heedb-label"},[n("nameLabel")]),o=W("text","heedb-priv-name",n("namePlaceholder"));H&&(o.value=H);let i=s("label",{class:"heedb-label"},[n("emailLabel")]),r=W("email","heedb-priv-email",n("emailPlaceholder"));y&&(r.value=y);let g=s("label",{class:"heedb-label"},[n("requestType")]),h=fe("heedb-priv-type",[{value:"deletion",label:n("deleteData")},{value:"access",label:n("accessData")},{value:"portability",label:n("exportData")}]),p=s("div",{class:"heedb-error",style:"display:none"}),m=s("button",{class:"heedb-btn-submit"},[n("submitRequest")]);m.onclick=async()=>{var v;let c=o.value.trim(),d=r.value.trim(),u=h.value;if(p.style.display="none",!c||!d){p.textContent=n("fillAllFields"),p.style.display="block";return}m.disabled=!0,m.textContent=n("submitting");try{let x=await F("/api/privacy-request",{api_key:$,name:c,email:d,request_type:u,lang:R});if(x.ok)y=d,localStorage.setItem("heedb_email",d),D(),Z(e,n("requestSubmittedTitle"),n("requestSubmittedBody"));else if(x.status===429){let w=parseInt((v=x.headers.get("Retry-After"))!=null?v:"60",10);p.textContent=n("rateLimited"),p.style.display="block",m.textContent=n("submitRequest"),setTimeout(()=>{m.disabled=!1,p.style.display="none"},w*1e3)}else{let w=await x.json();p.textContent=w.error||n("somethingWrong"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}}catch(x){p.textContent=n("networkError"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}},t?e.append(g,h,p,m):e.append(a,o,i,r,g,h,p,m)}async function ve(e){var t;if(!L){e.innerHTML="";let a=s("p",{style:"color:#71717a;text-align:center;margin:8px 0;font-size:13px;line-height:1.5"},[n("noThreadsAuth")]),o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendAMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.append(a,o);return}e.innerHTML="";for(let a=0;a<3;a++){let o=s("div",{class:"heedb-thread-item heedb-skeleton"});o.append(s("div",{class:"heedb-skel-line",style:"width:40%;height:12px"}),s("div",{class:"heedb-skel-line",style:"width:80%;height:13px;margin-top:6px"}),s("div",{class:"heedb-skel-line",style:"width:30%;height:11px;margin-top:4px"})),e.appendChild(o)}try{let{threads:a}=await me(y);if(e.innerHTML="",e.style.opacity="0",requestAnimationFrame(()=>{e.style.opacity="1"}),a.length===0){let r=s("p",{style:"color:#71717a;text-align:center;margin:8px 0"},[z(l.emptyStateText)||n("noOpenMessages")]);e.appendChild(r)}else for(let r of a){let g=s("span",{class:`heedb-badge heedb-badge-${r.status}`},[r.status]),h=s("div",{class:"heedb-thread-label"},[r.type==="privacy"?n("privacyRequest"):n("message")," \u2022 "]);h.appendChild(g);let p=s("div",{class:"heedb-thread-text"},[(t=r.preview)!=null?t:""]),m=new Date(r.createdAt).toLocaleDateString(),c=s("div",{class:"heedb-thread-meta"},[m]),d=s("div",{class:"heedb-thread-item"});d.append(h,p,c),d.onclick=()=>Te(r.id),e.appendChild(d)}let o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendNewMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.appendChild(o)}catch(a){e.innerHTML=`<p style="color:#ef4444;text-align:center">${n("failedToLoad")}</p>`}}function Te(e){V=e,T="thread-detail",M()}async function we(e){e.innerHTML="",e.style.padding="12px";let t=s("div",{class:"heedb-skel-line",style:"width:50%;height:13px;margin-bottom:12px"});e.appendChild(t);let a=s("div",{style:"display:flex;flex-direction:column;gap:8px"}),o=["65%","50%","70%","45%"],i=["flex-start","flex-end","flex-start","flex-end"];for(let g=0;g<4;g++){let h=s("div",{style:`display:flex;flex-direction:column;align-items:${i[g]}`});h.appendChild(s("div",{class:"heedb-skel-line",style:`width:${o[g]};height:32px;border-radius:8px`})),a.appendChild(h)}e.appendChild(a);let r=s("button",{class:"heedb-chat-back"},[n("backToMessages")]);r.onclick=()=>{T="threads",A("threads"),M()};try{let h=(await ge(V)).messages||[];e.innerHTML="",e.style.padding="12px",e.appendChild(r);let p=s("div",{class:"heedb-chat-messages"});for(let x of h){let w=x.direction==="inbound",k=s("div",{style:`display:flex;flex-direction:column;${w?"align-items:flex-start":"align-items:flex-end"}`}),P=s("div",{class:`heedb-chat-bubble ${w?"heedb-chat-inbound":"heedb-chat-outbound"}`},[ke(x.body)]),G=s("div",{class:`heedb-chat-time ${w?"":"heedb-chat-time-right"}`},[Ee(x.createdAt)]);k.append(P,G),p.appendChild(k)}e.appendChild(p),requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight});let m=s("div",{class:"heedb-chat-reply"}),c=document.createElement("textarea");c.className="heedb-chat-reply-input",c.placeholder=n("typeReply"),c.rows=1,c.addEventListener("input",()=>{c.style.height="auto",c.style.height=Math.min(c.scrollHeight,80)+"px"});let d=s("button",{class:"heedb-chat-send"},[n("send")]),u=s("div",{class:"heedb-error",style:"display:none;margin-top:4px"});async function v(){let x=c.value.trim();if(x){d.disabled=!0,d.textContent="\u2026",u.style.display="none";try{let w=await ue(V,x);if(w.ok){let k=s("div",{style:"display:flex;flex-direction:column;align-items:flex-start"}),P=s("div",{class:"heedb-chat-bubble heedb-chat-inbound"},[x]),G=s("div",{class:"heedb-chat-time"},[n("justNow")]);k.append(P,G),p.appendChild(k),p.scrollTop=p.scrollHeight,c.value="",c.style.height="auto"}else{let k=await w.json();u.textContent=k.error||n("failedToSend"),u.style.display="block"}}catch(w){u.textContent=n("networkError"),u.style.display="block"}d.disabled=!1,d.textContent=n("send")}}d.onclick=v,c.addEventListener("keydown",x=>{x.key==="Enter"&&!x.shiftKey&&(x.preventDefault(),v())}),m.append(c,d),e.append(m,u),requestAnimationFrame(()=>c.focus())}catch(g){e.innerHTML="",e.appendChild(r),e.appendChild(s("p",{style:"color:#ef4444;text-align:center"},[n("failedToLoadConvo")]))}}function ke(e){let t=e.split(`
|
|
167
167
|
`),a=[];for(let o of t){let i=o.trim();if(/^(On|Em|El|Le|Am|Il giorno) .+(<[^>]+@[^>]+>).*(wrote|escreveu|escribi|crit|schrieb|scritto)\s?:$/i.test(i)||/<[^>]+@[^>]+>/.test(i)&&i.endsWith(":")||/^-{3,}$/.test(i))break;/^>{1,}\s/.test(i)||a.push(o)}return a.join(`
|
|
168
|
-
`).trim()}function
|
|
168
|
+
`).trim()}function Ee(e){let t=new Date(e),o=new Date().getTime()-t.getTime(),i=Math.floor(o/6e4);if(i<1)return n("justNow");if(i<60)return n("minutesAgo").replace("{mins}",String(i));let r=Math.floor(i/60);return r<24?n("hoursAgo").replace("{hours}",String(r)):t.toLocaleDateString()}function Z(e,t,a){e.innerHTML="";let o=s("div",{class:"heedb-success"});o.innerHTML=`
|
|
169
169
|
<div class="heedb-success-icon">\u2705</div>
|
|
170
170
|
<h3>${t}</h3>
|
|
171
171
|
<p>${a}</p>
|
|
172
|
-
`,e.appendChild(o)}let
|
|
172
|
+
`,e.appendChild(o)}let S=null,_=null;function A(e){T=e,S&&S.querySelectorAll(".heedb-tab").forEach(t=>{t.classList.toggle("active",t.dataset.mode===e)})}function D(){_&&(_.style.display=y&&L?"":"none")}let q=null;function ee(){b=J(),q&&(q.textContent=X())}async function te(){if(l=await he(),R=Y(),b=J(),q=document.createElement("style"),q.textContent=X(),document.head.appendChild(q),l.customCSS){let d=document.createElement("style");d.textContent=l.customCSS,document.head.appendChild(d)}l.mode==="system"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{ee(),C&&f&&M()});let e=l.triggerText||"";if(N=s("button",{class:"heedb-btn",title:n("contactUs"),"aria-label":"Open contact widget"}),l.triggerIcon){let d=s("span",{class:"heedb-btn-icon"}),u=Q(l.triggerIcon);u&&d.appendChild(u),N.appendChild(d)}else N.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));if(e&&N.appendChild(s("span",{class:"heedb-btn-label"},[e])),N.onclick=U,document.body.appendChild(N),l.triggerMode==="embedded"&&l.triggerSelector){let d=document.querySelector(l.triggerSelector);d&&d.addEventListener("click",u=>{u.preventDefault(),U()})}if(l.triggerMode==="tag"){let d=s("button",{class:"heedb-tag","aria-label":"Open contact widget"}),u=s("span",{class:"heedb-tag-icon"});if(l.triggerIcon){let v=Q(l.triggerIcon);v&&u.appendChild(v)}else u.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));d.appendChild(u),d.appendChild(document.createTextNode(l.triggerText||n("feedback"))),d.onclick=U,document.body.appendChild(d)}f=s("div",{class:"heedb-panel",style:"display:none"});let t=s("div",{class:"heedb-header"}),a=s("h2",{},[l.headerTitle||n("contactUs")]),o=s("button",{class:"heedb-close","aria-label":"Close"},["\u2715"]);o.onclick=U,t.append(a,o),S=s("div",{class:"heedb-tabs"});let i=s("button",{class:"heedb-tab active","data-mode":"contact"},[z(l.contactTabLabel)||n("contactTab")]),g=l.showPrivacyTab!==!1?s("button",{class:"heedb-tab","data-mode":"privacy"},[n("privacyTab")]):null;_=s("button",{class:"heedb-tab","data-mode":"threads"},[n("messagesTab")]),_.style.display=y&&L?"":"none",i.onclick=()=>{A("contact"),M()},g&&(g.onclick=()=>{A("privacy"),M()}),_.onclick=()=>{A("threads"),M()},S.append(i),g&&S.append(g),S.append(_);let h=s("div",{class:"heedb-body"}),p=s("div",{class:"heedb-footer"}),m=new URLSearchParams({utm_source:"widget",utm_medium:"heedb-widget",utm_campaign:window.location.hostname}),c=s("a",{href:`https://heedb.com?${m.toString()}`,target:"_blank",rel:"noopener noreferrer"},[n("poweredBy")]);p.appendChild(c),f.append(t,S,h,p),document.body.appendChild(f)}function U(){C=!C,f&&(C?(f.style.display="flex",f.style.opacity="0",f.style.transform="translateY(8px)",requestAnimationFrame(()=>{f.style.opacity="1",f.style.transform="translateY(0)"}),y&&L&&T!=="privacy"&&T!=="thread-detail"&&(T="threads",A("threads")),M()):(f.style.opacity="0",f.style.transform="translateY(8px)",setTimeout(()=>{!C&&f&&(f.style.display="none")},150)))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",te):te()})();})();
|
package/package.json
CHANGED
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@heedb/web-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Drop-in feedback widget with email conversations for any website",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
8
|
-
"url": "https://github.com/TheAleSch/heedb.git",
|
|
8
|
+
"url": "git+https://github.com/TheAleSch/heedb.git",
|
|
9
9
|
"directory": "packages/web-sdk"
|
|
10
10
|
},
|
|
11
11
|
"homepage": "https://heedb.com",
|
|
12
|
-
"keywords": [
|
|
12
|
+
"keywords": [
|
|
13
|
+
"feedback",
|
|
14
|
+
"widget",
|
|
15
|
+
"support",
|
|
16
|
+
"email",
|
|
17
|
+
"customer-support",
|
|
18
|
+
"sdk"
|
|
19
|
+
],
|
|
13
20
|
"type": "module",
|
|
14
21
|
"main": "./dist/index.js",
|
|
15
22
|
"module": "./dist/index.js",
|
package/widget.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
/* Heedb Widget v1.0.
|
|
2
|
-
"use strict";(()=>{(function(){var
|
|
1
|
+
/* Heedb Widget v1.0.3 — https://heedb.com */
|
|
2
|
+
"use strict";(()=>{(function(){var ae,ne,se,oe,ie;let E=document.currentScript||document.querySelector("script[data-api-key]"),$=(ae=E==null?void 0:E.getAttribute("data-api-key"))!=null?ae:"",K=(ne=E==null?void 0:E.src)!=null?ne:"",I=(E==null?void 0:E.getAttribute("data-host"))||(K?new URL(K).origin:"");if(!$){console.warn("[Heedb] Missing data-api-key on <script> tag.");return}let re=1,l={},b=!1,de={primary:"#18181b",text:"#18181b",bg:"#ffffff"},le={primary:"#e4e4e7",text:"#e4e4e7",bg:"#1a1a1a"},B={en:{contactTab:"Message",privacyTab:"Privacy",messagesTab:"Messages",nameLabel:"Name",emailLabel:"Email",messageLabel:"Message",namePlaceholder:"Jane Smith",emailPlaceholder:"jane@example.com",messagePlaceholder:"How can we help?",sendMessage:"Send message",sending:"Sending\u2026",fillAllFields:"Please fill in all fields.",messageSentTitle:"Message sent!",messageSentBody:"We'll get back to you soon. Check your inbox for a confirmation email.",networkError:"Network error. Please try again.",somethingWrong:"Something went wrong.",rateLimited:"Too many messages. Please wait a moment.",requestType:"Request type",deleteData:"Delete my data",accessData:"Access my data",exportData:"Export my data",correctData:"Correct my data",restrictProcessing:"Restrict processing",objectProcessing:"Object to processing",other:"Other",submitRequest:"Submit request",submitting:"Submitting\u2026",requestSubmittedTitle:"Request submitted!",requestSubmittedBody:"Your privacy request has been received. We'll respond within 30 days.",contactUs:"Contact us",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Just now",minutesAgo:"{mins}m ago",hoursAgo:"{hours}h ago",send:"Send",backToMessages:"\u2190 Back to messages",noThreadsAuth:"Send a message below to view your message history.",sendAMessage:"+ Send a message",sendNewMessage:"+ Send a new message",noOpenMessages:"No open messages yet.",loading:"Loading\u2026",failedToLoad:"Failed to load messages.",failedToLoadConvo:"Failed to load conversation.",failedToSend:"Failed to send.",typeReply:"Type a reply\u2026",privacyRequest:"Privacy request",message:"Message"},es:{contactTab:"Mensaje",privacyTab:"Privacidad",messagesTab:"Mensajes",nameLabel:"Nombre",emailLabel:"Correo",messageLabel:"Mensaje",namePlaceholder:"Mar\xEDa Garc\xEDa",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"\xBFC\xF3mo podemos ayudarte?",sendMessage:"Enviar mensaje",sending:"Enviando\u2026",fillAllFields:"Por favor, completa todos los campos.",messageSentTitle:"\xA1Mensaje enviado!",messageSentBody:"Te responderemos pronto. Revisa tu bandeja de entrada para un correo de confirmaci\xF3n.",networkError:"Error de red. Int\xE9ntalo de nuevo.",somethingWrong:"Algo sali\xF3 mal.",rateLimited:"Demasiados mensajes. Espera un momento.",requestType:"Tipo de solicitud",deleteData:"Eliminar mis datos",accessData:"Acceder a mis datos",exportData:"Exportar mis datos",correctData:"Corregir mis datos",restrictProcessing:"Restringir procesamiento",objectProcessing:"Oponerse al procesamiento",other:"Otro",submitRequest:"Enviar solicitud",submitting:"Enviando\u2026",requestSubmittedTitle:"\xA1Solicitud enviada!",requestSubmittedBody:"Tu solicitud de privacidad ha sido recibida. Responderemos en un plazo de 30 d\xEDas.",contactUs:"Cont\xE1ctanos",feedback:"Comentarios",poweredBy:"Impulsado por Heedb",justNow:"Ahora",minutesAgo:"hace {mins}m",hoursAgo:"hace {hours}h",send:"Enviar",backToMessages:"\u2190 Volver a mensajes",noThreadsAuth:"Env\xEDa un mensaje para ver tu historial.",sendAMessage:"+ Enviar un mensaje",sendNewMessage:"+ Enviar un nuevo mensaje",noOpenMessages:"No hay mensajes a\xFAn.",loading:"Cargando\u2026",failedToLoad:"No se pudieron cargar los mensajes.",failedToLoadConvo:"No se pudo cargar la conversaci\xF3n.",failedToSend:"No se pudo enviar.",typeReply:"Escribe una respuesta\u2026",privacyRequest:"Solicitud de privacidad",message:"Mensaje"},pt:{contactTab:"Mensagem",privacyTab:"Privacidade",messagesTab:"Mensagens",nameLabel:"Nome",emailLabel:"Email",messageLabel:"Mensagem",namePlaceholder:"Maria Silva",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"Como podemos ajudar?",sendMessage:"Enviar mensagem",sending:"Enviando\u2026",fillAllFields:"Por favor, preencha todos os campos.",messageSentTitle:"Mensagem enviada!",messageSentBody:"Responderemos em breve. Verifique sua caixa de entrada para um email de confirma\xE7\xE3o.",networkError:"Erro de rede. Tente novamente.",somethingWrong:"Algo deu errado.",rateLimited:"Muitas mensagens. Aguarde um momento.",requestType:"Tipo de solicita\xE7\xE3o",deleteData:"Excluir meus dados",accessData:"Acessar meus dados",exportData:"Exportar meus dados",correctData:"Corrigir meus dados",restrictProcessing:"Restringir processamento",objectProcessing:"Opor-se ao processamento",other:"Outro",submitRequest:"Enviar solicita\xE7\xE3o",submitting:"Enviando\u2026",requestSubmittedTitle:"Solicita\xE7\xE3o enviada!",requestSubmittedBody:"Sua solicita\xE7\xE3o de privacidade foi recebida. Responderemos em at\xE9 30 dias.",contactUs:"Fale conosco",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Agora",minutesAgo:"h\xE1 {mins}m",hoursAgo:"h\xE1 {hours}h",send:"Enviar",backToMessages:"\u2190 Voltar \xE0s mensagens",noThreadsAuth:"Envie uma mensagem para ver seu hist\xF3rico.",sendAMessage:"+ Enviar uma mensagem",sendNewMessage:"+ Enviar uma nova mensagem",noOpenMessages:"Nenhuma mensagem ainda.",loading:"Carregando\u2026",failedToLoad:"N\xE3o foi poss\xEDvel carregar as mensagens.",failedToLoadConvo:"N\xE3o foi poss\xEDvel carregar a conversa.",failedToSend:"N\xE3o foi poss\xEDvel enviar.",typeReply:"Digite uma resposta\u2026",privacyRequest:"Solicita\xE7\xE3o de privacidade",message:"Mensagem"}},R="en";function n(e){var t,a,o;return(o=(a=(t=B[R])==null?void 0:t[e])!=null?a:B.en[e])!=null?o:e}function z(e){if(e)return e[R]||e.en}function Y(){var a;let e=E==null?void 0:E.getAttribute("data-lang");if(e&&e in B)return e;if(O&&O in B)return O;if(l.language&&l.language in B)return l.language;let t=(a=document.documentElement.lang)==null?void 0:a.slice(0,2);return t&&t in B?t:"en"}let O;function J(){return l.mode==="dark"?!0:l.mode==="light"?!1:l.mode==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:!1}function ce(){return b?le:de}function j(e,t){let a=l[e];return a!=null?String(a):t}let C=!1,T="contact",V="",H=(se=localStorage.getItem("heedb_name"))!=null?se:"",y=(oe=localStorage.getItem("heedb_email"))!=null?oe:"",L=(ie=localStorage.getItem("heedb_token"))!=null?ie:"",f=null,N=null;async function pe(e,t){try{let a=await F("/api/threads/token",{api_key:$,email:e,userHash:t});if(a.ok){let o=await a.json();if(o.widgetToken){L=o.widgetToken,localStorage.setItem("heedb_token",o.widgetToken);return}}L="",localStorage.removeItem("heedb_token")}catch(a){L="",localStorage.removeItem("heedb_token")}}window.Heedb={version:"1.0.3",init(e={}){e.lang&&(O=e.lang,R=Y(),ee(),C&&f&&M()),e.name&&(H=e.name,localStorage.setItem("heedb_name",e.name)),e.email&&(y=e.email,localStorage.setItem("heedb_email",e.email),e.userHash?pe(e.email,e.userHash).then(()=>{D(),C&&f&&M()}):(D(),C&&f&&M()))},reset(){H="",y="",L="",localStorage.removeItem("heedb_name"),localStorage.removeItem("heedb_email"),localStorage.removeItem("heedb_token"),T="contact",C=!1,f&&(f.style.display="none"),D()}};function F(e,t){return fetch(`${I}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}function me(e){let t=new URL(`${I}/api/threads`);return t.searchParams.set("api_key",$),t.searchParams.set("email",e),L&&t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ge(e){let t=new URL(`${I}/api/threads/${e}`);return t.searchParams.set("api_key",$),t.searchParams.set("email",y),t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ue(e,t){return F(`/api/threads/${e}/reply`,{api_key:$,email:y,token:L,message:t})}async function he(){var e;try{let t=new URL(`${I}/api/widget-config`);t.searchParams.set("api_key",$),t.searchParams.set("v",String(re));let a=await fetch(t.toString());if(a.ok)return(e=(await a.json()).config)!=null?e:{}}catch(t){}return{}}function X(){var u,v;let e=ce(),t=j(b?"darkPrimaryColor":"primaryColor",e.primary),a=j(b?"darkTextColor":"textColor",e.text),o=j(b?"darkBgColor":"bgColor",e.bg),i=(u=l.borderRadius)!=null?u:16,r=(v=l.buttonRadius)!=null?v:50,g=l.fontFamily||"system-ui, -apple-system, sans-serif",h=l.position==="bottom-left",p=r>=50?"50%":`${r}px`,m=Math.round(i*.5),c=l.triggerMode==="tag",d=l.triggerMode==="embedded"||c;return`
|
|
3
3
|
.heedb-btn {
|
|
4
4
|
position: fixed; bottom: 24px; ${h?"left: 24px":"right: 24px"}; z-index: 999998;
|
|
5
|
-
width: 52px; height: 52px; border-radius: ${
|
|
5
|
+
width: 52px; height: 52px; border-radius: ${p}; border: none;
|
|
6
6
|
background: ${t}; color: #fff; font-size: 22px; cursor: pointer;
|
|
7
7
|
box-shadow: 0 4px 16px rgba(0,0,0,.25);
|
|
8
|
-
display: ${
|
|
9
|
-
font-family: ${
|
|
8
|
+
display: ${d?"none":"flex"}; align-items: center; justify-content: center;
|
|
9
|
+
font-family: ${g}; transition: transform .15s;
|
|
10
10
|
}
|
|
11
11
|
.heedb-btn:hover { transform: scale(1.08); }
|
|
12
12
|
.heedb-btn-label { font-size: 14px; font-weight: 600; margin-left: 6px; }
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
transform-origin: ${h?"left bottom":"right bottom"} !important;
|
|
20
20
|
background: ${t}; color: #fff; border: none; cursor: pointer;
|
|
21
21
|
padding: 8px 18px; font-size: 13px; font-weight: 600;
|
|
22
|
-
font-family: ${
|
|
23
|
-
border-radius: ${Math.min(
|
|
22
|
+
font-family: ${g};
|
|
23
|
+
border-radius: ${Math.min(r,12)}px ${Math.min(r,12)}px 0 0;
|
|
24
24
|
box-shadow: 0 2px 12px rgba(0,0,0,.2);
|
|
25
25
|
display: flex; align-items: center; gap: 6px;
|
|
26
26
|
transition: opacity .15s;
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
width: 280px; max-height: 560px; border-radius: ${i}px;
|
|
34
34
|
background: ${o}; box-shadow: 0 8px 32px rgba(0,0,0,.18);
|
|
35
35
|
display: flex; flex-direction: column; overflow: hidden;
|
|
36
|
-
font-family: ${
|
|
36
|
+
font-family: ${g}; font-size: 14px; color: ${a};
|
|
37
37
|
transition: opacity .15s, transform .15s;
|
|
38
38
|
}
|
|
39
39
|
.heedb-header {
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
.heedb-label { display: block; font-size: 12px; font-weight: 600; color: #52525b; margin-bottom: 4px; }
|
|
59
59
|
.heedb-input, .heedb-textarea, .heedb-select {
|
|
60
60
|
width: 100%; box-sizing: border-box; padding: 8px 10px;
|
|
61
|
-
border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${
|
|
61
|
+
border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${m}px;
|
|
62
62
|
font-size: 13px; color: ${a}; margin-bottom: 10px;
|
|
63
63
|
font-family: inherit; background: ${b?"#222":o};
|
|
64
64
|
}
|
|
@@ -68,7 +68,7 @@
|
|
|
68
68
|
}
|
|
69
69
|
.heedb-btn-submit {
|
|
70
70
|
width: 100%; padding: 10px; background: ${t}; color: #fff;
|
|
71
|
-
border: none; border-radius: ${
|
|
71
|
+
border: none; border-radius: ${m}px; font-size: 14px; font-weight: 600;
|
|
72
72
|
cursor: pointer; transition: opacity .15s;
|
|
73
73
|
}
|
|
74
74
|
.heedb-btn-submit:hover { opacity: .85; }
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
.heedb-success h3 { margin: 12px 0 6px; font-size: 15px; color: ${a}; }
|
|
80
80
|
.heedb-success p { margin: 0; color: #71717a; font-size: 13px; line-height: 1.5; }
|
|
81
81
|
.heedb-thread-item {
|
|
82
|
-
padding: 10px 12px; border: 1px solid ${b?"#333":"#e4e4e7"}; border-radius: ${
|
|
82
|
+
padding: 10px 12px; border: 1px solid ${b?"#333":"#e4e4e7"}; border-radius: ${m}px;
|
|
83
83
|
margin-bottom: 8px; cursor: pointer; display: block; color: inherit;
|
|
84
84
|
transition: background .1s; background: none;
|
|
85
85
|
}
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
.heedb-new-msg { margin-top: 12px; padding-top: 12px; border-top: 1px solid ${b?"#333":"#e4e4e7"}; }
|
|
94
94
|
.heedb-new-msg button {
|
|
95
95
|
width: 100%; padding: 8px; background: none; border: 1px solid ${b?"#444":"#d4d4d8"};
|
|
96
|
-
border-radius: ${
|
|
96
|
+
border-radius: ${m}px; font-size: 13px; cursor: pointer; color: ${b?"#999":"#52525b"};
|
|
97
97
|
}
|
|
98
98
|
.heedb-new-msg button:hover { background: ${b?"#252525":"#f4f4f5"}; }
|
|
99
99
|
.heedb-footer {
|
|
@@ -116,7 +116,7 @@
|
|
|
116
116
|
max-height: 320px; overflow-y: auto;
|
|
117
117
|
}
|
|
118
118
|
.heedb-chat-bubble {
|
|
119
|
-
padding: 8px 12px; border-radius: ${Math.max(
|
|
119
|
+
padding: 8px 12px; border-radius: ${Math.max(m,8)}px; font-size: 13px;
|
|
120
120
|
line-height: 1.45; max-width: 85%; word-wrap: break-word;
|
|
121
121
|
white-space: pre-wrap;
|
|
122
122
|
}
|
|
@@ -136,14 +136,14 @@
|
|
|
136
136
|
display: flex; gap: 8px; border-top: 1px solid ${b?"#333":"#e4e4e7"}; padding-top: 12px;
|
|
137
137
|
}
|
|
138
138
|
.heedb-chat-reply-input {
|
|
139
|
-
flex: 1; padding: 8px 10px; border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${
|
|
139
|
+
flex: 1; padding: 8px 10px; border: 1px solid ${b?"#444":"#d4d4d8"}; border-radius: ${m}px;
|
|
140
140
|
font-size: 13px; font-family: inherit; color: ${a}; background: ${b?"#222":o};
|
|
141
141
|
resize: none; min-height: 36px; max-height: 80px; box-sizing: border-box;
|
|
142
142
|
}
|
|
143
143
|
.heedb-chat-reply-input:focus { outline: none; border-color: ${t}; }
|
|
144
144
|
.heedb-chat-send {
|
|
145
145
|
padding: 8px 14px; background: ${t}; color: #fff; border: none;
|
|
146
|
-
border-radius: ${
|
|
146
|
+
border-radius: ${m}px; font-size: 13px; font-weight: 600; cursor: pointer;
|
|
147
147
|
transition: opacity .15s; white-space: nowrap; align-self: flex-end;
|
|
148
148
|
}
|
|
149
149
|
.heedb-chat-send:hover { opacity: .85; }
|
|
@@ -163,10 +163,10 @@
|
|
|
163
163
|
|
|
164
164
|
/* Body fade transition */
|
|
165
165
|
.heedb-body { transition: opacity .15s ease; }
|
|
166
|
-
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,
|
|
166
|
+
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,r]of Object.entries(t))i==="class"?o.className=r:i==="style"?o.setAttribute("style",r):i.startsWith("on")&&typeof r=="function"?o.addEventListener(i.slice(2),r):o.setAttribute(i,String(r));for(let i of a)o.appendChild(typeof i=="string"?document.createTextNode(i):i);return o}function Q(e){let a=new DOMParser().parseFromString(e,"image/svg+xml").querySelector("svg");if(!a)return null;a.querySelectorAll("script,foreignObject,iframe,object,embed").forEach(r=>r.remove());for(let r of Array.from(a.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&a.removeAttribute(r.name);let o=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT),i;for(;i=o.nextNode();)for(let r of Array.from(i.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&i.removeAttribute(r.name);return a}function W(e,t,a=""){let o=document.createElement("input");return o.type=e,o.id=t,o.placeholder=a,o.className="heedb-input",o}function be(e,t=""){let a=document.createElement("textarea");return a.id=e,a.placeholder=t,a.className="heedb-textarea",a}function fe(e,t){let a=document.createElement("select");a.id=e,a.className="heedb-select";for(let o of t){let i=document.createElement("option");i.value=o.value,i.textContent=o.label,a.appendChild(i)}return a}function M(){if(!f)return;let e=f.querySelector(".heedb-body");e.innerHTML="",T==="contact"?xe(e):T==="privacy"?ye(e):T==="threads"?ve(e):T==="thread-detail"&&we(e),S&&(S.style.display=T==="thread-detail"?"none":"flex")}function xe(e,t=""){let a=!!(H&&y),o=s("label",{class:"heedb-label"},[n("nameLabel")]),i=W("text","heedb-name",n("namePlaceholder"));H&&(i.value=H);let r=s("label",{class:"heedb-label"},[n("emailLabel")]),g=W("email","heedb-email",n("emailPlaceholder"));(t||y)&&(g.value=t||y);let h=z(l.messageLabel),p=h?s("label",{class:"heedb-label"},[h]):null,m=be("heedb-message",z(l.messagePlaceholder)||n("messagePlaceholder")),c=s("div",{class:"heedb-error",style:"display:none"}),d=s("button",{class:"heedb-btn-submit"},[n("sendMessage")]);d.onclick=async()=>{var w;let u=i.value.trim(),v=g.value.trim(),x=m.value.trim();if(c.style.display="none",!u||!v||!x){c.textContent=n("fillAllFields"),c.style.display="block";return}d.disabled=!0,d.textContent=n("sending");try{let k=await F("/api/contact",{api_key:$,name:u,email:v,message:x,lang:R});if(k.ok)y=v,localStorage.setItem("heedb_email",v),D(),Z(e,n("messageSentTitle"),n("messageSentBody"));else if(k.status===429){let P=parseInt((w=k.headers.get("Retry-After"))!=null?w:"60",10);c.textContent=n("rateLimited"),c.style.display="block",d.textContent=n("sendMessage"),setTimeout(()=>{d.disabled=!1,c.style.display="none"},P*1e3)}else{let P=await k.json();c.textContent=P.error||n("somethingWrong"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}}catch(k){c.textContent=n("networkError"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}},a?(p&&e.append(p),e.append(m,c,d)):(e.append(o,i,r,g),p&&e.append(p),e.append(m,c,d))}function ye(e){let t=!!(H&&y),a=s("label",{class:"heedb-label"},[n("nameLabel")]),o=W("text","heedb-priv-name",n("namePlaceholder"));H&&(o.value=H);let i=s("label",{class:"heedb-label"},[n("emailLabel")]),r=W("email","heedb-priv-email",n("emailPlaceholder"));y&&(r.value=y);let g=s("label",{class:"heedb-label"},[n("requestType")]),h=fe("heedb-priv-type",[{value:"deletion",label:n("deleteData")},{value:"access",label:n("accessData")},{value:"portability",label:n("exportData")}]),p=s("div",{class:"heedb-error",style:"display:none"}),m=s("button",{class:"heedb-btn-submit"},[n("submitRequest")]);m.onclick=async()=>{var v;let c=o.value.trim(),d=r.value.trim(),u=h.value;if(p.style.display="none",!c||!d){p.textContent=n("fillAllFields"),p.style.display="block";return}m.disabled=!0,m.textContent=n("submitting");try{let x=await F("/api/privacy-request",{api_key:$,name:c,email:d,request_type:u,lang:R});if(x.ok)y=d,localStorage.setItem("heedb_email",d),D(),Z(e,n("requestSubmittedTitle"),n("requestSubmittedBody"));else if(x.status===429){let w=parseInt((v=x.headers.get("Retry-After"))!=null?v:"60",10);p.textContent=n("rateLimited"),p.style.display="block",m.textContent=n("submitRequest"),setTimeout(()=>{m.disabled=!1,p.style.display="none"},w*1e3)}else{let w=await x.json();p.textContent=w.error||n("somethingWrong"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}}catch(x){p.textContent=n("networkError"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}},t?e.append(g,h,p,m):e.append(a,o,i,r,g,h,p,m)}async function ve(e){var t;if(!L){e.innerHTML="";let a=s("p",{style:"color:#71717a;text-align:center;margin:8px 0;font-size:13px;line-height:1.5"},[n("noThreadsAuth")]),o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendAMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.append(a,o);return}e.innerHTML="";for(let a=0;a<3;a++){let o=s("div",{class:"heedb-thread-item heedb-skeleton"});o.append(s("div",{class:"heedb-skel-line",style:"width:40%;height:12px"}),s("div",{class:"heedb-skel-line",style:"width:80%;height:13px;margin-top:6px"}),s("div",{class:"heedb-skel-line",style:"width:30%;height:11px;margin-top:4px"})),e.appendChild(o)}try{let{threads:a}=await me(y);if(e.innerHTML="",e.style.opacity="0",requestAnimationFrame(()=>{e.style.opacity="1"}),a.length===0){let r=s("p",{style:"color:#71717a;text-align:center;margin:8px 0"},[z(l.emptyStateText)||n("noOpenMessages")]);e.appendChild(r)}else for(let r of a){let g=s("span",{class:`heedb-badge heedb-badge-${r.status}`},[r.status]),h=s("div",{class:"heedb-thread-label"},[r.type==="privacy"?n("privacyRequest"):n("message")," \u2022 "]);h.appendChild(g);let p=s("div",{class:"heedb-thread-text"},[(t=r.preview)!=null?t:""]),m=new Date(r.createdAt).toLocaleDateString(),c=s("div",{class:"heedb-thread-meta"},[m]),d=s("div",{class:"heedb-thread-item"});d.append(h,p,c),d.onclick=()=>Te(r.id),e.appendChild(d)}let o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendNewMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.appendChild(o)}catch(a){e.innerHTML=`<p style="color:#ef4444;text-align:center">${n("failedToLoad")}</p>`}}function Te(e){V=e,T="thread-detail",M()}async function we(e){e.innerHTML="",e.style.padding="12px";let t=s("div",{class:"heedb-skel-line",style:"width:50%;height:13px;margin-bottom:12px"});e.appendChild(t);let a=s("div",{style:"display:flex;flex-direction:column;gap:8px"}),o=["65%","50%","70%","45%"],i=["flex-start","flex-end","flex-start","flex-end"];for(let g=0;g<4;g++){let h=s("div",{style:`display:flex;flex-direction:column;align-items:${i[g]}`});h.appendChild(s("div",{class:"heedb-skel-line",style:`width:${o[g]};height:32px;border-radius:8px`})),a.appendChild(h)}e.appendChild(a);let r=s("button",{class:"heedb-chat-back"},[n("backToMessages")]);r.onclick=()=>{T="threads",A("threads"),M()};try{let h=(await ge(V)).messages||[];e.innerHTML="",e.style.padding="12px",e.appendChild(r);let p=s("div",{class:"heedb-chat-messages"});for(let x of h){let w=x.direction==="inbound",k=s("div",{style:`display:flex;flex-direction:column;${w?"align-items:flex-start":"align-items:flex-end"}`}),P=s("div",{class:`heedb-chat-bubble ${w?"heedb-chat-inbound":"heedb-chat-outbound"}`},[ke(x.body)]),G=s("div",{class:`heedb-chat-time ${w?"":"heedb-chat-time-right"}`},[Ee(x.createdAt)]);k.append(P,G),p.appendChild(k)}e.appendChild(p),requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight});let m=s("div",{class:"heedb-chat-reply"}),c=document.createElement("textarea");c.className="heedb-chat-reply-input",c.placeholder=n("typeReply"),c.rows=1,c.addEventListener("input",()=>{c.style.height="auto",c.style.height=Math.min(c.scrollHeight,80)+"px"});let d=s("button",{class:"heedb-chat-send"},[n("send")]),u=s("div",{class:"heedb-error",style:"display:none;margin-top:4px"});async function v(){let x=c.value.trim();if(x){d.disabled=!0,d.textContent="\u2026",u.style.display="none";try{let w=await ue(V,x);if(w.ok){let k=s("div",{style:"display:flex;flex-direction:column;align-items:flex-start"}),P=s("div",{class:"heedb-chat-bubble heedb-chat-inbound"},[x]),G=s("div",{class:"heedb-chat-time"},[n("justNow")]);k.append(P,G),p.appendChild(k),p.scrollTop=p.scrollHeight,c.value="",c.style.height="auto"}else{let k=await w.json();u.textContent=k.error||n("failedToSend"),u.style.display="block"}}catch(w){u.textContent=n("networkError"),u.style.display="block"}d.disabled=!1,d.textContent=n("send")}}d.onclick=v,c.addEventListener("keydown",x=>{x.key==="Enter"&&!x.shiftKey&&(x.preventDefault(),v())}),m.append(c,d),e.append(m,u),requestAnimationFrame(()=>c.focus())}catch(g){e.innerHTML="",e.appendChild(r),e.appendChild(s("p",{style:"color:#ef4444;text-align:center"},[n("failedToLoadConvo")]))}}function ke(e){let t=e.split(`
|
|
167
167
|
`),a=[];for(let o of t){let i=o.trim();if(/^(On|Em|El|Le|Am|Il giorno) .+(<[^>]+@[^>]+>).*(wrote|escreveu|escribi|crit|schrieb|scritto)\s?:$/i.test(i)||/<[^>]+@[^>]+>/.test(i)&&i.endsWith(":")||/^-{3,}$/.test(i))break;/^>{1,}\s/.test(i)||a.push(o)}return a.join(`
|
|
168
|
-
`).trim()}function
|
|
168
|
+
`).trim()}function Ee(e){let t=new Date(e),o=new Date().getTime()-t.getTime(),i=Math.floor(o/6e4);if(i<1)return n("justNow");if(i<60)return n("minutesAgo").replace("{mins}",String(i));let r=Math.floor(i/60);return r<24?n("hoursAgo").replace("{hours}",String(r)):t.toLocaleDateString()}function Z(e,t,a){e.innerHTML="";let o=s("div",{class:"heedb-success"});o.innerHTML=`
|
|
169
169
|
<div class="heedb-success-icon">\u2705</div>
|
|
170
170
|
<h3>${t}</h3>
|
|
171
171
|
<p>${a}</p>
|
|
172
|
-
`,e.appendChild(o)}let
|
|
172
|
+
`,e.appendChild(o)}let S=null,_=null;function A(e){T=e,S&&S.querySelectorAll(".heedb-tab").forEach(t=>{t.classList.toggle("active",t.dataset.mode===e)})}function D(){_&&(_.style.display=y&&L?"":"none")}let q=null;function ee(){b=J(),q&&(q.textContent=X())}async function te(){if(l=await he(),R=Y(),b=J(),q=document.createElement("style"),q.textContent=X(),document.head.appendChild(q),l.customCSS){let d=document.createElement("style");d.textContent=l.customCSS,document.head.appendChild(d)}l.mode==="system"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{ee(),C&&f&&M()});let e=l.triggerText||"";if(N=s("button",{class:"heedb-btn",title:n("contactUs"),"aria-label":"Open contact widget"}),l.triggerIcon){let d=s("span",{class:"heedb-btn-icon"}),u=Q(l.triggerIcon);u&&d.appendChild(u),N.appendChild(d)}else N.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));if(e&&N.appendChild(s("span",{class:"heedb-btn-label"},[e])),N.onclick=U,document.body.appendChild(N),l.triggerMode==="embedded"&&l.triggerSelector){let d=document.querySelector(l.triggerSelector);d&&d.addEventListener("click",u=>{u.preventDefault(),U()})}if(l.triggerMode==="tag"){let d=s("button",{class:"heedb-tag","aria-label":"Open contact widget"}),u=s("span",{class:"heedb-tag-icon"});if(l.triggerIcon){let v=Q(l.triggerIcon);v&&u.appendChild(v)}else u.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));d.appendChild(u),d.appendChild(document.createTextNode(l.triggerText||n("feedback"))),d.onclick=U,document.body.appendChild(d)}f=s("div",{class:"heedb-panel",style:"display:none"});let t=s("div",{class:"heedb-header"}),a=s("h2",{},[l.headerTitle||n("contactUs")]),o=s("button",{class:"heedb-close","aria-label":"Close"},["\u2715"]);o.onclick=U,t.append(a,o),S=s("div",{class:"heedb-tabs"});let i=s("button",{class:"heedb-tab active","data-mode":"contact"},[z(l.contactTabLabel)||n("contactTab")]),g=l.showPrivacyTab!==!1?s("button",{class:"heedb-tab","data-mode":"privacy"},[n("privacyTab")]):null;_=s("button",{class:"heedb-tab","data-mode":"threads"},[n("messagesTab")]),_.style.display=y&&L?"":"none",i.onclick=()=>{A("contact"),M()},g&&(g.onclick=()=>{A("privacy"),M()}),_.onclick=()=>{A("threads"),M()},S.append(i),g&&S.append(g),S.append(_);let h=s("div",{class:"heedb-body"}),p=s("div",{class:"heedb-footer"}),m=new URLSearchParams({utm_source:"widget",utm_medium:"heedb-widget",utm_campaign:window.location.hostname}),c=s("a",{href:`https://heedb.com?${m.toString()}`,target:"_blank",rel:"noopener noreferrer"},[n("poweredBy")]);p.appendChild(c),f.append(t,S,h,p),document.body.appendChild(f)}function U(){C=!C,f&&(C?(f.style.display="flex",f.style.opacity="0",f.style.transform="translateY(8px)",requestAnimationFrame(()=>{f.style.opacity="1",f.style.transform="translateY(0)"}),y&&L&&T!=="privacy"&&T!=="thread-detail"&&(T="threads",A("threads")),M()):(f.style.opacity="0",f.style.transform="translateY(8px)",setTimeout(()=>{!C&&f&&(f.style.display="none")},150)))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",te):te()})();})();
|