<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
<!-- Font Awesome -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css"/>
<!-- Chat Widget -->
<div id="chat-widget">
<!-- Floating Button -->
<button class="button floating-button">
<i class="fa-solid fa-comment-dots"></i> Chat With Us
</button>
<!-- Modal -->
<div class="modal-overlay">
<div class="modal-container">
<!-- Close -->
<button class="close" aria-label="Close">
<i class="fa-solid fa-xmark"></i>
</button>
<!-- Content area where JS will inject avatar, headings, text, button, iframes -->
<div class="content"></div>
<!-- Tabs -->
<div class="tabs">
<div class="tab" data-tab="email">
<i class="fa-solid fa-envelope"></i>
<span>Email Me</span>
</div>
<div class="tab" data-tab="call">
<i class="fa-solid fa-mobile-screen"></i>
<span>Call Me</span>
</div>
<div class="tab" data-tab="text">
<i class="fa-solid fa-comment-dots"></i>
<span>Text With Me</span>
</div>
</div>
<!-- Preloaded iframes (hidden) -->
<div id="iframes-container" style="display:none;">
<iframe id="iframe-email"
src="https://api.leadconnectorhq.com/widget/form/lnobftVLJJMkxzQ6EROJ"
style="width:100%;height:100%;border:none;border-radius:0px"
id="inline-lnobftVLJJMkxzQ6EROJ"
data-layout="{'id':'INLINE'}"
data-trigger-type="alwaysShow"
data-trigger-value=""
data-activation-type="alwaysActivated"
data-activation-value=""
data-deactivation-type="neverDeactivate"
data-deactivation-value=""
data-form-name="Email Me Form - Salem"
data-height="530"
data-layout-iframe-id="inline-lnobftVLJJMkxzQ6EROJ"
data-form-id="lnobftVLJJMkxzQ6EROJ"
title="Email Me Form - Salem"></iframe>
<iframe id="iframe-call"
src="https://api.leadconnectorhq.com/widget/form/UX9usvZvKqC7UJtKAj3n"
style="width:100%;height:100%;border:none;border-radius:0px"
id="inline-UX9usvZvKqC7UJtKAj3n"
data-layout="{'id':'INLINE'}"
data-trigger-type="alwaysShow"
data-trigger-value=""
data-activation-type="alwaysActivated"
data-activation-value=""
data-deactivation-type="neverDeactivate"
data-deactivation-value=""
data-form-name="Call Me Form - Salem"
data-height="530"
data-layout-iframe-id="inline-UX9usvZvKqC7UJtKAj3n"
data-form-id="UX9usvZvKqC7UJtKAj3n"
title="Call Me Form - Salem"></iframe>
<iframe id="iframe-text"
src="https://api.leadconnectorhq.com/widget/form/bEJotmLuXOjyJerD3KTa"
style="width:100%;height:100%;border:none;border-radius:0px"
id="inline-bEJotmLuXOjyJerD3KTa"
data-layout="{'id':'INLINE'}"
data-trigger-type="alwaysShow"
data-trigger-value=""
data-activation-type="alwaysActivated"
data-activation-value=""
data-deactivation-type="neverDeactivate"
data-deactivation-value=""
data-form-name="Text With Me Form"
data-height="530"
data-layout-iframe-id="inline-bEJotmLuXOjyJerD3KTa"
data-form-id="bEJotmLuXOjyJerD3KTa"
title="Text With Me Form"></iframe>
</div>
</div>
</div>
</div>
<!-- HighLevel Forms JS -->
<script src="https://link.msgsndr.com/js/form_embed.js"></script>
<!-- CSS -->
<style>
#chat-widget {
--primary-color: #1e1e1e;
--accent-color: #004892;
--text-color: #666666;
--background-accent: #f4f4f4;
--border-color: #e1e1e1;
--font-family: "Montserrat";
font-size: 16px;
}
/* Buttons */
#chat-widget .button {
width: 100%;
text-align: center;
background-color: var(--accent-color);
color: white;
border: none;
font-family: var(--font-family);
font-size: 1em;
font-weight: 500;
line-height: 1.3em;
border-radius: 0.313em;
padding: 1em 1.5em;
transition: all 0.2s linear;
}
#chat-widget .button:hover {
opacity: 0.75;
transform: scale(0.975);
}
/* Floating Button */
#chat-widget .floating-button {
cursor: pointer;
width: auto;
position: fixed;
bottom: -100%;
right: 1.25em;
display: flex;
align-items: center;
gap: 0.5rem;
box-shadow: 0 4px 8px rgba(0,0,0,0.15);
opacity: 0;
pointer-events: none;
transform: translateY(2rem);
transition: transform 0.9s ease, opacity 0.9s ease, bottom 0.9s ease;
z-index: 999;
}
#chat-widget .floating-button.visible {
opacity: 1;
pointer-events: auto;
bottom: 1.25em;
transform: translateY(0);
}
#chat-widget .floating-button.visible:hover {
opacity: 0.75;
transform: translateY(0) scale(0.975);
box-shadow: none;
}
/* Modal Overlay */
#chat-widget .modal-overlay {
display: flex;
justify-content: end;
align-items: end;
position: fixed;
bottom: -100%;
right: 1.25em;
z-index: 999;
opacity: 0;
pointer-events: none;
transition: bottom 0.9s ease, opacity 0.9s ease;
}
@media (max-width: 440px) {
#chat-widget .modal-overlay {
right: 0;
}
}
#chat-widget .modal-overlay.show {
bottom: 0;
opacity: 1;
pointer-events: auto;
}
@media (max-width: 440px) {
#chat-widget .modal-overlay {
width: 100%;
}
}
/* Modal Container */
#chat-widget .modal-container {
position: relative;
width: 375px;
min-width: 375px;
max-width: calc(100% - 2.5em);
background: white;
border: 1px solid var(--border-color);
border-radius: 1em 1em 0 0;
box-shadow: 0 3px 10px rgba(0,0,0,0.15);
padding: 0;
transform: translateY(100%);
transition: transform 0.9s ease, opacity 0.9s ease;
max-height: 90vh;
overflow-y: auto;
-webkit-overflow-scrolling: touch;
}
#chat-widget .modal-overlay.show .modal-container {
transform: translateY(0);
}
@media (max-width: 440px) {
#chat-widget .modal-container {
width: 100%;
min-width: 100%;
max-width: 100%;
}
}
/* Close Button */
#chat-widget .close {
cursor: pointer;
opacity: 1;
position: absolute;
top: 0.935em;
right: 0.935em;
width: 2em;
height: 2em;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--accent-color);
color: white;
border-radius: 50%;
border: none;
padding: 0;
transition: all 0.3s linear;
}
#chat-widget .close:hover {
opacity: 0.75;
transform: scale(0.95);
}
#chat-widget .close i {
font-size: 1.125em;
}
/* Modal Content */
#chat-widget .content {
display: flex;
flex-direction: column;
gap: 1.25em;
padding: 2.5em 1.25em;
}
#chat-widget .content.main-slide {
text-align: left;
flex-direction: row;
flex-wrap: wrap;
gap: 1rem 1.25em;
}
#chat-widget .content img {
width: 4em;
height: 4em;
object-fit: contain;
border-radius: 50%;
}
/* Text */
#chat-widget .heading {
align-self: center;
text-align: center;
color: var(--primary-color);
font-family: var(--font-family);
font-size: 1.5em;
font-weight: 600;
line-height: 1.3em;
margin: 0;
}
#chat-widget .text {
color: var(--text-color);
font-family: var(--font-family);
font-size: 1em;
font-weight: 500;
line-height: 1.6em;
margin: 0 0 1.25em 0;
}
/* Tabs */
#chat-widget .tabs {
display: flex;
gap: 1px;
background-color: var(--border-color);
}
#chat-widget .tab {
cursor: pointer;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
flex: 1;
background-color: var(--background-accent);
color: var(--primary-color);
text-align: center;
font-family: var(--font-family);
font-size: 12px;
font-weight: 500;
line-height: 1em;
padding: 0.935em;
transition: all 0.3s ease;
}
#chat-widget .tab i {
font-size: 1.25em;
margin-bottom: 0.625em;
}
#chat-widget .tab:hover,
#chat-widget .tab.active {
background-color: var(--accent-color);
color: white;
}
#chat-widget .tab:hover i,
#chat-widget .tab.active i {
color: white;
}
</style>
<!-- JS -->
<script>
document.addEventListener('DOMContentLoaded', () => {
const chatWidget = document.getElementById('chat-widget');
const chatBtn = chatWidget.querySelector('.floating-button');
const chatModal = chatWidget.querySelector('.modal-overlay');
const closeBtn = chatWidget.querySelector('.close');
const modalMain = chatWidget.querySelector('.content');
// Grab preloaded iframes
const preloadedIframes = {
email: document.getElementById('iframe-email'),
call: document.getElementById('iframe-call'),
text: document.getElementById('iframe-text')
};
// Tab content
const tabContent = {
main: {
image: "https://themaidssalem.com/wp-content/uploads/2025/09/chat-widget-avatar-2025.webp",
heading: "Let's Talk",
text: "Thanks for stopping by! Please don't hesitate to reach out.",
buttonText: "Have questions, submit here.",
buttonAction: () => activateTab('email')
},
email: { heading: "Email Me" },
call: { heading: "Call Me" },
text: { heading: "Text With Me" }
};
// Render modal content
function renderContent(tabId) {
modalMain.classList.toggle('main-slide', tabId === 'main');
modalMain.innerHTML = '';
const content = tabContent[tabId];
if (tabId === 'main') {
const img = document.createElement('img');
img.src = content.image;
img.className = 'avatar';
const h2 = document.createElement('h2');
h2.textContent = content.heading;
h2.className = 'heading';
const p = document.createElement('p');
p.textContent = content.text;
p.className = 'text';
const btn = document.createElement('button');
btn.className = 'button';
btn.textContent = content.buttonText;
btn.onclick = content.buttonAction;
modalMain.append(img, h2, p, btn);
} else {
const h2 = document.createElement('h2');
h2.textContent = content.heading;
h2.className = 'heading';
modalMain.appendChild(h2);
// Clone preloaded iframe
const iframeClone = preloadedIframes[tabId].cloneNode(true);
iframeClone.style.display = 'block';
modalMain.appendChild(iframeClone);
}
}
// Activate tab
function activateTab(tabId) {
const tabs = chatWidget.querySelectorAll('.tab'); // Grab tabs fresh each time
tabs.forEach(t => t.classList.remove('active'));
const tab = chatWidget.querySelector(`.tab[data-tab="${tabId}"]`);
if (tab) tab.classList.add('active');
renderContent(tabId);
}
// Reset to main tab
function resetToMain() {
activateTab('main');
}
// Show floating button
function showFloatingButton() {
chatBtn.classList.add('visible');
}
// Modal open/close
let modalCount = parseInt(sessionStorage.getItem('modalCount') || 0, 10);
function openModal(auto = false) {
if (auto && modalCount >= 2) {
showFloatingButton();
return;
}
resetToMain();
chatModal.classList.add('show');
chatBtn.classList.remove('visible');
if (auto) {
modalCount++;
sessionStorage.setItem('modalCount', modalCount);
}
}
function closeModal() {
chatModal.classList.remove('show');
setTimeout(showFloatingButton, 300);
}
chatBtn.addEventListener('click', () => openModal(false));
closeBtn.addEventListener('click', closeModal);
window.addEventListener('click', e => { if (e.target === chatModal) closeModal(); });
// Add tab click listeners
const tabs = chatWidget.querySelectorAll('.tab');
tabs.forEach(tab => {
tab.addEventListener('click', () => activateTab(tab.dataset.tab));
});
// Auto-open after 1.5s
setTimeout(() => openModal(true), 1500);
});
</script>