Promotions, new products and sales. Directly to your inbox.
Variant picker
Choosing a selection results in a full page refresh.
Opens in a new window.
function htmlInFrame(){
var sO = ''; // open tag, split so it doesn't close this parent script
var sC = ''; // close tag, split for same reason
return (
''+
''+
''+
'
FAB POPS® Chat
'+
'
Hi! Ask me anything about our products and shipping. 💬
'+
'
'+
sO+
'(function(){'+
'var WORKER_URL='+JSON.stringify(WORKER_URL)+';'+
'var SHOP_ID='+JSON.stringify(SHOP_ID)+';'+
'var msgs=document.getElementById("msgs");'+
'var form=document.getElementById("form");'+
'var input=document.getElementById("input");'+
'var sendBtn=document.getElementById("send");'+
'function addMessage(t,w){var el=document.createElement("div");el.className="msg "+(w||"bot");el.textContent=t;msgs.appendChild(el);msgs.scrollTop=msgs.scrollHeight;}'+
'async function ask(m){sendBtn.disabled=true;try{'+
' var res=await fetch(WORKER_URL,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:m,shop:SHOP_ID})});'+
' if(!res.ok) throw new Error("HTTP "+res.status);'+
' var data=await res.json().catch(function(){return{}});'+
' addMessage(data.reply||data.response||data.message||"Thanks!","bot");'+
'}catch(err){addMessage("Sorry—problem contacting the bot ("+err.message+").","sys");}finally{sendBtn.disabled=false;}}'+
'form.addEventListener("submit",function(e){e.preventDefault();var v=(input.value||"").trim();if(!v)return;addMessage(v,"you");input.value="";ask(v);});'+
'})();'+
sC+
'
'
);
}
function ensureFrame(){
if (document.getElementById('fabpops-frame')) return;
var frame = document.createElement('iframe');
frame.id = 'fabpops-frame';
frame.title = 'FAB POPS Chat';
// Prefer srcdoc (keeps everything inline and avoids GET to /chat)
if ('srcdoc' in frame){
frame.srcdoc = htmlInFrame();
} else {
// Fallback: Blob URL (used only if srcdoc unsupported)
var blob = new Blob([ htmlInFrame() ], { type: 'text/html' });
frame.src = URL.createObjectURL(blob);
}
document.body.appendChild(frame);
}
function ensureLauncher(){
if (document.getElementById('fabpops-launcher')) return;
var btn = document.createElement('button');
btn.id = 'fabpops-launcher';
btn.type = 'button';
btn.setAttribute('aria-expanded','false');
btn.textContent = '💬';
btn.addEventListener('click', function(){
var f = document.getElementById('fabpops-frame');
var open = f && f.style.display !== 'none';
if (f) f.style.display = open ? 'none' : 'block';
btn.setAttribute('aria-expanded', String(!open));
});
document.body.appendChild(btn);
}
function init(){ ensureFrame(); ensureLauncher(); }
(document.readyState === 'loading')
? document.addEventListener('DOMContentLoaded', init, { once:true })
: init();
})();