rowsky-chatbot-widget 1.1.0 → 1.1.1
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/chatbot.mjs +4 -2
- package/dist/chatbot.umd.js +1 -1
- package/package.json +1 -1
package/dist/chatbot.mjs
CHANGED
|
@@ -178,9 +178,11 @@ const createFlowEngine = (options) => {
|
|
|
178
178
|
(inp) => inp.type === "email" || inp.key === "email" || inp.key === "e_mail"
|
|
179
179
|
);
|
|
180
180
|
if (emailField && formData[emailField.key]) {
|
|
181
|
+
const emailValue = String(formData[emailField.key] || "").trim();
|
|
182
|
+
const inferredName = emailValue.includes("@") ? emailValue.split("@")[0].replace(/[._-]+/g, " ").trim() : "";
|
|
181
183
|
onLeadCapture == null ? void 0 : onLeadCapture({
|
|
182
|
-
name: formData.name || formData.nome || variables.name || variables.nome || "",
|
|
183
|
-
email:
|
|
184
|
+
name: formData.name || formData.nome || variables.name || variables.nome || inferredName || "Visitante",
|
|
185
|
+
email: emailValue,
|
|
184
186
|
phone: formData.phone || formData.telefone || variables.phone || variables.telefone || "",
|
|
185
187
|
metadata: { ...variables }
|
|
186
188
|
});
|
package/dist/chatbot.umd.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";const e="idle",t="running",i="waiting_input",a="waiting_option",o="ai_mode",n=n=>{const{flows:r=[],onMessage:l,onOptions:s,onInput:d,onTyping:f,onFlowEnd:u,onLeadCapture:c,onVariableSet:x}=n;let p=e,g=0,w=null,m={},b=[],h=null,v=!1;const y=e=>new Promise(t=>{if(v)return t();setTimeout(t,Math.max(0,e))}),k=e=>e&&"string"==typeof e?e.replace(/\{\{(\w+)\}\}/g,(e,t)=>m[t]||`{{${t}}}`):e||"",E=async e=>{if(v)return;const t=1e3*(e.delay||0);if(t>0||"message"===e.type){if(null==f||f(!0),await y(t>0?t:C(e)),v)return;null==f||f(!1)}switch(e.type){case"message":case"text":await I(e);break;case"options":case"question":await L(e);break;case"input":case"lead_capture":await z(e);break;case"subflow":await S(e);break;default:console.warn(`[FlowEngine] Tipo de passo desconhecido: ${e.type}`)}},C=e=>{const t=500+18*(e.content||e.title||"").length;return Math.min(t,2500)},I=async e=>{const t=k(e.content||e.title||"");null==l||l(t)},L=e=>new Promise(i=>{if(v)return i();const o=k(e.content||"");o&&(null==l||l(o)),p=a;const n=(e.options||[]).map(e=>"string"==typeof e?{label:e,value:e}:e);h=a=>{const o=e.variableKey||`option_step_${e.id}`;m[o]=a,null==x||x(o,a),p=t,i()},null==s||s(n,e=>{h&&(h(e),h=null)})}),z=e=>new Promise(a=>{if(v)return a();const o=k(e.content||"");o&&(null==l||l(o)),p=i;const n=(e.inputs||[]).map(e=>{var t;return{type:e.type||"text",label:e.label||"",required:!1!==e.required,placeholder:e.placeholder||"",key:e.key||(null==(t=e.label)?void 0:t.toLowerCase().replace(/[^a-z0-9_]/g,"_"))||`field_${Math.random().toString(36).slice(2,6)}`}});h=e=>{for(const[t,a]of Object.entries(e))m[t]=a,null==x||x(t,a);const i=n.find(e=>"email"===e.type||"email"===e.key||"e_mail"===e.key);i&&e[i.key]&&(null==c||c({name:e.name||e.nome||m.name||m.nome||"",email:e[i.key],phone:e.phone||e.telefone||m.phone||m.telefone||"",metadata:{...m}})),p=t,a()},null==d||d(n,e=>{h&&(h(e),h=null)})}),S=async e=>{const t=(i=e.flowId)?r.find(e=>String(e.id)===String(i)||e.name===i):null;var i;if(!t)return void console.warn(`[FlowEngine] Subflow não encontrado: ${e.flowId}`);if(e.mappings&&"object"==typeof e.mappings)for(const[o,n]of Object.entries(e.mappings))void 0!==m[n]&&(m[o]=m[n]);b.push({flow:w,stepIndex:g}),w=t,g=0,await T();const a=b.pop();a&&(w=a.flow,g=a.stepIndex)},T=async()=>{const e=(null==w?void 0:w.steps)||[];for(;g<e.length;){if(v)return;const t=e[g];await E(t),g++,g<e.length&&await y(350)}};return{start:async()=>{if(w=r.find(e=>{const t=(e.trigger||"").toLowerCase();return t.includes("abrir")&&(t.includes("site")||t.includes("imediat"))})||r[0]||null,!w)return p=o,void(null==u||u());g=0,p=t,m={},await T(),v||(p=o,null==u||u())},handleUserMessage:e=>p===a?(h&&(h(e),h=null),!0):p===i,getState:()=>p,getVariables:()=>({...m}),isAIMode:()=>p===o,isWaiting:()=>p===i||p===a,destroy:()=>{v=!0,h=null,b=[]}}},r="fluxia-widget-styles",l=e=>{const t=document.createElement("div");return t.textContent=e,t.innerHTML};const s=async({config:e,token:t,api:i,visitorId:a,botId:o})=>{(()=>{if(document.getElementById(r))return;const e=document.createElement("style");e.id=r,e.textContent='\n#fluxia-widget-root{all:initial;font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;line-height:1.5;color:#1f2937;--fw-header:#0f172a;--fw-white:#fff;--fw-green:#22c55e;--fw-red:#ef4444;--fw-red-dark:#dc2626;--fw-text:#1f2937;--fw-text-light:#6b7280;--fw-gray-100:#f3f4f6;--fw-gray-200:#e5e7eb;--fw-gray-300:#d1d5db;--fw-gray-bg:#fafbfc;--fw-radius:20px;--fw-shadow:0 20px 60px rgba(0,0,0,.25)}\n#fluxia-widget-root *,#fluxia-widget-root *::before,#fluxia-widget-root *::after{box-sizing:border-box;margin:0;padding:0}\n#fluxia-widget-root .fluxia-bubble{position:fixed;bottom:24px;right:24px;z-index:2147483646;width:60px;height:60px;border-radius:50%;border:none;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 8px 24px rgba(239,68,68,.5),0 0 0 4px rgba(255,255,255,.25);transition:transform .3s cubic-bezier(.34,1.56,.64,1),box-shadow .3s,opacity .25s;opacity:1}\n#fluxia-widget-root .fluxia-bubble.fw-hidden{transform:scale(0);opacity:0;pointer-events:none}\n#fluxia-widget-root .fluxia-bubble svg{width:28px;height:28px;fill:#fff;stroke:none}\n#fluxia-widget-root .fluxia-chatbox{position:fixed;bottom:10px;right:10px;z-index:2147483647;width:400px;height:600px;max-height:calc(100vh - 120px);border-radius:var(--fw-radius);background:var(--fw-white);box-shadow:var(--fw-shadow);display:flex;flex-direction:column;overflow:hidden;transform-origin:bottom right;transform:scale(0) translateY(20px);opacity:0;pointer-events:none;transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .25s}\n#fluxia-widget-root .fluxia-chatbox.fw-open{transform:scale(1) translateY(0);opacity:1;pointer-events:auto}\n#fluxia-widget-root .fluxia-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;background:var(--fw-header);color:var(--fw-white);flex-shrink:0;border-radius:var(--fw-radius) var(--fw-radius) 0 0}\n#fluxia-widget-root .fluxia-header-info{display:flex;align-items:center;gap:12px;flex:1;min-width:0}\n#fluxia-widget-root .fluxia-avatar{width:42px;height:42px;min-width:42px;border-radius:50%;background:rgba(255,255,255,.12);border:2px solid rgba(34,197,94,.5);display:flex;align-items:center;justify-content:center;font-size:20px;overflow:hidden;color:#fff}\n#fluxia-widget-root .fluxia-avatar img{width:100%;height:100%;object-fit:cover;border-radius:50%}\n#fluxia-widget-root .fluxia-header-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}\n#fluxia-widget-root .fluxia-title{font-weight:700;font-size:15px;color:var(--fw-white);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n#fluxia-widget-root .fluxia-status{font-size:12px;color:var(--fw-green);display:flex;align-items:center;gap:6px;font-weight:600}\n#fluxia-widget-root .fluxia-status-dot{width:7px;height:7px;border-radius:50%;background:var(--fw-green);display:inline-block;animation:fw-pulse 2s ease-in-out infinite}\n@keyframes fw-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.3)}}\n#fluxia-widget-root .fluxia-close{width:34px;height:34px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.08);border:none;color:var(--fw-white);cursor:pointer;border-radius:8px;transition:background .2s}\n#fluxia-widget-root .fluxia-close:hover{background:rgba(255,255,255,.18)}\n#fluxia-widget-root .fluxia-close svg{width:16px;height:16px}\n#fluxia-widget-root .fluxia-messages{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:10px;background:var(--fw-white);scroll-behavior:smooth}\n#fluxia-widget-root .fluxia-msg{max-width:82%;padding:10px 14px;font-size:13.5px;line-height:1.55;word-wrap:break-word;overflow-wrap:break-word;animation:fw-msgIn .3s ease-out}\n@keyframes fw-msgIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n#fluxia-widget-root .fluxia-msg-assistant{align-self:flex-start;background:var(--fw-gray-100);color:var(--fw-text);border-radius:16px 16px 16px 4px}\n#fluxia-widget-root .fluxia-msg-user{align-self:flex-end;background:var(--fw-header);color:var(--fw-white);border-radius:16px 16px 4px 16px}\n#fluxia-widget-root .fluxia-msg-system{align-self:center;background:transparent;color:var(--fw-text-light);font-size:12px;padding:4px 8px;border-radius:8px;text-align:center;max-width:90%}\n#fluxia-widget-root .fluxia-typing-wrapper{display:flex;align-items:center;gap:4px;padding:10px 14px;max-width:80px;background:var(--fw-gray-100);border-radius:16px 16px 16px 4px;align-self:flex-start;animation:fw-msgIn .3s ease-out}\n#fluxia-widget-root .fluxia-typing-dot{width:7px;height:7px;border-radius:50%;background:#94a3b8;animation:fw-bounce 1.4s infinite ease-in-out}\n#fluxia-widget-root .fluxia-typing-dot:nth-child(2){animation-delay:.16s}\n#fluxia-widget-root .fluxia-typing-dot:nth-child(3){animation-delay:.32s}\n@keyframes fw-bounce{0%,80%,100%{transform:scale(.7);opacity:.4}40%{transform:scale(1.1);opacity:1}}\n#fluxia-widget-root .fluxia-options{display:flex;flex-direction:column;gap:8px;align-self:flex-start;max-width:85%;animation:fw-msgIn .3s ease-out;padding:4px 0}\n#fluxia-widget-root .fluxia-option-btn{background:var(--fw-white);color:var(--fw-red-dark);border:2px solid var(--fw-red-dark);border-radius:12px;padding:10px 18px;font-size:13.5px;font-weight:500;font-family:inherit;cursor:pointer;transition:all .2s ease;text-align:left;line-height:1.4}\n#fluxia-widget-root .fluxia-option-btn:hover{background:var(--fw-red-dark);color:#fff;transform:translateY(-1px);box-shadow:0 4px 12px rgba(220,38,38,.25)}\n#fluxia-widget-root .fluxia-option-btn:active{transform:scale(.97)}\n#fluxia-widget-root .fluxia-option-btn.selected{background:var(--fw-red-dark);color:#fff;pointer-events:none;opacity:.8}\n#fluxia-widget-root .fluxia-option-btn.disabled{opacity:.4;pointer-events:none}\n#fluxia-widget-root .fluxia-form{display:flex;flex-direction:column;gap:10px;align-self:flex-start;max-width:85%;animation:fw-msgIn .3s ease-out;background:var(--fw-gray-100);border-radius:16px 16px 16px 4px;padding:16px;min-width:240px}\n#fluxia-widget-root .fluxia-form-field{display:flex;flex-direction:column;gap:4px}\n#fluxia-widget-root .fluxia-form-label{font-size:12px;font-weight:600;color:var(--fw-text);display:flex;align-items:center;gap:2px}\n#fluxia-widget-root .fluxia-form-label .required{color:var(--fw-red);font-size:14px}\n#fluxia-widget-root .fluxia-form-input{border:1.5px solid var(--fw-gray-300);border-radius:8px;padding:9px 12px;font-size:13.5px;font-family:inherit;outline:none;transition:border-color .2s,box-shadow .2s;color:var(--fw-text);width:100%;background:var(--fw-white)}\n#fluxia-widget-root .fluxia-form-input:focus{border-color:var(--fw-red);box-shadow:0 0 0 3px rgba(239,68,68,.1)}\n#fluxia-widget-root .fluxia-form-input.error{border-color:var(--fw-red);background:#fef2f2}\n#fluxia-widget-root .fluxia-form-error{font-size:11px;color:var(--fw-red);min-height:14px}\n#fluxia-widget-root .fluxia-form-submit{background:var(--fw-red-dark);color:#fff;border:none;border-radius:8px;padding:10px 20px;font-size:13.5px;font-weight:600;font-family:inherit;cursor:pointer;transition:background .2s,transform .1s;margin-top:4px}\n#fluxia-widget-root .fluxia-form-submit:hover{background:var(--fw-red)}\n#fluxia-widget-root .fluxia-form-submit:active{transform:scale(.97)}\n#fluxia-widget-root .fluxia-form-submit:disabled{background:var(--fw-gray-300);cursor:not-allowed}\n#fluxia-widget-root .fluxia-day-divider{display:flex;align-items:center;gap:12px;padding:8px 0;color:var(--fw-text-light);font-size:11px;font-weight:500}\n#fluxia-widget-root .fluxia-day-divider::before,#fluxia-widget-root .fluxia-day-divider::after{content:\'\';flex:1;height:1px;background:var(--fw-gray-200)}\n#fluxia-widget-root .fluxia-input-area{padding:12px 14px;background:var(--fw-white);border-top:1px solid var(--fw-gray-200);display:flex;align-items:center;gap:10px;flex-shrink:0}\n#fluxia-widget-root .fluxia-input{flex:1;border:1.5px solid var(--fw-gray-300);border-radius:24px;padding:10px 16px;font-size:13px;font-family:inherit;outline:none;color:var(--fw-text);background:var(--fw-gray-bg);transition:border-color .2s,box-shadow .2s}\n#fluxia-widget-root .fluxia-input::placeholder{color:#9ca3af}\n#fluxia-widget-root .fluxia-input:focus{border-color:var(--fw-header);background:var(--fw-white);box-shadow:0 0 0 3px rgba(15,23,42,.06)}\n#fluxia-widget-root .fluxia-input:disabled{opacity:.5;cursor:not-allowed}\n#fluxia-widget-root .fluxia-send{width:40px;height:40px;min-width:40px;border-radius:50%;background:var(--fw-red);color:var(--fw-white);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s,transform .2s;flex-shrink:0}\n#fluxia-widget-root .fluxia-send:hover{background:var(--fw-red-dark);transform:scale(1.08)}\n#fluxia-widget-root .fluxia-send:active{transform:scale(.92)}\n#fluxia-widget-root .fluxia-send:disabled{opacity:.4;cursor:not-allowed;transform:none}\n#fluxia-widget-root .fluxia-send svg{width:18px;height:18px}\n#fluxia-widget-root .fluxia-powered{text-align:center;padding:8px 0;font-size:11px;color:#9ca3af;background:var(--fw-white);border-top:1px solid var(--fw-gray-200);flex-shrink:0}\n#fluxia-widget-root .fluxia-powered a{color:#6b7280;text-decoration:none;font-weight:600}\n#fluxia-widget-root[data-position="left"] .fluxia-bubble{left:24px;right:auto}\n#fluxia-widget-root[data-position="left"] .fluxia-chatbox{left:24px;right:auto;transform-origin:bottom left}\n@media(max-width:768px){#fluxia-widget-root .fluxia-chatbox{width:calc(100vw - 32px);max-width:400px;height:calc(100vh - 140px);max-height:600px;bottom:10px;right:10px}#fluxia-widget-root .fluxia-bubble{bottom:20px;right:16px;width:56px;height:56px}}\n@media(max-width:480px){#fluxia-widget-root .fluxia-chatbox{position:fixed;top:0;left:0;right:0;bottom:0;width:100%;height:100%;max-width:none;max-height:none;border-radius:0;transform-origin:bottom center}#fluxia-widget-root .fluxia-chatbox.fw-open{border-radius:0}#fluxia-widget-root .fluxia-header{border-radius:0}#fluxia-widget-root .fluxia-bubble{bottom:16px;right:16px;width:52px;height:52px}#fluxia-widget-root .fluxia-bubble svg{width:24px;height:24px}#fluxia-widget-root .fluxia-avatar{width:38px;height:38px;min-width:38px}#fluxia-widget-root .fluxia-title{font-size:14px}#fluxia-widget-root .fluxia-msg{max-width:88%;font-size:13px}#fluxia-widget-root .fluxia-input{font-size:14px}#fluxia-widget-root .fluxia-send{width:38px;height:38px;min-width:38px}}\n',document.head.appendChild(e)})();const s=e.theme||{},d=s.position||"right",f=e.botName||e.name||"Assistente",u=e.botAvatar||"",c=e.customCss||"",x=e.flows||[],p=document.createElement("div");if(p.id="fluxia-widget-root",p.dataset.position=d,p.innerHTML=function({botName:e,botAvatar:t}){return`\n <button class="fluxia-bubble" aria-label="Abrir chat" title="Abrir chat">\n <svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>\n </button>\n\n <div class="fluxia-chatbox" role="dialog" aria-label="Chat">\n <div class="fluxia-header">\n <div class="fluxia-header-info">\n <div class="fluxia-avatar">${t?`<img src="${l(t)}" alt="Avatar" />`:"🤖"}</div>\n <div class="fluxia-header-text">\n <div class="fluxia-title">${e}</div>\n <div class="fluxia-status">\n <span class="fluxia-status-dot"></span>\n Online agora\n </div>\n </div>\n </div>\n <button class="fluxia-close" aria-label="Fechar chat" title="Fechar">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round">\n <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>\n </svg>\n </button>\n </div>\n\n <div class="fluxia-messages"></div>\n\n <div class="fluxia-input-area">\n <input class="fluxia-input" type="text"\n placeholder="Digite sua mensagem..."\n autocomplete="off" />\n <button class="fluxia-send" title="Enviar">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"\n stroke-linecap="round" stroke-linejoin="round">\n <line x1="22" y1="2" x2="11" y2="13"/>\n <polygon points="22 2 15 22 11 13 2 9 22 2"/>\n </svg>\n </button>\n </div>\n\n <div class="fluxia-powered">\n Powered by <a href="https://rowsky.com.br/" target="_blank" rel="noopener">Rowsky</a>\n </div>\n </div>\n `}({botName:l(f),botAvatar:u}),document.body.appendChild(p),c&&c.trim()){const e=document.createElement("style");e.id="fluxia-widget-custom",e.textContent=c,document.head.appendChild(e)}s.primaryColor&&(p.style.setProperty("--fw-red-dark",s.primaryColor),p.style.setProperty("--fw-red",s.primaryColor));const g=p.querySelector(".fluxia-bubble"),w=p.querySelector(".fluxia-chatbox"),m=p.querySelector(".fluxia-close"),b=p.querySelector(".fluxia-input"),h=p.querySelector(".fluxia-send"),v=p.querySelector(".fluxia-messages");let y=null,k=!1,E=!1;function C(){requestAnimationFrame(()=>{v.scrollTop=v.scrollHeight})}function I(e,t){const i=document.createElement("div");i.className=`fluxia-msg fluxia-msg-${e}`,"assistant"===e?i.innerHTML=(e=>{if(!e)return"";let t=l(e);return t=t.replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>"),t=t.replace(new RegExp("(?<!\\*)\\*(?!\\*)(.*?)(?<!\\*)\\*(?!\\*)","g"),"<em>$1</em>"),t=t.replace(/\n/g,"<br>"),t})(t):i.textContent=t,v.appendChild(i),C()}function L(){z();const e=document.createElement("div");e.className="fluxia-typing-wrapper",e.id="fluxia-typing-indicator",e.innerHTML='<div class="fluxia-typing-dot"></div><div class="fluxia-typing-dot"></div><div class="fluxia-typing-dot"></div>',v.appendChild(e),C()}function z(){const e=document.getElementById("fluxia-typing-indicator");e&&e.remove()}function S(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function T(e){return/^[\d\s\-+().]{7,20}$/.test(e)}function $(e){E=e,b.disabled=e,h.disabled=e,b.placeholder=e?"Aguarde...":"Digite sua mensagem..."}function j(){g.classList.add("fw-hidden"),w.classList.add("fw-open"),setTimeout(()=>{E||b.focus()},350),k||(k=!0,function(){if(function(){if(0===v.children.length){const e=document.createElement("div");e.className="fluxia-day-divider",e.textContent="Hoje",v.appendChild(e)}}(),!x.length)return e.initialMessage&&I("assistant",e.initialMessage),void $(!1);$(!0),y=n({flows:x,onMessage:e=>{I("assistant",e)},onOptions:(e,t)=>{!function(e,t){z();const i=document.createElement("div");i.className="fluxia-options",e.forEach(e=>{const a=document.createElement("button");a.className="fluxia-option-btn",a.textContent="string"==typeof e?e:e.label,a.addEventListener("click",()=>{const o="string"==typeof e?e:e.value||e.label;i.querySelectorAll(".fluxia-option-btn").forEach(e=>{e.classList.add("disabled")}),a.classList.remove("disabled"),a.classList.add("selected"),I("user",o),t(o)}),i.appendChild(a)}),v.appendChild(i),C()}(e,t)},onInput:(e,t)=>{!function(e,t){var i,a;z();const o=document.createElement("div");o.className="fluxia-form";const n={};e.forEach(e=>{const t=document.createElement("div");t.className="fluxia-form-field";const i=document.createElement("label");if(i.className="fluxia-form-label",i.textContent=e.label,e.required){const e=document.createElement("span");e.className="required",e.textContent=" *",i.appendChild(e)}const a=document.createElement("input");a.className="fluxia-form-input",a.type=e.type||"text",a.placeholder=e.placeholder||e.label||"",a.required=e.required,a.autocomplete=function(e){switch(e){case"email":return"email";case"tel":return"tel";case"name":return"name";default:return"off"}}(e.type);const r=document.createElement("div");r.className="fluxia-form-error",t.appendChild(i),t.appendChild(a),t.appendChild(r),o.appendChild(t),n[e.key]={input:a,error:r,config:e}});const r=document.createElement("button");if(r.className="fluxia-form-submit",r.textContent="Enviar",r.type="button",r.addEventListener("click",()=>{const e={};let i=!1;for(const[t,o]of Object.entries(n)){const a=o.input.value.trim();o.error.textContent="",o.input.classList.remove("error"),!o.config.required||a?"email"!==o.config.type||!a||S(a)?"tel"!==o.config.type||!a||T(a)?e[t]=a:(o.error.textContent="Telefone inválido",o.input.classList.add("error"),i=!0):(o.error.textContent="E-mail inválido",o.input.classList.add("error"),i=!0):(o.error.textContent=`${o.config.label} é obrigatório`,o.input.classList.add("error"),i=!0)}if(i)return;r.disabled=!0,r.textContent="Enviado ✓";for(const t of Object.values(n))t.input.disabled=!0;const a=Object.entries(e).filter(([,e])=>e).map(([,e])=>e).join(" • ");a&&I("user",a),t(e)}),1===e.length){const e=null==(i=Object.values(n)[0])?void 0:i.input;e&&e.addEventListener("keydown",e=>{"Enter"===e.key&&(e.preventDefault(),r.click())})}o.appendChild(r),v.appendChild(o),C();const l=null==(a=Object.values(n)[0])?void 0:a.input;l&&setTimeout(()=>l.focus(),100)}(e,t)},onTyping:e=>{e?L():z()},onFlowEnd:()=>{z(),$(!1),b.placeholder="Pergunte o que quiser..."},onLeadCapture:async e=>{try{await i.captureLead(t,e),console.log("[Fluxia] Lead capturado com sucesso")}catch(a){console.warn("[Fluxia] Erro ao capturar lead:",a.message)}},onVariableSet:(e,t)=>{console.log(`[Fluxia] Variável: ${e} = ${t}`)}}),y.start()}())}async function q(){var e,a;const o=b.value.trim();if(o&&!E){if(b.value="",y&&y.isWaiting()){if(y.handleUserMessage(o))return}I("user",o),$(!0),L();try{const n=await i.sendMessage(t,o);z();const r=(null==(e=null==n?void 0:n.reply)?void 0:e.content)||(null==n?void 0:n.reply)||(null==n?void 0:n.message)||(null==(a=null==n?void 0:n.data)?void 0:a.reply)||"Desculpe, não entendi. Pode reformular?";I("assistant","string"==typeof r?r:JSON.stringify(r))}catch(n){z(),console.error("[Fluxia]",n),401===n.status?I("system","Sessão expirada. Recarregue a página."):I("system","Erro ao enviar mensagem. Tente novamente.")}finally{$(!1),b.focus()}}}g.addEventListener("click",()=>j()),m.addEventListener("click",()=>(w.classList.remove("fw-open"),void setTimeout(()=>g.classList.remove("fw-hidden"),300))),h.addEventListener("click",q),b.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),q())})},d="fluxia_visitor_id",f=document.currentScript,u=async()=>{const e=(()=>{const e=f||document.currentScript||document.querySelector("script[data-client-id], script[data-bot-id]");if(!e)return console.error("[Fluxia] Script tag não encontrada. Use data-client-id OU data-bot-id + data-public-key."),null;const t=e.getAttribute("data-bot-id"),i=e.getAttribute("data-public-key"),a=e.getAttribute("data-client-id"),o=e.getAttribute("data-api-base")||"";return o&&(a||t&&i)?{botId:t?Number(t):null,publicKey:i||"",clientId:a||"",apiBase:o.replace(/\/$/,"")}:(console.error("[Fluxia] Atributos obrigatorios: data-api-base e (data-client-id OU data-bot-id + data-public-key)"),null)})();if(!e)return;const t=(()=>{let e=null;try{e=localStorage.getItem(d)}catch{}if(!e){e="v_"+crypto.randomUUID();try{localStorage.setItem(d,e)}catch{}}return e})(),i=(e=>{const t=async(t,i,a=null,o=null)=>{const n={"Content-Type":"application/json"};o&&(n.Authorization=`Bearer ${o}`);const r={method:t,headers:n};a&&(r.body=JSON.stringify(a));const l=await fetch(`${e}${i}`,r);if(!l.ok){const e=await l.json().catch(()=>({})),t=new Error(e.error||`HTTP ${l.status}`);throw t.status=l.status,t.data=e,t}return l.json()};return{bootstrap:({clientId:e,visitorId:i})=>t("POST","/widget/bootstrap",{clientId:e,visitorId:i}),handshake:({botId:e,publicKey:i,visitorId:a})=>t("POST","/widget/handshake",{botId:e,publicKey:i,visitorId:a}),getConfig:e=>t("GET","/widget/config",null,e),sendMessage:(e,i)=>t("POST","/widget/message",{message:i},e),captureLead:(e,i)=>t("POST","/widget/lead",i,e)}})(e.apiBase);try{let a="",o=null;if(e.clientId){const n=await i.bootstrap({clientId:e.clientId,visitorId:t});if(!n||!n.token)return void console.error("[Fluxia] Bootstrap falhou. Widget nao sera renderizado.");a=n.token,o=n.config||null}else{const o=await i.handshake({botId:e.botId,publicKey:e.publicKey,visitorId:t});if(!o||!o.token)return void console.error("[Fluxia] Handshake falhou. Widget nao sera renderizado.");a=o.token}o||(o=await i.getConfig(a)),o.flows||(o.flows=[]),await s({config:o,token:a,api:i,visitorId:t,botId:e.botId||(null==o?void 0:o.botId)}),console.log("[Fluxia] Widget inicializado com sucesso.")}catch(a){console.error("[Fluxia] Erro na inicialização:",a.message||a)}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",u):u()});
|
|
1
|
+
!function(e){"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";const e="idle",t="running",i="waiting_input",a="waiting_option",o="ai_mode",n=n=>{const{flows:r=[],onMessage:l,onOptions:s,onInput:d,onTyping:f,onFlowEnd:u,onLeadCapture:c,onVariableSet:x}=n;let p=e,g=0,w=null,m={},b=[],h=null,v=!1;const y=e=>new Promise(t=>{if(v)return t();setTimeout(t,Math.max(0,e))}),k=e=>e&&"string"==typeof e?e.replace(/\{\{(\w+)\}\}/g,(e,t)=>m[t]||`{{${t}}}`):e||"",E=async e=>{if(v)return;const t=1e3*(e.delay||0);if(t>0||"message"===e.type){if(null==f||f(!0),await y(t>0?t:C(e)),v)return;null==f||f(!1)}switch(e.type){case"message":case"text":await I(e);break;case"options":case"question":await L(e);break;case"input":case"lead_capture":await S(e);break;case"subflow":await z(e);break;default:console.warn(`[FlowEngine] Tipo de passo desconhecido: ${e.type}`)}},C=e=>{const t=500+18*(e.content||e.title||"").length;return Math.min(t,2500)},I=async e=>{const t=k(e.content||e.title||"");null==l||l(t)},L=e=>new Promise(i=>{if(v)return i();const o=k(e.content||"");o&&(null==l||l(o)),p=a;const n=(e.options||[]).map(e=>"string"==typeof e?{label:e,value:e}:e);h=a=>{const o=e.variableKey||`option_step_${e.id}`;m[o]=a,null==x||x(o,a),p=t,i()},null==s||s(n,e=>{h&&(h(e),h=null)})}),S=e=>new Promise(a=>{if(v)return a();const o=k(e.content||"");o&&(null==l||l(o)),p=i;const n=(e.inputs||[]).map(e=>{var t;return{type:e.type||"text",label:e.label||"",required:!1!==e.required,placeholder:e.placeholder||"",key:e.key||(null==(t=e.label)?void 0:t.toLowerCase().replace(/[^a-z0-9_]/g,"_"))||`field_${Math.random().toString(36).slice(2,6)}`}});h=e=>{for(const[t,a]of Object.entries(e))m[t]=a,null==x||x(t,a);const i=n.find(e=>"email"===e.type||"email"===e.key||"e_mail"===e.key);if(i&&e[i.key]){const t=String(e[i.key]||"").trim(),a=t.includes("@")?t.split("@")[0].replace(/[._-]+/g," ").trim():"";null==c||c({name:e.name||e.nome||m.name||m.nome||a||"Visitante",email:t,phone:e.phone||e.telefone||m.phone||m.telefone||"",metadata:{...m}})}p=t,a()},null==d||d(n,e=>{h&&(h(e),h=null)})}),z=async e=>{const t=(i=e.flowId)?r.find(e=>String(e.id)===String(i)||e.name===i):null;var i;if(!t)return void console.warn(`[FlowEngine] Subflow não encontrado: ${e.flowId}`);if(e.mappings&&"object"==typeof e.mappings)for(const[o,n]of Object.entries(e.mappings))void 0!==m[n]&&(m[o]=m[n]);b.push({flow:w,stepIndex:g}),w=t,g=0,await T();const a=b.pop();a&&(w=a.flow,g=a.stepIndex)},T=async()=>{const e=(null==w?void 0:w.steps)||[];for(;g<e.length;){if(v)return;const t=e[g];await E(t),g++,g<e.length&&await y(350)}};return{start:async()=>{if(w=r.find(e=>{const t=(e.trigger||"").toLowerCase();return t.includes("abrir")&&(t.includes("site")||t.includes("imediat"))})||r[0]||null,!w)return p=o,void(null==u||u());g=0,p=t,m={},await T(),v||(p=o,null==u||u())},handleUserMessage:e=>p===a?(h&&(h(e),h=null),!0):p===i,getState:()=>p,getVariables:()=>({...m}),isAIMode:()=>p===o,isWaiting:()=>p===i||p===a,destroy:()=>{v=!0,h=null,b=[]}}},r="fluxia-widget-styles",l=e=>{const t=document.createElement("div");return t.textContent=e,t.innerHTML};const s=async({config:e,token:t,api:i,visitorId:a,botId:o})=>{(()=>{if(document.getElementById(r))return;const e=document.createElement("style");e.id=r,e.textContent='\n#fluxia-widget-root{all:initial;font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;font-size:14px;line-height:1.5;color:#1f2937;--fw-header:#0f172a;--fw-white:#fff;--fw-green:#22c55e;--fw-red:#ef4444;--fw-red-dark:#dc2626;--fw-text:#1f2937;--fw-text-light:#6b7280;--fw-gray-100:#f3f4f6;--fw-gray-200:#e5e7eb;--fw-gray-300:#d1d5db;--fw-gray-bg:#fafbfc;--fw-radius:20px;--fw-shadow:0 20px 60px rgba(0,0,0,.25)}\n#fluxia-widget-root *,#fluxia-widget-root *::before,#fluxia-widget-root *::after{box-sizing:border-box;margin:0;padding:0}\n#fluxia-widget-root .fluxia-bubble{position:fixed;bottom:24px;right:24px;z-index:2147483646;width:60px;height:60px;border-radius:50%;border:none;background:linear-gradient(135deg,#ef4444,#dc2626);color:#fff;cursor:pointer;display:flex;align-items:center;justify-content:center;box-shadow:0 8px 24px rgba(239,68,68,.5),0 0 0 4px rgba(255,255,255,.25);transition:transform .3s cubic-bezier(.34,1.56,.64,1),box-shadow .3s,opacity .25s;opacity:1}\n#fluxia-widget-root .fluxia-bubble.fw-hidden{transform:scale(0);opacity:0;pointer-events:none}\n#fluxia-widget-root .fluxia-bubble svg{width:28px;height:28px;fill:#fff;stroke:none}\n#fluxia-widget-root .fluxia-chatbox{position:fixed;bottom:10px;right:10px;z-index:2147483647;width:400px;height:600px;max-height:calc(100vh - 120px);border-radius:var(--fw-radius);background:var(--fw-white);box-shadow:var(--fw-shadow);display:flex;flex-direction:column;overflow:hidden;transform-origin:bottom right;transform:scale(0) translateY(20px);opacity:0;pointer-events:none;transition:transform .35s cubic-bezier(.34,1.56,.64,1),opacity .25s}\n#fluxia-widget-root .fluxia-chatbox.fw-open{transform:scale(1) translateY(0);opacity:1;pointer-events:auto}\n#fluxia-widget-root .fluxia-header{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:14px 16px;background:var(--fw-header);color:var(--fw-white);flex-shrink:0;border-radius:var(--fw-radius) var(--fw-radius) 0 0}\n#fluxia-widget-root .fluxia-header-info{display:flex;align-items:center;gap:12px;flex:1;min-width:0}\n#fluxia-widget-root .fluxia-avatar{width:42px;height:42px;min-width:42px;border-radius:50%;background:rgba(255,255,255,.12);border:2px solid rgba(34,197,94,.5);display:flex;align-items:center;justify-content:center;font-size:20px;overflow:hidden;color:#fff}\n#fluxia-widget-root .fluxia-avatar img{width:100%;height:100%;object-fit:cover;border-radius:50%}\n#fluxia-widget-root .fluxia-header-text{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}\n#fluxia-widget-root .fluxia-title{font-weight:700;font-size:15px;color:var(--fw-white);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n#fluxia-widget-root .fluxia-status{font-size:12px;color:var(--fw-green);display:flex;align-items:center;gap:6px;font-weight:600}\n#fluxia-widget-root .fluxia-status-dot{width:7px;height:7px;border-radius:50%;background:var(--fw-green);display:inline-block;animation:fw-pulse 2s ease-in-out infinite}\n@keyframes fw-pulse{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.4;transform:scale(1.3)}}\n#fluxia-widget-root .fluxia-close{width:34px;height:34px;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.08);border:none;color:var(--fw-white);cursor:pointer;border-radius:8px;transition:background .2s}\n#fluxia-widget-root .fluxia-close:hover{background:rgba(255,255,255,.18)}\n#fluxia-widget-root .fluxia-close svg{width:16px;height:16px}\n#fluxia-widget-root .fluxia-messages{flex:1;overflow-y:auto;padding:16px;display:flex;flex-direction:column;gap:10px;background:var(--fw-white);scroll-behavior:smooth}\n#fluxia-widget-root .fluxia-msg{max-width:82%;padding:10px 14px;font-size:13.5px;line-height:1.55;word-wrap:break-word;overflow-wrap:break-word;animation:fw-msgIn .3s ease-out}\n@keyframes fw-msgIn{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}\n#fluxia-widget-root .fluxia-msg-assistant{align-self:flex-start;background:var(--fw-gray-100);color:var(--fw-text);border-radius:16px 16px 16px 4px}\n#fluxia-widget-root .fluxia-msg-user{align-self:flex-end;background:var(--fw-header);color:var(--fw-white);border-radius:16px 16px 4px 16px}\n#fluxia-widget-root .fluxia-msg-system{align-self:center;background:transparent;color:var(--fw-text-light);font-size:12px;padding:4px 8px;border-radius:8px;text-align:center;max-width:90%}\n#fluxia-widget-root .fluxia-typing-wrapper{display:flex;align-items:center;gap:4px;padding:10px 14px;max-width:80px;background:var(--fw-gray-100);border-radius:16px 16px 16px 4px;align-self:flex-start;animation:fw-msgIn .3s ease-out}\n#fluxia-widget-root .fluxia-typing-dot{width:7px;height:7px;border-radius:50%;background:#94a3b8;animation:fw-bounce 1.4s infinite ease-in-out}\n#fluxia-widget-root .fluxia-typing-dot:nth-child(2){animation-delay:.16s}\n#fluxia-widget-root .fluxia-typing-dot:nth-child(3){animation-delay:.32s}\n@keyframes fw-bounce{0%,80%,100%{transform:scale(.7);opacity:.4}40%{transform:scale(1.1);opacity:1}}\n#fluxia-widget-root .fluxia-options{display:flex;flex-direction:column;gap:8px;align-self:flex-start;max-width:85%;animation:fw-msgIn .3s ease-out;padding:4px 0}\n#fluxia-widget-root .fluxia-option-btn{background:var(--fw-white);color:var(--fw-red-dark);border:2px solid var(--fw-red-dark);border-radius:12px;padding:10px 18px;font-size:13.5px;font-weight:500;font-family:inherit;cursor:pointer;transition:all .2s ease;text-align:left;line-height:1.4}\n#fluxia-widget-root .fluxia-option-btn:hover{background:var(--fw-red-dark);color:#fff;transform:translateY(-1px);box-shadow:0 4px 12px rgba(220,38,38,.25)}\n#fluxia-widget-root .fluxia-option-btn:active{transform:scale(.97)}\n#fluxia-widget-root .fluxia-option-btn.selected{background:var(--fw-red-dark);color:#fff;pointer-events:none;opacity:.8}\n#fluxia-widget-root .fluxia-option-btn.disabled{opacity:.4;pointer-events:none}\n#fluxia-widget-root .fluxia-form{display:flex;flex-direction:column;gap:10px;align-self:flex-start;max-width:85%;animation:fw-msgIn .3s ease-out;background:var(--fw-gray-100);border-radius:16px 16px 16px 4px;padding:16px;min-width:240px}\n#fluxia-widget-root .fluxia-form-field{display:flex;flex-direction:column;gap:4px}\n#fluxia-widget-root .fluxia-form-label{font-size:12px;font-weight:600;color:var(--fw-text);display:flex;align-items:center;gap:2px}\n#fluxia-widget-root .fluxia-form-label .required{color:var(--fw-red);font-size:14px}\n#fluxia-widget-root .fluxia-form-input{border:1.5px solid var(--fw-gray-300);border-radius:8px;padding:9px 12px;font-size:13.5px;font-family:inherit;outline:none;transition:border-color .2s,box-shadow .2s;color:var(--fw-text);width:100%;background:var(--fw-white)}\n#fluxia-widget-root .fluxia-form-input:focus{border-color:var(--fw-red);box-shadow:0 0 0 3px rgba(239,68,68,.1)}\n#fluxia-widget-root .fluxia-form-input.error{border-color:var(--fw-red);background:#fef2f2}\n#fluxia-widget-root .fluxia-form-error{font-size:11px;color:var(--fw-red);min-height:14px}\n#fluxia-widget-root .fluxia-form-submit{background:var(--fw-red-dark);color:#fff;border:none;border-radius:8px;padding:10px 20px;font-size:13.5px;font-weight:600;font-family:inherit;cursor:pointer;transition:background .2s,transform .1s;margin-top:4px}\n#fluxia-widget-root .fluxia-form-submit:hover{background:var(--fw-red)}\n#fluxia-widget-root .fluxia-form-submit:active{transform:scale(.97)}\n#fluxia-widget-root .fluxia-form-submit:disabled{background:var(--fw-gray-300);cursor:not-allowed}\n#fluxia-widget-root .fluxia-day-divider{display:flex;align-items:center;gap:12px;padding:8px 0;color:var(--fw-text-light);font-size:11px;font-weight:500}\n#fluxia-widget-root .fluxia-day-divider::before,#fluxia-widget-root .fluxia-day-divider::after{content:\'\';flex:1;height:1px;background:var(--fw-gray-200)}\n#fluxia-widget-root .fluxia-input-area{padding:12px 14px;background:var(--fw-white);border-top:1px solid var(--fw-gray-200);display:flex;align-items:center;gap:10px;flex-shrink:0}\n#fluxia-widget-root .fluxia-input{flex:1;border:1.5px solid var(--fw-gray-300);border-radius:24px;padding:10px 16px;font-size:13px;font-family:inherit;outline:none;color:var(--fw-text);background:var(--fw-gray-bg);transition:border-color .2s,box-shadow .2s}\n#fluxia-widget-root .fluxia-input::placeholder{color:#9ca3af}\n#fluxia-widget-root .fluxia-input:focus{border-color:var(--fw-header);background:var(--fw-white);box-shadow:0 0 0 3px rgba(15,23,42,.06)}\n#fluxia-widget-root .fluxia-input:disabled{opacity:.5;cursor:not-allowed}\n#fluxia-widget-root .fluxia-send{width:40px;height:40px;min-width:40px;border-radius:50%;background:var(--fw-red);color:var(--fw-white);border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .2s,transform .2s;flex-shrink:0}\n#fluxia-widget-root .fluxia-send:hover{background:var(--fw-red-dark);transform:scale(1.08)}\n#fluxia-widget-root .fluxia-send:active{transform:scale(.92)}\n#fluxia-widget-root .fluxia-send:disabled{opacity:.4;cursor:not-allowed;transform:none}\n#fluxia-widget-root .fluxia-send svg{width:18px;height:18px}\n#fluxia-widget-root .fluxia-powered{text-align:center;padding:8px 0;font-size:11px;color:#9ca3af;background:var(--fw-white);border-top:1px solid var(--fw-gray-200);flex-shrink:0}\n#fluxia-widget-root .fluxia-powered a{color:#6b7280;text-decoration:none;font-weight:600}\n#fluxia-widget-root[data-position="left"] .fluxia-bubble{left:24px;right:auto}\n#fluxia-widget-root[data-position="left"] .fluxia-chatbox{left:24px;right:auto;transform-origin:bottom left}\n@media(max-width:768px){#fluxia-widget-root .fluxia-chatbox{width:calc(100vw - 32px);max-width:400px;height:calc(100vh - 140px);max-height:600px;bottom:10px;right:10px}#fluxia-widget-root .fluxia-bubble{bottom:20px;right:16px;width:56px;height:56px}}\n@media(max-width:480px){#fluxia-widget-root .fluxia-chatbox{position:fixed;top:0;left:0;right:0;bottom:0;width:100%;height:100%;max-width:none;max-height:none;border-radius:0;transform-origin:bottom center}#fluxia-widget-root .fluxia-chatbox.fw-open{border-radius:0}#fluxia-widget-root .fluxia-header{border-radius:0}#fluxia-widget-root .fluxia-bubble{bottom:16px;right:16px;width:52px;height:52px}#fluxia-widget-root .fluxia-bubble svg{width:24px;height:24px}#fluxia-widget-root .fluxia-avatar{width:38px;height:38px;min-width:38px}#fluxia-widget-root .fluxia-title{font-size:14px}#fluxia-widget-root .fluxia-msg{max-width:88%;font-size:13px}#fluxia-widget-root .fluxia-input{font-size:14px}#fluxia-widget-root .fluxia-send{width:38px;height:38px;min-width:38px}}\n',document.head.appendChild(e)})();const s=e.theme||{},d=s.position||"right",f=e.botName||e.name||"Assistente",u=e.botAvatar||"",c=e.customCss||"",x=e.flows||[],p=document.createElement("div");if(p.id="fluxia-widget-root",p.dataset.position=d,p.innerHTML=function({botName:e,botAvatar:t}){return`\n <button class="fluxia-bubble" aria-label="Abrir chat" title="Abrir chat">\n <svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>\n </button>\n\n <div class="fluxia-chatbox" role="dialog" aria-label="Chat">\n <div class="fluxia-header">\n <div class="fluxia-header-info">\n <div class="fluxia-avatar">${t?`<img src="${l(t)}" alt="Avatar" />`:"🤖"}</div>\n <div class="fluxia-header-text">\n <div class="fluxia-title">${e}</div>\n <div class="fluxia-status">\n <span class="fluxia-status-dot"></span>\n Online agora\n </div>\n </div>\n </div>\n <button class="fluxia-close" aria-label="Fechar chat" title="Fechar">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round">\n <line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/>\n </svg>\n </button>\n </div>\n\n <div class="fluxia-messages"></div>\n\n <div class="fluxia-input-area">\n <input class="fluxia-input" type="text"\n placeholder="Digite sua mensagem..."\n autocomplete="off" />\n <button class="fluxia-send" title="Enviar">\n <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"\n stroke-linecap="round" stroke-linejoin="round">\n <line x1="22" y1="2" x2="11" y2="13"/>\n <polygon points="22 2 15 22 11 13 2 9 22 2"/>\n </svg>\n </button>\n </div>\n\n <div class="fluxia-powered">\n Powered by <a href="https://rowsky.com.br/" target="_blank" rel="noopener">Rowsky</a>\n </div>\n </div>\n `}({botName:l(f),botAvatar:u}),document.body.appendChild(p),c&&c.trim()){const e=document.createElement("style");e.id="fluxia-widget-custom",e.textContent=c,document.head.appendChild(e)}s.primaryColor&&(p.style.setProperty("--fw-red-dark",s.primaryColor),p.style.setProperty("--fw-red",s.primaryColor));const g=p.querySelector(".fluxia-bubble"),w=p.querySelector(".fluxia-chatbox"),m=p.querySelector(".fluxia-close"),b=p.querySelector(".fluxia-input"),h=p.querySelector(".fluxia-send"),v=p.querySelector(".fluxia-messages");let y=null,k=!1,E=!1;function C(){requestAnimationFrame(()=>{v.scrollTop=v.scrollHeight})}function I(e,t){const i=document.createElement("div");i.className=`fluxia-msg fluxia-msg-${e}`,"assistant"===e?i.innerHTML=(e=>{if(!e)return"";let t=l(e);return t=t.replace(/\*\*(.*?)\*\*/g,"<strong>$1</strong>"),t=t.replace(new RegExp("(?<!\\*)\\*(?!\\*)(.*?)(?<!\\*)\\*(?!\\*)","g"),"<em>$1</em>"),t=t.replace(/\n/g,"<br>"),t})(t):i.textContent=t,v.appendChild(i),C()}function L(){S();const e=document.createElement("div");e.className="fluxia-typing-wrapper",e.id="fluxia-typing-indicator",e.innerHTML='<div class="fluxia-typing-dot"></div><div class="fluxia-typing-dot"></div><div class="fluxia-typing-dot"></div>',v.appendChild(e),C()}function S(){const e=document.getElementById("fluxia-typing-indicator");e&&e.remove()}function z(e){return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e)}function T(e){return/^[\d\s\-+().]{7,20}$/.test(e)}function $(e){E=e,b.disabled=e,h.disabled=e,b.placeholder=e?"Aguarde...":"Digite sua mensagem..."}function j(){g.classList.add("fw-hidden"),w.classList.add("fw-open"),setTimeout(()=>{E||b.focus()},350),k||(k=!0,function(){if(function(){if(0===v.children.length){const e=document.createElement("div");e.className="fluxia-day-divider",e.textContent="Hoje",v.appendChild(e)}}(),!x.length)return e.initialMessage&&I("assistant",e.initialMessage),void $(!1);$(!0),y=n({flows:x,onMessage:e=>{I("assistant",e)},onOptions:(e,t)=>{!function(e,t){S();const i=document.createElement("div");i.className="fluxia-options",e.forEach(e=>{const a=document.createElement("button");a.className="fluxia-option-btn",a.textContent="string"==typeof e?e:e.label,a.addEventListener("click",()=>{const o="string"==typeof e?e:e.value||e.label;i.querySelectorAll(".fluxia-option-btn").forEach(e=>{e.classList.add("disabled")}),a.classList.remove("disabled"),a.classList.add("selected"),I("user",o),t(o)}),i.appendChild(a)}),v.appendChild(i),C()}(e,t)},onInput:(e,t)=>{!function(e,t){var i,a;S();const o=document.createElement("div");o.className="fluxia-form";const n={};e.forEach(e=>{const t=document.createElement("div");t.className="fluxia-form-field";const i=document.createElement("label");if(i.className="fluxia-form-label",i.textContent=e.label,e.required){const e=document.createElement("span");e.className="required",e.textContent=" *",i.appendChild(e)}const a=document.createElement("input");a.className="fluxia-form-input",a.type=e.type||"text",a.placeholder=e.placeholder||e.label||"",a.required=e.required,a.autocomplete=function(e){switch(e){case"email":return"email";case"tel":return"tel";case"name":return"name";default:return"off"}}(e.type);const r=document.createElement("div");r.className="fluxia-form-error",t.appendChild(i),t.appendChild(a),t.appendChild(r),o.appendChild(t),n[e.key]={input:a,error:r,config:e}});const r=document.createElement("button");if(r.className="fluxia-form-submit",r.textContent="Enviar",r.type="button",r.addEventListener("click",()=>{const e={};let i=!1;for(const[t,o]of Object.entries(n)){const a=o.input.value.trim();o.error.textContent="",o.input.classList.remove("error"),!o.config.required||a?"email"!==o.config.type||!a||z(a)?"tel"!==o.config.type||!a||T(a)?e[t]=a:(o.error.textContent="Telefone inválido",o.input.classList.add("error"),i=!0):(o.error.textContent="E-mail inválido",o.input.classList.add("error"),i=!0):(o.error.textContent=`${o.config.label} é obrigatório`,o.input.classList.add("error"),i=!0)}if(i)return;r.disabled=!0,r.textContent="Enviado ✓";for(const t of Object.values(n))t.input.disabled=!0;const a=Object.entries(e).filter(([,e])=>e).map(([,e])=>e).join(" • ");a&&I("user",a),t(e)}),1===e.length){const e=null==(i=Object.values(n)[0])?void 0:i.input;e&&e.addEventListener("keydown",e=>{"Enter"===e.key&&(e.preventDefault(),r.click())})}o.appendChild(r),v.appendChild(o),C();const l=null==(a=Object.values(n)[0])?void 0:a.input;l&&setTimeout(()=>l.focus(),100)}(e,t)},onTyping:e=>{e?L():S()},onFlowEnd:()=>{S(),$(!1),b.placeholder="Pergunte o que quiser..."},onLeadCapture:async e=>{try{await i.captureLead(t,e),console.log("[Fluxia] Lead capturado com sucesso")}catch(a){console.warn("[Fluxia] Erro ao capturar lead:",a.message)}},onVariableSet:(e,t)=>{console.log(`[Fluxia] Variável: ${e} = ${t}`)}}),y.start()}())}async function q(){var e,a;const o=b.value.trim();if(o&&!E){if(b.value="",y&&y.isWaiting()){if(y.handleUserMessage(o))return}I("user",o),$(!0),L();try{const n=await i.sendMessage(t,o);S();const r=(null==(e=null==n?void 0:n.reply)?void 0:e.content)||(null==n?void 0:n.reply)||(null==n?void 0:n.message)||(null==(a=null==n?void 0:n.data)?void 0:a.reply)||"Desculpe, não entendi. Pode reformular?";I("assistant","string"==typeof r?r:JSON.stringify(r))}catch(n){S(),console.error("[Fluxia]",n),401===n.status?I("system","Sessão expirada. Recarregue a página."):I("system","Erro ao enviar mensagem. Tente novamente.")}finally{$(!1),b.focus()}}}g.addEventListener("click",()=>j()),m.addEventListener("click",()=>(w.classList.remove("fw-open"),void setTimeout(()=>g.classList.remove("fw-hidden"),300))),h.addEventListener("click",q),b.addEventListener("keydown",e=>{"Enter"!==e.key||e.shiftKey||(e.preventDefault(),q())})},d="fluxia_visitor_id",f=document.currentScript,u=async()=>{const e=(()=>{const e=f||document.currentScript||document.querySelector("script[data-client-id], script[data-bot-id]");if(!e)return console.error("[Fluxia] Script tag não encontrada. Use data-client-id OU data-bot-id + data-public-key."),null;const t=e.getAttribute("data-bot-id"),i=e.getAttribute("data-public-key"),a=e.getAttribute("data-client-id"),o=e.getAttribute("data-api-base")||"";return o&&(a||t&&i)?{botId:t?Number(t):null,publicKey:i||"",clientId:a||"",apiBase:o.replace(/\/$/,"")}:(console.error("[Fluxia] Atributos obrigatorios: data-api-base e (data-client-id OU data-bot-id + data-public-key)"),null)})();if(!e)return;const t=(()=>{let e=null;try{e=localStorage.getItem(d)}catch{}if(!e){e="v_"+crypto.randomUUID();try{localStorage.setItem(d,e)}catch{}}return e})(),i=(e=>{const t=async(t,i,a=null,o=null)=>{const n={"Content-Type":"application/json"};o&&(n.Authorization=`Bearer ${o}`);const r={method:t,headers:n};a&&(r.body=JSON.stringify(a));const l=await fetch(`${e}${i}`,r);if(!l.ok){const e=await l.json().catch(()=>({})),t=new Error(e.error||`HTTP ${l.status}`);throw t.status=l.status,t.data=e,t}return l.json()};return{bootstrap:({clientId:e,visitorId:i})=>t("POST","/widget/bootstrap",{clientId:e,visitorId:i}),handshake:({botId:e,publicKey:i,visitorId:a})=>t("POST","/widget/handshake",{botId:e,publicKey:i,visitorId:a}),getConfig:e=>t("GET","/widget/config",null,e),sendMessage:(e,i)=>t("POST","/widget/message",{message:i},e),captureLead:(e,i)=>t("POST","/widget/lead",i,e)}})(e.apiBase);try{let a="",o=null;if(e.clientId){const n=await i.bootstrap({clientId:e.clientId,visitorId:t});if(!n||!n.token)return void console.error("[Fluxia] Bootstrap falhou. Widget nao sera renderizado.");a=n.token,o=n.config||null}else{const o=await i.handshake({botId:e.botId,publicKey:e.publicKey,visitorId:t});if(!o||!o.token)return void console.error("[Fluxia] Handshake falhou. Widget nao sera renderizado.");a=o.token}o||(o=await i.getConfig(a)),o.flows||(o.flows=[]),await s({config:o,token:a,api:i,visitorId:t,botId:e.botId||(null==o?void 0:o.botId)}),console.log("[Fluxia] Widget inicializado com sucesso.")}catch(a){console.error("[Fluxia] Erro na inicialização:",a.message||a)}};"loading"===document.readyState?document.addEventListener("DOMContentLoaded",u):u()});
|