<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Automail Biz — B2B Business Directory | Find Verified Manufacturers &amp; Suppliers in India</title>
<meta name="description" content="Search verified manufacturers, suppliers &amp; service providers across India. 51 sectors, 1,800+ sub-categories, 120+ cities. Free for buyers and sellers. India's trusted B2B directory.">
<meta name="keywords" content="B2B directory India, manufacturer directory India, supplier directory India, wholesale suppliers India, B2B marketplace India, industrial suppliers India, verified manufacturers India, find suppliers India, B2B platform India, MSME directory India">
<meta name="robots" content="index, follow">
<link rel="canonical" href="https://biz.automail.digital">
<meta property="og:title" content="Automail Biz — B2B Business Directory | Find Verified Manufacturers &amp; Suppliers in India">
<meta property="og:description" content="Search verified manufacturers, suppliers &amp; service providers across India. 51 sectors, 1,800+ categories, 120+ cities. Free for buyers and sellers.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://biz.automail.digital">
<meta name="twitter:card" content="summary_large_image">
<link rel="icon" href="/img/favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="/img/logo.png">
<link rel="manifest" href="/manifest.json">
<meta name="theme-color" content="#6366f1">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="apple-mobile-web-app-title" content="Automail Biz">
<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=Inter:wght@400;500;600;700;800;900&display=swap" rel="stylesheet">
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "WebSite",
  "name": "Automail Biz",
  "url": "https://biz.automail.digital",
  "description": "B2B Business Directory connecting verified manufacturers, suppliers and service providers with buyers across India",
  "potentialAction": {
    "@type": "SearchAction",
    "target": "https://biz.automail.digital/?q={search_term_string}",
    "query-input": "required name=search_term_string"
  }
}
</script>
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {"@type":"Question","name":"What is Automail Biz?","acceptedAnswer":{"@type":"Answer","text":"Automail Biz is a B2B business directory connecting verified manufacturers, suppliers, traders, exporters, and service providers with buyers across India. It covers 51 sectors, 1,800+ sub-categories and 120+ cities. Listing and inquiring are both free."}},
    {"@type":"Question","name":"Is it free to list a business on Automail Biz?","acceptedAnswer":{"@type":"Answer","text":"Yes. Creating a business page is completely free. Buyers can also search and send inquiries at no cost. No credit card is required."}},
    {"@type":"Question","name":"How does business verification work on Automail Biz?","acceptedAnswer":{"@type":"Answer","text":"Verification checks the business's GST registration number, confirms the registered business address, and verifies the owner's phone or email via OTP. Verified businesses receive a green badge on their profile."}},
    {"@type":"Question","name":"How do buyers contact suppliers on Automail Biz?","acceptedAnswer":{"@type":"Answer","text":"Buyers can send a direct inquiry from any supplier's profile page. Logged-in buyers can also post a bulk purchase Requirement (RFQ) that relevant suppliers in the matching category can review and respond to."}},
    {"@type":"Question","name":"Which industries and cities does Automail Biz cover?","acceptedAnswer":{"@type":"Answer","text":"The directory covers 1,800+ sub-categories across 51 sectors including agriculture, manufacturing, chemicals, pharmaceuticals, IT, construction, and textiles — across 120+ cities throughout India."}},
    {"@type":"Question","name":"Do I need an account to search for suppliers?","acceptedAnswer":{"@type":"Answer","text":"No account is needed to browse the directory or view any business profile. A free account is required only to send inquiries or post a bulk purchase requirement."}}
  ]
}
</script>
<script>if(localStorage.getItem('biz-theme')==='dark')document.documentElement.setAttribute('data-theme','dark');</script>
<script>
(function(){
    if (window.__automailBizRuntimeFetch) return;
    window.__automailBizRuntimeFetch = true;
    var nativeFetch = window.fetch.bind(window);
    var runtimeCache = null;
    var runtimeCacheTs = 0;
    var runtimeTtlMs = 60000;
    var transientStatuses = { 408: true, 502: true, 503: true, 504: true };

    function normalizeOrigin(value) {
        try {
            var url = new URL(String(value || ''), window.location.origin);
            return url.origin === window.location.origin ? '' : url.origin;
        } catch (_) {
            return '';
        }
    }

    function defaultRuntime() {
        return {
            apiPrimary: 'firebase',
            apiFallbackEnabled: true,
            oracleApiBaseUrl: 'https://api.automail.digital',
            firebaseApiBaseUrl: window.location.origin,
            apiFailoverTimeoutMs: 6000
        };
    }

    function getRuntimeConfig() {
        var now = Date.now();
        if (runtimeCache && now - runtimeCacheTs < runtimeTtlMs) return Promise.resolve(runtimeCache);
        return nativeFetch('/api/runtime-config', { cache: 'no-store' })
            .then(function(res){ return res.ok ? res.json() : Promise.reject(new Error('runtime ' + res.status)); })
            .then(function(data){ runtimeCache = Object.assign(defaultRuntime(), data.runtime || {}); runtimeCacheTs = now; return runtimeCache; })
            .catch(function(){ runtimeCache = defaultRuntime(); runtimeCacheTs = now; return runtimeCache; });
    }

    function apiSuffix(input) {
        var raw = typeof input === 'string' ? input : (input && input.url);
        if (!raw) return null;
        try {
            var url = new URL(raw, window.location.origin);
            var apiOrigin = url.origin === 'https://api.automail.digital';
            var appOrigin = url.origin === 'https://app.automail.digital';
            if ((url.origin === window.location.origin || apiOrigin || appOrigin) && url.pathname.indexOf('/api/') === 0) {
                return url.pathname.slice(4) + url.search;
            }
        } catch (_) {}
        return null;
    }

    function methodOf(input, init) {
        return String((init && init.method) || (input && input.method) || 'GET').toUpperCase();
    }

    function apiUrl(origin, suffix) {
        return (origin || '') + '/api' + suffix;
    }

    function fetchWithUrl(input, init, url) {
        if (typeof input === 'string') return nativeFetch(url, init);
        if (window.Request && input instanceof Request) return nativeFetch(new Request(url, input), init);
        return nativeFetch(url, init);
    }

    window.fetch = function(input, init) {
        var suffix = apiSuffix(input);
        if (!suffix || suffix === '/runtime-config') return nativeFetch(input, init);
        var method = methodOf(input, init);
        var safeFallback = method === 'GET' || method === 'HEAD';
        return getRuntimeConfig().then(function(runtime){
            var firebaseOrigin = normalizeOrigin(runtime.firebaseApiBaseUrl);
            var oracleOrigin = normalizeOrigin(runtime.oracleApiBaseUrl);
            var primary = runtime.apiPrimary === 'oracle' && oracleOrigin ? oracleOrigin : firebaseOrigin;
            var fallback = primary === oracleOrigin ? firebaseOrigin : oracleOrigin;
            var primaryUrl = apiUrl(primary, suffix);
            if (runtime.apiFallbackEnabled === false || !safeFallback || fallback === primary) return fetchWithUrl(input, init, primaryUrl);
            return fetchWithUrl(input, init, primaryUrl).then(function(res){
                if (transientStatuses[res.status]) return fetchWithUrl(input, init, apiUrl(fallback, suffix));
                return res;
            }).catch(function(){
                return fetchWithUrl(input, init, apiUrl(fallback, suffix));
            });
        });
    };
})();
</script>
<!-- Firebase SDK (Auth) -->
<script src="https://www.gstatic.com/firebasejs/10.12.0/firebase-app-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/10.12.0/firebase-auth-compat.js"></script>
<script src="https://www.gstatic.com/firebasejs/10.12.0/firebase-firestore-compat.js"></script>
<!-- firebase-messaging-compat removed: not used; was causing 403 Installations errors -->
<script>
(function(){
    var manifest = {
        directoryUi: '/assets/biz-directory-ui.20260525p1.js',
        sourcingHub: '/assets/biz-sourcing-hub.20260525.js',
        livekitLoader: '/assets/biz-call-livekit-loader.20260525.js',
        push: '/push-notifications.js'
    };
    var modulePromises = {};
    function loadScript(src, key) {
        if (modulePromises[key]) return modulePromises[key];
        modulePromises[key] = new Promise(function(resolve, reject) {
            var existing = document.querySelector('script[data-automail-module="' + key + '"]');
            if (existing && existing.dataset.loaded === 'true') return resolve(existing);
            var script = existing || document.createElement('script');
            script.src = src;
            script.async = true;
            script.dataset.automailModule = key;
            script.onload = function(){ script.dataset.loaded = 'true'; resolve(script); };
            script.onerror = function(){ delete modulePromises[key]; reject(new Error('Module failed: ' + key)); };
            if (!existing) document.head.appendChild(script);
        });
        return modulePromises[key];
    }
    window.AutomailBizModules = window.AutomailBizModules || {
        manifest: manifest,
        load: function(name) {
            var src = manifest[name];
            if (!src) return Promise.reject(new Error('Unknown module: ' + name));
            return loadScript(src, name);
        },
        preload: function(name) {
            var src = manifest[name];
            if (!src || document.querySelector('link[data-automail-preload="' + name + '"]')) return;
            var link = document.createElement('link');
            link.rel = 'preload';
            link.as = 'script';
            link.href = src;
            link.dataset.automailPreload = name;
            document.head.appendChild(link);
        }
    };
    window.ensureAutomailPush = function() {
        if (window.AutomailPush && !window.AutomailPush.__stub) return Promise.resolve(window.AutomailPush);
        return window.AutomailBizModules.load('push').then(function(){ return window.AutomailPush; });
    };
    if (!window.AutomailPush) {
        window.AutomailPush = {
            __stub: true,
            init: function(){ return window.ensureAutomailPush().then(function(api){ return api.init && api.init(); }); },
            enable: function(email, opts){ return window.ensureAutomailPush().then(function(api){ return api.enable(email, opts); }); },
            disable: function(email){ return window.ensureAutomailPush().then(function(api){ return api.disable(email); }); },
            getPermission: function(){ return typeof Notification === 'undefined' ? 'unsupported' : Notification.permission; },
            getPreferences: function(email){ return window.ensureAutomailPush().then(function(api){ return api.getPreferences(email); }); },
            setPreferences: function(email, patch){ return window.ensureAutomailPush().then(function(api){ return api.setPreferences(email, patch); }); },
            sendTest: function(){ return window.ensureAutomailPush().then(function(api){ return api.sendTest(); }); },
            getCurrentToken: function(){ return null; }
        };
    }
})();
</script>
<script>
var fbAuth = null;
(function initFirebase() {
  try {
    // Guard against "app already exists" on back-forward cache restore
    if (!firebase.apps || !firebase.apps.length) {
      firebase.initializeApp({
        apiKey:"AIzaSyA_Mt-R0TELCnCsAEX8X8Vy04a66H032lI",
        authDomain:"biz.automail.digital",
        projectId:"automail8090",
        storageBucket:"automail8090.firebasestorage.app",
        messagingSenderId:"403986967133",
        appId:"1:403986967133:web:a4ae1d9d9076b1796fbbb4"
      });
    }
    fbAuth = firebase.auth();
  } catch(e) {
    console.warn('Firebase SDK init failed:', e.message);
    // Retry once on DOMContentLoaded in case SDK scripts were still evaluating
    document.addEventListener('DOMContentLoaded', function() {
      if (!fbAuth) {
        try {
          if (!firebase.apps || !firebase.apps.length) {
            firebase.initializeApp({
              apiKey:"AIzaSyA_Mt-R0TELCnCsAEX8X8Vy04a66H032lI",
              authDomain:"biz.automail.digital",
              projectId:"automail8090",
              storageBucket:"automail8090.firebasestorage.app",
              messagingSenderId:"403986967133",
              appId:"1:403986967133:web:a4ae1d9d9076b1796fbbb4"
            });
          }
          fbAuth = firebase.auth();
        } catch(e2) { console.warn('Firebase SDK retry failed:', e2.message); }
      }
    }, { once: true });
  }
})();
</script>
<style>
*,*::before,*::after{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}

/* ─── Theme Variables (Light Default) ─── */
:root{
    --bg:#f8f9fa;--bg-card:#fff;--bg-card-hover:#f3f4f6;
    --border:#e5e7eb;--border-hover:#d1d5db;
    --text:#374151;--text-primary:#1e1b4b;--text-secondary:#6b7280;--text-muted:#9ca3af;--text-dim:#d1d5db;
    --accent:#6366f1;--accent-hover:#4f46e5;--accent-light:#818cf8;--accent-bg:#eef2ff;
    --nav-bg:rgba(255,255,255,0.95);
    --hero-gradient-1:#1e1b4b;--hero-gradient-2:#312e81;--hero-gradient-3:#4338ca;--hero-gradient-4:#6366f1;
    --topbar-bg:linear-gradient(90deg,#1e1b4b,#312e81);
    --card-shadow:0 1px 3px rgba(0,0,0,.04);
    --featured-bg:linear-gradient(135deg,#eef2ff,#e0e7ff);--featured-border:#c7d2fe;
    --sidebar-active-bg:#eef2ff;--sidebar-active-text:#4338ca;
    --badge-bg:#f3f4f6;--badge-text:#6b7280;
    --verified-bg:#f0fdf4;--verified-text:#16a34a;
    --city-bg:#eff6ff;--city-text:#3b82f6;
    --cert-bg:#f5f3ff;--cert-text:#7c3aed;
    --response-bg:#ecfdf5;--response-text:#059669;
    --inquiry-bg:#fff7ed;--inquiry-text:#ea580c;
    --year-bg:#fefce8;--year-text:#ca8a04;
    --section-bg:#fff;--section-border:#e5e7eb;
    --testimonial-bg:#fafafa;
    --newsletter-bg:linear-gradient(135deg,#eef2ff,#e0e7ff);--newsletter-border:#c7d2fe;
    --cta-box-bg:linear-gradient(135deg,#1e1b4b,#312e81);
    --footer-bg:#fff;
    --compare-bg:#1e1b4b;
}
[data-theme="dark"]{
    --bg:#09090b;--bg-card:#18181b;--bg-card-hover:#1c1c22;
    --border:#27272a;--border-hover:#3f3f46;
    --text:#a1a1aa;--text-primary:#e4e4e7;--text-secondary:#a1a1aa;--text-muted:#71717a;--text-dim:#52525b;
    --accent:#818cf8;--accent-hover:#6366f1;--accent-light:#a5b4fc;--accent-bg:rgba(99,102,241,0.12);
    --nav-bg:rgba(9,9,11,0.92);
    --card-shadow:0 1px 3px rgba(0,0,0,.2);
    --featured-bg:linear-gradient(135deg,rgba(99,102,241,0.08),rgba(67,56,202,0.08));--featured-border:#3f3f46;
    --sidebar-active-bg:rgba(99,102,241,0.1);--sidebar-active-text:#a5b4fc;
    --badge-bg:#27272a;--badge-text:#a1a1aa;
    --verified-bg:rgba(34,197,94,0.1);--verified-text:#4ade80;
    --city-bg:rgba(59,130,246,0.1);--city-text:#60a5fa;
    --cert-bg:rgba(124,58,237,0.1);--cert-text:#a78bfa;
    --response-bg:rgba(5,150,105,0.1);--response-text:#34d399;
    --inquiry-bg:rgba(234,88,12,0.1);--inquiry-text:#fb923c;
    --year-bg:rgba(202,138,4,0.1);--year-text:#fbbf24;
    --section-bg:#18181b;--section-border:#27272a;
    --testimonial-bg:#1c1c22;
    --newsletter-bg:linear-gradient(135deg,rgba(99,102,241,0.06),rgba(67,56,202,0.06));--newsletter-border:#27272a;
    --cta-box-bg:linear-gradient(135deg,#1e1b4b,#312e81);
    --footer-bg:#18181b;
    --compare-bg:#1e1b4b;
}

*,*::before,*::after{box-sizing:border-box}
body{font-family:'Inter',system-ui,sans-serif;background:var(--bg);color:var(--text);line-height:1.6;-webkit-font-smoothing:antialiased;transition:background .3s,color .3s}
a{color:var(--accent);text-decoration:none}
a:hover{text-decoration:underline}
.container{max-width:1320px;margin:0 auto;padding:0 24px}

/* Animations */
@keyframes fadeInUp{from{opacity:0;transform:translateY(18px)}to{opacity:1;transform:translateY(0)}}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.5}}
@keyframes countUp{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}
@keyframes spin{to{transform:rotate(360deg)}}
.animate-in{animation:fadeInUp .5s ease both}
.animate-in-d1{animation:fadeInUp .5s ease .1s both}
.animate-in-d2{animation:fadeInUp .5s ease .2s both}
.live-dot{width:8px;height:8px;border-radius:50%;background:#22c55e;display:inline-block;animation:pulse 2s infinite;margin-right:6px;vertical-align:middle}

/* ── Top Bar ── */
.topbar{background:var(--topbar-bg);color:#c7d2fe;font-size:.78rem;padding:8px 0;text-align:center;overflow:hidden}
.topbar strong{color:#fbbf24}
.topbar-inner{display:flex;justify-content:center;align-items:center;gap:16px;flex-wrap:wrap}
.topbar-tag{display:inline-flex;align-items:center;gap:4px}

/* ── Nav ── */
.nav{background:var(--nav-bg);backdrop-filter:blur(12px);-webkit-backdrop-filter:blur(12px);border-bottom:1px solid var(--border);padding:0;position:sticky;top:0;z-index:50;box-shadow:var(--card-shadow);transition:background .3s,border-color .3s}
.nav .container{display:flex;align-items:center;height:60px;gap:28px}
.nav-brand{font-size:1.4rem;font-weight:900;color:var(--text-primary);text-decoration:none;display:flex;align-items:center;gap:8px;flex-shrink:0}
.nav-brand span{color:var(--accent)}
.nav-brand .brand-text{background:linear-gradient(135deg,#1e293b 0%,#6366f1 50%,#8b5cf6 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
[data-theme="dark"] .nav-brand .brand-text{background:linear-gradient(135deg,#c7d2fe 0%,#6366f1 50%,#8b5cf6 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.nav-brand .brand-logo{width:28px;height:28px;border-radius:6px;object-fit:contain}
.nav-brand .brand-badge{font-size:.58rem;font-weight:700;background:var(--accent-bg);color:var(--accent);padding:2px 6px;border-radius:4px;letter-spacing:.04em}
.nav-center{display:flex;gap:26px;flex:1;justify-content:flex-start}
.nav-center a{color:var(--text-secondary);font-size:.88rem;font-weight:500;position:relative;padding:20px 0;white-space:nowrap}
.nav-center a:hover{color:var(--text-primary);text-decoration:none}
.nav-center a.active::after{content:'';position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--accent);border-radius:1px}
.nav-right{display:flex;gap:8px;align-items:center;flex-shrink:0;margin-left:auto}
.nav-btn{padding:7px 14px;border-radius:8px;font-size:.82rem;font-weight:600;border:none;cursor:pointer;transition:all .15s;font-family:inherit;white-space:nowrap}
.btn-outline{background:transparent;border:1.5px solid var(--border);color:var(--text)}
.btn-outline:hover{border-color:var(--accent);color:var(--accent)}
.btn-primary{background:var(--accent);color:#fff}
.btn-primary:hover{background:var(--accent-hover);transform:translateY(-1px)}
.theme-toggle{width:36px;height:36px;border-radius:8px;border:1.5px solid var(--border);background:var(--bg-card);cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .15s}
.theme-toggle:hover{border-color:var(--accent);background:var(--accent-bg)}
.theme-toggle svg{width:18px;height:18px;stroke:var(--text-secondary);stroke-width:1.5;fill:none}
.nav-hamburger{display:none;width:36px;height:36px;border:none;background:none;cursor:pointer;flex-direction:column;justify-content:center;gap:4px;align-items:center}
.nav-hamburger span{display:block;width:20px;height:2px;background:var(--text);border-radius:2px;transition:all .2s}
/* Sign-up nav button permanently demoted — Log in is the single primary CTA */
#nav-signup-btn{display:none!important}

/* ── Buyer Call Widget (BCW) ── */
#bcw{display:none;align-items:center}
.bcw-ring-pill{display:flex;align-items:center;gap:7px;background:#ecfdf5;border:1.5px solid #86efac;border-radius:999px;padding:5px 10px 5px 7px;font-size:.78rem;font-weight:600;color:#15803d;position:relative;animation:bcwRingEntry .18s ease-out}
@keyframes bcwRingEntry{from{opacity:0;transform:scale(.92)}to{opacity:1;transform:scale(1)}}
.bcw-ring-pulse{position:absolute;inset:-4px;border-radius:50%;border:2px solid #16a34a;animation:bcwPulse 1.5s ease-out infinite;opacity:0;pointer-events:none}
.bcw-ring-pulse--2{animation-delay:.6s}
@keyframes bcwPulse{0%{transform:scale(.92);opacity:.5}100%{transform:scale(1.4);opacity:0}}
.bcw-icon{flex-shrink:0;color:inherit}
.bcw-info{display:flex;flex-direction:column;line-height:1.2}
.bcw-label{font-size:.68rem;font-weight:500;opacity:.7}
.bcw-caller{font-size:.8rem;font-weight:700;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bcw-btn{border:none;border-radius:6px;font-size:.74rem;font-weight:700;padding:4px 10px;cursor:pointer;font-family:inherit;transition:all .12s;white-space:nowrap}
.bcw-btn--decline{background:#fef2f2;color:#dc2626;border:1px solid #fca5a5}
.bcw-btn--decline:hover{background:#dc2626;color:#fff}
.bcw-btn--answer{background:#16a34a;color:#fff;border:1px solid #16a34a}
.bcw-btn--answer:hover{background:#15803d}
.bcw-active-pill{display:flex;align-items:center;gap:7px;background:var(--accent-bg,#eff6ff);border:1.5px solid var(--accent,#4f46e5);border-radius:999px;padding:5px 10px 5px 8px;font-size:.78rem;font-weight:600;color:var(--accent,#4f46e5);animation:bcwRingEntry .18s ease-out}
.bcw-active-dot{width:8px;height:8px;border-radius:50%;background:#94a3b8;flex-shrink:0}
.bcw-active-dot--live{background:#22c55e;box-shadow:0 0 0 2px rgba(34,197,94,.3);animation:bcwLivePulse 2s ease-in-out infinite}
@keyframes bcwLivePulse{0%,100%{box-shadow:0 0 0 2px rgba(34,197,94,.3)}50%{box-shadow:0 0 0 4px rgba(34,197,94,.15)}}
.bcw-active-info{display:flex;flex-direction:column;line-height:1.2;min-width:0}
.bcw-active-name{font-size:.8rem;font-weight:700;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bcw-active-state{font-size:.68rem;font-weight:500;opacity:.75;font-variant-numeric:tabular-nums}
.bcw-btn--mute{background:var(--bg-card,#fff);color:var(--text,#374151);border:1px solid var(--border,#e5e7eb)}
.bcw-btn--mute:hover{border-color:var(--accent,#4f46e5);color:var(--accent,#4f46e5)}
.bcw-btn--muted{background:var(--accent-bg,#eff6ff)!important;color:var(--accent,#4f46e5)!important;border-color:var(--accent,#4f46e5)!important}
.bcw-btn--end{background:#dc2626;color:#fff;border:1px solid #dc2626}
.bcw-btn--end:hover{background:#b91c1c}
@media(max-width:600px){#bcw{display:none!important}}

/* ── Hero ── */
.hero{background:linear-gradient(135deg,var(--hero-gradient-1) 0%,var(--hero-gradient-2) 40%,var(--hero-gradient-3) 70%,var(--hero-gradient-4) 100%);padding:52px 0 60px;position:relative;overflow:hidden}
.hero::before{content:'';position:absolute;top:-30%;right:-10%;width:600px;height:600px;background:radial-gradient(circle,rgba(251,191,36,.12) 0%,transparent 70%);pointer-events:none}
.hero::after{content:'';position:absolute;bottom:0;left:0;right:0;height:64px;background:linear-gradient(transparent,var(--bg))}
.hero-inner{display:flex;align-items:center;gap:48px;position:relative;z-index:1}
.hero-text{flex:1}
.hero-text h1{font-size:clamp(2rem,4vw,2.8rem);font-weight:900;color:#fff;line-height:1.12;margin-bottom:12px;letter-spacing:-.03em}
.hero-text h1 .gold{color:#fbbf24;position:relative}
.hero-text h1 .gold::after{content:'';position:absolute;bottom:-2px;left:0;right:0;height:3px;background:#fbbf24;border-radius:2px;opacity:.4}
.hero-text p{color:#c7d2fe;font-size:1.05rem;margin-bottom:24px;max-width:520px}
.hero-stats{display:flex;gap:28px;margin-bottom:28px}
.hero-stat{text-align:center;padding:12px 16px;background:rgba(255,255,255,.06);border-radius:10px;border:1px solid rgba(255,255,255,.08);backdrop-filter:blur(8px);min-width:90px;transition:transform .2s}
.hero-stat:hover{transform:translateY(-2px)}
.hero-stat-val{font-size:1.6rem;font-weight:900;color:#fff;animation:countUp .6s ease both}
.hero-stat-label{font-size:.68rem;color:#a5b4fc;text-transform:uppercase;letter-spacing:.06em}
.hero-search{display:flex;gap:8px;position:relative}
.hero-search input{flex:1;padding:15px 18px;border-radius:8px;border:2px solid transparent;font-size:.95rem;font-family:inherit;outline:none;transition:border-color .2s;background:#fff;color:#374151}
.hero-search input:focus{border-color:#6366f1}
.hero-search select{padding:15px 14px;border-radius:8px;border:none;font-size:.88rem;background:#fff;color:#374151;font-family:inherit;outline:none;cursor:pointer;min-width:140px}
.hero-search button{padding:15px 32px;border-radius:8px;background:#fbbf24;color:#1e1b4b;border:none;font-weight:700;font-size:.9rem;cursor:pointer;transition:all .15s;white-space:nowrap;font-family:inherit}
.hero-search button:hover{background:#f59e0b;transform:translateY(-1px)}
.search-target-toggle{display:flex;gap:6px;margin-top:8px;align-items:center;flex-wrap:wrap}
.search-target-toggle button{border:1px solid rgba(255,255,255,.14);background:rgba(255,255,255,.07);color:rgba(255,255,255,.76);border-radius:8px;padding:7px 11px;font-size:.78rem;font-weight:800;font-family:inherit;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:all .15s}
.search-target-toggle button.on{background:#fbbf24;color:#1e1b4b;border-color:#fbbf24}
.search-target-toggle button:hover:not(.on){background:rgba(255,255,255,.12);color:#fff}

/* sr-v2 uses a light hero/search area: force high-contrast boxed target toggle */
body.sr-v2 .search-target-toggle{display:inline-flex;gap:8px;padding:4px;background:#ffffff;border:1px solid #d9dfeb;border-radius:11px}
body.sr-v2 .search-target-toggle button{background:#eef2f7;color:#111827;border:1px solid #d5dbe7;min-height:32px;padding:7px 12px;border-radius:8px}
body.sr-v2 .search-target-toggle button:hover:not(.on){background:#e5ebf4;color:#111827;border-color:#c9d1df}
body.sr-v2 .search-target-toggle button.on{background:#fbbf24;color:#111827;border-color:#f59e0b;box-shadow:0 1px 0 rgba(120,53,15,.25)}

/* ── Use Case Autocomplete ── */
.uc-autocomplete{position:absolute;top:100%;left:0;right:0;background:#fff;border-radius:10px;box-shadow:0 8px 32px rgba(0,0,0,.18);z-index:100;max-height:320px;overflow-y:auto;display:none;margin-top:4px;border:1px solid #e5e7eb}
.uc-autocomplete.show{display:block}
.uc-ac-item{padding:10px 16px;cursor:pointer;font-size:.88rem;color:#374151;display:flex;align-items:center;gap:10px;transition:background .1s}
.uc-ac-item:hover,.uc-ac-item.active{background:#f0f4ff}
.uc-ac-item svg{width:14px;height:14px;stroke:#6366f1;fill:none;stroke-width:2;flex-shrink:0}
.uc-ac-item .uc-ac-type{font-size:.68rem;color:#a5b4fc;margin-left:auto;text-transform:uppercase;letter-spacing:.04em}
.uc-ac-header{padding:8px 16px 4px;font-size:.68rem;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.06em}

/* ── Hero Search Tabs (Normal / Use Case) ── */
.hero-search-tabs{display:flex;gap:0;margin-bottom:0;position:relative}
.hero-search-tab{flex:1;padding:12px 16px;font-size:.88rem;font-weight:600;color:rgba(255,255,255,.55);background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);cursor:pointer;transition:all .2s;display:flex;align-items:center;justify-content:center;gap:8px;font-family:inherit;user-select:none}
.hero-search-tab:first-child{border-radius:10px 0 0 0}
.hero-search-tab:last-child{border-radius:0 10px 0 0}
.hero-search-tab svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2;flex-shrink:0}
.hero-search-tab.active{background:rgba(255,255,255,.12);color:#fff;border-color:rgba(255,255,255,.2);border-bottom-color:transparent}
.hero-search-tab .tab-badge{font-size:.58rem;font-weight:700;background:#fbbf24;color:#1e1b4b;padding:1px 6px;border-radius:4px;letter-spacing:.03em;text-transform:uppercase;line-height:1.4}
.hero-search-tab:hover:not(.active){background:rgba(255,255,255,.08);color:rgba(255,255,255,.8)}

.hero-search-area{background:rgba(255,255,255,.06);border:1px solid rgba(255,255,255,.08);border-top:none;border-radius:0 0 10px 10px;padding:14px 14px 10px;position:relative}

/* Use case hint inside the search area */
.uc-hint{display:none;align-items:center;gap:8px;padding:8px 12px;background:rgba(251,191,36,.08);border:1px solid rgba(251,191,36,.15);border-radius:8px;margin-bottom:10px;font-size:.78rem;color:#fde68a;line-height:1.4}
.uc-hint.show{display:flex}
.uc-hint svg{width:16px;height:16px;stroke:#fbbf24;fill:none;stroke-width:2;flex-shrink:0}
.uc-hint strong{color:#fbbf24}

/* "I Need This" button + modal kept from before */
.uc-search-mode{display:none}
.lr-use-cases{display:flex;gap:4px;flex-wrap:wrap;margin-top:4px}
.lr-uc-tag{padding:2px 8px;border-radius:100px;font-size:.65rem;font-weight:500;color:#6366f1;background:#eef2ff;border:1px solid #e0e7ff}
.lr-uc-tag.matched{background:#dcfce7;color:#16a34a;border-color:#bbf7d0;font-weight:600}
.uc-match-reason{font-size:.72rem;color:#16a34a;margin-top:2px;font-style:italic}
.uc-need-this{display:inline-flex;align-items:center;gap:6px;padding:10px 24px;border-radius:10px;background:#6366f1;color:#fff;border:none;font-weight:600;font-size:.88rem;cursor:pointer;transition:all .15s;margin-top:12px;font-family:inherit}
.uc-need-this:hover{background:#4f46e5;transform:translateY(-1px)}
.uc-need-this svg{width:16px;height:16px;stroke:currentColor;fill:none;stroke-width:2}
.uc-need-modal{position:fixed;inset:0;z-index:10000;display:none;align-items:center;justify-content:center;background:rgba(0,0,0,.45);backdrop-filter:blur(4px)}
.uc-need-modal.show{display:flex}
.uc-need-modal-content{background:#fff;border-radius:14px;padding:28px;width:90%;max-width:420px;box-shadow:0 12px 40px rgba(0,0,0,.2)}
.uc-need-modal h3{margin:0 0 6px;font-size:1.1rem;color:#1e1b4b}
.uc-need-modal p{margin:0 0 16px;font-size:.85rem;color:#6b7280}
.uc-need-modal input{width:100%;padding:12px 14px;border-radius:8px;border:1px solid #d1d5db;font-size:.9rem;font-family:inherit;outline:none;transition:border-color .2s;box-sizing:border-box;margin-bottom:10px}
.uc-need-modal input:focus{border-color:#6366f1}
.uc-need-modal-actions{display:flex;gap:8px;justify-content:flex-end;margin-top:4px}
.uc-need-modal-actions button{padding:10px 20px;border-radius:8px;border:none;font-weight:600;font-size:.85rem;cursor:pointer;font-family:inherit}
.uc-need-modal-actions .uc-btn-cancel{background:#f3f4f6;color:#374151}
.uc-need-modal-actions .uc-btn-submit{background:#6366f1;color:#fff}
.popular-searches{display:flex;gap:6px;margin-top:14px;flex-wrap:wrap;align-items:center}
.ps-label{font-size:.75rem;color:#a5b4fc;font-weight:500}
.ps-tag{padding:4px 12px;border-radius:100px;font-size:.72rem;font-weight:500;color:#e0e7ff;background:rgba(255,255,255,.08);border:1px solid rgba(255,255,255,.1);cursor:pointer;transition:all .15s}
.ps-tag:hover{background:rgba(255,255,255,.15);color:#fff}
.hero-img{flex-shrink:0;width:340px;opacity:.9;display:flex;align-items:center;justify-content:center}
.hero-illustration{width:300px;height:300px;position:relative}
.hero-ring{position:absolute;inset:0;border-radius:50%;border:1px solid rgba(255,255,255,.06);animation:pulse 3s ease infinite}
.hero-ring:nth-child(2){inset:15px;animation-delay:.5s;border-color:rgba(255,255,255,.1)}
.hero-ring:nth-child(3){inset:30px;animation-delay:1s;border-color:rgba(255,255,255,.15)}
.hero-center-icon{position:absolute;inset:18px;border-radius:14px;background:rgba(255,255,255,.08);display:flex;flex-direction:column;align-items:stretch;justify-content:flex-start;gap:10px;padding:14px 16px;backdrop-filter:blur(8px);border:1px solid rgba(255,255,255,.18);box-shadow:0 8px 32px rgba(0,0,0,.2);overflow:hidden}
/* Hero card mockup elements */
.hci-header{display:flex;align-items:center;gap:10px}
.hci-avatar{width:38px;height:38px;border-radius:8px;background:rgba(251,191,36,.2);border:1px solid rgba(251,191,36,.35);display:flex;align-items:center;justify-content:center;font-size:.72rem;font-weight:800;color:#fbbf24;flex-shrink:0}
.hci-info{flex:1;min-width:0}
.hci-name{font-size:.74rem;font-weight:700;color:#fff;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.hci-loc{font-size:.6rem;color:#a5b4fc;display:flex;align-items:center;gap:3px}
.hci-loc svg{width:9px;height:9px;stroke:#a5b4fc;stroke-width:2;fill:none;flex-shrink:0;stroke-linecap:round;stroke-linejoin:round}
.hci-v{padding:3px 7px;background:rgba(34,197,94,.14);border:1px solid rgba(34,197,94,.28);border-radius:100px;font-size:.56rem;font-weight:700;color:#4ade80;white-space:nowrap;flex-shrink:0}
.hci-tags{display:flex;gap:4px;flex-wrap:wrap}
.hci-tag{padding:2px 8px;border-radius:5px;font-size:.62rem;font-weight:500;background:rgba(99,102,241,.18);border:1px solid rgba(99,102,241,.28);color:#c7d2fe}
.hci-stats{display:flex;gap:6px}
.hci-stat{flex:1;text-align:center;padding:6px 4px;background:rgba(255,255,255,.05);border-radius:8px}
.hci-stat b{display:block;font-size:.74rem;font-weight:800;color:#fff;letter-spacing:-.01em}
.hci-stat span{font-size:.56rem;color:#94a3b8}
.hci-cta{display:block;background:rgba(99,102,241,.22);border:1px solid rgba(99,102,241,.38);border-radius:8px;text-align:center;padding:7px 10px;font-size:.7rem;font-weight:600;color:#c7d2fe;margin-top:auto;cursor:pointer;text-decoration:none;transition:background .18s,border-color .18s,color .18s}
.hci-cta:hover{background:rgba(99,102,241,.5);border-color:rgba(99,102,241,.7);color:#fff;text-decoration:none}
.hero-center-icon svg{width:48px;height:48px;stroke:#c7d2fe;stroke-width:1.2;fill:none}

/* ── Media Trust Bar ── */
.media-bar{background:var(--section-bg);border-bottom:1px solid var(--section-border);padding:14px 0;transition:background .3s}
.media-inner{display:flex;align-items:center;justify-content:center;gap:40px;flex-wrap:wrap}
.media-label{font-size:.72rem;font-weight:600;color:var(--text-muted);text-transform:uppercase;letter-spacing:.06em}
.media-logo{font-size:.9rem;font-weight:700;color:var(--text-dim);letter-spacing:-.01em;transition:color .15s}
.media-logo:hover{color:var(--text-muted)}

/* ── Trust Bar ── */
.trust{background:var(--section-bg);border-bottom:1px solid var(--section-border);padding:14px 0;transition:background .3s}
.trust-row{display:flex;gap:28px;justify-content:center;align-items:center;flex-wrap:wrap}
.trust-item{display:flex;align-items:center;gap:6px;font-size:.82rem;color:var(--text-secondary);font-weight:500}
.trust-item svg{width:18px;height:18px;stroke:#16a34a;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.trust-live{display:none;align-items:center;gap:6px;font-size:.82rem;color:var(--text-secondary);font-weight:500;padding:4px 12px;background:var(--verified-bg);border-radius:100px;border:1px solid rgba(34,197,94,0.2)}
.trust-live .live-dot{margin-right:2px}

/* ── How It Works ── */
.how-it-works{padding:48px 0;border-bottom:1px solid var(--section-border);background:var(--section-bg);transition:background .3s}
.hiw-title{text-align:center;font-size:1.3rem;font-weight:800;color:var(--text-primary);margin-bottom:4px}
.hiw-sub{text-align:center;font-size:.9rem;color:var(--text-secondary);margin-bottom:32px}
.hiw-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:24px;position:relative}
.hiw-grid::before{content:'';position:absolute;top:36px;left:16%;right:16%;height:2px;background:linear-gradient(90deg,var(--border) 0%,var(--featured-border) 50%,var(--border) 100%);z-index:0}
.hiw-step{text-align:center;position:relative;z-index:1}
.hiw-num{width:56px;height:56px;border-radius:50%;background:linear-gradient(135deg,#6366f1,#4338ca);color:#fff;font-size:1.1rem;font-weight:800;display:flex;align-items:center;justify-content:center;margin:0 auto 14px;box-shadow:0 4px 16px rgba(99,102,241,.2);transition:transform .2s}
.hiw-step:hover .hiw-num{transform:scale(1.08)}
.hiw-step-title{font-size:.95rem;font-weight:700;color:var(--text-primary);margin-bottom:4px}
.hiw-step-desc{font-size:.82rem;color:var(--text-secondary);max-width:240px;margin:0 auto}
.hiw-step-time{font-size:.72rem;color:var(--accent-light);font-weight:600;margin-top:6px}
/* ── How It Works Tabs ── */
.hiw-tabs{display:flex;gap:4px;justify-content:center;margin-bottom:32px;background:var(--bg-card);border:1.5px solid var(--border);border-radius:12px;padding:4px;max-width:300px;margin-left:auto;margin-right:auto}
.hiw-tab-btn{flex:1;padding:9px 20px;border-radius:9px;border:none;cursor:pointer;font-size:.88rem;font-weight:600;color:var(--text-secondary);background:transparent;transition:all .2s;font-family:inherit}
.hiw-tab-btn.active{background:var(--accent);color:#fff;box-shadow:0 2px 8px rgba(99,102,241,.2)}
.hiw-tab-content{display:none}.hiw-tab-content.hiw-active{display:block}
.hiw-grid-5{grid-template-columns:repeat(5,1fr)!important}.hiw-grid-5::before{left:9%;right:9%}
/* ── FAQ Tabs ── */
.faq-tabs{display:flex;gap:0;justify-content:center;margin-bottom:24px;border-bottom:2px solid var(--border);max-width:720px;margin-left:auto;margin-right:auto}
.faq-tab-btn{padding:10px 24px;border:none;cursor:pointer;font-size:.88rem;font-weight:600;color:var(--text-secondary);background:transparent;border-bottom:2.5px solid transparent;margin-bottom:-2px;transition:all .2s;font-family:inherit}
.faq-tab-btn:hover{color:var(--text-primary)}.faq-tab-btn.active{color:var(--accent);border-bottom-color:var(--accent)}
.faq-tab-content{display:none}.faq-tab-content.faq-active{display:block}
/* ── Why Cards ── */
.why-card{text-align:center;padding:28px 24px}
.why-icon-wrap{width:52px;height:52px;border-radius:14px;display:flex;align-items:center;justify-content:center;margin:0 auto 14px}
.why-icon-wrap svg{width:26px;height:26px;stroke-width:1.8;fill:none;stroke-linecap:round;stroke-linejoin:round}
.why-icon-wrap.green{background:#f0fdf4;}.why-icon-wrap.green svg{stroke:#16a34a}
.why-icon-wrap.indigo{background:#eef2ff;}.why-icon-wrap.indigo svg{stroke:#4f46e5}
.why-icon-wrap.amber{background:#fffbeb;}.why-icon-wrap.amber svg{stroke:#d97706}
.why-title{font-size:.95rem;font-weight:700;color:var(--text-primary);margin-bottom:8px}
.why-desc{font-size:.83rem;color:var(--text-secondary);line-height:1.6}

/* ── Main Layout ── */
.main{display:grid;grid-template-columns:260px 1fr;gap:28px;padding:32px 0}
/* Grid overflow fix: prevent grid items from exceeding their track size */
.main > *{min-width:0}

/* ── Sidebar ── */
.sidebar{position:sticky;top:72px;align-self:start;max-height:calc(100vh - 80px);overflow-y:auto;scrollbar-width:thin;scrollbar-color:var(--border) transparent}
.side-section{margin-bottom:24px}
.side-title{font-size:.72rem;font-weight:700;color:var(--text-muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:10px;display:flex;align-items:center;gap:6px}
.side-title svg{width:14px;height:14px;stroke:currentColor;stroke-width:1.5;fill:none;stroke-linecap:round;stroke-linejoin:round}
.side-list{list-style:none}
.side-list li{margin-bottom:1px}
.side-list a{display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:8px;font-size:.85rem;color:var(--text);font-weight:500;transition:all .15s;cursor:pointer}
.side-list a:hover,.side-list a.active{background:var(--sidebar-active-bg);color:var(--sidebar-active-text);text-decoration:none}
.side-list a svg{width:16px;height:16px;stroke:currentColor;stroke-width:1.5;fill:none;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
.side-list a .count{margin-left:auto;font-size:.7rem;color:var(--text-muted);font-weight:400;background:var(--badge-bg);padding:1px 6px;border-radius:4px}
.side-list a.active .count{background:var(--accent-bg);color:var(--sidebar-active-text)}
.city-list{display:flex;flex-direction:column;gap:2px}
.city-tag{display:flex;justify-content:space-between;padding:8px 12px;border-radius:8px;font-size:.82rem;color:var(--text-secondary);cursor:pointer;transition:all .15s;align-items:center}
.city-tag:hover,.city-tag.active{background:var(--sidebar-active-bg);color:var(--sidebar-active-text)}
.side-callout{background:var(--featured-bg);border:1px solid var(--featured-border);border-radius:10px;padding:16px;text-align:center;margin-top:20px}
.side-callout .sc-val{font-size:1.4rem;font-weight:900;color:var(--sidebar-active-text)}
.side-callout .sc-label{font-size:.75rem;color:var(--text-secondary);margin-top:2px}
.side-callout .sc-sub{font-size:.7rem;color:var(--text-muted);margin-top:4px}

/* ── Content ── */
.content-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px;flex-wrap:wrap;gap:8px}
.content-header h2{font-size:1.2rem;font-weight:800;color:var(--text-primary);display:flex;align-items:center;gap:8px}
.sort-select{padding:7px 12px;border:1.5px solid var(--border);border-radius:8px;font-size:.82rem;font-family:inherit;color:var(--text);background:var(--bg-card);cursor:pointer;transition:border-color .15s}
.sort-select:hover{border-color:var(--featured-border)}

/* ── Filter Bar ── */
.filter-bar{display:flex;gap:8px;margin-bottom:12px;align-items:center;flex-wrap:wrap}
.filter-chip{display:flex;align-items:center;gap:5px;padding:6px 14px;border-radius:8px;font-size:.78rem;font-weight:500;color:var(--text-secondary);background:var(--bg-card);border:1.5px solid var(--border);cursor:pointer;transition:all .15s}
.filter-chip:hover,.filter-chip.active{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.filter-chip svg{width:14px;height:14px;stroke:currentColor;stroke-width:1.5;fill:none;stroke-linecap:round;stroke-linejoin:round}
.filter-count{font-size:.72rem;color:var(--text-muted);margin-left:auto}

/* ── Enterprise Search & Filter Module ── */
.search-filter-bar{background:var(--bg-card);border:1.5px solid var(--border);border-radius:12px;padding:12px 16px;margin-bottom:16px;display:flex;gap:10px;align-items:center;flex-wrap:wrap;position:sticky;top:58px;z-index:30;box-shadow:0 2px 8px rgba(0,0,0,.04);transition:border-color .2s,box-shadow .2s}
.search-filter-bar:focus-within{border-color:var(--accent);box-shadow:0 2px 16px rgba(99,102,241,.1)}
.sfb-search{flex:1;min-width:200px;position:relative}
.sfb-search input{width:100%;padding:10px 14px 10px 36px;border:1.5px solid var(--border);border-radius:8px;font-size:.88rem;font-family:inherit;color:var(--text);background:var(--bg);outline:none;transition:border-color .15s}
.sfb-search input:focus{border-color:var(--accent)}
.sfb-search input::placeholder{color:var(--text-muted)}
.sfb-search svg{position:absolute;left:10px;top:50%;transform:translateY(-50%);width:16px;height:16px;stroke:var(--text-muted);stroke-width:2;fill:none}
.sfb-search .sfb-clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);width:20px;height:20px;border:none;background:var(--badge-bg);border-radius:50%;cursor:pointer;display:none;align-items:center;justify-content:center;color:var(--text-muted);font-size:.7rem;line-height:1;padding:0}
.sfb-search .sfb-clear.show{display:flex}
.sfb-target{display:flex;gap:4px;padding:3px;background:var(--bg-card);border:1.5px solid var(--border);border-radius:8px;align-items:center}
.sfb-target button{border:none;background:transparent;color:var(--text-muted);border-radius:6px;padding:8px 10px;font-size:.78rem;font-weight:800;font-family:inherit;cursor:pointer;white-space:nowrap}
.sfb-target button.on{background:var(--accent);color:#fff}
#listings-container.is-refreshing{opacity:.58;pointer-events:none;transition:opacity .18s}
.sfb-divider{width:1px;height:28px;background:var(--border);flex-shrink:0}
.sfb-filters{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.sfb-dropdown{position:relative}
.sfb-dropdown-btn{display:flex;align-items:center;gap:5px;padding:8px 12px;border-radius:8px;font-size:.8rem;font-weight:500;color:var(--text-secondary);background:var(--bg-card);border:1.5px solid var(--border);cursor:pointer;transition:all .15s;white-space:nowrap;font-family:inherit}
.sfb-dropdown-btn:hover,.sfb-dropdown-btn.active{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.sfb-dropdown-btn svg{width:14px;height:14px;stroke:currentColor;stroke-width:1.5;fill:none;flex-shrink:0}
.sfb-dropdown-btn .sfb-count{background:var(--accent);color:#fff;font-size:.62rem;font-weight:700;padding:1px 5px;border-radius:4px;margin-left:2px}
.sfb-panel{position:absolute;top:calc(100% + 6px);left:0;min-width:240px;max-height:320px;overflow-y:auto;background:var(--bg-card);border:1.5px solid var(--border);border-radius:10px;box-shadow:0 8px 32px rgba(0,0,0,.12);z-index:40;display:none;padding:8px 0;scrollbar-width:thin}
.sfb-panel.show{display:block}
.sfb-panel.right{left:auto;right:0}
.sfb-panel-search{padding:6px 10px;position:sticky;top:0;background:var(--bg-card);z-index:1}
.sfb-panel-search input{width:100%;padding:7px 10px;border:1.5px solid var(--border);border-radius:6px;font-size:.78rem;font-family:inherit;color:var(--text);background:var(--bg);outline:none}
.sfb-panel-search input:focus{border-color:var(--accent)}
.sfb-panel-item{display:flex;align-items:center;gap:8px;padding:7px 14px;font-size:.82rem;color:var(--text);cursor:pointer;transition:background .1s}
.sfb-panel-item:hover{background:var(--accent-bg)}
.sfb-panel-item.selected{color:var(--accent);font-weight:600}
.sfb-panel-item .sfb-check{width:16px;height:16px;border:1.5px solid var(--border);border-radius:4px;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .15s}
.sfb-panel-item.selected .sfb-check{background:var(--accent);border-color:var(--accent)}
.sfb-panel-item.selected .sfb-check::after{content:'✓';color:#fff;font-size:.62rem;font-weight:700}
.sfb-panel-item svg{width:16px;height:16px;stroke:currentColor;stroke-width:1.5;fill:none;flex-shrink:0}
.sfb-panel-divider{height:1px;background:var(--border);margin:4px 0}
.sfb-panel-label{padding:6px 14px;font-size:.68rem;font-weight:700;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}
.sfb-sort-btn{display:flex;align-items:center;gap:5px;padding:8px 12px;border-radius:8px;font-size:.8rem;font-weight:500;color:var(--text-secondary);background:var(--bg-card);border:1.5px solid var(--border);cursor:pointer;transition:all .15s;white-space:nowrap;font-family:inherit}
.sfb-sort-btn:hover{border-color:var(--accent);color:var(--accent)}
.sfb-sort-btn svg{width:14px;height:14px;stroke:currentColor;stroke-width:1.5;fill:none}

/* ── Active Filter Tags ── */
.active-filters{display:flex;gap:6px;flex-wrap:wrap;align-items:center;width:100%}
.active-filters:empty{display:none}
.af-tag{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;border-radius:6px;font-size:.72rem;font-weight:500;background:var(--accent-bg);color:var(--accent);border:1px solid rgba(99,102,241,.2)}
.af-tag button{background:none;border:none;color:var(--accent);cursor:pointer;font-size:.72rem;font-weight:700;padding:0 0 0 2px;line-height:1;opacity:.7}
.af-tag button:hover{opacity:1}
.af-clear{font-size:.72rem;color:var(--text-muted);cursor:pointer;font-weight:500;padding:4px 8px;border-radius:6px;border:1px solid var(--border);background:var(--bg-card);transition:all .15s}
.af-clear:hover{color:var(--accent);border-color:var(--accent)}

/* ── Load More ── */
.load-more-bar{text-align:center;padding:20px 0}
.load-more-btn{padding:12px 32px;border-radius:10px;border:1.5px solid var(--border);background:var(--bg-card);color:var(--text);font-size:.88rem;font-weight:600;cursor:pointer;transition:all .15s;font-family:inherit}
.load-more-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.load-more-btn:disabled{opacity:.5;cursor:not-allowed}
.load-more-info{font-size:.72rem;color:var(--text-muted);margin-top:8px}

/* ── Breadcrumb ── */
.breadcrumb{display:flex;align-items:center;gap:6px;font-size:.78rem;color:var(--text-muted);margin-bottom:16px}
.breadcrumb a{color:var(--text-secondary);font-weight:500}
.breadcrumb a:hover{color:var(--sidebar-active-text);text-decoration:none}
.breadcrumb span.sep{color:var(--text-dim)}
.breadcrumb .current{color:var(--text);font-weight:500}

/* ── Featured Banner ── */
.featured-banner{background:var(--featured-bg);border:1.5px solid var(--featured-border);border-radius:14px;padding:20px;margin-bottom:24px;display:flex;gap:14px;overflow-x:auto;scrollbar-width:none;scroll-snap-type:x mandatory;position:relative}
.featured-banner::-webkit-scrollbar{display:none}
.featured-banner::before{content:'FEATURED';position:absolute;top:-10px;left:20px;background:linear-gradient(135deg,#fbbf24,#f59e0b);color:#1e1b4b;font-size:.65rem;font-weight:700;padding:3px 10px;border-radius:4px;letter-spacing:.04em;z-index:2}
.fb-card{flex-shrink:0;width:240px;background:var(--bg-card);border-radius:10px;padding:16px;border:1.5px solid var(--border);position:relative;scroll-snap-align:start;transition:all .2s}
.fb-card:hover{border-color:var(--accent-light);box-shadow:0 4px 16px rgba(99,102,241,.08);transform:translateY(-2px)}
.fb-badge{position:absolute;top:10px;right:10px;background:#fbbf24;color:#1e1b4b;font-size:.62rem;font-weight:700;padding:2px 8px;border-radius:4px}
.fb-name{font-size:.92rem;font-weight:700;color:var(--text-primary);margin-bottom:3px}
.fb-tag{font-size:.78rem;color:var(--text-secondary);margin-bottom:10px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.4}
.fb-meta{font-size:.72rem;color:var(--text-muted);display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.fb-meta span{display:inline-flex;align-items:center;gap:3px}
.fb-meta svg{width:10px;height:10px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.fb-cta{display:inline-block;padding:6px 14px;border-radius:6px;font-size:.75rem;font-weight:600;background:#4338ca;color:#fff;cursor:pointer;transition:all .15s;border:none;text-align:center;width:100%;font-family:inherit}
.fb-cta:hover{background:#3730a3;text-decoration:none}

/* ── Listing Rows ── */
.listing-row{display:flex;gap:14px;padding:16px;background:var(--bg-card);border:1.5px solid var(--border);border-radius:12px;margin-bottom:10px;transition:all .2s;align-items:center;position:relative}
.listing-row:hover{border-color:var(--featured-border);box-shadow:0 4px 20px rgba(99,102,241,.06);transform:translateY(-1px)}
.lr-check{flex-shrink:0}
.lr-check input{width:16px;height:16px;accent-color:#6366f1;cursor:pointer;border-radius:4px}
.lr-num{width:28px;height:28px;border-radius:8px;background:var(--badge-bg);display:flex;align-items:center;justify-content:center;font-size:.72rem;font-weight:700;color:var(--text-muted);flex-shrink:0}
.lr-logo{width:48px;height:48px;border-radius:10px;background:var(--accent-bg);display:flex;align-items:center;justify-content:center;font-size:.88rem;font-weight:700;color:var(--accent);flex-shrink:0;position:relative;overflow:hidden}
.lr-logo img{width:100%;height:100%;object-fit:cover}
.lr-logo .online-dot{position:absolute;bottom:0;right:0;width:10px;height:10px;border-radius:50%;background:#22c55e;border:2px solid var(--bg-card)}
.lr-info{flex:1;min-width:0}
.lr-name{font-size:.92rem;font-weight:700;color:var(--text-primary);margin-bottom:1px;display:flex;align-items:center;gap:6px}
.lr-tag{font-size:.78rem;color:var(--text-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.lr-badges{display:flex;gap:4px;flex-shrink:0;flex-wrap:wrap;align-items:center}
.lr-badge{padding:3px 9px;border-radius:6px;font-size:.68rem;font-weight:500;background:var(--badge-bg);color:var(--badge-text);display:flex;align-items:center;gap:3px}
.lr-badge svg{width:10px;height:10px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.lr-badge.city{background:var(--city-bg);color:var(--city-text)}
.lr-badge.verified{background:var(--verified-bg);color:var(--verified-text)}
.lr-badge.year{background:var(--year-bg);color:var(--year-text)}
.lr-badge.cert{background:var(--cert-bg);color:var(--cert-text)}
.lr-badge.response{background:var(--response-bg);color:var(--response-text)}
.lr-badge.sponsored{background:linear-gradient(135deg,#fef3c7,#fde68a);color:#92400e;border:1px solid rgba(180,83,9,.25);font-weight:600}
.lr-badge.sponsored::before{content:"★";margin-right:2px}
.lr-badge.inquiries{background:var(--inquiry-bg);color:var(--inquiry-text)}
.lr-actions{flex-shrink:0;display:flex;gap:6px;flex-direction:column;align-items:stretch;margin-right:44px}
.lr-btn{padding:7px 16px;border-radius:8px;border:1.5px solid var(--border);font-size:.78rem;font-weight:600;color:var(--sidebar-active-text);background:var(--bg-card);cursor:pointer;transition:all .15s;text-align:center;white-space:nowrap;font-family:inherit}
.lr-btn:hover{background:var(--accent-bg);border-color:var(--featured-border);text-decoration:none}
.lr-btn.inquiry{background:#6366f1;color:#fff;border-color:#6366f1}
.lr-btn.inquiry:hover{background:#4f46e5}
.lr-btn.wa{background:#25d366;color:#fff;border-color:#25d366;display:flex;align-items:center;justify-content:center;gap:4px;padding:6px 12px;font-size:.72rem}
.lr-btn.wa:hover{background:#1da851}
.lr-btn.wa svg{width:14px;height:14px;fill:#fff;stroke:none}

/* 5-action row on listing card (View / Chat / Call / Inquire / RFQ) */
.lr-actions-5{display:grid !important;grid-template-columns:repeat(5,minmax(0,1fr));gap:6px;flex-direction:row !important;align-items:stretch;flex-shrink:0;margin-right:44px;min-width:340px}
.lr-actions-5 .lr-btn{padding:7px 6px;font-size:.74rem;font-weight:600;border-radius:7px;border:1.5px solid var(--border);background:var(--bg-card);color:var(--sidebar-active-text);cursor:pointer;text-align:center;white-space:nowrap;line-height:1;display:flex;align-items:center;justify-content:center;text-decoration:none;font-family:inherit;transition:all .15s}
.lr-actions-5 .lr-btn:hover{background:var(--accent-bg);border-color:var(--featured-border)}
.lr-actions-5 .lr-btn-view{background:var(--accent,#6366f1);color:#fff;border-color:var(--accent,#6366f1)}
.lr-actions-5 .lr-btn-view:hover{background:#4f46e5;border-color:#4f46e5;color:#fff}
.lr-actions-5 .lr-btn-chat{background:#dcfce7;color:#15803d;border-color:#bbf7d0}
.lr-actions-5 .lr-btn-chat:hover{background:#bbf7d0;color:#14532d;border-color:#86efac}
.lr-actions-5 .lr-btn-call{background:#dbeafe;color:#1e40af;border-color:#bfdbfe}
.lr-actions-5 .lr-btn-call:hover{background:#bfdbfe;color:#1e3a8a;border-color:#93c5fd}
.lr-actions-5 .lr-btn-inquire{background:var(--accent-bg,#eef2ff);color:var(--accent,#6366f1);border-color:var(--accent-bg,#e0e7ff)}
.lr-actions-5 .lr-btn-inquire:hover{background:var(--accent,#6366f1);color:#fff;border-color:var(--accent,#6366f1)}
.lr-actions-5 .lr-btn-rfq{background:#fef3c7;color:#92400e;border-color:#fde68a}
.lr-actions-5 .lr-btn-rfq:hover{background:#fde68a;color:#78350f;border-color:#fcd34d}
@media(max-width:980px){.lr-actions-5{min-width:0;margin-right:0;order:4;flex:0 0 100%;grid-template-columns:repeat(5,1fr);gap:4px}.lr-actions-5 .lr-btn{padding:9px 4px;font-size:.7rem;min-height:38px}}
@media(max-width:520px){.lr-actions-5{grid-template-columns:repeat(3,1fr);gap:4px}.lr-actions-5 .lr-btn{font-size:.72rem;min-height:36px}}

/* Language pill (EN / हि / गु) — Google Translate widget mount target */
.lang-pill .lp-btn{transition:all .15s}
.lang-pill .lp-btn:hover{filter:brightness(1.05)}
.lang-pill .lp-btn.on{background:var(--ink,#1e1b4b) !important;color:#fff !important}
@media(max-width:760px){.lang-pill{display:none !important}}
/* Hide Google Translate top bar artefacts if/when widget is enabled */
.goog-te-banner-frame.skiptranslate,.goog-te-gadget-icon{display:none !important}
body{top:0 !important}

/* ════════════════════════════════════════════════════════════════
   SHOWROOM v2 — namespaced under .sr-page
   Ports biz/mockups/01-showroom.html as the live page layout.
   All selectors scoped so they don't bleed into nav/drawer/cockpit.
   ════════════════════════════════════════════════════════════════ */
.sr-page{--sr-bg:#f8f9fa;--sr-card:#fff;--sr-card-h:#f3f4f6;--sr-border:#e5e7eb;--sr-border-h:#d1d5db;--sr-text:#374151;--sr-ink:#1e1b4b;--sr-muted:#6b7280;--sr-dim:#9ca3af;--sr-accent:#6366f1;--sr-accent-h:#4f46e5;--sr-accent-light:#818cf8;--sr-accent-bg:#eef2ff;--sr-gold:#fbbf24;--sr-gold-bg:#fef3c7;--sr-gold-deep:#92400e;--sr-success:#16a34a;--sr-success-bg:#dcfce7;--sr-shadow-sm:0 1px 2px rgba(30,27,75,.04);--sr-shadow:0 4px 16px rgba(30,27,75,.06);--sr-shadow-lg:0 12px 40px rgba(30,27,75,.10);background:var(--sr-bg);color:var(--sr-text);font-family:'Inter',system-ui,sans-serif;line-height:1.55}
.sr-page a{color:var(--sr-accent);text-decoration:none}
.sr-page a:hover{color:var(--sr-accent-h)}
.sr-page button{font-family:inherit;cursor:pointer;border:none}
.sr-page .sr-btn{display:inline-flex;align-items:center;gap:6px;padding:9px 16px;border-radius:8px;font-size:.85rem;font-weight:600;transition:all .15s;border:1.5px solid transparent;white-space:nowrap;text-decoration:none}
.sr-page .sr-btn-primary{background:var(--sr-accent);color:#fff}
.sr-page .sr-btn-primary:hover{background:var(--sr-accent-h);color:#fff}
.sr-page .sr-btn-ghost{background:var(--sr-card);color:var(--sr-ink);border-color:var(--sr-border)}
.sr-page .sr-btn-ghost:hover{border-color:var(--sr-border-h);background:var(--sr-card-h)}
.sr-page .sr-btn-gold{background:var(--sr-gold);color:var(--sr-ink);font-weight:700}
.sr-page .sr-btn-gold:hover{background:#f59e0b;color:var(--sr-ink)}
.sr-page .sr-ico{width:16px;height:16px;display:inline-block}

/* HERO */
.sr-page .sr-hero{padding:36px 0 28px;background:linear-gradient(180deg,#f8f9fa 0%,#fff 100%);position:relative;overflow:hidden}
.sr-page .sr-hero::before{content:'';position:absolute;top:-100px;right:-100px;width:500px;height:500px;background:radial-gradient(circle,rgba(99,102,241,.08),transparent 70%);pointer-events:none}
.sr-page .sr-hero-grid{display:grid;grid-template-columns:1.15fr .85fr;gap:60px;align-items:center;position:relative}
.sr-page .sr-hero h1{font-size:2.6rem;line-height:1.05;color:var(--sr-ink);margin:0 0 12px;letter-spacing:-.025em;font-weight:900;text-wrap:balance;max-width:560px}
.sr-page .sr-hero h1 .sr-gold{background:linear-gradient(135deg,#f59e0b,var(--sr-gold));-webkit-background-clip:text;background-clip:text;color:transparent}
.sr-page .sr-hero p.sr-lede{font-size:.98rem;color:var(--sr-muted);margin:0 0 18px;max-width:540px}
.sr-page .sr-search-pill{display:inline-flex;background:var(--sr-card);border:1px solid var(--sr-border);border-radius:10px;padding:3px;margin-bottom:12px;box-shadow:var(--sr-shadow-sm)}
.sr-page .sr-search-pill button{padding:7px 14px;border-radius:7px;background:transparent;color:var(--sr-muted);font-size:.78rem;font-weight:600;display:flex;align-items:center;gap:5px}
.sr-page .sr-search-pill button.on{background:var(--sr-ink);color:#fff}
.sr-page .sr-search-bar{display:flex;background:var(--sr-card);border:1.5px solid var(--sr-border);border-radius:14px;overflow:hidden;box-shadow:var(--sr-shadow);margin-bottom:14px;position:relative}
.sr-page .sr-search-bar:focus-within{border-color:var(--sr-accent);box-shadow:0 0 0 4px rgba(99,102,241,.10)}
.sr-page .sr-search-bar input{flex:1;border:none;outline:none;padding:16px 18px;font-size:.95rem;background:transparent;color:var(--sr-ink);font-family:inherit}
.sr-page .sr-search-bar select{border:none;border-left:1px solid var(--sr-border);padding:0 14px;font-size:.85rem;color:var(--sr-text);background:var(--sr-card);outline:none;font-family:inherit}
.sr-page .sr-search-bar button{padding:0 22px;background:var(--sr-accent);color:#fff;font-weight:700;font-size:.9rem;border:none;cursor:pointer}
.sr-page .sr-search-bar button:hover{background:var(--sr-accent-h)}
.sr-page .sr-popular{display:flex;gap:7px;flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none;font-size:.78rem;color:var(--sr-muted);align-items:center}
.sr-page .sr-popular::-webkit-scrollbar{display:none}
.sr-page .sr-popular b{color:var(--sr-ink);margin-right:4px}
.sr-page .sr-popular span,.sr-page .sr-popular .ps-tag{padding:4px 10px;background:var(--sr-card);border:1px solid var(--sr-border);border-radius:20px;cursor:pointer;transition:all .15s;white-space:nowrap;flex-shrink:0;color:var(--sr-text);font-size:.78rem;font-weight:500}
.sr-page .sr-popular span:hover,.sr-page .sr-popular .ps-tag:hover{border-color:var(--sr-accent);color:var(--sr-accent);background:var(--sr-accent-bg)}
.sr-page .sr-proof{display:flex;gap:12px;margin-top:24px;flex-wrap:wrap}
.sr-page .sr-proof-tile{flex:1;min-width:140px;background:var(--sr-card);border:1px solid var(--sr-border);border-radius:12px;padding:14px 16px;display:flex;align-items:center;gap:10px;box-shadow:var(--sr-shadow-sm)}
.sr-page .sr-proof-icon{width:36px;height:36px;border-radius:9px;background:var(--sr-accent-bg);color:var(--sr-accent);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.sr-page .sr-proof-icon.sr-gold-i{background:var(--sr-gold-bg);color:var(--sr-gold-deep)}
.sr-page .sr-proof-icon.sr-green-i{background:var(--sr-success-bg);color:var(--sr-success)}
.sr-page .sr-proof-tile b{display:block;color:var(--sr-ink);font-size:.92rem}
.sr-page .sr-proof-tile span{display:block;font-size:.73rem;color:var(--sr-muted)}
.sr-page .sr-collage{position:relative;height:360px}
.sr-page .sr-cc{position:absolute;background:var(--sr-card);border:1px solid var(--sr-border);border-radius:14px;padding:14px;box-shadow:var(--sr-shadow-lg);width:280px}
.sr-page .sr-cc1{top:20px;left:0;transform:rotate(-3deg)}
.sr-page .sr-cc2{top:90px;right:30px;transform:rotate(2deg);z-index:2}
.sr-page .sr-cc3{bottom:30px;left:60px;transform:rotate(-1deg)}
.sr-page .sr-cc-head{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.sr-page .sr-cc-logo{width:40px;height:40px;border-radius:9px;background:linear-gradient(135deg,#a78bfa,var(--sr-accent));display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:.85rem}
.sr-page .sr-cc-info{flex:1;min-width:0}
.sr-page .sr-cc-name{font-size:.86rem;font-weight:700;color:var(--sr-ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sr-page .sr-cc-loc{font-size:.7rem;color:var(--sr-muted)}
.sr-page .sr-cc-v{background:var(--sr-success-bg);color:var(--sr-success);font-size:.62rem;font-weight:700;padding:2px 7px;border-radius:5px}
.sr-page .sr-cc-tags{display:flex;gap:4px;flex-wrap:wrap;margin:6px 0}
.sr-page .sr-cc-tags span{font-size:.66rem;padding:2px 7px;background:var(--sr-bg);border-radius:5px;color:var(--sr-text)}
.sr-page .sr-cc-meta{font-size:.7rem;color:var(--sr-muted);margin-top:6px;display:flex;justify-content:space-between}
.sr-page .sr-cc-pulse{position:absolute;top:-8px;right:-8px;background:var(--sr-success);color:#fff;font-size:.62rem;font-weight:700;padding:3px 8px;border-radius:6px;animation:pulse 2s infinite}
@keyframes pulse{0%,100%{opacity:1}50%{opacity:.4}}
@media(max-width:1500px) and (min-width:920px){.sr-page .sr-collage{transform:scale(.9);transform-origin:top right}.sr-page .sr-cc{width:240px}}
@media(max-width:920px){.sr-page .sr-hero-grid{grid-template-columns:1fr;gap:36px}.sr-page .sr-collage{height:340px}.sr-page .sr-cc{width:240px}}
@media(max-width:600px){.sr-page .sr-hero h1{font-size:2.2rem}.sr-page .sr-hero p.sr-lede{font-size:.95rem}.sr-page .sr-collage{display:none}}

/* SECTION + DISCOVERY (3-LANE) */
.sr-page .sr-section{padding:36px 0}
.sr-page .sr-section-head{display:flex;align-items:end;justify-content:space-between;margin-bottom:24px;flex-wrap:wrap;gap:12px}
.sr-page .sr-section-head h2{margin:0;font-size:1.7rem;color:var(--sr-ink);letter-spacing:-.02em;font-weight:800}
.sr-page .sr-section-head .sr-sub{color:var(--sr-muted);font-size:.92rem;margin-top:4px}
.sr-page .sr-section-head .sr-more{font-size:.85rem;font-weight:600;color:var(--sr-accent);display:inline-flex;align-items:center;gap:4px}
.sr-page .sr-discovery{display:grid;grid-template-columns:220px 1fr 280px;gap:28px;margin-top:8px;align-items:start}
.sr-page .sr-lane-1{position:sticky;top:80px;max-height:calc(100vh - 100px);overflow-y:auto;padding-right:6px;-webkit-mask-image:linear-gradient(to bottom,#000 calc(100% - 28px),transparent);mask-image:linear-gradient(to bottom,#000 calc(100% - 28px),transparent)}
.sr-page .sr-lane-1::-webkit-scrollbar{width:6px}
.sr-page .sr-lane-1::-webkit-scrollbar-thumb{background:var(--sr-border);border-radius:3px}
@media(max-width:1100px){
  .sr-page .sr-discovery{display:flex;flex-direction:column;gap:16px}
  .sr-page .sr-lane-3{display:block;order:0}
  .sr-page .sr-lane-3 .sr-panel{display:none}
  .sr-page .sr-lane-3 .sr-signin-card{margin-bottom:0}
  .sr-page .sr-lane-2{order:1}
  .sr-page .sr-lane-1{order:2;position:static;max-height:none;-webkit-mask-image:none;mask-image:none}
}
@media(max-width:760px){.sr-page .sr-discovery{grid-template-columns:1fr}.sr-page .sr-lane-1{display:none}}
.sr-page .sr-lane-1 h4{font-size:.7rem;text-transform:uppercase;letter-spacing:.08em;color:var(--sr-muted);margin:0 0 12px;font-weight:700}
.sr-page .sr-sector-list{display:flex;flex-direction:column;gap:2px;list-style:none;padding:0;margin:0}
.sr-page .sr-sector-list a,.sr-page .sr-sector-list li>a{display:flex;justify-content:space-between;align-items:center;padding:9px 12px;border-radius:8px;font-size:.86rem;color:var(--sr-text);font-weight:500;transition:all .15s;text-decoration:none}
.sr-page .sr-sector-list a:hover,.sr-page .sr-sector-list li>a:hover{background:var(--sr-card);color:var(--sr-ink)}
.sr-page .sr-sector-list a.on,.sr-page .sr-sector-list a.active,.sr-page .sr-sector-list li.active>a{background:var(--sr-accent-bg);color:var(--sr-accent);font-weight:600}
.sr-page .sr-sector-list a small,.sr-page .sr-sector-list li>a small{color:var(--sr-dim);font-weight:400;font-size:.74rem}
.sr-page .sr-sector-more{font-size:.78rem;color:var(--sr-accent);padding:8px 12px;font-weight:600;display:inline-block;cursor:pointer}

/* PREMIUM LISTING CARD V2 */
.sr-page .sr-cards-row{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px}
.sr-page .sr-lcard{background:var(--sr-card);border:1px solid var(--sr-border);border-radius:12px;padding:16px;transition:all .2s;position:relative;overflow:hidden}
.sr-page .sr-lcard:hover{border-color:var(--sr-accent);transform:translateY(-2px);box-shadow:var(--sr-shadow)}
.sr-page .sr-lcard.sr-lcard-gold{border-color:var(--sr-gold);background:linear-gradient(180deg,#fffbeb 0%,var(--sr-card) 35%)}
.sr-page .sr-lcard.sr-lcard-gold::before{content:'★ Featured';position:absolute;top:0;right:0;background:var(--sr-gold);color:var(--sr-ink);font-size:.62rem;font-weight:800;padding:3px 9px;border-bottom-left-radius:8px;letter-spacing:.04em}
.sr-page .sr-lcard.sr-lcard-verified{border-color:var(--sr-accent-light)}
.sr-page .sr-lc-head{display:flex;gap:10px;margin-bottom:10px}
.sr-page .sr-lc-logo{width:42px;height:42px;border-radius:9px;background:linear-gradient(135deg,var(--sr-accent-light),var(--sr-accent));display:flex;align-items:center;justify-content:center;color:#fff;font-weight:800;font-size:.92rem;flex-shrink:0;overflow:hidden}
.sr-page .sr-lc-logo img{width:100%;height:100%;object-fit:cover;border-radius:9px}
.sr-page .sr-lc-name{font-size:.92rem;font-weight:700;color:var(--sr-ink);line-height:1.2;display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.sr-page .sr-lc-name .sr-vchip{background:var(--sr-success-bg);color:var(--sr-success);font-size:.6rem;font-weight:700;padding:1px 5px;border-radius:4px}
.sr-page .sr-lc-name .sr-gchip{background:var(--sr-gold-bg);color:var(--sr-gold-deep);font-size:.6rem;font-weight:700;padding:1px 5px;border-radius:4px}
.sr-page .sr-lc-meta{font-size:.72rem;color:var(--sr-muted);margin-top:3px}
.sr-page .sr-lc-act{display:flex;gap:4px;margin-left:auto}
.sr-page .sr-lc-act button{width:28px;height:28px;border-radius:7px;background:var(--sr-bg);color:var(--sr-muted);display:flex;align-items:center;justify-content:center;transition:all .15s;border:none;cursor:pointer}
.sr-page .sr-lc-act button:hover{background:var(--sr-accent-bg);color:var(--sr-accent)}
.sr-page .sr-lc-act button.fav.on{background:#fee2e2;color:#dc2626}
.sr-page .sr-lc-products{display:flex;gap:4px;flex-wrap:wrap;margin:8px 0;font-size:.72rem}
.sr-page .sr-lc-products span{padding:3px 8px;background:var(--sr-bg);color:var(--sr-text);border-radius:5px}
.sr-page .sr-lc-stats{display:flex;gap:10px;font-size:.7rem;color:var(--sr-muted);padding:8px 0;border-top:1px solid var(--sr-border);border-bottom:1px solid var(--sr-border);margin:10px 0;flex-wrap:wrap}
.sr-page .sr-lc-stats span{display:flex;align-items:center;gap:3px}
.sr-page .sr-lc-stats b{color:var(--sr-ink);font-weight:600}
.sr-page .sr-rating-pill{display:inline-flex;align-items:center;gap:5px;padding:3px 7px;border-radius:999px;background:#fffbeb;color:#92400e;border:1px solid #fde68a;font-weight:700;line-height:1}
.sr-page .sr-rating-pill .stars{color:#f59e0b;letter-spacing:0;font-size:.78rem}
.sr-page .sr-rating-pill.is-empty{background:var(--sr-bg);color:var(--sr-muted);border-color:var(--sr-border);font-weight:600}
.sr-page .sr-lc-actions{display:grid;grid-template-columns:repeat(6,1fr);gap:5px;margin-top:8px}
.sr-page .sr-lc-actions button,.sr-page .sr-lc-actions a{padding:7px 4px;border-radius:7px;font-size:.7rem;font-weight:600;display:flex;align-items:center;justify-content:center;gap:3px;transition:all .15s;border:none;cursor:pointer;text-decoration:none;line-height:1;white-space:nowrap}
.sr-page .sr-act-view{background:var(--sr-accent);color:#fff}
.sr-page .sr-act-view:hover{background:var(--sr-accent-h);color:#fff}
.sr-page .sr-act-wa{background:#dcfce7;color:#15803d}
.sr-page .sr-act-wa:hover{background:#bbf7d0;color:#14532d}
.sr-page .sr-act-chat{background:#e0f2fe;color:#0369a1}
.sr-page .sr-act-chat:hover{background:#bae6fd}
.sr-page .sr-act-call{background:#dbeafe;color:#1e40af}
.sr-page .sr-act-call:hover{background:#bfdbfe}
.sr-page .sr-act-inq{background:var(--sr-accent-bg);color:var(--sr-accent)}
.sr-page .sr-act-inq:hover{background:#dbeafe}
@media(max-width:760px){.sr-page .sr-lc-actions{grid-template-columns:repeat(3,1fr)}}
@media(max-width:520px){.sr-page .sr-lc-actions{grid-template-columns:repeat(3,1fr)}}

@media(max-width:760px){
    .sr-page .sr-lc-actions{grid-template-columns:repeat(3,1fr);gap:6px}
    .sr-page .sr-lc-actions button,.sr-page .sr-lc-actions a{min-height:40px;padding:9px 6px;font-size:.78rem;line-height:1.15}
    .sr-page .sr-lc-act button,.sr-page .sr-lc-act .compare-cb{width:34px;height:34px}
}

@media(max-width:600px){
    .sr-page .sr-search-bar{display:grid;grid-template-columns:1fr;overflow:hidden}
    .sr-page .sr-search-bar input{padding:14px 16px;border-bottom:1px solid var(--sr-border)}
    .sr-page .sr-search-bar select{border-left:none;border-top:1px solid var(--sr-border);padding:12px 14px}
    .sr-page .sr-search-bar button{width:100%;padding:12px 14px}
}

/* Compare checkbox — visible chip in card header */
.sr-page .sr-lc-act .compare-cb{appearance:none;-webkit-appearance:none;width:28px;height:28px;border-radius:7px;background:var(--sr-bg);border:1.5px solid var(--sr-border);position:relative;cursor:pointer;flex-shrink:0;transition:all .15s;display:inline-flex !important}
.sr-page .sr-lc-act .compare-cb:hover{background:var(--sr-accent-bg);border-color:var(--sr-accent)}
.sr-page .sr-lc-act .compare-cb::before{content:'⇌';position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--sr-muted);font-weight:700}
.sr-page .sr-lc-act .compare-cb:checked{background:var(--sr-accent);border-color:var(--sr-accent)}
.sr-page .sr-lc-act .compare-cb:checked::before{color:#fff;content:'✓'}

/* TRENDING RFQ ROWS + LANE 3 */
.sr-page .sr-rfq-rows{display:flex;flex-direction:column;gap:8px}
.sr-page .sr-rfq-row{display:flex;align-items:center;justify-content:space-between;background:var(--sr-card);border:1px solid var(--sr-border);border-radius:10px;padding:14px 16px;gap:10px}
.sr-page .sr-rfq-row:hover{border-color:var(--sr-accent)}
.sr-page .sr-rfq-info b{color:var(--sr-ink);font-size:.92rem}
.sr-page .sr-rfq-info span{display:block;font-size:.74rem;color:var(--sr-muted);margin-top:2px}
.sr-page .sr-bid-now{padding:7px 14px;background:var(--sr-gold);color:var(--sr-ink);border-radius:7px;font-size:.78rem;font-weight:700;flex-shrink:0;border:none;cursor:pointer}
.sr-page .sr-bid-now:hover{background:#f59e0b}
.sr-page .sr-lane-3 .sr-panel{background:var(--sr-card);border:1px solid var(--sr-border);border-radius:12px;padding:16px;margin-bottom:14px}
.sr-page .sr-lane-3 h5{margin:0 0 10px;font-size:.78rem;text-transform:uppercase;letter-spacing:.06em;color:var(--sr-muted);font-weight:700;display:flex;justify-content:space-between}
.sr-page .sr-lane-3 h5 b{color:var(--sr-accent);font-weight:700}
.sr-page .sr-signin-card{background:linear-gradient(135deg,var(--sr-ink) 0%,#312e81 100%);color:#fff;border-radius:12px;padding:18px;margin-bottom:14px}
.sr-page .sr-signin-card h4{margin:0 0 6px;font-size:1rem;color:#fff}
.sr-page .sr-signin-card p{font-size:.8rem;color:#cbd5e1;margin:0 0 12px}
.sr-page .sr-signin-card button,.sr-page .sr-signin-card a{display:block;width:100%;background:var(--sr-gold);color:var(--sr-ink);padding:10px;border-radius:8px;font-weight:700;font-size:.85rem;text-align:center;border:none;cursor:pointer;text-decoration:none;box-sizing:border-box}
.sr-page .sr-signin-card button:hover,.sr-page .sr-signin-card a:hover{background:#f59e0b;color:var(--sr-ink)}

/* BAND HEAD */
.sr-page .sr-band{margin-bottom:36px}
.sr-page .sr-band-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:14px}
.sr-page .sr-band-head h3{margin:0;font-size:1.15rem;color:var(--sr-ink);font-weight:700;display:flex;align-items:center;gap:8px}
.sr-page .sr-band-head h3 .sr-bicon{width:28px;height:28px;border-radius:7px;background:var(--sr-accent-bg);color:var(--sr-accent);display:flex;align-items:center;justify-content:center}
.sr-page .sr-band-head h3 .sr-bicon.sr-bg-gold{background:var(--sr-gold-bg);color:var(--sr-gold-deep)}
.sr-page .sr-band-head h3 .sr-bicon.sr-bg-green{background:var(--sr-success-bg);color:var(--sr-success)}
.sr-page .sr-band-head a{font-size:.78rem;color:var(--sr-accent);font-weight:600}

/* RFQ PROOF TIMELINE */
.sr-page .sr-rfq-proof{background:linear-gradient(135deg,var(--sr-ink),#312e81);color:#fff;border-radius:18px;padding:32px 36px;display:grid;grid-template-columns:.9fr 1.1fr;gap:28px;align-items:center;position:relative;overflow:hidden}
.sr-page .sr-rfq-proof::before{content:'';position:absolute;right:-200px;top:-200px;width:500px;height:500px;background:radial-gradient(circle,rgba(251,191,36,.18),transparent 60%);pointer-events:none}
@media(max-width:820px){.sr-page .sr-rfq-proof{grid-template-columns:1fr;padding:32px}}
.sr-page .sr-rfq-proof .sr-label{display:inline-block;background:rgba(251,191,36,.18);color:var(--sr-gold);font-size:.74rem;font-weight:700;padding:5px 11px;border-radius:6px;letter-spacing:.05em;text-transform:uppercase;margin-bottom:14px}
.sr-page .sr-rfq-proof h2{margin:0 0 10px;font-size:1.6rem;line-height:1.15;letter-spacing:-.02em;color:#fff}
.sr-page .sr-rfq-proof p{color:#cbd5e1;font-size:.95rem;margin:0 0 18px}
.sr-page .sr-rfq-proof small.sr-illustrative{display:block;font-size:.72rem;color:#94a3b8;margin-top:8px;font-style:italic}
.sr-page .sr-timeline{position:relative}
.sr-page .sr-tl-item{display:flex;gap:12px;margin-bottom:8px;align-items:start}
.sr-page .sr-tl-time{font-size:.72rem;color:var(--sr-gold);font-weight:700;width:78px;flex-shrink:0;text-align:right;padding-top:11px}
.sr-page .sr-tl-card{flex:1;background:rgba(255,255,255,.07);border:1px solid rgba(255,255,255,.12);border-radius:10px;padding:11px 14px;font-size:.85rem;backdrop-filter:blur(8px);color:#fff}
.sr-page .sr-tl-card b{color:#fff}
.sr-page .sr-tl-card span{display:block;font-size:.74rem;color:#94a3b8;margin-top:2px}

/* SECTORS VISUAL GRID */
.sr-page .sr-sector-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:14px}
.sr-page .sr-sec-tile{background:var(--sr-card);border:1px solid var(--sr-border);border-radius:12px;padding:18px;text-align:center;transition:all .2s;cursor:pointer;text-decoration:none;display:block}
.sr-page .sr-sec-tile:hover{border-color:var(--sr-accent);transform:translateY(-2px);box-shadow:var(--sr-shadow)}
.sr-page .sr-sec-icon{width:48px;height:48px;border-radius:11px;background:var(--sr-accent-bg);color:var(--sr-accent);display:flex;align-items:center;justify-content:center;margin:0 auto 10px}
.sr-page .sr-sec-tile b{display:block;font-size:.88rem;color:var(--sr-ink);margin-bottom:3px}
.sr-page .sr-sec-tile span{font-size:.72rem;color:var(--sr-muted)}

/* CITIES */
.sr-page .sr-city-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:10px}
.sr-page .sr-city{background:var(--sr-card);border:1px solid var(--sr-border);border-radius:10px;padding:14px;display:flex;align-items:center;gap:10px;transition:all .15s;cursor:pointer;text-decoration:none}
.sr-page .sr-city:hover{border-color:var(--sr-accent);background:var(--sr-accent-bg)}
.sr-page .sr-city svg{color:var(--sr-accent)}
.sr-page .sr-city b{font-size:.84rem;color:var(--sr-ink)}
.sr-page .sr-city span{font-size:.7rem;color:var(--sr-muted);display:block}

/* HIW */
.sr-page .sr-hiw{background:var(--sr-card);border-radius:14px;padding:28px;border:1px solid var(--sr-border)}
.sr-page .sr-hiw-tabs{display:flex;gap:6px;background:var(--sr-bg);padding:4px;border-radius:10px;width:fit-content;margin:0 auto 28px}
.sr-page .sr-hiw-tabs button{padding:9px 22px;border-radius:7px;font-size:.86rem;font-weight:600;color:var(--sr-muted);background:transparent;border:none;cursor:pointer}
.sr-page .sr-hiw-tabs button.on{background:var(--sr-card);color:var(--sr-ink);box-shadow:var(--sr-shadow-sm)}
.sr-page .sr-hiw-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}
@media(max-width:1000px){.sr-page .sr-hiw-grid{grid-template-columns:repeat(2,1fr)}}
@media(max-width:540px){.sr-page .sr-hiw-grid{grid-template-columns:1fr}.sr-page .sr-hiw{padding:24px}}
.sr-page .sr-hiw-step{padding:16px;border-radius:10px;background:var(--sr-bg);border:1px solid var(--sr-border);display:flex;flex-direction:column}
.sr-page .sr-hiw-num{width:30px;height:30px;border-radius:8px;background:var(--sr-accent);color:#fff;font-weight:800;display:flex;align-items:center;justify-content:center;font-size:.86rem;margin-bottom:10px}
.sr-page .sr-hiw-step b{display:block;font-size:.92rem;color:var(--sr-ink);margin:0 0 4px}
.sr-page .sr-hiw-step p{font-size:.8rem;margin:0 0 8px;color:var(--sr-text)}
.sr-page .sr-hiw-step small{display:inline-block;font-size:.68rem;color:var(--sr-accent);font-weight:700;margin-top:auto;padding:3px 8px;background:var(--sr-accent-bg);border-radius:5px;align-self:flex-start}

/* FAQ */
.sr-page .sr-faq{display:grid;grid-template-columns:1fr 1fr;gap:14px}
@media(max-width:820px){.sr-page .sr-faq{grid-template-columns:1fr}}
.sr-page .sr-faq details{background:var(--sr-card);border:1px solid var(--sr-border);border-radius:10px;padding:0}
.sr-page .sr-faq summary{padding:16px 18px;cursor:pointer;font-size:.92rem;font-weight:600;color:var(--sr-ink);list-style:none;display:flex;justify-content:space-between;align-items:center}
.sr-page .sr-faq summary::-webkit-details-marker{display:none}
.sr-page .sr-faq summary::after{content:'+';color:var(--sr-accent);font-weight:700;font-size:1.3rem;margin-left:12px}
.sr-page .sr-faq details[open] summary::after{content:'−'}
.sr-page .sr-faq p{padding:0 18px 16px;margin:0;font-size:.86rem;color:var(--sr-text)}

/* ── Hide ALL legacy directory shell when sr-page mode is active ──
   The relocator script lifts #sectors, #featured-container, #listings,
   #listings-container, #load-more-bar OUT of these containers into the
   sr-page mount points before / after first paint. Hiding the wrappers
   here removes the entire legacy enterprise grid + sidebar + breadcrumb
   + filter bars + trust strip + newsletter from visible flow. ── */
body.sr-v2 > section.hero,
body.sr-v2 .trust,
body.sr-v2 .trust-strip,
body.sr-v2 > div.container > div.main,
body.sr-v2 .how-it-works,
body.sr-v2 .home-customer-impact,
body.sr-v2 .testimonials,
body.sr-v2 > section.faq,
body.sr-v2 > section.cta,
body.sr-v2 > section.newsletter,
body.sr-v2 .filters-section,
body.sr-v2 .filter-bar,
body.sr-v2 .home-stats{display:none !important}
/* The wrapper container that holds <div class="main"> may also wrap stray bits — neutralise its layout */
body.sr-v2 > div.container:has(> div.main){display:none !important}
/* Ensure relocated mount points are visible (override any inherited display:none) */
body.sr-v2 #sr-mount-listings,
body.sr-v2 #sr-mount-listings-header,
body.sr-v2 #sr-mount-sectors,
body.sr-v2 #sr-mount-featured,
body.sr-v2 #sr-mount-loadmore{display:block !important}
body.sr-v2 #sr-mount-listings #listings-container{display:block !important}
body.sr-v2 #sr-mount-sectors #sectors{display:flex !important;flex-direction:column}
body.sr-v2 #sr-mount-listings-header #listings{display:flex !important}
body.sr-v2 #sr-mount-loadmore #load-more-bar{display:block !important}

/* ── Compare Bar ── */
.compare-bar{position:fixed;bottom:0;left:0;right:0;background:var(--compare-bg);color:#fff;padding:12px 24px;display:none;justify-content:space-between;align-items:center;z-index:100;box-shadow:0 -4px 20px rgba(0,0,0,.15);border-radius:16px 16px 0 0}
.compare-bar.visible{display:flex}
.compare-text{font-size:.88rem;font-weight:500}
.compare-text strong{color:#fbbf24}
.compare-btn{padding:8px 20px;border-radius:8px;background:#fbbf24;color:#1e1b4b;font-weight:700;font-size:.85rem;border:none;cursor:pointer;transition:transform .15s;font-family:inherit}
.compare-btn:hover{transform:translateY(-1px)}

/* ── Compare Modal ── */
.compare-modal-overlay{display:none;position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:500;align-items:center;justify-content:center;padding:20px}
.compare-modal-overlay.show{display:flex}
.compare-modal{background:var(--bg);border-radius:16px;width:95vw;max-width:1000px;max-height:85vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.2)}
.compare-modal-header{display:flex;align-items:center;justify-content:space-between;padding:16px 24px;border-bottom:1px solid var(--border)}
.compare-modal-header h3{margin:0;font-size:1.1rem}
.compare-modal-close{background:none;border:none;font-size:24px;cursor:pointer;color:var(--text-muted);padding:4px}
.compare-modal-body{overflow:auto;padding:20px}
.compare-table{width:100%;border-collapse:collapse;font-size:.85rem}
.compare-table th{text-align:left;padding:10px 12px;background:var(--bg);font-weight:600;color:var(--text-muted);font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;position:sticky;top:0;z-index:1;border-bottom:2px solid var(--border)}
.compare-table td{padding:10px 12px;border-bottom:1px solid var(--border);vertical-align:top}
.compare-table td:first-child{font-weight:600;color:var(--text-muted);white-space:nowrap;min-width:120px}
.compare-table .ct-name{font-weight:700;font-size:.95rem}
.compare-table .ct-verified{color:#059669;font-weight:600;font-size:.75rem}
.compare-table .ct-badge{display:inline-block;padding:2px 8px;border-radius:4px;background:var(--accent-bg);color:var(--accent);font-size:.72rem;font-weight:600;margin:2px}

/* ── Buyer Review Modal ── */
.review-modal-overlay{display:none;position:fixed;inset:0;background:rgba(15,23,42,.62);z-index:10020;align-items:center;justify-content:center;padding:18px;backdrop-filter:blur(6px)}
.review-modal-overlay.show{display:flex}
.review-modal{background:var(--bg);border:1px solid var(--border);border-radius:12px;width:min(560px,96vw);max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 24px 70px rgba(15,23,42,.28)}
.review-modal-header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:18px 22px;border-bottom:1px solid var(--border);background:var(--bg-card)}
.review-modal-header h3{margin:0;font-size:1.05rem;color:var(--text-primary);font-weight:800;line-height:1.25}
.review-modal-header p{margin:4px 0 0;color:var(--text-secondary);font-size:.82rem;line-height:1.45}
.review-modal-close{width:36px;height:36px;border-radius:8px;border:1px solid var(--border);background:var(--bg);color:var(--text-muted);font-size:22px;line-height:1;cursor:pointer;flex-shrink:0}
.review-modal-close:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.review-modal-body{padding:20px 22px;overflow:auto}
.review-notice{border:1px solid var(--border);border-radius:10px;background:var(--bg-card);padding:14px;color:var(--text-secondary);font-size:.88rem;line-height:1.55}
.review-notice strong{display:block;color:var(--text-primary);font-size:.95rem;margin-bottom:4px}
.review-field{margin-bottom:15px}
.review-field label{display:block;font-size:.76rem;font-weight:800;color:var(--text-primary);margin-bottom:7px;text-transform:uppercase;letter-spacing:.04em}
.review-field select,.review-field textarea,.review-field input{width:100%;border:1px solid var(--border);border-radius:9px;background:var(--bg-card);color:var(--text);font-family:inherit;font-size:.9rem;padding:10px 12px;outline:none;box-sizing:border-box}
.review-field textarea{min-height:112px;resize:vertical;line-height:1.55}
.review-field select:focus,.review-field textarea:focus,.review-field input:focus{border-color:var(--accent);box-shadow:0 0 0 4px rgba(99,102,241,.12)}
.review-rating-row{display:grid;grid-template-columns:130px 1fr;align-items:center;gap:10px;margin-bottom:10px}
.review-rating-label{font-size:.84rem;color:var(--text-secondary);font-weight:650}
.review-stars{display:flex;gap:4px}
.review-star{width:34px;height:34px;border-radius:8px;border:1px solid var(--border);background:var(--bg-card);color:#d1d5db;font-size:20px;line-height:1;cursor:pointer;transition:all .12s}
.review-star.on{background:#fffbeb;border-color:#f59e0b;color:#f59e0b}
.review-actions{display:flex;justify-content:flex-end;gap:10px;padding:16px 22px;border-top:1px solid var(--border);background:var(--bg-card)}
.review-btn{border:none;border-radius:9px;padding:10px 18px;font-size:.86rem;font-weight:800;cursor:pointer;font-family:inherit}
.review-btn.secondary{background:var(--badge-bg);color:var(--text)}
.review-btn.primary{background:var(--accent);color:#fff}
.review-btn.primary:disabled{opacity:.6;cursor:not-allowed}
.sr-page .sr-act-review{background:#fef3c7;color:#92400e}
.sr-page .sr-act-review:hover{background:#fde68a}
@media(max-width:520px){.review-rating-row{grid-template-columns:1fr}.review-star{width:38px;height:38px}.review-actions{flex-direction:column-reverse}.review-btn{width:100%}}

/* ── Loading / Empty ── */
.loading{text-align:center;padding:40px;color:var(--text-muted)}
.spinner{width:32px;height:32px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;margin:0 auto 12px}
.empty-state{text-align:center;padding:60px 20px;color:var(--text-muted)}
.empty-state svg{width:48px;height:48px;stroke:var(--text-dim);stroke-width:1.5;fill:none;margin-bottom:12px}
.empty-state h3{color:var(--text-secondary);font-size:1.1rem;margin-bottom:8px}

/* ── Testimonials ── */
.testimonials{background:var(--section-bg);border-top:1px solid var(--section-border);padding:56px 0;transition:background .3s}
.t-title{font-size:1.4rem;font-weight:800;color:var(--text-primary);text-align:center;margin-bottom:4px}
.t-sub{font-size:.9rem;color:var(--text-secondary);text-align:center;margin-bottom:32px}
.t-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:16px}
.t-card{padding:24px;border:1.5px solid var(--border);border-radius:12px;background:var(--testimonial-bg);transition:border-color .2s}
.t-card:hover{border-color:var(--featured-border)}
.t-stars{color:#fbbf24;font-size:.95rem;margin-bottom:8px;letter-spacing:1px}
.t-text{font-size:.88rem;color:var(--text);margin-bottom:14px;line-height:1.6}
.t-bottom{display:flex;align-items:center;gap:10px}
.t-avatar{width:36px;height:36px;border-radius:50%;background:var(--accent-bg);display:flex;align-items:center;justify-content:center;font-size:.78rem;font-weight:700;color:var(--accent);flex-shrink:0}
.t-auth{font-size:.82rem;font-weight:600;color:var(--text-primary)}
.t-role{font-size:.72rem;color:var(--text-muted)}

/* ── Newsletter ── */
.newsletter{padding:48px 0;background:var(--newsletter-bg);border-top:1px solid var(--newsletter-border);transition:background .3s}
.nl-inner{max-width:520px;margin:0 auto;text-align:center}
.nl-inner h3{font-size:1.2rem;font-weight:800;color:var(--text-primary);margin-bottom:6px}
.nl-inner p{font-size:.88rem;color:var(--text-secondary);margin-bottom:20px}
.nl-form{display:flex;gap:8px;max-width:440px;margin:0 auto}
.nl-form input{flex:1;padding:12px 16px;border-radius:8px;border:1.5px solid var(--featured-border);font-size:.9rem;font-family:inherit;outline:none;background:var(--bg-card);color:var(--text)}
.nl-form input:focus{border-color:var(--accent)}
.nl-form button{padding:12px 24px;border-radius:8px;background:#6366f1;color:#fff;border:none;font-weight:700;font-size:.85rem;cursor:pointer;white-space:nowrap;transition:background .15s;font-family:inherit}
.nl-form button:hover{background:#4f46e5}
.nl-note{font-size:.72rem;color:var(--text-muted);margin-top:10px}

/* ── FAQ ── */
.faq{padding:56px 0;background:var(--section-bg);border-top:1px solid var(--section-border);transition:background .3s}
.faq-title{font-size:1.4rem;font-weight:800;color:var(--text-primary);text-align:center;margin-bottom:6px}
.faq-sub{font-size:.9rem;color:var(--text-secondary);text-align:center;margin-bottom:32px}
.faq-list{max-width:720px;margin:0 auto}
.faq-item{border:1.5px solid var(--border);border-radius:10px;margin-bottom:8px;overflow:hidden;transition:border-color .2s}
.faq-item:hover{border-color:var(--featured-border)}
.faq-q{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;cursor:pointer;font-size:.92rem;font-weight:600;color:var(--text-primary);background:var(--bg-card);transition:background .15s}
.faq-q:hover{background:var(--bg-card-hover)}
.faq-q .arrow{width:20px;height:20px;stroke:var(--text-muted);stroke-width:2;fill:none;transition:transform .3s}
.faq-item.open .faq-q .arrow{transform:rotate(180deg)}
.faq-a{padding:0 20px 16px;font-size:.85rem;color:var(--text-secondary);line-height:1.6;display:none}
.faq-item.open .faq-a{display:block}

/* ── CTA ── */
.cta{padding:56px 0}
.cta-box{background:var(--cta-box-bg);border-radius:20px;padding:56px 48px;text-align:center;position:relative;overflow:hidden}
.cta-box::before{content:'';position:absolute;top:-40%;right:-10%;width:300px;height:300px;background:radial-gradient(circle,rgba(251,191,36,.1) 0%,transparent 70%);pointer-events:none}
.cta-box h2{font-size:1.6rem;font-weight:900;color:#fff;margin-bottom:10px;position:relative}
.cta-box p{color:#a5b4fc;margin-bottom:28px;max-width:500px;margin-left:auto;margin-right:auto;position:relative}
.cta-main{display:inline-block;padding:14px 36px;background:#fbbf24;color:#1e1b4b;font-weight:700;border-radius:10px;font-size:.95rem;transition:all .15s;position:relative}
.cta-main:hover{transform:translateY(-2px);text-decoration:none;box-shadow:0 4px 20px rgba(251,191,36,.3)}
.cta-secondary{display:block;color:#a5b4fc;font-size:.82rem;margin-top:14px;font-weight:500;position:relative}
.cta-secondary:hover{color:#fff;text-decoration:underline}

/* ── Footer ── */
.footer{background:var(--footer-bg);border-top:1px solid var(--section-border);padding:48px 0 24px;transition:background .3s}
.footer-grid{display:grid;grid-template-columns:1.5fr 1fr 1fr 1fr;gap:32px;margin-bottom:32px}
.footer-brand-name{font-size:1.2rem;font-weight:900;color:var(--text-primary);margin-bottom:8px;display:flex;align-items:center;gap:8px}
.footer-brand-name .brand-text{background:linear-gradient(135deg,#1e293b 0%,#6366f1 50%,#8b5cf6 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
[data-theme="dark"] .footer-brand-name .brand-text{background:linear-gradient(135deg,#c7d2fe 0%,#6366f1 50%,#8b5cf6 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text}
.footer-brand-name span{color:var(--accent);-webkit-text-fill-color:var(--accent)}
.footer-brand-name .brand-logo{width:24px;height:24px;border-radius:5px;object-fit:contain}
.footer-desc{font-size:.82rem;color:var(--text-secondary);line-height:1.5;margin-bottom:12px}
.footer-social{display:flex;gap:8px}
.footer-social a{width:32px;height:32px;border-radius:8px;background:var(--badge-bg);display:flex;align-items:center;justify-content:center;transition:all .15s}
.footer-social a:hover{background:var(--accent-bg)}
.footer-social a svg{width:16px;height:16px;stroke:var(--text-secondary);stroke-width:1.5;fill:none;stroke-linecap:round;stroke-linejoin:round}
.f-col-title{font-size:.78rem;font-weight:700;color:var(--text-primary);text-transform:uppercase;letter-spacing:.04em;margin-bottom:12px}
.f-links{list-style:none}
.f-links li{margin-bottom:6px}
.f-links a{font-size:.82rem;color:var(--text-secondary);font-weight:500;transition:color .15s}
.f-links a:hover{color:var(--sidebar-active-text);text-decoration:none}
.footer-bottom{border-top:1px solid var(--section-border);padding-top:20px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px}
.footer-bottom p{font-size:.78rem;color:var(--text-muted)}
.footer-bottom a{color:var(--accent);font-weight:600}
.footer-legal{display:flex;gap:16px}
.footer-legal a{font-size:.78rem;color:var(--text-muted);font-weight:500}
.footer-legal a:hover{color:var(--text);text-decoration:none}

/* ── Scroll to Top ── */
.scroll-top{position:fixed;bottom:24px;right:24px;width:44px;height:44px;border-radius:12px;background:#6366f1;color:#fff;border:none;cursor:pointer;display:none;align-items:center;justify-content:center;box-shadow:0 4px 16px rgba(99,102,241,.3);transition:all .2s;z-index:99}
.scroll-top:hover{transform:translateY(-2px);background:#4f46e5}
.scroll-top.visible{display:flex}
.scroll-top svg{width:20px;height:20px;stroke:#fff;stroke-width:2;fill:none}

/* ── Mobile Drawer ── */
.mobile-drawer-overlay{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:150;opacity:0;pointer-events:none;transition:opacity .25s ease;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px)}
.mobile-drawer-overlay.visible{opacity:1;pointer-events:auto}
.mobile-drawer{position:fixed;top:0;right:0;bottom:0;width:min(320px,85vw);background:var(--bg-card);z-index:151;transform:translateX(100%);transition:transform .3s cubic-bezier(.4,0,.2,1);box-shadow:-8px 0 32px rgba(0,0,0,.12);display:flex;flex-direction:column;overflow-y:auto;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}
.mobile-drawer.visible{transform:translateX(0)}
.drawer-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid var(--border);flex-shrink:0}
.drawer-header .drawer-title{font-size:1.1rem;font-weight:800;color:var(--text-primary);display:flex;align-items:center;gap:8px}
.drawer-header .drawer-title span{color:var(--accent)}
.drawer-close{width:44px;height:44px;border:none;background:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:10px;color:var(--text-muted)}
.drawer-close:hover{background:var(--badge-bg);color:var(--text)}
.drawer-close svg{width:22px;height:22px;stroke:currentColor;stroke-width:2;fill:none}
.drawer-nav{padding:12px 16px;display:flex;flex-direction:column;gap:2px;border-bottom:1px solid var(--border)}
.drawer-nav a{display:flex;align-items:center;gap:10px;padding:14px 16px;border-radius:10px;font-size:.95rem;font-weight:600;color:var(--text);text-decoration:none;transition:background .15s}
.drawer-nav a:hover,.drawer-nav a.active{background:var(--sidebar-active-bg);color:var(--sidebar-active-text)}
.drawer-nav a svg{width:20px;height:20px;stroke:currentColor;stroke-width:1.5;fill:none;flex-shrink:0}
.drawer-section{padding:16px}
.drawer-section-title{font-size:.72rem;font-weight:700;color:var(--text-muted);text-transform:uppercase;letter-spacing:.06em;margin-bottom:10px;padding:0 4px}
.drawer-sectors{display:flex;flex-direction:column;gap:2px}
.drawer-sector{display:flex;align-items:center;gap:10px;padding:12px 14px;border-radius:10px;font-size:.88rem;font-weight:500;color:var(--text);cursor:pointer;transition:background .15s}
.drawer-sector:hover,.drawer-sector.active{background:var(--sidebar-active-bg);color:var(--sidebar-active-text)}
.drawer-sector svg{width:18px;height:18px;stroke:currentColor;stroke-width:1.5;fill:none;flex-shrink:0}
.drawer-cities{display:flex;flex-wrap:wrap;gap:6px;padding:4px 0}
.drawer-city{padding:10px 16px;border-radius:100px;font-size:.82rem;font-weight:500;color:var(--text-secondary);background:var(--badge-bg);border:1.5px solid var(--border);cursor:pointer;transition:all .15s}
.drawer-city:hover,.drawer-city.active{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.drawer-cta{margin:20px 16px;padding:14px;border-radius:10px;background:var(--accent);color:#fff;font-weight:700;font-size:.92rem;border:none;cursor:pointer;text-align:center;display:block;text-decoration:none;font-family:inherit;transition:background .15s}
.drawer-cta:hover{background:var(--accent-hover);text-decoration:none;color:#fff}

/* ── Drawer Search ── */
.drawer-search{padding:12px 16px;border-bottom:1px solid var(--border)}
.drawer-search-box{position:relative}
.drawer-search-box input{width:100%;padding:11px 14px 11px 38px;border-radius:10px;border:1.5px solid var(--border);background:var(--bg);color:var(--text);font-size:.88rem;font-family:inherit;outline:none;transition:border-color .15s;box-sizing:border-box}
.drawer-search-box input:focus{border-color:var(--accent)}
.drawer-search-box input::placeholder{color:var(--text-dim)}
.drawer-search-box svg{position:absolute;left:12px;top:50%;transform:translateY(-50%);width:16px;height:16px;stroke:var(--text-muted);stroke-width:2;fill:none;pointer-events:none}
.drawer-search-tabs{display:flex;gap:4px;margin-top:8px}
.drawer-search-tab{flex:1;padding:7px 0;border-radius:8px;border:none;background:var(--badge-bg);color:var(--text-secondary);font-size:.75rem;font-weight:600;cursor:pointer;font-family:inherit;transition:all .15s;text-align:center}
.drawer-search-tab.active{background:var(--accent);color:#fff}
.drawer-no-results{padding:12px 16px;font-size:.82rem;color:var(--text-muted);text-align:center;display:none}

/* ── Mobile Sector Pills ── */
.mobile-sector-pills{display:none;overflow-x:auto;gap:8px;padding:14px 16px;-webkit-overflow-scrolling:touch;scrollbar-width:none;scroll-snap-type:x proximity;position:relative}
.mobile-sector-pills::-webkit-scrollbar{display:none}
.mobile-sector-pills::after{content:none}
.m-sector-pill{display:flex;align-items:center;gap:6px;padding:10px 16px;border-radius:100px;font-size:.82rem;font-weight:600;color:var(--text-secondary);background:var(--bg-card);border:1.5px solid var(--border);white-space:nowrap;cursor:pointer;flex-shrink:0;scroll-snap-align:start;transition:all .15s;min-height:44px}
.m-sector-pill:hover,.m-sector-pill.active{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.m-sector-pill svg{width:16px;height:16px;stroke:currentColor;stroke-width:1.5;fill:none;flex-shrink:0}

/* ── Mobile Sticky CTA ── */
@media(max-width:768px){
    .mobile-cta{position:fixed;bottom:0;left:0;right:0;background:var(--bg-card);border-top:1px solid var(--border);padding:10px 16px;display:flex;gap:8px;z-index:80;box-shadow:0 -2px 12px rgba(0,0,0,.05);transition:transform .3s ease}
    .mobile-cta .m-btn{flex:1;padding:14px;border-radius:10px;font-weight:700;font-size:.88rem;border:none;cursor:pointer;text-align:center;font-family:inherit;min-height:48px;display:flex;align-items:center;justify-content:center}
    .mobile-cta .m-primary{background:#6366f1;color:#fff}
    .mobile-cta .m-secondary{background:var(--badge-bg);color:var(--text)}
    .mobile-cta.hidden{transform:translateY(100%)}
}
@media(min-width:769px){.mobile-cta{display:none}}

/* ── Responsive ── */
@media(max-width:900px){.main{grid-template-columns:1fr}.sidebar{display:none}.mobile-sector-pills{display:flex}}

/* Intermediate breakpoint — compacts nav between tablet & desktop so logged-in
   header (theme + avatar + Logout + workspace + lang + 2 CTAs) fits cleanly */
@media(max-width:1280px){
    .nav .container{gap:18px}
    .nav-center{gap:18px}
    .nav-center a{font-size:.83rem}
    .nav-right{gap:6px}
    .auth-user-bar .user-name{display:none}
    .auth-user-bar{gap:0}
    /* Avatar becomes the logout affordance — text Logout is hidden to free space */
    .auth-user-bar .user-logout{display:none}
    .auth-user-bar .user-avatar{cursor:pointer;transition:all .15s;border:1.5px solid transparent}
    .auth-user-bar .user-avatar:hover{border-color:var(--accent);transform:scale(1.05)}
    .auth-user-bar .user-avatar::after{content:"";position:absolute}
    .nav-btn{padding:6px 12px;font-size:.78rem}
    .theme-toggle{width:32px;height:32px}
    .lang-pill #lang-select{padding:5px 22px 5px 24px !important;font-size:.74rem !important}
}
@media(max-width:1080px){
    .nav-center{gap:12px}
    .nav-center a{font-size:.8rem}
    /* Hide "List my business" — Post Requirement is the primary logged-in CTA */
    .nav-right>a.btn-primary{display:none}
}

@media(max-width:768px){
    /* Viewport overflow prevention */
    html,body{overflow-x:hidden}
    /* Hero */
    .hero-inner{flex-direction:column;text-align:center}.hero-img{display:none}
    .hero{padding:36px 0 44px}
    .hero-search{flex-direction:column;gap:10px}
    .hero-search input{padding:14px 16px;font-size:1rem;border-radius:10px}
    .hero-search select{padding:14px 16px;font-size:.9rem;border-radius:10px;min-width:auto}
    .hero-search button{padding:16px;border-radius:10px;font-size:.95rem;min-height:50px}
    .hero-text h1{font-size:1.7rem;line-height:1.2}
    .hero-text p{font-size:.95rem}
    .hero-stats{flex-wrap:wrap;justify-content:center;gap:8px}
    .hero-stat{padding:10px 14px;min-width:72px}
    .hero-stat-val{font-size:1.3rem}
    .hero-stat-label{font-size:.62rem}

    /* Nav */
    .nav-center{display:none}
    .nav-hamburger{display:flex}
    .nav .container{height:52px;padding:0 16px}
    .nav-brand{font-size:1.2rem}
    .nav-right .nav-btn,.nav-right .auth-user-bar .user-logout{font-size:.78rem;padding:6px 12px}
    .nav-right>a.nav-btn{display:none}
    .nav-right>#nav-login-btn,.nav-right>#nav-signup-btn{display:none}
    .buyer-ws-trigger.visible{display:inline-flex !important;width:34px;height:34px;font-size:15px}

    /* Topbar */
    .topbar-inner{font-size:.7rem;gap:8px}
    .topbar{padding:6px 0}

    /* How It Works — hidden on mobile (user request) */
    .how-it-works{display:none}

    /* Listings — Card layout for mobile */
    .listing-row{flex-direction:row;flex-wrap:wrap;align-items:center;gap:10px;padding:14px 16px}
    .lr-check{display:none}
    .lr-num{display:none}
    .lr-logo{width:44px;height:44px;flex-shrink:0}
    .lr-name{font-size:.9rem}
    .lr-tag{font-size:.78rem;white-space:normal;-webkit-line-clamp:2;display:-webkit-box;-webkit-box-orient:vertical;overflow:hidden}
    .listing-row .lr-logo{order:1;flex:0 0 44px}
    .listing-row .lr-info{order:2;flex:1 1 0;min-width:calc(100% - 60px)}
    .listing-row .lr-badges{order:3;display:flex !important;flex-wrap:wrap;gap:4px;flex:0 0 100%}
    .listing-row .lr-actions{order:4;flex-direction:row;flex:0 0 100%;gap:8px;margin-right:0}
    .lr-badge{font-size:.68rem;padding:4px 10px}
    .lr-btn{flex:1;text-align:center;padding:12px 10px;min-height:44px;display:flex;align-items:center;justify-content:center;font-size:.82rem}

    /* Footer */
    .footer-grid{grid-template-columns:1fr;gap:28px}
    .footer-bottom{flex-direction:column;text-align:center;gap:10px}

    /* Filter Bar */
    .filter-bar{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:none;gap:6px;padding-bottom:2px}
    .filter-bar::-webkit-scrollbar{display:none}
    .filter-chip{min-height:40px;padding:8px 14px;font-size:.8rem}

    /* Enterprise Search & Filter — Mobile */
    .main{overflow-x:hidden}
    .search-filter-bar{flex-direction:column;gap:8px;padding:10px 16px;position:sticky;top:52px;border-radius:0;margin-left:-16px;margin-right:-16px;border-left:0;border-right:0;overflow:hidden}
    .sfb-search input{width:100%;box-sizing:border-box}
    .sfb-search{min-width:0;width:100%}
    .sfb-search input{padding:12px 14px 12px 36px;min-height:44px;font-size:.9rem}
    .sfb-divider{display:none}
    .sfb-filters{width:100%;overflow-x:auto;flex-wrap:nowrap;scrollbar-width:none;-webkit-overflow-scrolling:touch}
    .sfb-filters::-webkit-scrollbar{display:none}
    .sfb-dropdown-btn,.sfb-sort-btn{min-height:40px;padding:8px 12px;flex-shrink:0}
    .sfb-panel{position:fixed;top:auto;bottom:0;left:0;right:0;min-width:100%;max-height:60vh;border-radius:16px 16px 0 0;border-bottom:0}
    .active-filters{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:none;padding-bottom:2px}
    .active-filters::-webkit-scrollbar{display:none}
    .af-tag{flex-shrink:0}
    .load-more-btn{width:100%;min-height:48px}

    /* Featured Banner */
    .featured-banner{padding:18px 14px}
    .fb-card{width:200px;padding:14px}

    /* Various */
    .popular-searches{justify-content:center}
    .ps-tag{padding:8px 14px;font-size:.78rem;min-height:36px;display:flex;align-items:center}
    .cta-box{padding:36px 20px}
    .cta-box h2{font-size:1.3rem}
    .t-grid{grid-template-columns:1fr}
    .t-card{padding:20px}
    .nl-form{flex-direction:column;gap:10px}
    .nl-form input{padding:14px 16px;font-size:.95rem}
    .nl-form button{padding:14px;min-height:48px}

    /* Breadcrumb & Content Header */
    .breadcrumb{font-size:.75rem;padding:0 0 8px;overflow:hidden;text-overflow:ellipsis}
    .content-header{flex-direction:column;align-items:flex-start;gap:10px}
    .sort-select{width:100%;padding:10px 14px;min-height:44px}
    .container{padding:0 16px}
    .content{min-width:0;overflow-x:hidden}

    /* FAQ */
    .faq-q{padding:16px;font-size:.88rem;min-height:56px}
    .faq-a{padding:0 16px 16px;font-size:.85rem}
    .faq-tabs{overflow-x:auto;flex-wrap:nowrap;scrollbar-width:none;padding-bottom:0}
    .faq-tabs::-webkit-scrollbar{display:none}
    .faq-tab-btn{flex-shrink:0;padding:10px 14px;font-size:.82rem}
    .hiw-grid-5{grid-template-columns:1fr 1fr!important}
    .hiw-grid-5::before{display:none}
    .hiw-tabs{max-width:100%;margin-bottom:20px}

    /* Auth Modal */
    .auth-box{margin:16px;max-width:calc(100vw - 32px);padding:24px 20px}
    .auth-field input{padding:12px 14px;min-height:44px}
    .auth-btn{min-height:48px;font-size:.9rem}

    /* Spacing for mobile sticky CTA — on footer, not body, to avoid blank white space */
    body{padding-bottom:0}
    .footer{padding-bottom:80px}

    /* Scroll to top + Chat FAB positioning */
    .scroll-top{bottom:80px;right:12px;width:40px;height:40px;border-radius:10px}
    .scroll-top svg{width:18px;height:18px}
    .chat-fab{bottom:140px;right:12px;width:48px;height:48px}

    /* Trust bar — 2×2 grid on mobile, left-aligned items */
    .trust{padding:12px 0}
    .trust-row{display:grid;grid-template-columns:1fr 1fr;gap:6px 0;padding:0 16px}
    .trust-item{font-size:.76rem;min-height:32px;justify-content:flex-start;gap:5px}
    .trust-item svg{width:16px;height:16px}
    .trust-live{grid-column:1/-1;justify-self:center;margin-top:4px;font-size:.76rem;padding:3px 10px}

    /* Media bar — hide on mobile (beta product, inauthentic) */
    .media-bar{display:none}

    /* Newsletter / CTA sections */
    .newsletter{padding:36px 0}
    .faq{padding:40px 0}
    .testimonials{padding:40px 0}
    .cta{padding:40px 0}
    .how-it-works{padding:36px 0}

    /* Mobile sector pills enhanced */
    .mobile-sector-pills{padding:12px 16px;gap:6px}

    /* Hero Search Tabs — mobile */
    .hero-search-tabs{gap:0}
    .hero-search-tab{padding:10px 8px;font-size:.78rem;gap:4px;min-width:0;overflow:hidden}
    .hero-search-tab svg{width:14px;height:14px}
    .hero-search-tab .tab-badge{font-size:.52rem;padding:1px 4px}
    .hero-search-area{padding:10px 10px 8px}
    .hero-search input,.hero-search select,.hero-search button{width:100%;max-width:100%}
    .uc-hint{font-size:.72rem;padding:6px 10px}
    /* Mobile sector pills fade — disabled (::after sticky doesn't work in overflow containers) */
    .mobile-sector-pills::after{display:none}
}

/* ── Small screens (<480px) ── */
@media(max-width:480px){
    .hero-text h1{font-size:1.45rem}
    .hero-stats{gap:6px}
    .hero-stat{padding:8px 10px;min-width:65px}
    .hero-stat-val{font-size:1.15rem}
    .nav-brand .brand-badge{display:none}
    .nav-right .nav-btn{padding:6px 10px;font-size:.75rem}
    .footer-grid{grid-template-columns:1fr}
    .topbar-inner .topbar-tag:nth-child(2),.topbar-inner .topbar-tag:nth-child(3){display:none}
    .lr-actions{flex-direction:column;margin-right:0}
    .lr-btn{width:100%}
    /* Hero search tabs — stack text when very small */
    .hero-search-tab{font-size:.72rem;padding:9px 6px;gap:3px}
    .hero-search-tab .tab-badge{display:none}
    /* Trust bar — single column on very small screens */
    .trust-row{grid-template-columns:1fr;gap:4px;padding:0 12px}
    .trust-item{font-size:.72rem}
    .trust-live{font-size:.72rem}
    /* Search filter bar — tighter padding */
    .search-filter-bar{padding:8px 12px}
    .sfb-dropdown-btn,.sfb-sort-btn{padding:7px 10px;font-size:.75rem}
}

/* ── Performance: Reduce motion ── */
@media(prefers-reduced-motion:reduce){
    *,*::before,*::after{animation-duration:.01ms !important;animation-iteration-count:1 !important;transition-duration:.01ms !important;scroll-behavior:auto !important}
}

/* ── GPU hints for animated elements ── */
.mobile-drawer,.mobile-drawer-overlay,.mobile-cta,.scroll-top,.chat-fab,.chat-panel,.nav{will-change:transform}
.listing-row,.fb-card,.hiw-num{will-change:auto}

/* ── Auth Modal ── */
.auth-overlay{position:fixed;inset:0;background:rgba(0,0,0,.5);z-index:200;display:none;align-items:center;justify-content:center;backdrop-filter:blur(4px)}
.auth-overlay.visible{display:flex}
.auth-box{background:var(--bg-card);border:1.5px solid var(--border);border-radius:16px;padding:32px;width:100%;max-width:420px;position:relative;box-shadow:0 20px 60px rgba(0,0,0,.15)}
.auth-box h2{font-size:1.3rem;font-weight:800;color:var(--text-primary);margin-bottom:4px}
.auth-box .auth-sub{font-size:.85rem;color:var(--text-secondary);margin-bottom:20px}
.auth-box .auth-close{position:absolute;top:16px;right:16px;background:none;border:none;cursor:pointer;color:var(--text-muted);font-size:1.2rem;padding:4px 8px;border-radius:6px}
.auth-box .auth-close:hover{background:var(--badge-bg);color:var(--text)}
.auth-field{margin-bottom:14px}
.auth-field label{display:block;font-size:.78rem;font-weight:600;color:var(--text-secondary);margin-bottom:4px}
.auth-field input{width:100%;padding:10px 14px;border:1.5px solid var(--border);border-radius:8px;font-size:.88rem;font-family:inherit;background:var(--bg);color:var(--text);outline:none;transition:border-color .15s}
.auth-field input:focus{border-color:var(--accent)}
.auth-name-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.auth-terms-row{display:flex;align-items:flex-start;gap:8px;margin:2px 0 16px;font-size:.82rem;color:var(--text-secondary);line-height:1.45}
.auth-terms-row input{margin-top:3px;flex-shrink:0;width:15px;height:15px;accent-color:#6366f1}
.auth-terms-row a{color:var(--accent);font-weight:600}
.auth-password-match{font-size:.75rem;margin-top:5px;display:none}
.auth-password-match.visible{display:block}
.auth-password-match.ok{color:#16a34a}
.auth-password-match.bad{color:#ef4444}
@media(max-width:560px){.auth-name-row{grid-template-columns:1fr;gap:0}}
.auth-btn{width:100%;padding:12px;border-radius:8px;border:none;font-size:.88rem;font-weight:700;cursor:pointer;font-family:inherit;transition:all .15s}
.auth-btn.primary{background:#6366f1;color:#fff}
.auth-btn.primary:hover{background:#4f46e5}
.auth-btn.primary:disabled{opacity:.6;cursor:not-allowed}
.auth-btn.google{background:var(--bg);color:var(--text);border:1.5px solid var(--border);display:flex;align-items:center;justify-content:center;gap:8px;margin-top:10px}
.auth-btn.google:hover{background:var(--bg-card-hover);border-color:var(--border-hover)}
.auth-btn.google svg{width:18px;height:18px}
.auth-divider{display:flex;align-items:center;gap:10px;margin:16px 0;color:var(--text-muted);font-size:.78rem}
.auth-divider::before,.auth-divider::after{content:'';flex:1;height:1px;background:var(--border)}
.auth-toggle{text-align:center;margin-top:16px;font-size:.82rem;color:var(--text-secondary)}
.auth-toggle a{color:var(--accent);font-weight:600;cursor:pointer}
.auth-error{background:rgba(239,68,68,.1);color:#ef4444;padding:8px 12px;border-radius:8px;font-size:.82rem;margin-bottom:12px;display:none}
.auth-error.visible{display:block}
.auth-success{background:rgba(34,197,94,.1);color:#16a34a;padding:8px 12px;border-radius:8px;font-size:.82rem;margin-bottom:12px;display:none}
.auth-success.visible{display:block}
.auth-user-bar{display:flex;align-items:center;gap:8px;font-size:.82rem;color:var(--text);font-weight:500}
.auth-user-bar .user-avatar{width:28px;height:28px;border-radius:50%;background:var(--accent-bg);display:flex;align-items:center;justify-content:center;font-size:.72rem;font-weight:700;color:var(--accent)}
.auth-user-bar .user-name{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.auth-user-bar .user-logout{color:var(--text-muted);cursor:pointer;font-size:.75rem;margin-left:4px}
.auth-user-bar .user-logout:hover{color:var(--accent)}
/* Password strength hints */
.pwhint{color:var(--text-muted);padding-left:16px;position:relative}
.pwhint::before{content:'○';position:absolute;left:0;font-size:.7rem;top:.05em}
.pwhint.ok{color:#16a34a}
.pwhint.ok::before{content:'✓'}

/* ── Chat Panel ── */
.chat-fab{position:fixed;bottom:80px;right:24px;width:56px;height:56px;border-radius:50%;background:#6366f1;color:#fff;border:none;cursor:pointer;display:none;align-items:center;justify-content:center;box-shadow:0 4px 20px rgba(99,102,241,.35);z-index:90;transition:all .2s}
.chat-fab:hover{transform:scale(1.05);background:#4f46e5}
.chat-fab.visible{display:flex}
.chat-fab svg{width:24px;height:24px;stroke:#fff;stroke-width:2;fill:none}
.chat-fab .chat-badge{position:absolute;top:-4px;right:-4px;background:#ef4444;color:#fff;font-size:.65rem;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px}
.chat-panel{position:fixed;bottom:0;right:0;width:400px;max-width:100vw;height:80vh;max-height:600px;background:var(--bg-card);border:1.5px solid var(--border);border-radius:16px 16px 0 0;box-shadow:0 -8px 40px rgba(0,0,0,.12);z-index:200;display:none;flex-direction:column;overflow:hidden}
.chat-panel.visible{display:flex}
.chat-header{padding:14px 16px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:10px;background:var(--bg-card);flex-shrink:0}
.chat-header h3{font-size:.95rem;font-weight:700;color:var(--text-primary);flex:1;margin:0}
.chat-header-conv{background:linear-gradient(135deg,#fff 0%,#f8fafc 100%)}
.chat-title-wrap{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}
.chat-title-wrap h3{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chat-conv-subtitle{font-size:.7rem;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chat-header .chat-back,.chat-header .chat-close{background:none;border:none;cursor:pointer;color:var(--text-muted);padding:4px;border-radius:6px}
.chat-header .chat-back:hover,.chat-header .chat-close:hover{background:var(--badge-bg);color:var(--text)}
.chat-header .chat-back svg,.chat-header .chat-close svg{width:18px;height:18px;stroke:currentColor;stroke-width:2;fill:none}
.chat-list{flex:1;overflow-y:auto;padding:8px}
.chat-list-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;cursor:pointer;transition:all .15s}
.chat-list-item:hover{background:var(--bg-card-hover)}
.chat-list-item .cli-avatar{width:40px;height:40px;border-radius:10px;background:var(--accent-bg);display:flex;align-items:center;justify-content:center;font-size:.82rem;font-weight:700;color:var(--accent);flex-shrink:0}
.chat-list-item .cli-info{flex:1;min-width:0}
.chat-list-item .cli-name{font-size:.85rem;font-weight:600;color:var(--text-primary)}
.chat-list-item .cli-preview{font-size:.75rem;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chat-list-item .cli-time{font-size:.68rem;color:var(--text-muted);flex-shrink:0}
.chat-list-item .cli-unread{background:#6366f1;color:#fff;font-size:.65rem;font-weight:700;min-width:18px;height:18px;border-radius:9px;display:flex;align-items:center;justify-content:center;padding:0 4px;flex-shrink:0}
.chat-summary{border-bottom:1px solid var(--border);flex-shrink:0;background:var(--bg-card)}
.chat-summary-toggle{display:flex;align-items:center;gap:8px;width:100%;background:none;border:none;cursor:pointer;padding:8px 16px;font-size:.8rem;font-weight:600;color:var(--text-secondary);font-family:inherit;text-align:left}
.chat-summary-toggle:hover{background:var(--badge-bg)}
.chat-summary-caret{margin-left:auto;font-size:.65rem;color:var(--text-muted)}
.chat-summary-body{padding:10px 16px 12px;background:#f8fafc}
.chat-summary-state{font-size:.78rem;color:var(--text-muted)}
.chat-summary-points{display:flex;flex-direction:column;gap:5px}
.chat-kp{display:flex;align-items:center;gap:6px;font-size:.8rem;line-height:1.35}
.chat-kp-icon{flex-shrink:0;font-size:.85rem;width:16px;text-align:center}
.chat-kp-lbl{font-weight:600;color:var(--text-secondary);flex-shrink:0}
.chat-kp-val{color:var(--text-primary);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-tools{padding:8px 12px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:6px;background:var(--bg-card);flex-shrink:0}
.chat-search-wrap{flex:1;min-width:0;position:relative}
.chat-search-wrap svg{position:absolute;left:9px;top:50%;transform:translateY(-50%);width:14px;height:14px;stroke:var(--text-muted);stroke-width:2;fill:none;pointer-events:none}
.chat-search-wrap input{width:100%;height:32px;border:1px solid var(--border);border-radius:8px;background:var(--bg);color:var(--text);font:inherit;font-size:.78rem;padding:0 10px 0 30px;outline:none}
.chat-search-wrap input:focus{border-color:#6366f1;box-shadow:0 0 0 2px rgba(99,102,241,.12)}
.chat-tool-btn{height:32px;border:1px solid var(--border);background:#fff;color:var(--text-secondary);font:inherit;font-size:.72rem;font-weight:700;border-radius:8px;padding:0 9px;cursor:pointer;flex-shrink:0}
.chat-tool-btn:hover{border-color:#6366f1;color:#4f46e5;background:#eef2ff}
.chat-messages{flex:1;overflow-y:auto;padding:12px 16px;display:flex;flex-direction:column;gap:6px}
.chat-system-note{text-align:center;padding:22px 12px;color:var(--text-muted);font-size:.82rem;line-height:1.45}
.chat-msg{max-width:80%;padding:8px 12px;border-radius:12px;font-size:.84rem;line-height:1.5;word-break:break-word}
.chat-msg.mine{align-self:flex-end;background:#6366f1;color:#fff;border-bottom-right-radius:4px}
.chat-msg.theirs{align-self:flex-start;background:var(--badge-bg);color:var(--text);border-bottom-left-radius:4px}
.chat-msg .msg-time{font-size:.65rem;opacity:.7;margin-top:2px}
.chat-msg .msg-attach{margin-top:4px}
.chat-msg .msg-attach a{color:inherit;text-decoration:underline;font-size:.78rem}
.chat-msg .msg-attach img{max-width:200px;max-height:150px;border-radius:8px;margin-top:4px;cursor:pointer}
.chat-msg-deleted{font-style:italic;color:var(--text-muted);font-size:.8rem;padding:4px 0}
.chat-staged-files{padding:8px 12px;border-top:1px solid var(--border);background:#f8fafc;display:flex;gap:6px;flex-wrap:wrap;flex-shrink:0}
.chat-staged-file{display:flex;align-items:center;gap:6px;max-width:100%;border:1px solid rgba(99,102,241,.18);background:#fff;border-radius:999px;padding:4px 6px 4px 8px;font-size:.72rem;color:var(--text-secondary)}
.chat-staged-file span{max-width:170px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.chat-staged-file button{width:18px;height:18px;border:0;border-radius:50%;background:#eef2ff;color:#4f46e5;cursor:pointer;line-height:18px;padding:0;font-size:.78rem}
.chat-input-bar{padding:10px 12px;border-top:1px solid var(--border);display:flex;gap:8px;align-items:center;background:var(--bg-card);flex-shrink:0}
.chat-input-bar input{flex:1;padding:8px 12px;border:1.5px solid var(--border);border-radius:8px;font-size:.85rem;font-family:inherit;background:var(--bg);color:var(--text);outline:none}
.chat-input-bar input:focus{border-color:var(--accent)}
.chat-input-bar button{padding:8px 14px;border-radius:8px;border:none;background:#6366f1;color:#fff;font-weight:600;font-size:.82rem;cursor:pointer;font-family:inherit;flex-shrink:0}
.chat-input-bar button:hover{background:#4f46e5}
.chat-input-bar button:disabled{opacity:.5;cursor:not-allowed}
.chat-input-bar .attach-btn{background:none;border:none;cursor:pointer;color:var(--text-muted);padding:4px}
.chat-input-bar .attach-btn:hover{color:var(--accent)}
.chat-input-bar .attach-btn svg{width:18px;height:18px;stroke:currentColor;stroke-width:2;fill:none}
.chat-stopped-notice{padding:10px 16px;background:rgba(234,88,12,.08);color:var(--inquiry-text);font-size:.82rem;text-align:center;border-top:1px solid var(--border)}
.chat-stopped-notice button{background:#6366f1;color:#fff;border:none;padding:4px 12px;border-radius:6px;font-size:.78rem;font-weight:600;cursor:pointer;margin-left:6px;font-family:inherit}
.chat-privacy-bar{padding:8px 16px;background:var(--accent-bg);font-size:.78rem;color:var(--text-secondary);display:flex;align-items:flex-start;justify-content:space-between;gap:10px;border-top:1px solid var(--border)}
.chat-privacy-main{display:flex;flex-direction:column;gap:6px;min-width:0}
.chat-privacy-bar label{display:flex;align-items:center;gap:6px;cursor:pointer;line-height:1.25}
.chat-share-options{display:none;align-items:center;gap:10px;flex-wrap:wrap;color:var(--text-muted);font-size:.72rem}
.chat-privacy-bar.sharing .chat-share-options{display:flex}
.chat-share-state{font-size:.68rem;color:var(--accent);font-weight:700;white-space:nowrap;margin-top:1px}
.chat-privacy-bar input[type=checkbox]{accent-color:#6366f1}
.chat-empty{flex:1;display:flex;align-items:center;justify-content:center;text-align:center;padding:40px;color:var(--text-muted);font-size:.88rem}
.chat-login-prompt{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:40px;gap:12px}
.chat-login-prompt svg{width:48px;height:48px;stroke:var(--text-dim);stroke-width:1.5;fill:none}
.chat-login-prompt h4{color:var(--text-primary);font-size:1rem;margin:0}
.chat-login-prompt p{color:var(--text-secondary);font-size:.85rem;margin:0}
.chat-login-prompt button{padding:10px 24px;border-radius:8px;background:#6366f1;color:#fff;border:none;font-weight:700;font-size:.88rem;cursor:pointer;font-family:inherit}
@media(max-width:480px){.chat-panel{width:100vw;height:100vh;max-height:100vh;border-radius:0}.chat-tools{gap:5px}.chat-tool-btn{padding:0 7px}.chat-msg{max-width:86%}}

/* ── Listing Detail Drawer ── */
.ld-overlay{position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:300;opacity:0;visibility:hidden;transition:opacity .25s ease,visibility .25s ease;backdrop-filter:blur(2px)}
.ld-overlay.visible{opacity:1;visibility:visible}
.ld-drawer{position:fixed;top:0;right:0;bottom:0;width:560px;max-width:100vw;background:var(--bg);z-index:301;transform:translateX(100%);transition:transform .3s cubic-bezier(.32,.72,0,1);overflow-y:auto;overflow-x:hidden;box-shadow:-8px 0 40px rgba(0,0,0,.12)}
.ld-drawer.visible{transform:translateX(0)}
.ld-drawer-header{position:sticky;top:0;z-index:2;background:var(--bg);border-bottom:1px solid var(--border);padding:14px 20px;display:flex;align-items:center;gap:12px}
.ld-drawer-header .ld-back{background:none;border:none;cursor:pointer;color:var(--text-muted);padding:6px;border-radius:8px;display:flex;align-items:center}
.ld-drawer-header .ld-back:hover{background:var(--badge-bg);color:var(--text)}
.ld-drawer-header .ld-back svg{width:20px;height:20px;stroke:currentColor;stroke-width:2;fill:none}
.ld-drawer-header .ld-title{flex:1;font-size:.92rem;font-weight:700;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ld-drawer-header .ld-share{background:none;border:1.5px solid var(--border);padding:6px 12px;border-radius:8px;font-size:.75rem;font-weight:600;color:var(--text-secondary);cursor:pointer;display:flex;align-items:center;gap:5px;white-space:nowrap;font-family:inherit}
.ld-drawer-header .ld-share:hover{border-color:var(--accent);color:var(--accent);background:var(--accent-bg)}
.ld-drawer-header .ld-share svg{width:14px;height:14px;stroke:currentColor;stroke-width:2;fill:none}
.ld-loading{display:flex;align-items:center;justify-content:center;padding:80px 20px;color:var(--text-muted)}
.ld-loading .spinner{width:28px;height:28px;border:3px solid var(--border);border-top-color:var(--accent);border-radius:50%;animation:spin .8s linear infinite;margin-right:12px}
.ld-hero{position:relative;padding:28px 24px 24px;background:linear-gradient(135deg,var(--hero-gradient-1),var(--hero-gradient-2));color:#fff}
.ld-hero-top{display:flex;gap:16px;align-items:flex-start}
.ld-hero-logo{width:64px;height:64px;border-radius:14px;background:rgba(255,255,255,.15);display:flex;align-items:center;justify-content:center;font-size:1.2rem;font-weight:800;flex-shrink:0;overflow:hidden;border:2px solid rgba(255,255,255,.2)}
.ld-hero-logo img{width:100%;height:100%;object-fit:cover}
.ld-hero-text{flex:1;min-width:0}
.ld-hero-text h2{font-size:1.3rem;font-weight:800;margin:0 0 4px;line-height:1.2}
.ld-hero-text .ld-tagline{font-size:.85rem;opacity:.85;line-height:1.4;margin-bottom:8px}
.ld-hero-badges{display:flex;flex-wrap:wrap;gap:6px}
.ld-hero-badges .ld-hb{padding:3px 10px;border-radius:6px;font-size:.7rem;font-weight:600;background:rgba(255,255,255,.15);display:flex;align-items:center;gap:4px}
.ld-hero-badges .ld-hb svg{width:11px;height:11px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.ld-hero-badges .ld-hb.verified{background:rgba(34,197,94,.25)}
.ld-section{padding:20px 24px;border-bottom:1px solid var(--border)}
.ld-section:last-child{border-bottom:none}
.ld-section-title{font-size:.82rem;font-weight:700;color:var(--text-primary);margin-bottom:12px;display:flex;align-items:center;gap:7px}
.ld-section-title svg{width:16px;height:16px;stroke:var(--accent);stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round;flex-shrink:0}
.ld-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(130px,1fr));gap:8px}
.ld-stat{padding:10px 12px;border-radius:10px;background:var(--bg-card);border:1px solid var(--border)}
.ld-stat-label{font-size:.68rem;font-weight:500;color:var(--text-muted);margin-bottom:2px;display:flex;align-items:center;gap:5px}
.ld-stat-label svg{width:12px;height:12px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.ld-stat-value{font-size:.88rem;font-weight:700;color:var(--text-primary)}
.ld-rating-summary{display:flex;align-items:center;gap:12px;padding:14px;border-radius:12px;background:var(--bg-card);border:1px solid var(--border)}
.ld-rating-score{font-size:1.8rem;font-weight:800;color:var(--text-primary);line-height:1}
.ld-rating-stars{color:#f59e0b;font-size:1.05rem;letter-spacing:0;line-height:1.2}
.ld-rating-count{font-size:.78rem;color:var(--text-muted);margin-top:3px}
.ld-about{font-size:.85rem;line-height:1.65;color:var(--text-secondary)}
.ld-about.clamped{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden}
.ld-about-toggle{display:inline;font-size:.78rem;font-weight:600;color:var(--accent);cursor:pointer;margin-top:4px}
.ld-certs{display:flex;flex-wrap:wrap;gap:6px}
.ld-cert{padding:4px 10px;border-radius:6px;font-size:.72rem;font-weight:600;background:var(--cert-bg);color:var(--cert-text);display:flex;align-items:center;gap:4px}
.ld-cert svg{width:11px;height:11px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.ld-products{display:flex;flex-direction:column;gap:10px}
.ld-product{padding:14px;border-radius:10px;background:var(--bg-card);border:1px solid var(--border);transition:border-color .15s}
.ld-product:hover{border-color:var(--featured-border)}
.ld-product-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px;margin-bottom:6px}
.ld-product-name{font-size:.88rem;font-weight:700;color:var(--text-primary)}
.ld-product-flags{display:flex;gap:4px}
.ld-product-flag{padding:2px 7px;border-radius:4px;font-size:.62rem;font-weight:600;background:var(--accent-bg);color:var(--accent)}
.ld-product-desc{font-size:.78rem;color:var(--text-secondary);line-height:1.5;margin-bottom:8px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ld-product-meta{display:flex;flex-wrap:wrap;gap:8px;font-size:.72rem;color:var(--text-muted)}
.ld-product-meta span{display:flex;align-items:center;gap:4px}
.ld-product-meta svg{width:11px;height:11px;stroke:currentColor;stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.ld-contact-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.ld-contact-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:10px;background:var(--bg-card);border:1px solid var(--border);text-decoration:none;color:var(--text);transition:border-color .15s}
.ld-contact-item:hover{border-color:var(--accent);color:var(--accent)}
.ld-contact-icon{width:34px;height:34px;border-radius:8px;background:var(--accent-bg);display:flex;align-items:center;justify-content:center;flex-shrink:0}
.ld-contact-icon svg{width:16px;height:16px;stroke:var(--accent);stroke-width:2;fill:none;stroke-linecap:round;stroke-linejoin:round}
.ld-contact-icon.wa svg{stroke:none;fill:#25d366}
.ld-contact-label{font-size:.68rem;color:var(--text-muted)}
.ld-contact-value{font-size:.82rem;font-weight:600;color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ld-social{display:flex;gap:8px;margin-top:10px}
.ld-social a{width:34px;height:34px;border-radius:8px;background:var(--badge-bg);display:flex;align-items:center;justify-content:center;transition:all .15s;text-decoration:none}
.ld-social a:hover{background:var(--accent-bg)}
.ld-social a svg{width:16px;height:16px;stroke:var(--text-secondary);stroke-width:2;fill:none}
.ld-social a:hover svg{stroke:var(--accent)}
.ld-drawer-footer{position:sticky;bottom:0;z-index:2;background:var(--bg);border-top:1px solid var(--border);padding:12px 24px;display:flex;gap:8px}
.ld-drawer-footer .ld-cta{flex:1;padding:10px;border-radius:10px;font-size:.85rem;font-weight:700;border:none;cursor:pointer;font-family:inherit;text-align:center;text-decoration:none;display:flex;align-items:center;justify-content:center;gap:6px;transition:all .15s}
.ld-drawer-footer .ld-cta svg{width:16px;height:16px;stroke:currentColor;stroke-width:2;fill:none}
.ld-drawer-footer .ld-cta.primary{background:#6366f1;color:#fff}
.ld-drawer-footer .ld-cta.primary:hover{background:#4f46e5}
.ld-drawer-footer .ld-cta.secondary{background:var(--bg-card);color:var(--text);border:1.5px solid var(--border)}
.ld-drawer-footer .ld-cta.secondary:hover{border-color:var(--accent);color:var(--accent)}
.ld-drawer-footer .ld-cta.wa{background:#25d366;color:#fff}
.ld-drawer-footer .ld-cta.wa:hover{background:#1da851}
.ld-drawer-footer .ld-cta.wa svg{fill:#fff;stroke:none}
@media(max-width:640px){
    .ld-drawer{width:100vw}
    .ld-contact-grid{grid-template-columns:1fr}
    .ld-hero-top{flex-direction:column;align-items:center;text-align:center}
    .ld-hero-badges{justify-content:center}
}

/* ── Procurement: Trust & Shortlist ── */
.lr-trust{display:flex;align-items:center;gap:4px;font-size:.72rem;color:#6b7280;margin-top:2px}
.lr-trust .trust-score{background:#ecfdf5;color:#059669;padding:1px 6px;border-radius:10px;font-weight:600;font-size:.68rem}
.lr-trust .review-stars{color:#f59e0b;letter-spacing:1px}
.lr-shortlist{position:absolute;top:50%;right:10px;transform:translateY(-50%);background:rgba(255,255,255,.9);border:none;border-radius:50%;width:32px;height:32px;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:16px;color:#d1d5db;transition:color .2s,transform .15s;z-index:5}
.lr-shortlist:hover,.lr-shortlist.active{color:#ef4444;transform:translateY(-50%) scale(1.15)}
.lr-shortlist.active{color:#ef4444}

/* ── Buyer Workspace Panel ── */
.buyer-ws-backdrop{display:none;position:fixed;inset:0;background:rgba(0,0,0,.3);z-index:199}
.buyer-ws-backdrop.open{display:block}
.buyer-ws{display:none;position:fixed;top:0;right:0;bottom:0;width:420px;max-width:100vw;background:var(--bg-card);z-index:200;box-shadow:-4px 0 24px rgba(0,0,0,.12);overflow-y:auto;transition:transform .25s ease}
.buyer-ws.open{display:block}
.buyer-ws-header{position:sticky;top:0;background:var(--bg-card);padding:16px 20px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;z-index:1}
.buyer-ws-header h3{margin:0;font-size:1rem}
.buyer-ws-close{background:none;border:none;font-size:20px;cursor:pointer;color:var(--text-muted)}
.buyer-ws-tabs{display:flex;gap:0;border-bottom:1px solid var(--border);padding:0 16px;background:var(--bg)}
.buyer-ws-tab{padding:10px 16px;font-size:.82rem;font-weight:500;border:none;background:none;cursor:pointer;color:var(--text-muted);border-bottom:2px solid transparent;transition:all .2s}
.buyer-ws-tab.active{color:var(--accent);border-bottom-color:var(--accent)}
.buyer-ws-body{padding:16px 20px}
.buyer-ws-empty{text-align:center;padding:40px 20px;color:var(--text-muted)}
.buyer-ws-empty .emoji{font-size:40px;margin-bottom:8px}
.buyer-ws-card{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:12px;margin-bottom:10px}
.buyer-ws-card .bw-name{font-weight:600;font-size:.88rem}
.buyer-ws-card .bw-meta{font-size:.75rem;color:var(--text-muted)}
.buyer-ws-card .bw-actions{display:flex;gap:8px;margin-top:8px}
.buyer-ws-card .bw-btn{padding:4px 12px;border-radius:6px;font-size:.75rem;border:1px solid var(--border);background:var(--bg-card);cursor:pointer;font-weight:500;transition:all .2s}
.buyer-ws-card .bw-btn.primary{background:var(--accent);color:#fff;border-color:var(--accent)}

/* ─── Buyer Cockpit (full-page mode for /cockpit route) ─── */
/* Reuses the buyer-ws panel; adds .fullpage modifier to span entire viewport */
.buyer-ws.fullpage{position:fixed !important;top:64px;left:0;right:0;bottom:0;width:100% !important;max-width:100% !important;box-shadow:none;background:var(--bg);overflow-y:auto;z-index:50}
.buyer-ws.fullpage .buyer-ws-header{background:var(--bg-card);padding:18px 24px;border-bottom:1px solid var(--border)}
.buyer-ws.fullpage .buyer-ws-header h3{font-size:1.25rem;font-weight:700}
.buyer-ws.fullpage .buyer-ws-close{display:none}
.buyer-ws.fullpage .buyer-ws-tabs{padding:0 24px;background:var(--bg-card);position:sticky;top:0;z-index:2;overflow-x:auto;-webkit-overflow-scrolling:touch}
.buyer-ws.fullpage .buyer-ws-tab{padding:14px 20px;font-size:.92rem}
.buyer-ws.fullpage .buyer-ws-body{padding:24px 24px 60px;max-width:1200px;margin:0 auto}
.buyer-ws.fullpage .buyer-ws-card{padding:16px;border-radius:12px}
.cockpit-summary{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:12px;margin-bottom:24px}
.cockpit-summary .cs-tile{background:var(--bg-card);border:1px solid var(--border);border-radius:12px;padding:14px 16px}
.cockpit-summary .cs-num{font-size:1.6rem;font-weight:800;color:var(--ink,#1e1b4b);line-height:1}
.cockpit-summary .cs-lbl{font-size:.74rem;color:var(--text-muted);font-weight:500;margin-top:4px;text-transform:uppercase;letter-spacing:.04em}
.cockpit-summary .cs-tile.accent .cs-num{color:var(--accent,#6366f1)}
.cockpit-summary .cs-tile.gold .cs-num{color:#b45309}
.cockpit-summary .cs-tile.green .cs-num{color:#15803d}
.cockpit-back{display:inline-flex;align-items:center;gap:6px;font-size:.85rem;color:var(--text-muted);text-decoration:none;margin-bottom:14px;font-weight:500}
.cockpit-back:hover{color:var(--accent)}
@media(max-width:760px){
  .buyer-ws.fullpage{top:56px}
  .buyer-ws.fullpage .buyer-ws-header{padding:14px 16px}
  .buyer-ws.fullpage .buyer-ws-header h3{font-size:1.05rem}
  .buyer-ws.fullpage .buyer-ws-tabs{padding:0 12px}
  .buyer-ws.fullpage .buyer-ws-tab{padding:11px 14px;font-size:.82rem}
  .buyer-ws.fullpage .buyer-ws-body{padding:16px 14px 60px}
  .cockpit-summary{grid-template-columns:repeat(2,1fr);gap:8px}
}
/* Hide directory page sections when cockpit is active */
body.cockpit-mode > .nav-bar,body.cockpit-mode .nav-bar{position:sticky;top:0;z-index:60}
body.cockpit-mode .topbar,body.cockpit-mode .hero,body.cockpit-mode #sectors,body.cockpit-mode #listings,body.cockpit-mode .testimonials,body.cockpit-mode .newsletter,body.cockpit-mode .faq,body.cockpit-mode .cta,body.cockpit-mode .footer,body.cockpit-mode .how-it-works,body.cockpit-mode .trust-strip,body.cockpit-mode .home-customer-impact,body.cockpit-mode .compare-tray,body.cockpit-mode .mobile-sticky-cta,body.cockpit-mode .filters-section{display:none !important}

/* ── Buyer Workspace: Push Notifications tab ── */
.bw-push-hero{position:relative;padding:16px;border-radius:12px;background:linear-gradient(135deg,rgba(99,102,241,.12),rgba(139,92,246,.06));border:1px solid var(--border);margin-bottom:14px;overflow:hidden}
.bw-push-hero::after{content:'';position:absolute;top:-30px;right:-30px;width:140px;height:140px;border-radius:50%;background:radial-gradient(circle,rgba(99,102,241,.22),transparent 70%);pointer-events:none}
.bw-push-hero-row{display:flex;align-items:center;gap:12px;position:relative;z-index:1}
.bw-push-hero-icon{width:40px;height:40px;border-radius:10px;display:grid;place-items:center;background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;box-shadow:0 6px 16px rgba(99,102,241,.3);flex-shrink:0}
.bw-push-hero-title{font-size:.92rem;font-weight:700;color:var(--text);margin:0 0 4px;letter-spacing:-.01em}
.bw-push-status{display:inline-flex;align-items:center;gap:5px;font-size:.72rem;font-weight:600;padding:2px 9px;border-radius:999px;border:1px solid;line-height:1.4}
.bw-push-status.on{background:rgba(16,185,129,.1);color:#10b981;border-color:rgba(16,185,129,.25)}
.bw-push-status.off{background:rgba(245,158,11,.1);color:#f59e0b;border-color:rgba(245,158,11,.25)}
.bw-push-status.blocked{background:rgba(239,68,68,.1);color:#ef4444;border-color:rgba(239,68,68,.25)}
.bw-push-status-dot{width:6px;height:6px;border-radius:50%;background:currentColor;box-shadow:0 0 6px currentColor}
.bw-push-actions{display:flex;gap:6px;margin-top:12px;flex-wrap:wrap;position:relative;z-index:1}
.bw-push-actions .bw-btn{font-size:.74rem;padding:6px 12px;display:inline-flex;align-items:center;gap:5px}
.bw-push-actions .bw-btn.primary{background:linear-gradient(135deg,#6366f1,#8b5cf6);border:none;color:#fff;box-shadow:0 4px 12px rgba(99,102,241,.3)}
.bw-push-group-label{font-size:.66rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text-muted);margin:16px 0 8px;display:flex;align-items:center;gap:6px}
.bw-push-group-label::after{content:'';flex:1;height:1px;background:linear-gradient(90deg,var(--border),transparent);margin-left:6px}
.bw-push-item{display:flex;align-items:center;gap:11px;padding:11px 0;border-bottom:1px solid var(--border)}
.bw-push-item:last-child{border-bottom:none}
.bw-push-item-icon{width:30px;height:30px;border-radius:8px;display:grid;place-items:center;background:rgba(99,102,241,.1);color:#6366f1;flex-shrink:0}
.bw-push-item-text{flex:1;min-width:0}
.bw-push-item-label{font-size:.82rem;font-weight:500;color:var(--text);display:flex;align-items:center;gap:6px;flex-wrap:wrap;line-height:1.3}
.bw-push-item-desc{font-size:.72rem;color:var(--text-muted);margin-top:2px}
.bw-push-rec{font-size:.6rem;font-weight:700;padding:1px 6px;border-radius:999px;background:rgba(99,102,241,.14);color:#818cf8;text-transform:uppercase;letter-spacing:.04em;border:1px solid rgba(99,102,241,.22)}
.bw-push-switch{position:relative;width:36px;height:20px;border-radius:999px;border:none;padding:0;cursor:pointer;transition:background .2s;background:var(--border);flex-shrink:0}
.bw-push-switch[data-on="1"]{background:#6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.12)}
.bw-push-switch:disabled{opacity:.4;cursor:not-allowed}
.bw-push-switch .bw-push-thumb{position:absolute;top:3px;left:3px;width:14px;height:14px;border-radius:50%;background:#fff;transition:transform .22s cubic-bezier(.4,0,.2,1);box-shadow:0 1px 2px rgba(0,0,0,.25)}
.bw-push-switch[data-on="1"] .bw-push-thumb{transform:translateX(16px)}
.bw-push-empty{padding:28px 16px;text-align:center;color:var(--text-muted);border:1px dashed var(--border);border-radius:10px;font-size:.82rem}

/* ── RFQ Form Modal - Automail premium procurement surface ── */
.rfq-modal-overlay{display:none;position:fixed;inset:0;background:rgba(10,15,30,.72);z-index:10000;justify-content:center;align-items:center;padding:18px;backdrop-filter:blur(10px)}
.rfq-modal-overlay.show{display:flex}
.rfq-modal{background:#fff;border:1px solid rgba(99,102,241,.18);border-radius:8px;padding:24px;width:520px;max-width:92vw;max-height:88vh;overflow-y:auto;box-shadow:0 24px 70px rgba(10,15,30,.34),0 0 0 1px rgba(255,255,255,.72)}
.rfq-brand{display:flex;align-items:center;gap:10px;margin-bottom:16px;padding-bottom:14px;border-bottom:1px solid #e5eaf5}
.rfq-brand img{width:34px;height:34px;border-radius:8px;box-shadow:0 10px 28px rgba(99,102,241,.24)}
.rfq-brand span{font-size:.76rem;font-weight:800;text-transform:uppercase;letter-spacing:.08em;color:#667085}
.rfq-modal h3{margin:0 0 18px;font-size:1.16rem;line-height:1.25;color:#101828;display:flex;align-items:center;gap:8px;letter-spacing:0;font-weight:800}
.rfq-modal h3 svg{color:#6366f1;flex-shrink:0}
.rfq-modal label{display:block;font-size:.74rem;font-weight:750;margin-bottom:6px;color:#344054;text-transform:uppercase;letter-spacing:.04em}
.rfq-modal input,.rfq-modal textarea,.rfq-modal select{width:100%;padding:11px 12px;border:1px solid #d9e2f0;border-radius:8px;font-size:.9rem;margin-bottom:14px;box-sizing:border-box;background:#fff;color:#101828;font-family:inherit;transition:border-color .18s,box-shadow .18s,background .18s}
.rfq-modal input:hover,.rfq-modal textarea:hover,.rfq-modal select:hover{border-color:#b7c5da;background:#fbfdff}
.rfq-modal input:focus,.rfq-modal textarea:focus,.rfq-modal select:focus{outline:none;border-color:#6366f1;box-shadow:0 0 0 4px rgba(99,102,241,.12)}
.rfq-modal textarea{resize:vertical;min-height:96px;line-height:1.55}
.rfq-cat{position:relative;margin-bottom:6px}
.rfq-cat-trigger{width:100%;min-height:42px;display:flex;align-items:center;justify-content:space-between;gap:10px;padding:10px 12px;border:1px solid #d9e2f0;border-radius:8px;background:#fff;color:#101828;font-size:.9rem;font-family:inherit;text-align:left;cursor:pointer;transition:border-color .18s,box-shadow .18s,background .18s}
.rfq-cat-trigger:hover{border-color:#b7c5da;background:#fbfdff}
.rfq-cat-trigger:focus{outline:none;border-color:#6366f1;box-shadow:0 0 0 4px rgba(99,102,241,.12)}
.rfq-cat-trigger span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rfq-cat-trigger b{width:8px;height:8px;border-right:2px solid #667085;border-bottom:2px solid #667085;transform:rotate(45deg);margin-top:-4px;flex-shrink:0}
.rfq-cat.open .rfq-cat-trigger b{transform:rotate(225deg);margin-top:4px}
.rfq-cat-menu{display:none;position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:10020;background:#fff;border:1px solid #d9e2f0;border-radius:10px;box-shadow:0 18px 44px rgba(16,24,40,.18);overflow:hidden}
.rfq-cat.open .rfq-cat-menu{display:block}
.rfq-cat-menu input{border:0;border-bottom:1px solid #e5eaf5;border-radius:0;margin:0;padding:11px 12px;box-shadow:none}
.rfq-cat-menu input:focus{box-shadow:none;border-color:#e5eaf5}
.rfq-cat-results{max-height:280px;overflow-y:auto;padding:6px}
.rfq-cat-item{display:grid;grid-template-columns:1fr auto;gap:6px 10px;padding:9px 10px;border-radius:8px;cursor:pointer;color:#101828;font-size:.86rem}
.rfq-cat-item:hover,.rfq-cat-item.active{background:#eef2ff}
.rfq-cat-item strong{font-weight:750;line-height:1.25}
.rfq-cat-item span{font-size:.72rem;color:#667085;grid-column:1 / -1;line-height:1.3}
.rfq-cat-item em{font-style:normal;font-size:.66rem;color:#4f46e5;background:#eef2ff;border:1px solid #c7d2fe;border-radius:999px;padding:2px 7px;white-space:nowrap}
.rfq-cat-empty{padding:22px 12px;text-align:center;color:#667085;font-size:.82rem}
.rfq-cat-hint{font-size:.72rem;color:#667085;margin:-2px 0 12px;line-height:1.35}
.rfq-modal .rfq-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:10px;padding-top:14px;border-top:1px solid #e5eaf5}
.rfq-modal .rfq-btn{min-height:40px;padding:9px 18px;border-radius:8px;font-size:.86rem;font-weight:800;border:1px solid transparent;cursor:pointer;font-family:inherit;transition:transform .18s,box-shadow .18s,background .18s,border-color .18s}
.rfq-modal .rfq-btn.primary{background:#4f46e5;color:#fff;box-shadow:0 12px 28px rgba(79,70,229,.24)}
.rfq-modal .rfq-btn.primary:hover{background:#4338ca;transform:translateY(-1px);box-shadow:0 16px 34px rgba(79,70,229,.26)}
.rfq-modal .rfq-btn.cancel{background:#fff;border-color:#d9e2f0;color:#344054}
.rfq-modal .rfq-btn.cancel:hover{background:#f8fbff;border-color:#b7c5da}

/* ── Review Stars Display ── */
.review-section{margin-top:16px;padding:16px 0;border-top:1px solid var(--border)}
.review-card{background:var(--bg);border:1px solid var(--border);border-radius:10px;padding:12px;margin-bottom:10px}
.review-card .rv-header{display:flex;justify-content:space-between;align-items:flex-start}
.review-card .rv-name{font-weight:600;font-size:.85rem}
.review-card .rv-date{font-size:.72rem;color:var(--text-muted)}
.review-card .rv-stars{color:#f59e0b;font-size:.85rem;letter-spacing:1px}
.review-card .rv-text{font-size:.82rem;color:var(--text);margin-top:6px;line-height:1.5}
.review-card .rv-response{background:var(--bg-card);border-left:3px solid var(--accent);padding:8px 12px;margin-top:8px;border-radius:0 8px 8px 0;font-size:.8rem}
.review-card .rv-response strong{font-size:.72rem;color:var(--accent)}

/* ── Buyer Workspace Trigger ── */
.buyer-ws-trigger{position:relative;background:var(--bg-card);color:var(--text);border:1.5px solid var(--border);width:38px;height:38px;border-radius:8px;display:none;align-items:center;justify-content:center;cursor:pointer;font-size:17px;transition:all .15s;z-index:auto;flex-shrink:0}
.buyer-ws-trigger:hover{background:var(--bg-card-hover);border-color:var(--border-hover)}
.buyer-ws-trigger.visible{display:inline-flex}
.buyer-ws-trigger .bw-badge{position:absolute;top:-5px;right:-5px;background:#ef4444;color:#fff;font-size:.6rem;font-weight:700;min-width:16px;height:16px;border-radius:8px;display:flex;align-items:center;justify-content:center;padding:0 3px;line-height:1}

/* ── Alert Badge ── */
.alert-dot{width:8px;height:8px;background:#ef4444;border-radius:50%;display:inline-block;margin-left:4px}

@media(max-width:640px){
    .buyer-ws{width:100vw}
}

/* ═══════════════════════════════════════════════════════════ */
/* BUYER ONBOARDING FLOW                                      */
/* ═══════════════════════════════════════════════════════════ */
.onb-overlay{position:fixed;inset:0;background:rgba(0,0,0,.6);z-index:300;display:none;align-items:center;justify-content:center;backdrop-filter:blur(6px);padding:16px}
.onb-overlay.visible{display:flex}
.onb-box{background:var(--bg-card,#fff);border-radius:16px;width:100%;max-width:640px;max-height:90vh;overflow-y:auto;box-shadow:0 25px 60px rgba(0,0,0,.25);animation:onb-in .3s ease}
@keyframes onb-in{from{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}
.onb-header{padding:24px 28px 0;text-align:center}
.onb-header h2{font-size:1.5rem;font-weight:700;color:var(--text-main,#111);margin:0}
.onb-header p{font-size:.88rem;color:var(--text-muted,#666);margin:6px 0 0}
.onb-steps{display:flex;justify-content:center;gap:8px;padding:20px 28px 0}
.onb-step{display:flex;align-items:center;gap:6px;font-size:.78rem;color:var(--text-dim,#999)}
.onb-step-num{width:28px;height:28px;border-radius:50%;background:var(--bg-muted,#f1f1f1);display:flex;align-items:center;justify-content:center;font-weight:600;font-size:.8rem;transition:all .2s}
.onb-step.active .onb-step-num{background:var(--accent,#2563eb);color:#fff}
.onb-step.done .onb-step-num{background:#22c55e;color:#fff}
.onb-step.active{color:var(--text-main,#111);font-weight:600}
.onb-step-line{width:24px;height:2px;background:var(--border,#e5e7eb);border-radius:1px}
.onb-step.done+.onb-step-line,.onb-step.active+.onb-step-line{background:var(--accent,#2563eb)}
.onb-body{padding:20px 28px 24px}
.onb-field{margin-bottom:16px}
.onb-field label{display:block;font-size:.82rem;font-weight:600;color:var(--text-main,#111);margin-bottom:5px}
.onb-field label .onb-opt{font-weight:400;color:var(--text-dim,#999);font-size:.76rem}
.onb-field input,.onb-field select,.onb-field textarea{width:100%;padding:10px 12px;border:1.5px solid var(--border,#e0e0e0);border-radius:8px;font-size:.88rem;background:var(--bg-card,#fff);color:var(--text-main,#111);transition:border-color .15s}
.onb-field input:focus,.onb-field select:focus,.onb-field textarea:focus{border-color:var(--accent,#2563eb);outline:none;box-shadow:0 0 0 3px rgba(37,99,235,.1)}
.onb-field textarea{resize:vertical;min-height:60px}
.onb-radio-row{display:flex;gap:10px;margin-top:4px}
.onb-radio-card{flex:1;padding:12px 14px;border:1.5px solid var(--border,#e0e0e0);border-radius:10px;cursor:pointer;text-align:center;transition:all .15s;background:var(--bg-card,#fff)}
.onb-radio-card:hover{border-color:var(--accent,#2563eb)}
.onb-radio-card.selected{border-color:var(--accent,#2563eb);background:rgba(37,99,235,.05)}
.onb-radio-card input{display:none}
.onb-radio-card .onb-rc-icon{font-size:1.5rem;margin-bottom:4px}
.onb-radio-card .onb-rc-label{font-size:.84rem;font-weight:600;color:var(--text-main,#111)}
.onb-radio-card .onb-rc-desc{font-size:.74rem;color:var(--text-muted,#666);margin-top:2px}
.onb-biz-fields{display:none;margin-top:12px}
.onb-biz-fields.visible{display:block}
.onb-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}

/* Interest picker - two-panel side-by-side layout */
.onb-selected-tags{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:8px;min-height:20px}
.onb-tag{display:inline-flex;align-items:center;gap:4px;padding:3px 9px;background:rgba(37,99,235,.1);color:var(--accent,#2563eb);border-radius:20px;font-size:.72rem;font-weight:500}
.onb-tag button{background:none;border:none;color:var(--accent,#2563eb);cursor:pointer;font-size:.9rem;line-height:1;padding:0 0 0 2px}
.onb-interest-count{font-size:.8rem;color:var(--text-muted,#666);margin-bottom:8px}
.onb-interest-count span{font-weight:600;color:var(--accent,#2563eb)}
.onb-interest-count.error{color:#ef4444}
.onb-interest-count.error span{color:#ef4444}
.onb-interest-layout{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-top:4px}
.onb-panel{border:1.5px solid var(--border,#e0e0e0);border-radius:10px;overflow:hidden;display:flex;flex-direction:column;background:var(--bg-card,#fff)}
.onb-panel-header{padding:9px 12px 7px;border-bottom:1px solid var(--border,#e0e0e0);background:var(--bg-muted,#f8f9fa)}
.onb-panel-title{font-size:.7rem;font-weight:700;color:var(--text-main,#111);text-transform:uppercase;letter-spacing:.06em}
.onb-panel-hint{font-size:.67rem;color:var(--text-muted,#888);margin-top:1px;display:block}
.onb-panel-search{padding:6px 8px;border-bottom:1px solid var(--border,#e0e0e0)}
.onb-panel-search input{width:100%;padding:5px 9px;border:1.5px solid var(--border,#e0e0e0);border-radius:6px;font-size:.76rem;background:var(--bg-card,#fff);color:var(--text-main,#111);box-sizing:border-box}
.onb-panel-search input:focus{border-color:var(--accent,#2563eb);outline:none}
.onb-check-list{overflow-y:auto;max-height:220px}
.onb-check-item{display:flex;align-items:center;gap:8px;padding:7px 12px;cursor:pointer;transition:background .12s;font-size:.81rem;color:var(--text-main,#111);border-bottom:1px solid var(--border,#f0f0f0);user-select:none}
.onb-check-item:last-child{border-bottom:none}
.onb-check-item:hover{background:rgba(37,99,235,.04)}
.onb-check-item.selected{background:rgba(37,99,235,.06)}
.onb-check-item.domain-active{background:rgba(37,99,235,.09)}
.onb-chk-box{width:16px;height:16px;border:1.5px solid var(--border,#bbb);border-radius:4px;flex-shrink:0;display:flex;align-items:center;justify-content:center;transition:all .12s;background:var(--bg-card,#fff)}
.onb-check-item.selected .onb-chk-box,.onb-check-item.domain-active .onb-chk-box{background:var(--accent,#2563eb);border-color:var(--accent,#2563eb)}
.onb-chk-box svg{width:10px;height:10px;stroke:#fff;stroke-width:3;fill:none;display:none;pointer-events:none}
.onb-check-item.selected .onb-chk-box svg,.onb-check-item.domain-active .onb-chk-box svg{display:block}
.onb-chk-label{flex:1;line-height:1.25}
.onb-chk-count{font-size:.67rem;color:var(--text-dim,#bbb);flex-shrink:0;background:var(--bg-muted,#f3f4f6);padding:1px 5px;border-radius:8px}
.onb-check-item.domain-active .onb-chk-count{color:var(--accent,#2563eb);background:rgba(37,99,235,.1)}
.onb-panel-empty{padding:14px;text-align:center;color:var(--text-dim,#aaa);font-size:.75rem;font-style:italic}

/* Onboarding actions */
.onb-actions{display:flex;justify-content:space-between;padding:0 28px 24px;gap:12px}
.onb-btn{padding:10px 24px;border-radius:8px;font-size:.88rem;font-weight:600;cursor:pointer;border:none;transition:all .15s}
.onb-btn-back{background:var(--bg-muted,#f3f4f6);color:var(--text-main,#111)}
.onb-btn-back:hover{background:var(--border,#e5e7eb)}
.onb-btn-next{background:var(--accent,#2563eb);color:#fff}
.onb-btn-next:hover{background:#1d4ed8}
.onb-btn-next:disabled{opacity:.5;cursor:not-allowed}
.onb-btn-skip{background:none;color:var(--text-muted,#999);font-weight:500;font-size:.82rem}
.onb-error{color:#ef4444;font-size:.8rem;margin-top:4px}
.onb-spinner{display:inline-block;width:16px;height:16px;border:2px solid rgba(255,255,255,.3);border-top-color:#fff;border-radius:50%;animation:spin .6s linear infinite;margin-right:6px;vertical-align:middle}
@keyframes spin{to{transform:rotate(360deg)}}

@media(max-width:640px){
    .onb-box{max-width:100%;max-height:100vh;border-radius:12px}
    .onb-header{padding:18px 18px 0}
    .onb-body{padding:16px 18px 20px}
    .onb-actions{padding:0 18px 20px}
    .onb-row{grid-template-columns:1fr}
    .onb-step span{display:none}
    .onb-radio-row{flex-direction:column}
    .onb-interest-layout{grid-template-columns:1fr}
    .onb-check-list{max-height:160px}
}
</style>
</head>
<body class="sr-v2">

<!-- Mobile Drawer Overlay -->
<div class="mobile-drawer-overlay" id="mobile-drawer-overlay"></div>

<!-- Mobile Drawer -->
<div class="mobile-drawer" id="mobile-drawer">
    <div class="drawer-header">
        <div class="drawer-title"><img src="/img/logo.png" alt="Automail" style="width:24px;height:24px;border-radius:5px" width="24" height="24"> <span class="brand-text" style="background:linear-gradient(135deg,#1e293b 0%,#6366f1 50%,#8b5cf6 100%);-webkit-background-clip:text;-webkit-text-fill-color:transparent;background-clip:text">Automail</span><span>Biz</span></div>
        <button class="drawer-close" id="drawer-close" aria-label="Close menu"><svg viewBox="0 0 24 24"><path d="M18 6L6 18M6 6l12 12"/></svg></button>
    </div>
    <div class="drawer-search">
        <div class="drawer-search-box">
            <svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
            <input type="text" id="drawer-search-input" placeholder="Search categories or cities..." autocomplete="off">
        </div>
        <div class="drawer-search-tabs">
            <button class="drawer-search-tab active" data-search-scope="all">All</button>
            <button class="drawer-search-tab" data-search-scope="categories">Categories</button>
            <button class="drawer-search-tab" data-search-scope="cities">Cities</button>
        </div>
    </div>
    <div class="drawer-no-results" id="drawer-no-results">No matches found</div>
    <nav class="drawer-nav">
        <a href="#sectors"><svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7" rx="1"/><rect x="14" y="3" width="7" height="7" rx="1"/><rect x="3" y="14" width="7" height="7" rx="1"/><rect x="14" y="14" width="7" height="7" rx="1"/></svg>Categories</a>
        <a href="#listings"><svg viewBox="0 0 24 24"><path d="M21 21l-4.35-4.35M11 3a8 8 0 100 16 8 8 0 000-16z"/></svg>Browse</a>
        <a href="#faq-v2"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 015.83 1c0 2-3 3-3 3M12 17h.01"/></svg>FAQ</a>
        <a href="javascript:void(0)" id="drawer-login-link" onclick="hideDrawerAndShowAuth('login')"><svg viewBox="0 0 24 24"><path d="M15 3h4a2 2 0 012 2v14a2 2 0 01-2 2h-4M10 17l5-5-5-5M15 12H3"/></svg>Log in</a>
        <a href="javascript:void(0)" id="drawer-signup-link" onclick="hideDrawerAndShowAuth('signup')" style="color:var(--accent);font-weight:700"><svg viewBox="0 0 24 24"><path d="M16 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="8.5" cy="7" r="4"/><path d="M20 8v6M23 11h-6"/></svg>Sign up</a>
    </nav>
    <div class="drawer-section">
        <div class="drawer-section-title">Sectors</div>
        <div class="drawer-sectors" id="drawer-sectors"></div>
    </div>
    <div class="drawer-section">
        <div class="drawer-section-title">Top Cities</div>
        <div class="drawer-cities" id="drawer-cities"></div>
    </div>
    <a href="https://app.automail.digital" class="drawer-cta">List Your Business &rarr;</a>
</div>

<!-- Top Bar -->
<div class="topbar"><div class="container"><div class="topbar-inner">
    <span class="topbar-tag"><span class="live-dot"></span><strong id="topbar-count">1,800+</strong> businesses listed</span>
    <span class="topbar-tag">&middot;</span>
    <span class="topbar-tag"><strong>120+</strong> cities</span>
    <span class="topbar-tag">&middot;</span>
    <span class="topbar-tag"><strong>0% commission</strong> &middot; direct inquiries</span>
</div></div></div>

<!-- Nav -->
<nav class="nav"><div class="container">
    <a href="/" class="nav-brand"><img src="/img/logo.png" alt="Automail" class="brand-logo" width="28" height="28"><span class="brand-text">Automail</span><span>Biz</span></a>
    <div class="nav-center">
        <a href="#sectors" class="active">Categories</a>
        <a href="#listings">Browse</a>
        <a href="#how-it-works-v2">How It Works</a>
        <a href="#faq-v2">FAQ</a>
    </div>
    <div class="nav-right">
        <!-- Buyer Call Widget: shown when a seller callback arrives -->
        <div id="bcw" style="display:none;align-items:center"></div>
        <audio id="bcw-ringtone-audio" src="/audio/ringtone.mp3" loop preload="none" style="display:none"></audio>
        <button class="theme-toggle" id="theme-toggle" title="Toggle theme" aria-label="Toggle light/dark theme">
            <svg id="theme-icon-sun" viewBox="0 0 24 24" style="display:none"><circle cx="12" cy="12" r="5"/><path d="M12 1v2M12 21v2M4.2 4.2l1.4 1.4M18.4 18.4l1.4 1.4M1 12h2M21 12h2M4.2 19.8l1.4-1.4M18.4 5.6l1.4-1.4"/></svg>
            <svg id="theme-icon-moon" viewBox="0 0 24 24"><path d="M21 12.79A9 9 0 1111.21 3 7 7 0 0021 12.79z"/></svg>
        </button>
        <!-- Auth: shown when logged out -->
        <button class="nav-btn" id="nav-login-btn" onclick="showAuthModal('login')" style="background:var(--bg-card);color:var(--text);border:1.5px solid var(--border)">Log in</button>
        <button class="nav-btn" id="nav-signup-btn" onclick="showAuthModal('signup')" style="background:transparent;color:var(--text);border:none;font-weight:600;display:none">Sign up</button>
        <!-- Auth: shown when logged in -->
        <div class="auth-user-bar" id="nav-user-bar" style="display:none">
            <div class="user-avatar" id="nav-user-avatar"></div>
            <span class="user-name" id="nav-user-name"></span>
            <span class="user-logout" onclick="doLogout()">Logout</span>
        </div>
        <button class="buyer-ws-trigger" id="buyer-ws-trigger" title="Sourcing Hub — inbox, quotes, calls, chats &amp; shortlists"><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 7V5a2 2 0 00-4 0v2M8 7V5a2 2 0 00-4 0v2"/></svg><span class="bw-badge" id="bw-badge" style="display:none">0</span></button>
        <!-- Language dropdown (Google Translate widget mount) -->
        <div class="lang-pill" id="lang-pill" title="Language" style="display:inline-flex;align-items:center;margin-right:6px;position:relative">
            <svg viewBox="0 0 24 24" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" style="position:absolute;left:9px;top:50%;transform:translateY(-50%);color:var(--text-muted,#6b7280);pointer-events:none"><circle cx="12" cy="12" r="10"/><path d="M2 12h20M12 2a15 15 0 010 20M12 2a15 15 0 000 20"/></svg>
            <select id="lang-select" aria-label="Language" style="appearance:none;-webkit-appearance:none;-moz-appearance:none;padding:6px 26px 6px 28px;background:var(--bg-card,#fff);border:1.5px solid var(--border,#e5e7eb);border-radius:8px;font-size:.78rem;font-weight:600;color:var(--text,#374151);cursor:pointer;font-family:inherit;outline:none">
                <option value="en" data-lang="en">EN · English</option>
                <option value="hi" data-lang="hi">हि · हिन्दी</option>
                <option value="gu" data-lang="gu">ગુ · ગુજરાતી</option>
            </select>
            <svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" style="position:absolute;right:9px;top:50%;transform:translateY(-50%);color:var(--text-muted,#6b7280);pointer-events:none"><polyline points="6 9 12 15 18 9"/></svg>
        </div>
        <a href="https://app.automail.digital" class="nav-btn btn-primary" style="text-decoration:none;color:#fff;white-space:nowrap">List my business &rarr;</a>
        <button class="nav-btn" id="nav-post-req-btn" onclick="openRfqModal()" style="background:#fbbf24;color:#1e1b4b;font-weight:700;border:1.5px solid #fbbf24;display:none"><svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right:5px;vertical-align:middle"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="12" y1="18" x2="12" y2="12"/><line x1="9" y1="15" x2="15" y2="15"/></svg>Post Requirement</button>
        <button class="nav-hamburger" id="nav-hamburger"><span></span><span></span><span></span></button>
    </div>
</div></nav>

<!-- ════════════════════════════════════════════════════════════════
     SR-PAGE v2 — full showroom layout port from biz/mockups/01-showroom.html
     IDs preserved: #hero-search, #hero-search-btn, #hero-city-select,
     #hero-autocomplete, #hero-stat-listings, #hero-stat-biz-label, #faq.
     Mount placeholders re-host #listings, #listings-container, #sectors,
     #featured-container, #load-more-bar via DOM relocation in init.
     ════════════════════════════════════════════════════════════════ -->
<div class="sr-page" id="sr-page-root">

  <!-- HERO -->
  <section class="sr-hero">
    <div class="container">
      <div class="sr-hero-grid">
        <div>
          <div class="sr-search-pill" role="tablist" aria-label="Search mode">
            <button type="button" class="on" id="tab-normal" data-mode="normal"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>Directory</button>
            <button type="button" id="tab-usecase" data-mode="usecase"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>Use-case</button>
          </div>
          <h1>Find India's Best <span class="sr-gold">B2B Suppliers</span> in Seconds.</h1>
          <p class="sr-lede">Verified manufacturers, suppliers &amp; service providers across <b>51 sectors, 1,800+ categories and 120+ cities</b>. Direct inquiries — zero commission.</p>
          <div class="sr-search-bar" role="search">
            <input type="text" id="hero-search" placeholder="Try: stainless steel sheets, IT services, packaging…" autocomplete="off">
            <div class="uc-autocomplete" id="hero-autocomplete"></div>
            <select id="hero-city-select"><option value="">All Cities</option></select>
            <button id="hero-search-btn" type="button">Search</button>
          </div>
                    <div class="search-target-toggle" id="hero-search-target" role="radiogroup" aria-label="Search target">
                        <button type="button" class="on" data-target="product" aria-checked="true">Products</button>
                        <button type="button" data-target="supplier" aria-checked="false">Suppliers</button>
                    </div>
          <div id="popular-searches-row" style="overflow-x:auto;overflow-y:hidden;scrollbar-width:none">
            <div class="sr-popular" id="popular-searches">
              <b>Popular:</b>
              <span class="ps-tag">Steel manufacturer</span>
              <span class="ps-tag">IT services</span>
              <span class="ps-tag">Packaging supplier</span>
              <span class="ps-tag">Diamond wholesale</span>
              <span class="ps-tag">Pharma API</span>
              <span class="ps-tag">Auto parts</span>
            </div>
          </div>
          <span class="uc-search-mode" id="uc-mode-toggle" style="display:none"></span>
          <div class="uc-hint" id="uc-hint" style="display:none"></div>
          <div class="sr-proof">
            <div class="sr-proof-tile"><div class="sr-proof-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/></svg></div><div><b id="hero-stat-listings">1,800+</b><span id="hero-stat-biz-label">Verified suppliers</span></div></div>
            <div class="sr-proof-tile"><div class="sr-proof-icon sr-gold-i"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26"/></svg></div><div><b>0% commission</b><span>Direct deals only</span></div></div>
            <div class="sr-proof-tile"><div class="sr-proof-icon sr-green-i"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg></div><div><b>~3 hr</b><span>Avg first reply</span></div></div>
          </div>
        </div>
        <div class="sr-collage" aria-hidden="true">
          <div class="sr-cc sr-cc1">
            <span class="sr-cc-pulse">VERIFIED</span>
            <div class="sr-cc-head"><div class="sr-cc-logo">RS</div><div class="sr-cc-info"><div class="sr-cc-name">Rajesh Steels <span class="sr-cc-v">✓</span></div><div class="sr-cc-loc">Mumbai · Steel</div></div></div>
            <div class="sr-cc-tags"><span>SS sheets</span><span>2-12mm</span><span>Custom</span></div>
            <div class="sr-cc-meta"><span>⏱ Replies in 2h</span><span>★ 4.8</span></div>
          </div>
          <div class="sr-cc sr-cc2">
            <div class="sr-cc-head"><div class="sr-cc-logo" style="background:linear-gradient(135deg,#fbbf24,#f59e0b);color:#1e1b4b">PT</div><div class="sr-cc-info"><div class="sr-cc-name">PackTech Solutions <span class="sr-cc-v">✓</span></div><div class="sr-cc-loc">Surat · Packaging</div></div></div>
            <div class="sr-cc-tags"><span>500ml bottles</span><span>Food-grade</span><span>10K MOQ</span></div>
            <div class="sr-cc-meta"><span>⏱ Replies in 1h</span><span>★ 4.9</span></div>
          </div>
          <div class="sr-cc sr-cc3">
            <div class="sr-cc-head"><div class="sr-cc-logo" style="background:linear-gradient(135deg,#22c55e,#16a34a)">GW</div><div class="sr-cc-info"><div class="sr-cc-name">Greenwave Cotton <span class="sr-cc-v">✓</span></div><div class="sr-cc-loc">Ahmedabad · Textile</div></div></div>
            <div class="sr-cc-tags"><span>Organic cotton</span><span>GOTS cert.</span><span>Bulk</span></div>
            <div class="sr-cc-meta"><span>⏱ Replies in 4h</span><span>★ 4.7</span></div>
          </div>
        </div>
      </div>
    </div>
  </section>

  <!-- 3-LANE DISCOVERY -->
  <section class="sr-section">
    <div class="container">
      <div class="sr-section-head">
        <div><h2>Discover suppliers</h2><div class="sr-sub">Browse by sector, find what's trending, or post an RFQ.</div></div>
      </div>
      <div class="sr-discovery">
        <!-- LANE 1 -->
        <aside class="sr-lane-1">
          <h4>Top Sectors</h4>
          <!-- Mount: existing #sectors UL is relocated here -->
          <div id="sr-mount-sectors"></div>
          <a class="sr-sector-more" href="#sectors-grid">All sectors →</a>
        </aside>
        <!-- LANE 2 -->
        <main class="sr-lane-2">
          <div class="sr-band">
            <div class="sr-band-head"><h3><span class="sr-bicon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg></span> Top in directory</h3><a href="#listings">View all →</a></div>
            <!-- Mount: existing #featured-container, #listings header & #listings-container relocated here -->
            <div id="sr-mount-featured"></div>
            <div id="sr-mount-listings-header"></div>
            <div id="sr-mount-listings"></div>
            <div id="sr-mount-loadmore"></div>
          </div>
          <div class="sr-band">
            <div class="sr-band-head"><h3><span class="sr-bicon sr-bg-gold"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg></span> Trending RFQs</h3><span class="sr-sub" style="font-size:.82rem">Live buyer demand</span></div>
            <div class="sr-rfq-rows" id="sr-trending-rfqs"><div style="font-size:.84rem;color:var(--sr-muted);padding:14px 4px">Loading live RFQs…</div></div>
          </div>
        </main>
        <!-- LANE 3 -->
        <aside class="sr-lane-3">
          <div class="sr-signin-card">
            <h4>Open Sourcing Hub</h4>
            <p>Inbox, quotes, calls, chats, shortlists, RFQs &amp; alerts — one workspace.</p>
            <a href="/sourcing-hub" onclick="event.preventDefault();window.history.pushState({},'','/sourcing-hub');window._enterCockpit&&window._enterCockpit()">Open Sourcing Hub →</a>
          </div>
          <div class="sr-panel">
            <h5>Recently viewed <b id="sr-recent-count"></b></h5>
            <div id="sr-recent-list" style="font-size:.82rem;color:var(--sr-muted)">No recent items yet.</div>
          </div>
        </aside>
      </div>
    </div>
  </section>

  <!-- RFQ PROOF TIMELINE -->
  <section class="sr-section" style="padding-top:0">
    <div class="container">
      <div class="sr-rfq-proof">
        <div>
          <span class="sr-label">RFQ in action</span>
          <h2>One RFQ. Real quotes. Hours, not weeks.</h2>
          <p>Post once. Suppliers compete with quotes. You pick the winner. Direct deal — zero commission.</p>
          <small class="sr-illustrative">Illustrative example based on aggregated platform data.</small>
        </div>
        <div class="sr-timeline">
          <div class="sr-tl-item"><div class="sr-tl-time">0 min</div><div class="sr-tl-card"><b>Buyer posts RFQ</b><span>500 kg SS sheets · Mumbai · 5 days</span></div></div>
          <div class="sr-tl-item"><div class="sr-tl-time">+12 min</div><div class="sr-tl-card"><b>3 verified suppliers viewed</b><span>Surat, Mumbai, Pune</span></div></div>
          <div class="sr-tl-item"><div class="sr-tl-time">+2 hr</div><div class="sr-tl-card"><b>5 quotes received</b><span>Range ₹185 – ₹220 / kg</span></div></div>
          <div class="sr-tl-item"><div class="sr-tl-time">+6 hr</div><div class="sr-tl-card"><b>Buyer awards order</b><span>Direct chat &amp; PO with winner</span></div></div>
        </div>
      </div>
    </div>
  </section>

  <!-- SECTORS VISUAL GRID + CITIES — hidden (Lane 1 + hero city-select cover this; saves ~800px scroll) -->
  <div style="display:none" aria-hidden="true">
  <section class="sr-section" id="sectors-grid">
    <div class="container">
      <div class="sr-section-head"><div><h2>Browse by sector</h2><div class="sr-sub">51 sectors · 1,800+ categories</div></div></div>
      <div class="sr-sector-grid" id="sr-sector-tiles">
        <!-- Populated by populateSectorTiles() — falls back to placeholders below -->
        <a class="sr-sec-tile" data-sector="steel"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="3" y="3" width="18" height="18" rx="2"/></svg></div><b>Steel &amp; Metals</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="textile"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2l4 4-4 4-4-4 4-4z"/><path d="M3 12l4 4 4-4-4-4-4 4z"/><path d="M13 12l4 4 4-4-4-4-4 4z"/><path d="M12 14l4 4-4 4-4-4 4-4z"/></svg></div><b>Textile</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="packaging"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/></svg></div><b>Packaging</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="chemical"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M9 3v6l-5 9a2 2 0 002 3h12a2 2 0 002-3l-5-9V3"/></svg></div><b>Chemicals</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="electronics"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="6" width="20" height="12" rx="2"/></svg></div><b>Electronics</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="auto"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="6" cy="17" r="2"/><circle cx="18" cy="17" r="2"/><path d="M2 17h2l1-5h14l1 5h2M5 12V7h11l3 5"/></svg></div><b>Auto Parts</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="pharma"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M8 12h8M12 8v8"/></svg></div><b>Pharma</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="food"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 11h18M5 11V8a4 4 0 014-4h6a4 4 0 014 4v3M3 11v6a4 4 0 004 4h10a4 4 0 004-4v-6"/></svg></div><b>Food &amp; Bev</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="construction"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 21h18M5 21V7l7-4 7 4v14"/></svg></div><b>Construction</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="it"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></div><b>IT &amp; Software</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="logistics"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="1" y="3" width="15" height="13"/><polygon points="16 8 20 8 23 11 23 16 16 16 16 8"/><circle cx="5.5" cy="18.5" r="2.5"/><circle cx="18.5" cy="18.5" r="2.5"/></svg></div><b>Logistics</b><span>Loading…</span></a>
        <a class="sr-sec-tile" data-sector="agro"><div class="sr-sec-icon"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 2v20M2 12h20"/></svg></div><b>Agro</b><span>Loading…</span></a>
      </div>
    </div>
  </section>

  <!-- CITIES -->
  <section class="sr-section">
    <div class="container">
      <div class="sr-section-head"><div><h2>Top business cities</h2><div class="sr-sub">120+ cities across India</div></div></div>
      <div class="sr-city-grid">
        <a class="sr-city" data-city="Mumbai"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Mumbai</b><span>Steel · Pharma</span></div></a>
        <a class="sr-city" data-city="Delhi"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Delhi</b><span>Apparel · Auto</span></div></a>
        <a class="sr-city" data-city="Bengaluru"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Bengaluru</b><span>IT · Electronics</span></div></a>
        <a class="sr-city" data-city="Ahmedabad"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Ahmedabad</b><span>Textile · Chem</span></div></a>
        <a class="sr-city" data-city="Pune"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Pune</b><span>Auto · IT</span></div></a>
        <a class="sr-city" data-city="Surat"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Surat</b><span>Diamond · Textile</span></div></a>
        <a class="sr-city" data-city="Chennai"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Chennai</b><span>Auto · Leather</span></div></a>
        <a class="sr-city" data-city="Hyderabad"><svg class="sr-ico" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg><div><b>Hyderabad</b><span>Pharma · IT</span></div></a>
      </div>
    </div>
  </section>
  </div>
  <!-- /hidden sectors+cities -->

  <!-- HOW IT WORKS -->
  <section class="sr-section" id="how-it-works-v2">
    <div class="container">
      <div class="sr-section-head"><div><h2>How it works</h2><div class="sr-sub">5 steps. Direct contact. Zero commission.</div></div></div>
      <div class="sr-hiw">
        <div class="sr-hiw-tabs" role="tablist">
          <button type="button" class="on" data-hiw="buyer">For Buyers</button>
          <button type="button" data-hiw="seller">For Sellers</button>
        </div>
        <div class="sr-hiw-grid" id="sr-hiw-buyer">
          <div class="sr-hiw-step"><div class="sr-hiw-num">1</div><b>Search or post</b><p>Find suppliers by sector / city, or post an RFQ once.</p><small>~30 seconds</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">2</div><b>Compare verified</b><p>Shortlist verified suppliers — products, ratings, reply time.</p><small>Side-by-side</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">3</div><b>Inquire / chat / call</b><p>Direct in-app chat &amp; call — no platform middleman.</p><small>0% commission</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">4</div><b>Receive quotes</b><p>Suppliers respond with quotes &amp; samples directly to you.</p><small>Avg 3 hr first reply</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">5</div><b>Award &amp; transact</b><p>Pick the winner, agree terms, transact directly.</p><small>You own the deal</small></div>
        </div>
        <div class="sr-hiw-grid" id="sr-hiw-seller" style="display:none">
          <div class="sr-hiw-step"><div class="sr-hiw-num">1</div><b>List your business</b><p>Add products, capabilities, certifications &amp; service areas.</p><small>~5 min</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">2</div><b>Get verified</b><p>Submit GSTIN &amp; KYC for the verified badge.</p><small>1 working day</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">3</div><b>Receive inquiries</b><p>Buyers reach out via chat, call &amp; inquiry forms.</p><small>Direct lead</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">4</div><b>Quote on RFQs</b><p>Browse open RFQs, bid, win business.</p><small>Plan-based limits</small></div>
          <div class="sr-hiw-step"><div class="sr-hiw-num">5</div><b>Close &amp; deliver</b><p>Direct deals, your terms, your invoice.</p><small>0% commission</small></div>
        </div>
      </div>
    </div>
  </section>

  <!-- FAQ -->
  <section class="sr-section" id="faq-v2">
    <div class="container">
      <div class="sr-section-head"><div><h2>Frequently asked questions</h2><div class="sr-sub">Buyer &amp; seller answers</div></div></div>
      <div class="sr-faq">
        <details><summary>Is Automail Biz really 0% commission?</summary><p>Yes. Buyers and suppliers transact directly. There is no platform commission on any deal closed via Automail Biz. We charge sellers a flat subscription for visibility &amp; tools — never a cut of your sale.</p></details>
        <details><summary>How are suppliers verified?</summary><p>Verified suppliers submit GSTIN, business proof &amp; KYC. We check documents and mark verified profiles with a green ✓ badge. You can also see reply time &amp; ratings on each card.</p></details>
        <details><summary>What's an RFQ and how does it work?</summary><p>Post a Request for Quotation in 30 seconds — what you need, quantity, city, deadline. Verified suppliers respond with quotes. You compare and award. Direct chat &amp; call included.</p></details>
        <details><summary>How fast do suppliers reply?</summary><p>Average first reply on Automail Biz is around 3 hours. Each supplier card shows their typical reply time so you can pick the fastest.</p></details>
        <details><summary>Can I list my business for free?</summary><p>Yes. Basic listing is free. Paid plans unlock featured placement, more RFQs, lead alerts &amp; advanced tools. See <a href="/pricing">Pricing</a>.</p></details>
        <details><summary>Is my data &amp; chat private?</summary><p>All inquiries, chats &amp; calls are end-to-end on the Automail platform. We don't sell leads to third parties. See our <a href="/privacy">Privacy Policy</a>.</p></details>
        <details><summary>Do you support pan-India sourcing?</summary><p>Yes — 120+ cities &amp; 51 sectors across India. Filter by city, state, sector or sub-category to find local or national suppliers.</p></details>
        <details><summary>How is Automail Biz different from IndiaMART?</summary><p>Three differences: (1) zero commission on deals, (2) in-app voice/video calling, (3) Sourcing Hub workspace with inbox, quotes, calls, chats, shortlists, RFQs &amp; alerts.</p></details>
      </div>
    </div>
  </section>

</div>
<!-- ════════════════════════════ END SR-PAGE v2 ════════════════════════════ -->

<!-- (Legacy hero kept hidden for SEO/JSON-LD anchor parity) -->
<section class="hero" style="display:none"><div class="container">
    <div class="hero-inner">
        <div class="hero-text animate-in">
            <h1>Find India's Best <span class="gold">B2B Suppliers</span> in Seconds</h1>
            <p>Search verified manufacturers, suppliers &amp; service providers across 51 sectors, 1,800+ categories and 120+ cities.</p>
            <div class="hero-stats">
                <div class="hero-stat"><div class="hero-stat-val" id="hero-stat-listings">&mdash;</div><div class="hero-stat-label" id="hero-stat-biz-label">Businesses</div></div>
                <div class="hero-stat"><div class="hero-stat-val">51</div><div class="hero-stat-label">Sectors</div></div>
                <div class="hero-stat"><div class="hero-stat-val">1,800+</div><div class="hero-stat-label">Categories</div></div>
                <div class="hero-stat"><div class="hero-stat-val">120+</div><div class="hero-stat-label">Cities</div></div>
            </div>
            <div class="hero-search-tabs">
                <button class="hero-search-tab active" id="tab-normal" data-mode="normal">
                    <svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
                    Search Directory
                </button>
                <button class="hero-search-tab" id="tab-usecase" data-mode="usecase">
                    <svg viewBox="0 0 24 24"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>
                    Use Case Search
                    <span class="tab-badge">Smart</span>
                </button>
            </div>
            <div class="hero-search-area">
                <div class="uc-hint" id="uc-hint">
                    <svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4M12 8h.01"/></svg>
                    <span>Describe <strong>what you need done</strong> — e.g. "cut stainless steel sheets", "weld aluminum frames", "pack 500ml bottles". We'll match you with suppliers who can do it.</span>
                </div>
                <div class="hero-search">
                    <input type="text" placeholder="Search businesses, products, or services..." id="hero-search" autocomplete="off">
                    <div class="uc-autocomplete" id="hero-autocomplete"></div>
                    <select id="hero-city-select"><option value="">All Cities</option></select>
                    <button id="hero-search-btn">Search</button>
                </div>
            </div>
            <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap" id="popular-searches-row">
                <div class="popular-searches" id="popular-searches">
                    <span class="ps-label">Popular:</span>
                    <span class="ps-tag">Steel manufacturer</span>
                    <span class="ps-tag">IT services</span>
                    <span class="ps-tag">Packaging supplier</span>
                    <span class="ps-tag">Diamond wholesale</span>
                    <span class="ps-tag">Pharma API</span>
                    <span class="ps-tag">Auto parts</span>
                </div>
            </div>
            <!-- Hidden toggle for backward compat (JS references it) -->
            <span class="uc-search-mode" id="uc-mode-toggle" style="display:none"></span>
        </div>
        <div class="hero-img animate-in-d2">
            <div class="hero-illustration">
                <div class="hero-ring"></div>
                <div class="hero-ring"></div>
                <div class="hero-ring"></div>
                <div class="hero-center-icon">
                  <div class="hci-header">
                    <div class="hci-avatar">RS</div>
                    <div class="hci-info">
                      <div class="hci-name">Rajkot Steel Works</div>
                      <div class="hci-loc"><svg viewBox="0 0 24 24"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg>Rajkot, Gujarat</div>
                    </div>
                    <span class="hci-v">✓ Verified</span>
                  </div>
                  <div class="hci-tags">
                    <span class="hci-tag">Iron &amp; Steel</span>
                    <span class="hci-tag">Manufacturer</span>
                    <span class="hci-tag">Exporter</span>
                  </div>
                  <div class="hci-stats">
                    <div class="hci-stat"><b>21yr</b><span>Est.</span></div>
                    <div class="hci-stat"><b>51-200</b><span>Staff</span></div>
                    <div class="hci-stat"><b>30+</b><span>Export</span></div>
                  </div>
                  <a href="/s/rajkot-steel-works" class="hci-cta" onclick="event.preventDefault();openListingDrawer('rajkot-steel-works')">View Profile →</a>
                </div>
            </div>
        </div>
    </div>
</div></section>

<!-- Trust Bar -->
<div class="trust"><div class="container"><div class="trust-row">
    <span class="trust-item"><svg viewBox="0 0 24 24"><path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/></svg>Verified Businesses</span>
    <span class="trust-item"><svg viewBox="0 0 24 24"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>Secure &amp; Trusted</span>
    <span class="trust-item"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 6v6l4 2"/></svg>0% Commission</span>
    <span class="trust-item"><svg viewBox="0 0 24 24"><path d="M17 21v-2a4 4 0 00-4-4H5a4 4 0 00-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 00-3-3.87M16 3.13a4 4 0 010 7.75"/></svg>Direct Inquiries</span>
    <span class="trust-live"><span class="live-dot"></span><span id="trust-weekly">&mdash;</span> businesses joined this week</span>
</div></div></div>

<!-- Mobile Sector Pills (visible on <900px) -->
<div class="mobile-sector-pills" id="mobile-sector-pills"></div>

<!-- How It Works -->
<section class="how-it-works" id="how-it-works"><div class="container">
    <div class="hiw-title">How Automail Biz Works</div>
    <div class="hiw-sub">A transparent B2B directory for Indian businesses &mdash; free for both buyers and sellers.</div>
    <div class="hiw-tabs">
        <button class="hiw-tab-btn active" data-tab="sellers">For Sellers</button>
        <button class="hiw-tab-btn" data-tab="buyers">For Buyers</button>
    </div>
    <!-- Sellers Flow -->
    <div class="hiw-tab-content hiw-active" id="hiw-tab-sellers">
        <div class="hiw-grid hiw-grid-5">
            <div class="hiw-step animate-in"><div class="hiw-num">1</div><div class="hiw-step-title">Create Your Page</div><div class="hiw-step-desc">Go to app.automail.digital, add your company name, industry category, city, and a short description of your products or services.</div><div class="hiw-step-time">~5 minutes</div></div>
            <div class="hiw-step animate-in-d1"><div class="hiw-num">2</div><div class="hiw-step-title">Complete Your Profile</div><div class="hiw-step-desc">Add products/services, certifications, export details, team size, and contact preferences. A complete profile reaches more buyers.</div><div class="hiw-step-time">More detail = more visibility</div></div>
            <div class="hiw-step animate-in-d2"><div class="hiw-num">3</div><div class="hiw-step-title">Get Verified</div><div class="hiw-step-desc">Submit your GST number, confirm your address, and verify your phone or email via OTP. The Verified badge builds buyer trust.</div><div class="hiw-step-time">Reviewed within a few days</div></div>
            <div class="hiw-step animate-in-d2"><div class="hiw-num">4</div><div class="hiw-step-title">Go Live &amp; Get Found</div><div class="hiw-step-desc">Your page is published immediately. It appears in category &amp; city searches, and gets its own URL that search engines can index.</div><div class="hiw-step-time">Live instantly</div></div>
            <div class="hiw-step animate-in-d2"><div class="hiw-num">5</div><div class="hiw-step-title">Receive Inquiries</div><div class="hiw-step-desc">Buyers contact you directly through your profile. You get an email for every inquiry. Reply by email or WhatsApp &mdash; no intermediaries.</div><div class="hiw-step-time">Free, no per-inquiry fees</div></div>
        </div>
    </div>
    <!-- Buyers Flow -->
    <div class="hiw-tab-content" id="hiw-tab-buyers">
        <div class="hiw-grid hiw-grid-5">
            <div class="hiw-step animate-in"><div class="hiw-num">1</div><div class="hiw-step-title">Search Freely</div><div class="hiw-step-desc">Type any product, service, or business name. Browse 51 sectors, 1,800+ categories and 120+ cities &mdash; no account needed to search.</div><div class="hiw-step-time">No sign-up required</div></div>
            <div class="hiw-step animate-in-d1"><div class="hiw-num">2</div><div class="hiw-step-title">Filter Results</div><div class="hiw-step-desc">Narrow results by business type (manufacturer / trader / exporter / service), city, establishment year, employee count, and more.</div><div class="hiw-step-time">Verified filter available</div></div>
            <div class="hiw-step animate-in-d2"><div class="hiw-num">3</div><div class="hiw-step-title">Review Profiles</div><div class="hiw-step-desc">See company details, products, certifications, and export info. The green Verified badge confirms GST and contact verification.</div><div class="hiw-step-time">Detailed business info</div></div>
            <div class="hiw-step animate-in-d2"><div class="hiw-num">4</div><div class="hiw-step-title">Send Inquiry or RFQ</div><div class="hiw-step-desc">Contact one supplier directly through their profile. Or post a bulk Requirement (RFQ) &mdash; relevant suppliers in matching categories are notified.</div><div class="hiw-step-time">Direct, no spam</div></div>
            <div class="hiw-step animate-in-d2"><div class="hiw-num">5</div><div class="hiw-step-title">Save &amp; Track</div><div class="hiw-step-desc">Create a free buyer account to shortlist suppliers, save your searches, and get email alerts when new matching suppliers join.</div><div class="hiw-step-time">Free buyer account</div></div>
        </div>
    </div>
</div></section>

<!-- Main Layout -->
<div class="container"><div class="main">
    <!-- Sidebar (rendered by JS) -->
    <aside class="sidebar" id="sidebar"></aside>

    <!-- Content -->
    <div>
        <!-- Breadcrumb -->
        <div class="breadcrumb">
            <a href="/">Home</a><span class="sep">/</span>
            <a href="#" id="breadcrumb-cat">All Categories</a><span class="sep">/</span>
            <span class="current" id="breadcrumb-current">All Listings</span>
        </div>

        <!-- Enterprise Search & Filter Bar -->
        <div class="search-filter-bar" id="search-filter-bar">
            <div class="sfb-search">
                <svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
                <input type="text" id="sfb-search-input" placeholder="Search businesses, products, services..." autocomplete="off">
                <div class="uc-autocomplete" id="sfb-autocomplete"></div>
                <button class="sfb-clear" id="sfb-clear-btn" title="Clear search">&times;</button>
            </div>
            <div class="sfb-target" id="sfb-search-target" role="radiogroup" aria-label="Search target">
                <button type="button" class="on" data-target="product" aria-checked="true">Products</button>
                <button type="button" data-target="supplier" aria-checked="false">Suppliers</button>
            </div>
            <div class="sfb-divider"></div>
            <div class="sfb-filters">
                <!-- Sector dropdown -->
                <div class="sfb-dropdown" id="sfb-sector-dd">
                    <button class="sfb-dropdown-btn" id="sfb-sector-btn"><svg viewBox="0 0 24 24"><rect x="3" y="3" width="7" height="7"/><rect x="14" y="3" width="7" height="7"/><rect x="3" y="14" width="7" height="7"/><rect x="14" y="14" width="7" height="7"/></svg>Category<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-sector-panel"></div>
                </div>
                <!-- City dropdown -->
                <div class="sfb-dropdown" id="sfb-city-dd">
                    <button class="sfb-dropdown-btn" id="sfb-city-btn"><svg viewBox="0 0 24 24"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg>City<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-city-panel"></div>
                </div>
                <!-- Sub-Category dropdown -->
                <div class="sfb-dropdown" id="sfb-subcat-dd" style="display:none">
                    <button class="sfb-dropdown-btn" id="sfb-subcat-btn"><svg viewBox="0 0 24 24"><path d="M9 18l6-6-6-6"/></svg>Sub-Category<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-subcat-panel"></div>
                </div>
                <!-- Verification filter -->
                <div class="sfb-dropdown" id="sfb-type-dd">
                    <button class="sfb-dropdown-btn" id="sfb-type-btn"><svg viewBox="0 0 24 24"><path d="M22 11.08V12a10 10 0 11-5.93-9.14"/><path d="M22 4L12 14.01l-3-3"/></svg>Type<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-type-panel">
                        <div class="sfb-panel-item" data-type="verified"><div class="sfb-check"></div>Verified Only</div>
                        <div class="sfb-panel-item" data-type="featured"><div class="sfb-check"></div>Featured</div>
                    </div>
                </div>
                <!-- Business Type dropdown -->
                <div class="sfb-dropdown" id="sfb-biztype-dd">
                    <button class="sfb-dropdown-btn" id="sfb-biztype-btn"><svg viewBox="0 0 24 24"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 7V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v2"/></svg>Biz Type<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-biztype-panel">
                        <div class="sfb-panel-item" data-biztype="Manufacturer"><div class="sfb-check"></div>Manufacturer</div>
                        <div class="sfb-panel-item" data-biztype="Supplier"><div class="sfb-check"></div>Supplier</div>
                        <div class="sfb-panel-item" data-biztype="Trader"><div class="sfb-check"></div>Trader</div>
                        <div class="sfb-panel-item" data-biztype="Service Provider"><div class="sfb-check"></div>Service Provider</div>
                        <div class="sfb-panel-item" data-biztype="Exporter"><div class="sfb-check"></div>Exporter</div>
                        <div class="sfb-panel-item" data-biztype="Importer"><div class="sfb-check"></div>Importer</div>
                        <div class="sfb-panel-item" data-biztype="Wholesaler"><div class="sfb-check"></div>Wholesaler</div>
                        <div class="sfb-panel-item" data-biztype="Distributor"><div class="sfb-check"></div>Distributor</div>
                    </div>
                </div>
                <!-- Year Established dropdown -->
                <div class="sfb-dropdown" id="sfb-year-dd">
                    <button class="sfb-dropdown-btn" id="sfb-year-btn"><svg viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="18" rx="2"/><path d="M16 2v4M8 2v4M3 10h18"/></svg>Est. Year<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-year-panel">
                        <div class="sfb-panel-item" data-year="0-5"><div class="sfb-check"></div>0–5 Years</div>
                        <div class="sfb-panel-item" data-year="5-10"><div class="sfb-check"></div>5–10 Years</div>
                        <div class="sfb-panel-item" data-year="10-25"><div class="sfb-check"></div>10–25 Years</div>
                        <div class="sfb-panel-item" data-year="25+"><div class="sfb-check"></div>25+ Years</div>
                    </div>
                </div>
                <!-- Employee Count dropdown -->
                <div class="sfb-dropdown" id="sfb-emp-dd">
                    <button class="sfb-dropdown-btn" id="sfb-emp-btn"><svg viewBox="0 0 24 24"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>Employees<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-emp-panel">
                        <div class="sfb-panel-item" data-emp="1-10"><div class="sfb-check"></div>1–10</div>
                        <div class="sfb-panel-item" data-emp="11-50"><div class="sfb-check"></div>11–50</div>
                        <div class="sfb-panel-item" data-emp="51-200"><div class="sfb-check"></div>51–200</div>
                        <div class="sfb-panel-item" data-emp="201-500"><div class="sfb-check"></div>201–500</div>
                        <div class="sfb-panel-item" data-emp="500+"><div class="sfb-check"></div>500+</div>
                    </div>
                </div>
                <!-- Annual Turnover dropdown -->
                <div class="sfb-dropdown" id="sfb-turnover-dd">
                    <button class="sfb-dropdown-btn" id="sfb-turnover-btn"><svg viewBox="0 0 24 24"><path d="M12 1v22"/><path d="M17 5H9.5a3.5 3.5 0 0 0 0 7h5a3.5 3.5 0 0 1 0 7H6"/></svg>Turnover<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel" id="sfb-turnover-panel">
                        <div class="sfb-panel-item" data-turnover="<1cr"><div class="sfb-check"></div>Under ₹1 Cr</div>
                        <div class="sfb-panel-item" data-turnover="1-10cr"><div class="sfb-check"></div>₹1–10 Cr</div>
                        <div class="sfb-panel-item" data-turnover="10-50cr"><div class="sfb-check"></div>₹10–50 Cr</div>
                        <div class="sfb-panel-item" data-turnover="50-100cr"><div class="sfb-check"></div>₹50–100 Cr</div>
                        <div class="sfb-panel-item" data-turnover="100cr+"><div class="sfb-check"></div>₹100 Cr+</div>
                    </div>
                </div>
                <!-- Sort dropdown -->
                <div class="sfb-dropdown" id="sfb-sort-dd">
                    <button class="sfb-sort-btn" id="sfb-sort-btn"><svg viewBox="0 0 24 24"><path d="M3 6h18M3 12h12M3 18h6"/></svg>Sort<svg viewBox="0 0 24 24" style="width:10px;height:10px"><path d="M6 9l6 6 6-6"/></svg></button>
                    <div class="sfb-panel right" id="sfb-sort-panel">
                        <div class="sfb-panel-item selected" data-sort="relevant">Most Relevant</div>
                        <div class="sfb-panel-item" data-sort="newest">Newest First</div>
                        <div class="sfb-panel-item" data-sort="rating">Highest Rated</div>
                        <div class="sfb-panel-item" data-sort="established">Most Established</div>
                        <div class="sfb-panel-item" data-sort="az">A &rarr; Z</div>
                        <div class="sfb-panel-item" data-sort="za">Z &rarr; A</div>
                    </div>
                </div>
            </div>
            <!-- Active Filter Tags (inside sticky bar) -->
            <div class="active-filters" id="active-filters"></div>
        </div>

        <!-- Filter Bar (legacy, hidden — replaced by enterprise bar) -->
        <div class="filter-bar" id="filter-bar" style="display:none">
            <div class="filter-chip active" data-filter="all"><svg viewBox="0 0 24 24"><path d="M22 3H2l8 9.46V19l4 2v-8.54L22 3z"/></svg>All</div>
            <div class="filter-chip" data-filter="verified"><svg viewBox="0 0 24 24"><path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/></svg>Verified Only</div>
            <div class="filter-chip" data-filter="featured"><svg viewBox="0 0 24 24"><polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/></svg>Featured</div>
            <span class="filter-count" id="filter-count">Loading...</span>
        </div>

        <!-- Featured Banner (dynamic) -->
        <div id="featured-container"></div>

        <!-- Listings Header -->
        <div class="content-header" id="listings" style="display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:8px">
            <h2>Verified suppliers <span style="font-weight:400;font-size:.85rem;color:var(--text-muted)" id="listing-total-count"></span></h2>
            <div style="display:flex;align-items:center;gap:10px">
                <button class="nav-btn" id="save-search-btn" onclick="saveCurrentSearch()" style="display:none;font-size:.78rem;padding:5px 12px;background:var(--bg-card);color:var(--text);border:1.5px solid var(--border);cursor:pointer;border-radius:6px" title="Save this search and get alerts"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="margin-right:4px;vertical-align:middle"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>Save Search</button>
                <select class="sort-select" id="sort-select" style="display:none"><option value="">Most Relevant</option><option value="newest">Newest First</option><option value="az">A-Z</option></select>
            </div>
        </div>

        <!-- Listings (dynamic) -->
        <div id="listings-container">
            <div class="loading"><div class="spinner"></div><p>Loading listings...</p></div>
        </div>
        <!-- Load More -->
        <div class="load-more-bar" id="load-more-bar" style="display:none">
            <button class="load-more-btn" id="load-more-btn">Load More Businesses</button>
            <div class="load-more-info" id="load-more-info"></div>
        </div>
    </div>
</div></div>

<!-- Compare Bar -->
<div class="compare-bar" id="compare-bar">
    <span class="compare-text"><strong id="compare-count">0</strong> products/suppliers selected for comparison</span>
    <button class="compare-btn" id="compare-now-btn">Compare Now &rarr;</button>
</div>

<!-- Compare Modal -->
<div class="compare-modal-overlay" id="compare-modal-overlay">
    <div class="compare-modal">
        <div class="compare-modal-header">
            <h3>&#9878; Compare Products &amp; Suppliers</h3>
            <button class="compare-modal-close" id="compare-modal-close">&times;</button>
        </div>
        <div class="compare-modal-body" id="compare-modal-body">
            <p style="text-align:center;color:var(--text-muted);padding:40px">Select 2 to 3 products or suppliers to compare</p>
        </div>
    </div>
</div>

<!-- Buyer Review Modal -->
<div class="review-modal-overlay" id="review-modal-overlay">
    <div class="review-modal" role="dialog" aria-modal="true" aria-labelledby="review-modal-title">
        <div class="review-modal-header">
            <div>
                <h3 id="review-modal-title">Review Seller</h3>
                <p id="review-modal-subtitle">Only verified buyer interactions can be reviewed.</p>
            </div>
            <button class="review-modal-close" id="review-modal-close" type="button" aria-label="Close review window">&times;</button>
        </div>
        <div class="review-modal-body" id="review-modal-body"></div>
        <div class="review-actions" id="review-modal-actions"></div>
    </div>
</div>

<!-- Buyer Workspace Backdrop -->
<div class="buyer-ws-backdrop" id="buyer-ws-backdrop"></div>

<!-- Buyer Workspace Panel -->
<div class="buyer-ws" id="buyer-ws">
    <div class="buyer-ws-header">
        <h3><svg viewBox="0 0 24 24" width="18" height="18" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:7px"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 7V5a2 2 0 00-4 0v2M8 7V5a2 2 0 00-4 0v2"/></svg>Buyer Workspace</h3>
        <button class="buyer-ws-close" id="buyer-ws-close">&times;</button>
    </div>
    <div class="buyer-ws-tabs">
        <button class="buyer-ws-tab active" data-bwtab="shortlist"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:4px"><path d="M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z"/></svg>Shortlist</button>
        <button class="buyer-ws-tab" data-bwtab="rfqs"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:4px"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg>My RFQs</button>
        <button class="buyer-ws-tab" data-bwtab="searches"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:4px"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>Saved</button>
        <button class="buyer-ws-tab" data-bwtab="alerts"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:4px"><path d="M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9M13.73 21a2 2 0 01-3.46 0"/></svg>Alerts</button>
        <button class="buyer-ws-tab" data-bwtab="notifications"><svg viewBox="0 0 24 24" width="13" height="13" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:4px"><path d="M22 17H2a3 3 0 003-3V9a7 7 0 0114 0v5a3 3 0 003 3zm-8.27 4a2 2 0 01-3.46 0"/></svg>Push</button>
    </div>
    <div class="buyer-ws-body" id="bw-body"></div>
</div>

<!-- RFQ Create Modal -->
<div class="rfq-modal-overlay" id="rfq-modal-overlay">
    <div class="rfq-modal">
        <div class="rfq-brand"><img src="/img/logo.png" alt="Automail"><span>Automail Biz</span></div>
        <h3><svg viewBox="0 0 24 24" width="16" height="16" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:7px"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="12" y1="18" x2="12" y2="12"/><line x1="9" y1="15" x2="15" y2="15"/></svg>Submit RFQ — Request for Quotation</h3>
        <label>Product / Service Required *</label>
        <input type="text" id="rfq-title" placeholder="e.g. Stainless steel sheets, 2mm thickness" maxlength="200">
        <label>Category</label>
        <input type="hidden" id="rfq-category">
        <div class="rfq-cat" id="rfq-category-box">
            <button type="button" class="rfq-cat-trigger" id="rfq-category-trigger" aria-expanded="false"><span>Select category...</span><b></b></button>
            <div class="rfq-cat-menu" id="rfq-category-menu">
                <input type="text" id="rfq-category-search" placeholder="Search category, product, industry..." autocomplete="off">
                <div class="rfq-cat-results" id="rfq-category-results"></div>
            </div>
        </div>
        <div class="rfq-cat-hint" id="rfq-category-hint">Choose the closest product category so matched suppliers are more relevant.</div>
        <label>Quantity &amp; Unit *</label>
        <div style="display:flex;gap:8px">
            <input type="number" id="rfq-qty" placeholder="100" style="flex:1" min="1">
            <input type="text" id="rfq-unit" placeholder="kg / pcs / tons" style="flex:1" maxlength="20">
        </div>
        <label>Detailed Requirements</label>
        <textarea id="rfq-desc" placeholder="Specifications, quality standards, certifications needed..." maxlength="5000"></textarea>
        <label>Budget Range (optional)</label>
        <div style="display:flex;gap:8px">
            <input type="number" id="rfq-budget-min" placeholder="Min ₹" style="flex:1">
            <input type="number" id="rfq-budget-max" placeholder="Max ₹" style="flex:1">
        </div>
        <label>Delivery City *</label>
        <input type="text" id="rfq-city" placeholder="e.g. Mumbai" maxlength="100">
        <label>Deadline</label>
        <input type="date" id="rfq-deadline">
        <div class="rfq-actions">
            <button type="button" class="rfq-btn cancel" id="rfq-cancel">Cancel</button>
            <button type="button" class="rfq-btn primary" id="rfq-submit">Submit RFQ</button>
        </div>
    </div>
</div>

<!-- Why Automail Biz -->
<section class="testimonials"><div class="container">
    <div class="t-title" id="testimonial-title">Why Indian Businesses List on Automail Biz</div>
    <div class="t-sub">Built for Indian manufacturers, suppliers, and MSMEs</div>
    <div class="t-grid">
        <div class="t-card why-card">
            <div class="why-icon-wrap indigo"><svg viewBox="0 0 24 24"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"/><path d="M7 11V7a5 5 0 0110 0v4"/></svg></div>
            <div class="why-title">Verified Business Badges</div><div class="why-desc">GST registration, business address, and contact details are actively verified. Buyers can filter by verified businesses — your badge directly improves inquiry quality.</div>
        </div>
        <div class="t-card why-card">
            <div class="why-icon-wrap amber"><svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg></div>
            <div class="why-title">Your Own SEO-Ready Page</div><div class="why-desc">Every business gets a dedicated public URL (biz.automail.digital/s/your-name) that search engines can index. Get found when buyers search for your products online.</div>
        </div>
        <div class="t-card why-card">
            <div class="why-icon-wrap green"><svg viewBox="0 0 24 24"><path d="M22 11.08V12a10 10 0 11-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg></div>
            <div class="why-title">Direct Inquiries, 0% Commission</div><div class="why-desc">Buyers reach you directly — no broker, no middleman, no per-deal cut. Phone, chat, inquiry and RFQ flow straight into your dashboard from a single listing card.</div>
        </div>
    </div>
</div></section>

<!-- Newsletter -->
<section class="newsletter"><div class="container">
    <div class="nl-inner">
        <h3>Get New Supplier Updates</h3>
        <p>Weekly digest of new businesses, trending categories &amp; buyer demand in your sector.</p>
        <div class="nl-form">
            <input type="email" placeholder="Your business email..." id="nl-email">
            <button id="nl-submit">Subscribe</button>
        </div>
        <div class="nl-note">Unsubscribe anytime. No spam.</div>
    </div>
</div></section>

<!-- FAQ -->
<section class="faq" id="faq"><div class="container">
    <div class="faq-title">Frequently Asked Questions</div>
    <div class="faq-sub">Everything buyers and sellers need to know about Automail Biz</div>
    <div class="faq-tabs">
        <button class="faq-tab-btn active" data-faqtab="general">General</button>
        <button class="faq-tab-btn" data-faqtab="sellers">For Sellers</button>
        <button class="faq-tab-btn" data-faqtab="buyers">For Buyers</button>
    </div>

    <!-- General -->
    <div class="faq-tab-content faq-active faq-list" id="faq-tab-general">
        <div class="faq-item open">
            <div class="faq-q">What is Automail Biz?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Automail Biz is a B2B business directory connecting verified manufacturers, suppliers, traders, exporters, and service providers with buyers across India. It covers 51 sectors with 1,800+ sub-categories and 120+ cities. Listing a business and sending inquiries are both free.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">Is Automail Biz really free for everyone?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Yes &mdash; completely free for both buyers and sellers. Sellers can create a business page and receive unlimited buyer inquiries at no cost. Buyers can search, browse all profiles, and send inquiries for free. No credit card is required for any of these.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">Which industries and cities are covered?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">The directory covers 1,800+ sub-categories across 51 sectors &mdash; including agriculture, manufacturing, chemicals, pharmaceuticals, IT, construction, textiles, electronics, logistics, and more. It is searchable across 120+ cities throughout India, covering tier-1, tier-2, and industrial tier-3 cities.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">How do I know if a listed business is genuine?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Businesses with the green "Verified" badge have had their GST registration number, business address, and contact details actively checked. Other listings are self-declared by the business owner. For important sourcing decisions, we recommend using the Verified filter and reviewing the full business profile before proceeding.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">Is my contact information safe when I browse the directory?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Yes. Browsing the directory and viewing any business profile does not expose your contact details to anyone. Your information is only shared with a supplier when you actively send them an inquiry or post a requirement. Account data is stored securely.</div>
        </div>
    </div>

    <!-- Sellers -->
    <div class="faq-tab-content faq-list" id="faq-tab-sellers">
        <div class="faq-item open">
            <div class="faq-q">How do I list my business on Automail Biz?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Go to <a href="https://app.automail.digital" style="color:var(--accent)">app.automail.digital</a>, create a free account, and fill in your business name, industry category, city, and a short description. Your page goes live immediately after submission. The whole process takes under 5 minutes.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">How does the business verification process work?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">After listing, you can request verification from your profile dashboard. You will need to provide your GST registration number, confirm your registered business address, and verify your phone number or email via OTP. Our team reviews your submission and adds the green Verified badge to your profile within a few business days.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">How will buyers find my business on the directory?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Your business appears in category and city-based searches within the directory. It also gets a dedicated public URL (biz.automail.digital/s/your-business-name) that search engines can index &mdash; so buyers searching for your products or services on Google may find your page directly.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">How do I receive and respond to buyer inquiries?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">When a buyer submits an inquiry through your profile, you receive an email notification with the buyer's message and contact details. You can reply directly by email or reach out on WhatsApp. There are no platform fees or commissions on any inquiry &mdash; it is a direct connection between you and the buyer.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">Can I update my profile after it goes live?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Yes. Log in to app.automail.digital at any time to update your description, add product categories, upload certifications, or change contact details. All changes go live immediately with no re-approval required.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">Does a more complete profile get more visibility in search results?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Yes. Profiles that include a detailed description, multiple product categories, certifications, export information, and updated contact details tend to appear more relevant in category and search results within the directory. The more information you provide, the easier it is for the right buyers to find and evaluate your business.</div>
        </div>
    </div>

    <!-- Buyers -->
    <div class="faq-tab-content faq-list" id="faq-tab-buyers">
        <div class="faq-item open">
            <div class="faq-q">Do I need an account to browse or contact a supplier?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Browsing the directory and viewing any business profile is open to everyone &mdash; no account required. To send a direct inquiry to a specific supplier or post a bulk purchase requirement (RFQ), you will need to create a free buyer account.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">What is the difference between a direct inquiry and an RFQ?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">A direct inquiry is a message you send to one specific supplier through their profile page &mdash; for example, asking about pricing, minimum order quantity, or lead time. An RFQ (Request for Quotation) is a bulk requirement that you post once, describing what you need in detail. Relevant suppliers in the matching category are notified and can respond to it.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">How do I post a bulk purchase requirement?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Log in to your buyer account and click "Post Requirement" in the top navigation bar. Fill in the product name, quantity, unit of measurement, delivery city, and optionally a budget range and deadline. Relevant suppliers in the matching category are notified and can review and respond to your requirement.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">Can I save and compare multiple suppliers?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Yes. Use the heart (shortlist) icon on any listing to save suppliers to your personal list. You can also save your current search filters and receive email alerts when new suppliers matching your criteria join the directory. These features require a free buyer account.</div>
        </div>
        <div class="faq-item">
            <div class="faq-q">Is there any quality guarantee for businesses listed in the directory?<svg class="arrow" viewBox="0 0 24 24"><path d="M6 9l6 6 6-6"/></svg></div>
            <div class="faq-a">Verified businesses have had their GST registration, address, and contact details checked. All other listings are self-declared. Automail Biz is a directory platform &mdash; it does not act as an intermediary in transactions or guarantee business quality. We recommend reviewing full profiles, applying the Verified filter, and conducting your own due diligence before placing orders.</div>
        </div>
    </div>
</div></section>

<!-- CTA -->
<section class="cta"><div class="container"><div class="cta-box">
    <h2>List Your Business on India's Modern B2B Directory</h2>
    <p>Create your business page in under 5 minutes. Get found by verified buyers across 120+ cities &mdash; ₹0 to list, 0% commission, ever.</p>
    <a href="https://app.automail.digital" class="cta-main">Create Business Page &rarr;</a>
    <a href="#faq-v2" class="cta-secondary">Have questions? See FAQ &nearr;</a>
</div></div></section>

<!-- Footer -->
<footer class="footer"><div class="container">
    <div class="footer-grid">
        <div>
            <div class="footer-brand-name"><img src="/img/logo.png" alt="Automail" class="brand-logo" width="24" height="24"><span class="brand-text">Automail</span><span>Biz</span></div>
            <div class="footer-desc">India's modern B2B business directory. Find verified manufacturers, suppliers &amp; service providers. Part of the <a href="https://automail.digital" style="color:var(--accent);text-decoration:none;font-weight:600">Automail</a> ecosystem.</div>
            <div class="footer-social">
                <a href="https://www.facebook.com/people/Automail/61579560025780/" title="Facebook" target="_blank" rel="noopener"><svg viewBox="0 0 24 24"><path d="M18 2h-3a5 5 0 00-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 011-1h3z"/></svg></a>
                <a href="https://twitter.com/automail422" title="X (Twitter)" target="_blank" rel="noopener"><svg viewBox="0 0 24 24"><path d="M22 4s-.7 2.1-2 3.4c1.6 10-9.4 17.3-18 11.6 2.2.1 4.4-.6 6-2C3 15.5.5 9.6 3 5c2.2 2.6 5.6 4.1 9 4-.9-4.2 4-6.6 7-3.8 1.1 0 3-1.2 3-1.2z"/></svg></a>
                <a href="https://linkedin.com/company/automail-digital" title="LinkedIn" target="_blank" rel="noopener"><svg viewBox="0 0 24 24"><path d="M16 8a6 6 0 016 6v7h-4v-7a2 2 0 00-4 0v7h-4v-7a6 6 0 016-6z"/><rect x="2" y="9" width="4" height="12"/><circle cx="4" cy="4" r="2"/></svg></a>
                <a href="https://youtube.com/@automail.digital" title="YouTube" target="_blank" rel="noopener"><svg viewBox="0 0 24 24"><path d="M22.5 6.4a2.8 2.8 0 00-2-2C18.9 4 12 4 12 4s-6.9 0-8.5.4a2.8 2.8 0 00-2 2A30 30 0 001 12a30 30 0 00.5 5.6 2.8 2.8 0 002 2c1.6.4 8.5.4 8.5.4s6.9 0 8.5-.4a2.8 2.8 0 002-2A30 30 0 0023 12a30 30 0 00-.5-5.6z"/><path d="M9.75 15.02l5.75-3.27-5.75-3.27v6.54z"/></svg></a>
                <a href="https://wa.me/919979756432?text=Hi!%20I'm%20interested%20in%20Automail%20Biz.%20Can%20you%20tell%20me%20more%3F" title="WhatsApp" target="_blank" rel="noopener"><svg viewBox="0 0 24 24"><path d="M17.47 14.38c-.3-.15-1.76-.87-2.03-.97-.27-.1-.47-.15-.67.15s-.77.97-.94 1.17c-.17.2-.35.22-.65.07-.3-.15-1.27-.47-2.42-1.49-.89-.8-1.5-1.78-1.67-2.08-.18-.3-.02-.46.13-.61.14-.14.3-.35.45-.52.15-.18.2-.3.3-.5.1-.2.05-.38-.02-.52-.08-.15-.67-1.62-.92-2.22-.24-.58-.49-.5-.67-.51h-.58c-.2 0-.52.08-.79.38s-1.04 1.02-1.04 2.49 1.07 2.88 1.22 3.08c.15.2 2.1 3.2 5.08 4.49.71.31 1.27.49 1.7.63.71.23 1.36.2 1.87.12.57-.09 1.76-.72 2.01-1.41.25-.7.25-1.29.17-1.41-.07-.13-.27-.2-.57-.35z"/><path d="M12 2C6.48 2 2 6.48 2 12c0 1.77.46 3.43 1.27 4.88L2 22l5.27-1.38A9.94 9.94 0 0012 22c5.52 0 10-4.48 10-10S17.52 2 12 2z"/></svg></a>
            </div>
        </div>
        <div>
            <div class="f-col-title">Directory</div>
            <ul class="f-links">
                <li><a href="#sectors">All Categories</a></li>
                <li><a href="#listings">Browse Listings</a></li>
                <li><a href="#listings">New Listings</a></li>
            </ul>
        </div>
        <div>
            <div class="f-col-title">For Businesses</div>
            <ul class="f-links">
                <li><a href="https://app.automail.digital">List Your Business</a></li>
                <li><a href="#how-it-works-v2">How It Works</a></li>
                <li><a href="#faq-v2">FAQ</a></li>
            </ul>
        </div>
        <div>
            <div class="f-col-title">Company</div>
            <ul class="f-links">
                <li><a href="https://automail.digital">Automail Platform</a></li>
                <li><a href="https://automail.digital/privacy-policy.html">Privacy Policy</a></li>
                <li><a href="https://automail.digital/terms-of-service.html">Terms of Service</a></li>
            </ul>
        </div>
    </div>
    <div class="footer-bottom">
        <p>&copy; 2026 <a href="https://automail.digital">Automail Digital</a> &middot; <span style="color:var(--text-muted)">India &middot; Made in Bharat 🇮🇳</span></p>
        <div class="footer-legal">
            <a href="mailto:support@automail.digital">support@automail.digital</a>
            <a href="https://automail.digital/privacy-policy.html">Privacy</a>
            <a href="https://automail.digital/terms-of-service.html">Terms</a>
        </div>
    </div>
</div></footer>

<!-- Auth Modal -->
<div class="auth-overlay" id="auth-overlay">
<div class="auth-box">
    <button class="auth-close" onclick="hideAuthModal()">&times;</button>
    <h2 id="auth-title">Log in to Automail</h2>
    <div class="auth-sub" id="auth-sub">Access live chat with sellers and manage inquiries</div>
    <div class="auth-error" id="auth-error"></div>
    <div class="auth-success" id="auth-success"></div>
    <form id="auth-form" onsubmit="handleAuthSubmit(event)">
        <!-- Signup fields -->
        <div class="auth-name-row" id="auth-complete-name-row" style="display:none">
            <div class="auth-field">
                <label>First Name *</label>
                <input type="text" id="auth-first-name" placeholder="John" autocomplete="given-name" maxlength="80">
            </div>
            <div class="auth-field">
                <label>Last Name *</label>
                <input type="text" id="auth-last-name" placeholder="Doe" autocomplete="family-name" maxlength="80">
            </div>
        </div>
        <div class="auth-field" id="auth-name-field" style="display:none"></div>
        <div class="auth-field">
            <label>Email</label>
            <input type="email" id="auth-email" placeholder="you@company.com" required autocomplete="email">
        </div>
        <div class="auth-field" id="auth-pw-field">
            <label>Password</label>
            <input type="password" id="auth-password" placeholder="Your password" autocomplete="current-password" oninput="updatePwStrength(this.value)">
            <div id="auth-pw-hints" style="display:none;margin-top:6px;font-size:.75rem;line-height:1.6">
                <div id="pwhint-len" class="pwhint">At least 8 characters</div>
                <div id="pwhint-upper" class="pwhint">One uppercase letter</div>
                <div id="pwhint-lower" class="pwhint">One lowercase letter</div>
                <div id="pwhint-num" class="pwhint">One number</div>
                <div id="pwhint-special" class="pwhint">One special character (!@#$...)</div>
            </div>
        </div>
        <div class="auth-field" id="auth-pw2-field" style="display:none">
            <label>Confirm Password</label>
            <input type="password" id="auth-password2" placeholder="Confirm password" autocomplete="new-password" oninput="updatePasswordMatch()">
            <div id="auth-password-match" class="auth-password-match"></div>
        </div>
        <div class="auth-terms-row" id="auth-terms-field" style="display:none">
            <input type="checkbox" id="auth-terms" onchange="updateAuthTermsState()">
            <span>I agree to the <a href="https://automail.digital/terms-of-service" target="_blank" rel="noopener noreferrer">Terms of Service</a> and <a href="https://automail.digital/privacy-policy" target="_blank" rel="noopener noreferrer">Privacy Policy</a></span>
        </div>
        <button type="submit" class="auth-btn primary" id="auth-submit-btn">Log in</button>
    </form>
    <div id="auth-google-section">
        <div class="auth-divider">or</div>
        <button class="auth-btn google" onclick="googleAuth()">
            <svg viewBox="0 0 24 24"><path d="M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92a5.06 5.06 0 01-2.2 3.32v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.1z" fill="#4285F4"/><path d="M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z" fill="#34A853"/><path d="M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z" fill="#FBBC05"/><path d="M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z" fill="#EA4335"/></svg>
            Continue with Google
        </button>
    </div>
    <div class="auth-toggle" id="auth-toggle">
        Don't have an account? <a onclick="switchAuthMode('signup')">Sign up</a>
    </div>
</div>
</div>

<!-- ═══════════════════════════════════════════════════════════ -->
<!-- BUYER ONBOARDING OVERLAY                                   -->
<!-- ═══════════════════════════════════════════════════════════ -->
<div class="onb-overlay" id="onb-overlay">
<div class="onb-box">
    <div class="onb-header">
        <h2 id="onb-title">Welcome to Automail Biz</h2>
        <p id="onb-subtitle">Let's set up your buyer profile for personalized recommendations</p>
    </div>

    <!-- Step indicators -->
    <div class="onb-steps" id="onb-steps">
        <div class="onb-step active" data-step="1">
            <div class="onb-step-num">1</div>
            <span>Profile</span>
        </div>
        <div class="onb-step-line"></div>
        <div class="onb-step" data-step="2">
            <div class="onb-step-num">2</div>
            <span>Business</span>
        </div>
        <div class="onb-step-line"></div>
        <div class="onb-step" data-step="3">
            <div class="onb-step-num">3</div>
            <span>Location</span>
        </div>
        <div class="onb-step-line"></div>
        <div class="onb-step" data-step="4">
            <div class="onb-step-num">4</div>
            <span>Interests</span>
        </div>
    </div>

    <!-- Step 1: Personal Info -->
    <div class="onb-body" id="onb-step-1">
        <div class="onb-field">
            <label>Full Name <span style="color:#ef4444">*</span></label>
            <input type="text" id="onb-fullname" placeholder="Enter your full name" maxlength="100" autocomplete="name">
        </div>
        <div class="onb-field">
            <label>Email</label>
            <input type="email" id="onb-email" placeholder="you@company.com" disabled style="opacity:.6;cursor:not-allowed">
        </div>
        <div class="onb-field">
            <label>Phone Number <span style="color:#ef4444">*</span></label>
            <input type="tel" id="onb-phone" placeholder="+91 XXXXX XXXXX" maxlength="15" autocomplete="tel">
        </div>
    </div>

    <!-- Step 2: Business Info -->
    <div class="onb-body" id="onb-step-2" style="display:none">
        <div class="onb-field">
            <label>I am a</label>
            <div class="onb-radio-row">
                <div class="onb-radio-card" onclick="selectBuyerType('individual')">
                    <input type="radio" name="onb-buyer-type" value="individual">
                    <div class="onb-rc-icon">👤</div>
                    <div class="onb-rc-label">Individual</div>
                    <div class="onb-rc-desc">Personal buyer</div>
                </div>
                <div class="onb-radio-card selected" onclick="selectBuyerType('business')">
                    <input type="radio" name="onb-buyer-type" value="business" checked>
                    <div class="onb-rc-icon">🏢</div>
                    <div class="onb-rc-label">Business</div>
                    <div class="onb-rc-desc">Company or firm</div>
                </div>
            </div>
        </div>
        <div class="onb-biz-fields visible" id="onb-biz-fields">
            <div class="onb-field">
                <label>Company Name <span class="onb-opt">(optional)</span></label>
                <input type="text" id="onb-company" placeholder="Your company or firm name" maxlength="200">
            </div>
            <div class="onb-field">
                <label>Your Designation <span class="onb-opt">(optional)</span></label>
                <input type="text" id="onb-designation" placeholder="e.g. Purchase Manager, Director" maxlength="100">
            </div>
            <div class="onb-field">
                <label>GST Number <span class="onb-opt">(optional)</span></label>
                <input type="text" id="onb-gst" placeholder="e.g. 24AAAAA0000A1Z5" maxlength="15" style="text-transform:uppercase">
                <div class="onb-error" id="onb-gst-error" style="display:none"></div>
            </div>
        </div>
    </div>

    <!-- Step 3: Location -->
    <div class="onb-body" id="onb-step-3" style="display:none">
        <div class="onb-row">
            <div class="onb-field">
                <label>City <span style="color:#ef4444">*</span></label>
                <input type="text" id="onb-city" placeholder="e.g. Rajkot, Mumbai" maxlength="100" list="onb-city-list">
                <datalist id="onb-city-list"></datalist>
            </div>
            <div class="onb-field">
                <label>State <span style="color:#ef4444">*</span></label>
                <select id="onb-state">
                    <option value="">Select State</option>
                </select>
            </div>
        </div>
        <div class="onb-field">
            <label>Pincode <span class="onb-opt">(optional)</span></label>
            <input type="text" id="onb-pincode" placeholder="e.g. 360001" maxlength="6" pattern="[1-9][0-9]{5}">
        </div>
        <div class="onb-field">
            <label>Address <span class="onb-opt">(optional)</span></label>
            <textarea id="onb-address" placeholder="Street address, building name, landmark" maxlength="500" rows="2"></textarea>
        </div>
    </div>

    <!-- Step 4: Interests -->
    <div class="onb-body" id="onb-step-4" style="display:none">
        <div class="onb-interest-count" id="onb-interest-count">
            Selected: <span>0</span> interests (minimum 3 required)
        </div>
        <div class="onb-selected-tags" id="onb-selected-tags"></div>
        <div class="onb-interest-layout">
            <!-- Left panel: Industry / Domain -->
            <div class="onb-panel">
                <div class="onb-panel-header">
                    <div class="onb-panel-title">Industry / Domain</div>
                    <span class="onb-panel-hint">Select one or more industries</span>
                </div>
                <div class="onb-panel-search">
                    <input type="text" id="onb-domain-search" placeholder="Search industries…" autocomplete="off">
                </div>
                <div class="onb-check-list" id="onb-domain-list"></div>
            </div>
            <!-- Right panel: Product / Interest -->
            <div class="onb-panel">
                <div class="onb-panel-header">
                    <div class="onb-panel-title">Product / Interest</div>
                    <span class="onb-panel-hint" id="onb-cat-hint">Choose an industry first</span>
                </div>
                <div class="onb-panel-search">
                    <input type="text" id="onb-interest-search" placeholder="Search interests…" autocomplete="off">
                </div>
                <div class="onb-check-list" id="onb-cat-list"></div>
            </div>
        </div>
    </div>

    <!-- Error display -->
    <div style="padding:0 28px"><div class="onb-error" id="onb-error" style="display:none"></div></div>

    <!-- Actions -->
    <div class="onb-actions" id="onb-actions">
        <button class="onb-btn onb-btn-back" id="onb-back-btn" style="visibility:hidden" onclick="onbBack()">Back</button>
        <button class="onb-btn onb-btn-next" id="onb-next-btn" onclick="onbNext()">Continue</button>
    </div>
</div>
</div>

<!-- Chat FAB -->
<button class="chat-fab" id="chat-fab" onclick="toggleChatPanel()">
    <svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>
    <span class="chat-badge" id="chat-badge" style="display:none">0</span>
</button>

<!-- Chat Panel -->
<div class="chat-panel" id="chat-panel">
    <!-- Chat list view -->
    <div id="chat-list-view">
        <div class="chat-header">
            <h3>Messages</h3>
            <button class="chat-close" onclick="toggleChatPanel()"><svg viewBox="0 0 24 24"><path d="M18 6L6 18M6 6l12 12"/></svg></button>
        </div>
        <div class="chat-list" id="chat-list">
            <div class="chat-empty" id="chat-list-empty">
                <div>
                    <svg viewBox="0 0 24 24" style="width:40px;height:40px;stroke:var(--text-dim);stroke-width:1.5;fill:none;margin-bottom:8px"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>
                    <div>No conversations yet</div>
                    <div style="font-size:.78rem;color:var(--text-muted);margin-top:4px">Start a chat from any business listing</div>
                </div>
            </div>
        </div>
    </div>
    <!-- Chat conversation view -->
    <div id="chat-conv-view" style="display:none;flex-direction:column;height:100%">
        <div class="chat-header chat-header-conv">
            <button class="chat-back" onclick="showChatList()"><svg viewBox="0 0 24 24"><path d="M19 12H5M12 19l-7-7 7-7"/></svg></button>
            <div class="chat-title-wrap">
                <h3 id="chat-conv-title">Chat</h3>
                <div class="chat-conv-subtitle" id="chat-conv-subtitle">Buyer workspace</div>
            </div>
            <button class="chat-close" onclick="toggleChatPanel()"><svg viewBox="0 0 24 24"><path d="M18 6L6 18M6 6l12 12"/></svg></button>
        </div>
        <div class="chat-summary" id="chat-summary">
            <button class="chat-summary-toggle" type="button" onclick="toggleChatSummary()">
                <span>Key Points</span>
                <span class="chat-summary-caret" id="chat-summary-caret">&gt;</span>
            </button>
            <div class="chat-summary-body" id="chat-summary-body" style="display:none"></div>
        </div>
        <div class="chat-tools" id="chat-tools">
            <div class="chat-search-wrap">
                <svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>
                <input type="search" id="chat-search-input" placeholder="Search this chat" oninput="setChatSearch(this.value)">
            </div>
            <button class="chat-tool-btn" type="button" onclick="clearCurrentChatLocal()" title="Hide loaded messages on this device">Clear</button>
            <button class="chat-tool-btn chat-restore-btn" type="button" id="chat-restore-btn" onclick="restoreCurrentChatLocal()" title="Restore messages hidden on this device" style="display:none">Restore</button>
        </div>
        <div class="chat-messages" id="chat-messages"></div>
        <div class="chat-privacy-bar" id="chat-privacy-bar">
            <div class="chat-privacy-main">
                <label><input type="checkbox" id="chat-share-contact" onchange="toggleShareContact()"> Share contact with seller</label>
                <div class="chat-share-options" id="chat-share-options">
                    <label><input type="checkbox" class="chat-share-field" value="email" checked onchange="toggleShareContact(true)"> Email</label>
                    <label><input type="checkbox" class="chat-share-field" value="phone" checked onchange="toggleShareContact(true)"> Phone</label>
                    <label><input type="checkbox" class="chat-share-field" value="company" onchange="toggleShareContact(true)"> Company</label>
                </div>
            </div>
            <span class="chat-share-state" id="chat-share-state"></span>
        </div>
        <div class="chat-stopped-notice" id="chat-stopped-notice" style="display:none">
            You paused this conversation. <button onclick="resumeCurrentChat()">Resume</button>
        </div>
        <div class="chat-staged-files" id="chat-staged-files" style="display:none"></div>
        <div class="chat-input-bar" id="chat-input-bar">
            <label class="attach-btn" title="Attach file">
                <svg viewBox="0 0 24 24"><path d="M21.44 11.05l-9.19 9.19a6 6 0 01-8.49-8.49l9.19-9.19a4 4 0 015.66 5.66l-9.2 9.19a2 2 0 01-2.83-2.83l8.49-8.48"/></svg>
                <input type="file" id="chat-file-input" style="display:none" multiple onchange="handleChatFileUpload(event)">
            </label>
            <input type="text" id="chat-msg-input" placeholder="Type a message..." onkeydown="if(event.key==='Enter'&&!event.shiftKey){event.preventDefault();sendChatMsg()}" maxlength="5000">
            <button onclick="sendChatMsg()" id="chat-send-btn">Send</button>
            <button onclick="stopCurrentChat()" class="pause-btn" title="Pause conversation" style="background:none;border:none;cursor:pointer;color:var(--text-muted);padding:4px;flex-shrink:0"><svg viewBox="0 0 24 24" style="width:16px;height:16px;stroke:currentColor;stroke-width:2;fill:none"><rect x="6" y="4" width="4" height="16"/><rect x="14" y="4" width="4" height="16"/></svg></button>
        </div>
    </div>
    <!-- Login prompt for non-auth users -->
    <div class="chat-login-prompt" id="chat-login-prompt" style="display:none">
        <svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/></svg>
        <h4>Sign up to chat with sellers</h4>
        <p>Get instant responses and negotiate directly with verified businesses</p>
        <button onclick="hideChat();showAuthModal('signup')">Sign Up</button>
    </div>
</div>

<!-- Scroll to Top -->
<button class="scroll-top" id="scroll-top" title="Back to top">
    <svg viewBox="0 0 24 24"><path d="M18 15l-6-6-6 6"/></svg>
</button>

<!-- Listing Detail Drawer -->
<div class="ld-overlay" id="ld-overlay"></div>
<div class="ld-drawer" id="ld-drawer">
    <div class="ld-drawer-header">
        <button class="ld-back" id="ld-close" title="Close"><svg viewBox="0 0 24 24"><path d="M18 6L6 18M6 6l12 12"/></svg></button>
        <div class="ld-title" id="ld-header-title">Business Details</div>
        <a class="ld-share" id="ld-share-link" href="#" target="_blank" title="Open full page"><svg viewBox="0 0 24 24"><path d="M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg>Full Page</a>
    </div>
    <div id="ld-content"><div class="ld-loading"><div class="spinner"></div>Loading...</div></div>
    <div class="ld-drawer-footer" id="ld-footer" style="display:none"></div>
</div>

<!-- Mobile Sticky CTA -->
<div class="mobile-cta">
    <a href="#listings" class="m-btn m-secondary" style="text-decoration:none;color:inherit">Browse</a>
    <a href="https://app.automail.digital" class="m-btn m-primary" style="text-decoration:none;color:#fff">List my business &rarr;</a>
</div>

<script src="/assets/biz-directory-ui.20260525p1.js"></script>
<!-- ═══════════════════════════════════════════════════════════
    BUYER CALL RUNTIME — WebRTC voice call to seller (STUN/TURN)
     ═══════════════════════════════════════════════════════════ -->
<script>
(function() {
    'use strict';

    window.__AUTOMAIL_BIZ_CALL_RUNTIME_VERSION = 'call-audio-v18-2026-05-15-raw-mic-escalating-rescue';

    var CALL_ICE_SERVERS = [
        { urls: ['stun:stun.l.google.com:19302', 'stun:stun1.l.google.com:19302'] },
        {
            urls: [
                'turn:openrelay.metered.ca:80',
                'turn:openrelay.metered.ca:443',
                'turn:openrelay.metered.ca:443?transport=tcp',
                'turns:openrelay.metered.ca:443?transport=tcp'
            ],
            username: 'openrelayproject',
            credential: 'openrelayproject'
        }
    ];
    // Constraints for navigator.mediaDevices.getUserMedia.
    // v13 (2026-05-15): REMOVED voiceIsolation. On Windows desktop Chrome,
    // voiceIsolation:true routes through Windows Voice Mode (WASAPI) which
    // silently bypasses the speaker-reference AEC unless the output is a
    // "communications" device — causing heavy echo on standard speakers.
    var CALL_AUDIO_CONSTRAINTS = {
        echoCancellation: true,
        noiseSuppression: true,
        autoGainControl: true,
        sampleRate: { ideal: 48000 },
        channelCount: { ideal: 1 },
        googEchoCancellation: true,
        googAutoGainControl: true,
        googNoiseSuppression: true,
        googHighpassFilter: true
    };
    var LK_AUDIO_CAPTURE = {
        echoCancellation: true,
        noiseSuppression: true,
        autoGainControl: true,
        sampleRate: 48000,
        channelCount: 1
    };

    // v16 (2026-05-15): Robust mic pipeline — cross-OS resilient.
    // Windows Chrome has a recurring bug where getUserMedia returns a "live"
    // track that emits zero RTP samples (Windows Communications audio session
    // stuck from prior Teams/Zoom). The fix used by every shipping voice
    // product: (1) explicit device pinning to skip Windows 'default'/
    // 'communications' aliases, (2) AudioContext routing bypasses the
    // direct-track-to-sender silence path, (3) sample verification with
    // auto-retry, (4) RTP outbound watchdog re-acquires + replaceTrack if
    // bytesSent freezes mid-call.
    var _sharedAudioCtx = null;
    function _getSharedAudioCtx() {
        if (_sharedAudioCtx && _sharedAudioCtx.state !== 'closed') return _sharedAudioCtx;
        var Ctor = window.AudioContext || window.webkitAudioContext;
        if (!Ctor) return null;
        try { _sharedAudioCtx = new Ctor({ sampleRate: 48000, latencyHint: 'interactive' }); }
        catch (_) { try { _sharedAudioCtx = new Ctor(); } catch (__) { _sharedAudioCtx = null; } }
        return _sharedAudioCtx;
    }
    function _isWindowsUA() { try { return /Windows/i.test(navigator.userAgent || navigator.platform || ''); } catch (_) { return false; } }
    async function _pickInputDeviceId() {
        try {
            if (!navigator.mediaDevices || !navigator.mediaDevices.enumerateDevices) return undefined;
            var devices = await navigator.mediaDevices.enumerateDevices();
            var inputs = devices.filter(function(d){ return d.kind === 'audioinput'; });
            if (!inputs.length) return undefined;
            if (!_isWindowsUA()) {
                var def = inputs.find(function(d){ return d.deviceId === 'default'; });
                return (def && def.deviceId) || inputs[0].deviceId;
            }
            var real = inputs.filter(function(d){ return d.deviceId !== 'default' && d.deviceId !== 'communications'; });
            if (!real.length) return undefined;
            var nonComm = real.find(function(d){ return !/communications/i.test(d.label || ''); });
            return (nonComm || real[0]).deviceId;
        } catch (_) { return undefined; }
    }
    function _verifyStreamHasAudio(stream, timeoutMs) {
        timeoutMs = timeoutMs || 400;
        return new Promise(function(resolve) {
            var ctx = _getSharedAudioCtx();
            if (!ctx || !stream) return resolve(true);
            var src, analyser, raf, done = false;
            function finish(ok) {
                if (done) return; done = true;
                try { cancelAnimationFrame(raf); } catch (_) {}
                try { src && src.disconnect(); } catch (_) {}
                try { analyser && analyser.disconnect(); } catch (_) {}
                resolve(ok);
            }
            try {
                src = ctx.createMediaStreamSource(stream);
                analyser = ctx.createAnalyser();
                analyser.fftSize = 1024;
                src.connect(analyser);
            } catch (_) { return resolve(true); }
            var buf = new Float32Array(analyser.fftSize);
            var deadline = Date.now() + timeoutMs;
            function tick() {
                try {
                    analyser.getFloatTimeDomainData(buf);
                    var peak = 0;
                    for (var i = 0; i < buf.length; i++) { var v = Math.abs(buf[i]); if (v > peak) peak = v; }
                    if (peak > 0.0008) return finish(true);
                } catch (_) {}
                if (Date.now() > deadline) return finish(false);
                raf = requestAnimationFrame(tick);
            }
            raf = requestAnimationFrame(tick);
        });
    }
    function _buildProcessedStream(rawStream) {
        var ctx = _getSharedAudioCtx();
        if (!ctx) return { stream: rawStream, rawStream: rawStream, gainNode: null, ctx: null, src: null };
        try {
            var src = ctx.createMediaStreamSource(rawStream);
            var gain = ctx.createGain(); gain.gain.value = 1.0;
            var dest = ctx.createMediaStreamDestination();
            src.connect(gain).connect(dest);
            try { dest.stream.getAudioTracks().forEach(function(t){ t.__automailPipelineTrack = true; }); } catch (_) {}
            return { stream: dest.stream, rawStream: rawStream, gainNode: gain, ctx: ctx, src: src };
        } catch (e) {
            console.warn('[call] _buildProcessedStream failed, using raw stream:', e && e.message);
            return { stream: rawStream, rawStream: rawStream, gainNode: null, ctx: null, src: null };
        }
    }
    async function _acquireRobustMicPipeline(opts) {
        opts = opts || {};
        // v17 default: raw mic (no AudioContext routing). AudioContext route
        // turned out to itself be a silence source on Windows Chrome (ctx
        // suspended / MediaStreamDestination not flushing).  Use it only as a
        // rescue path invoked by the watchdog (opts.usePipeline === true).
        var usePipeline = opts.usePipeline === true;
        var doVerify = opts.verify === true;
        var skipDevicePin = opts.skipDevicePin === true;
        var deviceId = skipDevicePin ? undefined : await _pickInputDeviceId();
        var base = deviceId
            ? Object.assign({}, CALL_AUDIO_CONSTRAINTS, { deviceId: { exact: deviceId } })
            : CALL_AUDIO_CONSTRAINTS;
        var rawStream;
        try {
            rawStream = await navigator.mediaDevices.getUserMedia({ audio: base, video: false });
        } catch (e) {
            if (e && (e.name === 'OverconstrainedError' || e.name === 'NotFoundError' || e.name === 'TypeError')) {
                console.warn('[call] mic exact-device failed, fallback minimal:', e.name);
                rawStream = await navigator.mediaDevices.getUserMedia({
                    audio: { echoCancellation: true, noiseSuppression: true, autoGainControl: true },
                    video: false
                });
            } else { throw e; }
        }
        var ctx = _getSharedAudioCtx();
        try { if (ctx && ctx.state !== 'running') await ctx.resume(); } catch (_) {}
        var verified = true;
        if (doVerify) {
            verified = await _verifyStreamHasAudio(rawStream, 600);
            if (!verified) console.warn('[call] silent track detected (informational); watchdog will heal if needed');
        }
        var built = usePipeline ? _buildProcessedStream(rawStream) : { stream: rawStream, rawStream: rawStream, gainNode: null, ctx: null, src: null };
        // Arm OS-mute / track-ended diagnostics on the raw track.
        try {
            var rt = rawStream.getAudioTracks()[0];
            if (rt) {
                rt.onmute = function(){ try { window.__automailMicMuted = { ts: Date.now(), id: rt.id, label: rt.label }; } catch (_) {} console.warn('[call] mic track muted by OS'); };
                rt.onunmute = function(){ try { window.__automailMicUnmuted = { ts: Date.now(), id: rt.id }; } catch (_) {} };
                rt.onended = function(){ try { window.__automailMicEnded = { ts: Date.now(), id: rt.id }; } catch (_) {} console.warn('[call] mic track ended'); };
            }
        } catch (_) {}
        var pipeline = { stream: built.stream, rawStream: rawStream, gainNode: built.gainNode, ctx: built.ctx, src: built.src, deviceId: deviceId, verified: verified };
        try {
            var t = built.stream.getAudioTracks()[0];
            var s = t && t.getSettings ? t.getSettings() : {};
            window.__automailMicPipeline = { ts: Date.now(), deviceId: deviceId, verified: verified, usingPipeline: !!built.gainNode, trackId: t && t.id, trackLabel: t && t.label, settings: s, isWindows: _isWindowsUA() };
        } catch (_) {}
        return pipeline;
    }
    function _teardownMicPipeline(pipeline) {
        if (!pipeline) return;
        try { pipeline.rawStream && pipeline.rawStream.getTracks().forEach(function(t){ t.stop(); }); } catch (_) {}
        try { pipeline.stream && pipeline.stream.getTracks().forEach(function(t){ t.stop(); }); } catch (_) {}
        try { pipeline.src && pipeline.src.disconnect(); } catch (_) {}
        try { pipeline.gainNode && pipeline.gainNode.disconnect(); } catch (_) {}
    }
    function _startSenderWatchdog(pc, getPipelineState) {
        // v17: tightened threshold + escalating rescue (raw -> cooldown -> AudioContext -> restartIce).
        var thresholdMs = 4000, maxReacquires = 4;
        var lastBytesSent = -1, lastChangeAt = Date.now(), reacquires = 0, busy = false, stopped = false;
        var id = setInterval(async function() {
            if (stopped) return;
            try {
                if (!pc || pc.connectionState === 'closed' || pc.connectionState === 'failed') return;
                if (pc.connectionState !== 'connected') return;
                var stats = await pc.getStats();
                var outbound = 0;
                stats.forEach(function(r){ if (r.type === 'outbound-rtp' && r.kind === 'audio') outbound += Number(r.bytesSent) || 0; });
                var now = Date.now();
                if (outbound > lastBytesSent) { lastBytesSent = outbound; lastChangeAt = now; try { window.__automailLastOutboundAudio = { bytesSent: outbound, ts: now }; } catch (_) {} }
                else if (outbound === lastBytesSent && lastBytesSent > 0) {
                    if (now - lastChangeAt > thresholdMs && reacquires < maxReacquires && !busy) {
                        busy = true; reacquires += 1;
                        console.warn('[call] outbound RTP frozen', (now - lastChangeAt), 'ms — rescue attempt', reacquires, '/', maxReacquires);
                        try {
                            if (reacquires === 4) {
                                try { pc.restartIce && pc.restartIce(); } catch (_) {}
                                lastChangeAt = now; lastBytesSent = -1;
                            } else {
                                var state = getPipelineState();
                                var old = state.pipeline;
                                if (reacquires === 2) { await new Promise(function(r){ setTimeout(r, 700); }); }
                                var fresh = await _acquireRobustMicPipeline({ verify: false, skipDevicePin: true, usePipeline: reacquires >= 3 });
                                var sender = pc.getSenders().find(function(s){ return s.track && s.track.kind === 'audio'; });
                                if (sender && sender.replaceTrack) {
                                    await sender.replaceTrack(fresh.stream.getAudioTracks()[0]);
                                    state.pipeline = fresh;
                                    state.onPipelineReplaced && state.onPipelineReplaced(fresh);
                                    _teardownMicPipeline(old);
                                    lastBytesSent = -1; lastChangeAt = now;
                                    try { window.__automailMicReacquired = { ts: Date.now(), attempt: reacquires, usingPipeline: !!fresh.gainNode }; } catch (_) {}
                                }
                            }
                        } catch (e) { console.warn('[call] mic re-acquire failed:', e && e.message); }
                        finally { busy = false; }
                    }
                } else if (outbound === 0 && lastBytesSent === -1) { lastBytesSent = 0; lastChangeAt = now; }
            } catch (_) {}
        }, 2000);
        return function stop() { stopped = true; clearInterval(id); };
    }
    // Backward-compat wrapper — existing callers receive a plain MediaStream
    // and we stash the pipeline on the active call object for teardown.
    async function _acquireCallMic() {
        var p = await _acquireRobustMicPipeline();
        if (_activeCall) _activeCall._micPipeline = p;
        else window.__pendingMicPipeline = p;
        try {
            var t = p.stream.getAudioTracks()[0];
            if (t) {
                var s = (typeof t.getSettings === 'function') ? t.getSettings() : {};
                window.__lastBuyerMicSettings = { ts: Date.now(), label: t.label, id: t.id, enabled: t.enabled, muted: t.muted, readyState: t.readyState, settings: s };
                if (s && s.echoCancellation === false) console.warn('[call] AEC requested but NOT active on buyer track:', s);
            }
        } catch (_) {}
        return p.stream;
    }
    var _iceCache = null;
    var _iceCacheExpiry = 0;
    function _hasTurnServer(servers) {
        return (servers || []).some(function(server) {
            var urls = Array.isArray(server.urls) ? server.urls : [server.urls];
            return urls.some(function(url) { return /^turns?:/i.test(String(url || '')); });
        });
    }
    async function _fetchIceServers() {
        var now = Date.now();
        if (_iceCache && now < _iceCacheExpiry) return _iceCache;
        try {
            var headers = await _authHeaders();
            var res = await fetch(API_BASE + '/calls/turn-credentials', { headers: headers });
            if (res.ok) {
                var data = await res.json();
                if (data && Array.isArray(data.iceServers) && data.iceServers.length) {
                    _iceCache = data.iceServers;
                    _iceCacheExpiry = now + 20 * 60 * 1000;
                    return _iceCache;
                }
            }
        } catch (e) { console.warn('[buyer-call] ICE fetch failed — STUN-only:', e && e.message); }
        return CALL_ICE_SERVERS;
    }
    var RING_TIMEOUT_MS = 35 * 1000;
    var _fbDb = null;
    var _activeCall = null; // { callId, pc, localStream, remoteStream, unsubSignal, unsubCand, seenCand, remoteSet, pendingCand, ringTimer }

    function _ensureFirestore() {
        if (_fbDb) return _fbDb;
        if (typeof firebase === 'undefined' || !firebase.firestore) return null;
        try { _fbDb = firebase.firestore(); } catch (_) {}
        return _fbDb;
    }

    async function _authHeaders() {
        if (typeof getAuthHeaders === 'function') return await getAuthHeaders();
        if (typeof currentUser !== 'undefined' && currentUser && fbAuth?.currentUser) {
            var token = await fbAuth.currentUser.getIdToken();
            return { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token };
        }
        return { 'Content-Type': 'application/json' };
    }

    async function _sendIceCandidate(callId, headers, selfUid, c) {
        // v14 (2026-05-15): FLIPPED primary path — Firestore first.
        // Firestore SDK writes go direct to Google's servers, bypassing our
        // Cloud Functions / Firebase Hosting entirely. No rate limits, no
        // cold starts, no concurrency throttles. ICE trickle can burst to
        // 30+ candidates in 5 seconds; that volume was hitting the global
        // 100 req/min/IP cap and the Functions concurrency limit, producing
        // intermittent 503s. Firestore is the bulletproof transport here.
        // REST stays as fallback for networks that block Firestore.
        var fdb = _ensureFirestore();
        if (fdb) {
            try {
                var createdAt = (firebase.firestore && firebase.firestore.FieldValue)
                    ? firebase.firestore.FieldValue.serverTimestamp()
                    : new Date();
                await fdb.collection('calls').doc(callId)
                    .collection('candidates').doc(selfUid)
                    .collection('items').add({
                        candidate: String(c.candidate || '').slice(0, 2000),
                        sdpMid: c.sdpMid || null,
                        sdpMLineIndex: c.sdpMLineIndex == null ? null : Number(c.sdpMLineIndex),
                        createdAt: createdAt
                    });
                return true;
            } catch (firestoreErr) {
                // fall through to REST fallback
                try {
                    var res = await fetch(API_BASE + '/calls/' + callId + '/candidate', {
                        method: 'POST',
                        headers: headers,
                        body: JSON.stringify({ peerUid: selfUid, candidate: c.candidate, sdpMid: c.sdpMid, sdpMLineIndex: c.sdpMLineIndex })
                    });
                    if (!res.ok) throw new Error('HTTP ' + res.status);
                    console.warn('[buyer-call] Firestore ICE write failed; used REST fallback:', firestoreErr.message);
                    return true;
                } catch (restErr) {
                    throw new Error('Firestore ICE failed: ' + firestoreErr.message + '; REST fallback: ' + restErr.message);
                }
            }
        }
        // No Firestore available — REST only.
        var res = await fetch(API_BASE + '/calls/' + callId + '/candidate', {
            method: 'POST',
            headers: headers,
            body: JSON.stringify({ peerUid: selfUid, candidate: c.candidate, sdpMid: c.sdpMid, sdpMLineIndex: c.sdpMLineIndex })
        });
        if (!res.ok) throw new Error('HTTP ' + res.status);
        return true;
    }

    function _escapeHtml(value) {
        return String(value == null ? '' : value).replace(/[&<>"']/g, function(ch) {
            return ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[ch];
        });
    }

    function _formatCallDuration(totalSeconds) {
        var seconds = Math.max(0, Math.floor(totalSeconds || 0));
        var mins = Math.floor(seconds / 60);
        var secs = seconds % 60;
        return String(mins).padStart(2, '0') + ':' + String(secs).padStart(2, '0');
    }

    // v15 (2026-05-15): Force a=sendrecv on the audio m-line of any local
    // SDP we ship. Canonical seatbelt against Chrome transceiver direction
    // races (setCodecPreferences vs replaceTrack ordering, late mic acquire,
    // etc.) producing recvonly/inactive answers that silently kill audio.
    function _forceAudioSendrecv(sdp) {
        if (!sdp || typeof sdp !== 'string') return sdp;
        var sections = sdp.split(/^m=/m);
        for (var i = 1; i < sections.length; i++) {
            if (!/^audio\s/i.test(sections[i])) continue;
            if (/^a=(sendrecv|sendonly|recvonly|inactive)\s*$/m.test(sections[i])) {
                sections[i] = sections[i].replace(/^a=(sendrecv|sendonly|recvonly|inactive)\s*$/m, 'a=sendrecv');
            } else if (/^c=/m.test(sections[i])) {
                sections[i] = sections[i].replace(/^(c=[^\r\n]+\r?\n)/m, '$1a=sendrecv\r\n');
            } else {
                sections[i] = sections[i].replace(/^([^\r\n]+\r?\n)/, '$1a=sendrecv\r\n');
            }
        }
        return sections[0] + sections.slice(1).map(function(s){ return 'm=' + s; }).join('');
    }

    function _tuneOpusForSpeech(sdp) {
        if (!sdp || typeof sdp !== 'string') return sdp;
        var match = /a=rtpmap:(\d+) opus\/48000(?:\/2)?/i.exec(sdp);
        if (!match) return sdp;
        var payload = match[1];
        // REPLACE the entire fmtp line (not append) — avoids duplicate params and invalid ptime=20.
        // maxplaybackrate removed: restricting to 16kHz causes one-way audio mismatch.
        var newFmtp = 'a=fmtp:' + payload + ' maxaveragebitrate=64000;useinbandfec=1;usedtx=0;stereo=0;sprop-stereo=0;cbr=0';
        var fmtpRe = new RegExp('a=fmtp:' + payload + ' [^\\r\\n]+', 'i');
        var tuned = sdp;
        if (fmtpRe.test(tuned)) tuned = tuned.replace(fmtpRe, newFmtp);
        else tuned = tuned.replace(new RegExp('(a=rtpmap:' + payload + ' opus/48000(?:/2)?\\r?\\n)', 'i'), '$1' + newFmtp + '\r\n');
        // v9 (2026-05-14): DO NOT append a=ptime / a=maxptime at end of SDP.
        // Those are media-level attrs; session-level placement breaks Chrome's
        // direction negotiation (one-way audio). Opus default ptime 20ms.
        return tuned;
    }

    function _getSelectedCandidateTypes(stats) {
        var reports = {};
        var selectedPair = null;
        stats.forEach(function(report) {
            reports[report.id] = report;
            if (report.type === 'candidate-pair' && (report.selected || report.state === 'succeeded') && report.nominated !== false) {
                if (!selectedPair || Number(report.timestamp || 0) > Number(selectedPair.timestamp || 0)) selectedPair = report;
            }
        });
        var local = selectedPair ? reports[selectedPair.localCandidateId] : null;
        var remote = selectedPair ? reports[selectedPair.remoteCandidateId] : null;
        return {
            localCandidateType: local && local.candidateType || null,
            remoteCandidateType: remote && remote.candidateType || null,
            localProtocol: local && local.protocol || null,
            remoteProtocol: remote && remote.protocol || null,
            localNetworkType: local && local.networkType || null,
            selectedRttMs: selectedPair && selectedPair.currentRoundTripTime != null ? Math.round(Number(selectedPair.currentRoundTripTime) * 1000) : null,
            availableOutgoingBitrate: selectedPair && selectedPair.availableOutgoingBitrate || null
        };
    }

    function _prepareAudioTransceiversForVoice(pc) {
        if (!pc || typeof pc.getTransceivers !== 'function') return { opusPreferred:false, audioTransceivers:0 };
        var audioTransceivers = 0;
        var opusPreferred = false;
        var preferredCodecs = null;
        try {
            var senderApi = window.RTCRtpSender;
            var capabilities = senderApi && senderApi.getCapabilities ? senderApi.getCapabilities('audio') : null;
            var codecs = capabilities && capabilities.codecs ? capabilities.codecs : [];
            var opus = codecs.filter(function(codec){ return String(codec.mimeType || '').toLowerCase() === 'audio/opus'; });
            var rest = codecs.filter(function(codec){ return String(codec.mimeType || '').toLowerCase() !== 'audio/opus'; });
            if (opus.length) preferredCodecs = opus.concat(rest);
        } catch (_) {}
        try {
            pc.getTransceivers().forEach(function(transceiver) {
                var kind = transceiver && transceiver.sender && transceiver.sender.track && transceiver.sender.track.kind;
                kind = kind || (transceiver && transceiver.receiver && transceiver.receiver.track && transceiver.receiver.track.kind);
                if (kind !== 'audio') return;
                audioTransceivers += 1;
                try { if (!transceiver.stopped && transceiver.direction !== 'sendrecv') transceiver.direction = 'sendrecv'; } catch (_) {}
                try {
                    if (preferredCodecs && typeof transceiver.setCodecPreferences === 'function') {
                        transceiver.setCodecPreferences(preferredCodecs);
                        opusPreferred = true;
                    }
                } catch (err) { console.warn('[buyer-call] Opus codec preference skipped:', err && err.message || err); }
            });
        } catch (_) {}
        return { opusPreferred: opusPreferred, audioTransceivers: audioTransceivers };
    }

    function _wirePeerDiagnostics(pc, label, callId, role) {
        if (!pc || typeof pc.addEventListener !== 'function') return;
        var publish = function(eventName) {
            var snapshot = {
                ts: Date.now(), event: eventName, callId: callId, role: role,
                iceState: pc.iceConnectionState, connState: pc.connectionState, signalingState: pc.signalingState
            };
            try { window.__lastCallPeerState = snapshot; } catch (_) {}
            console.info('[' + label + ']', eventName, snapshot);
        };
        pc.addEventListener('iceconnectionstatechange', function(){ publish('iceconnectionstatechange'); });
        pc.addEventListener('connectionstatechange', function(){ publish('connectionstatechange'); });
        pc.addEventListener('signalingstatechange', function(){ publish('signalingstatechange'); });
    }

    // v13 (2026-05-15): Enterprise-grade 701 noise suppression.
    // ICE error 701 covers two unrelated conditions:
    //   (a) local interface bind failure on a dead/virtual NIC
    //       ("Address not associated with the desired network interface")
    //   (b) STUN/TURN host lookup or TCP/TLS connect failure
    // Both are per-candidate diagnostics — they do NOT mean the call failed.
    // Once iceConnectionState is `connected`, all 701s are noise (a working
    // pair is already carrying media). Before connection, surface them at
    // debug level only. We also auto-restart ICE on hard `failed`.
    function _wireBenign701Suppressor(pc, label) {
        if (!pc) return;
        var iceRestartAttempted = false;
        pc.addEventListener('icecandidateerror', function(ev) {
            var code = ev.errorCode;
            var text = ev.errorText || ev.url || '';
            var live = pc.connectionState === 'connected'
                    || pc.iceConnectionState === 'connected'
                    || pc.iceConnectionState === 'completed';
            if (code === 701 && live) return;            // silent — stale candidate
            if (code === 701) {
                console.debug('[' + label + '] ICE candidate error (benign):', code, text);
                return;
            }
            console.warn('[' + label + '] ICE candidate error:', code, text);
        });
        pc.addEventListener('iceconnectionstatechange', function() {
            if (pc.iceConnectionState === 'failed' && !iceRestartAttempted) {
                iceRestartAttempted = true;
                console.warn('[' + label + '] ICE failed — restarting');
                try { pc.restartIce && pc.restartIce(); } catch (_) {}
            }
        });
    }

    function _isAndroidChromeVoiceRouting() {
        var ua = '';
        try { ua = navigator.userAgent || ''; } catch (_) {}
        return /Android/i.test(ua) && /(Chrome|CriOS|EdgA|SamsungBrowser)/i.test(ua);
    }

    function _setCallAudioSink(el) {
        if (!el || typeof el.setSinkId !== 'function') return Promise.resolve(false);
        return el.setSinkId('communications').then(function(){ return true; }).catch(function(){
            try { return el.setSinkId('default').then(function(){ return false; }); }
            catch (_) { return Promise.resolve(false); }
        });
    }

    function _startCallStatsMonitor(pc, localStream) {
        var last = null;
        var noInboundSamples = 0;
        var noOutboundSamples = 0;
        return setInterval(async function() {
            if (!_activeCall || !pc || pc.connectionState === 'closed') return;
            try {
                var stats = await pc.getStats();
                var now = Date.now();
                var rttMs = null, jitterMs = null, packetsLostTotal = 0;
                var inboundBytes = 0, outboundBytes = 0, inboundPackets = 0, outboundPackets = 0;
                stats.forEach(function(report) {
                    if (report.type === 'candidate-pair' && report.state === 'succeeded' && report.currentRoundTripTime != null) {
                        rttMs = Math.round(Number(report.currentRoundTripTime) * 1000);
                    }
                    if (report.type === 'inbound-rtp' && report.kind === 'audio') {
                        if (report.jitter != null) jitterMs = Math.round(Number(report.jitter) * 1000);
                        packetsLostTotal += Number(report.packetsLost || 0);
                        inboundBytes += Number(report.bytesReceived || 0);
                        inboundPackets += Number(report.packetsReceived || 0);
                    }
                    if (report.type === 'outbound-rtp' && report.kind === 'audio') {
                        outboundBytes += Number(report.bytesSent || 0);
                        outboundPackets += Number(report.packetsSent || 0);
                    }
                });
                var elapsedSec = last ? Math.max(1, (now - last.at) / 1000) : 5;
                var inboundPacketsDelta = last ? Math.max(0, inboundPackets - last.inboundPackets) : 0;
                var outboundPacketsDelta = last ? Math.max(0, outboundPackets - last.outboundPackets) : 0;
                var packetsLostDelta = last ? Math.max(0, packetsLostTotal - last.packetsLostTotal) : 0;
                var inboundKbps = last ? Math.round((Math.max(0, inboundBytes - last.inboundBytes) * 8) / 1000 / elapsedSec) : 0;
                var outboundKbps = last ? Math.round((Math.max(0, outboundBytes - last.outboundBytes) * 8) / 1000 / elapsedSec) : 0;
                var packetLossPct = inboundPacketsDelta + packetsLostDelta > 0 ? Math.round((packetsLostDelta / (inboundPacketsDelta + packetsLostDelta)) * 100) : 0;
                var connected = pc.connectionState === 'connected' || pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed';
                var micEnabled = true;
                try { micEnabled = localStream.getAudioTracks().some(function(t){ return t.enabled && t.readyState === 'live'; }); } catch (_) {}
                if (connected && last) {
                    noInboundSamples = inboundPacketsDelta === 0 ? noInboundSamples + 1 : 0;
                    noOutboundSamples = micEnabled && outboundPacketsDelta === 0 ? noOutboundSamples + 1 : 0;
                }
                var noRemoteAudio = connected && noInboundSamples >= 3;
                var noOutboundAudio = connected && noOutboundSamples >= 3;
                var types = _getSelectedCandidateTypes(stats);
                if (_activeCall) {
                    _activeCall.callQuality = { rttMs:rttMs, jitterMs:jitterMs, packetLossPct:packetLossPct, inboundKbps:inboundKbps, outboundKbps:outboundKbps, noRemoteAudio:noRemoteAudio, noOutboundAudio:noOutboundAudio, localCandidateType:types.localCandidateType, remoteCandidateType:types.remoteCandidateType };
                }
                if (noRemoteAudio) _updateModalState('Connected, waiting for seller audio…', _callControlsHtml(false));
                else if (noOutboundAudio) _updateModalState('Mic connected, but no voice is leaving…', _callControlsHtml(false));
                else if ((rttMs != null && rttMs > 450) || (jitterMs != null && jitterMs > 80) || packetLossPct > 8) _updateModalState('Poor network — keeping call alive…', _callControlsHtml(false));
                last = { at: now, inboundBytes: inboundBytes, outboundBytes: outboundBytes, inboundPackets: inboundPackets, outboundPackets: outboundPackets, packetsLostTotal: packetsLostTotal };
            } catch (_) {}
        }, 5000);
    }

    function _updateCallDuration(seconds) {
        var el = document.querySelector('#call-buyer-modal [data-call-duration]');
        if (el) el.textContent = _formatCallDuration(seconds || 0);
    }

    function _startCallDuration() {
        if (!_activeCall) return;
        if (!_activeCall.connectedAt) _activeCall.connectedAt = Date.now();
        if (_activeCall.durationTimer) clearInterval(_activeCall.durationTimer);
        _updateCallDuration(0);
        _activeCall.durationTimer = setInterval(function() {
            if (!_activeCall || !_activeCall.connectedAt) return;
            _updateCallDuration((Date.now() - _activeCall.connectedAt) / 1000);
        }, 1000);
    }

    function _stopCallDuration(call) {
        try { if (call && call.durationTimer) clearInterval(call.durationTimer); } catch (_) {}
    }

    function _hangupButtonHtml() {
        return '<button id="call-hangup-btn" class="lr-btn" style="min-width:132px;padding:10px 18px;background:#dc2626;color:#fff;border-color:#dc2626;font-weight:700">Hang up</button>';
    }

    // ── 2026-05-14 v7: Enterprise WebRTC audio rebuild ─────────────────────
    // The previous "audio rig" allocated an AudioContext + silent oscillator
    // + WebAudio ringback that mixed into a MediaStreamDestination and drove
    // the remote <audio> element. That design was the root cause of every
    // call-audio symptom on this codebase:
    //   • Android Chrome routed the call to the LOUDSPEAKER because the
    //     <audio> element was playing a synthetic MediaStream — Chrome only
    //     picks VOICE_COMMUNICATION (earpiece + hardware AEC) when the
    //     element is bound to a pure WebRTC remote stream from the start.
    //   • Desktop heard heavy ECHO because the ringback gain leaked through
    //     the speaker into the mic, defeating the browser's hardware AEC.
    //   • Element rebuilds during the call introduced one-way audio races.
    // Enterprise rebuild: ONE <audio> element per call, created inside the
    // user gesture, unlocked with a muted .play()/pause() (NO synthetic
    // stream ever), then srcObject-swapped to the WebRTC remote stream when
    // ontrack fires. No AudioContext. No ringback tone (visual "Ringing…"
    // is enough; haptic on Android keeps the affordance).
    function _createCallAudioRig() {
        var rig = {
            remoteAudio: null,
            ringbackTimer: null,
            ringbackActive: false,
            unlocked: false,
            androidVoiceSafe: _isAndroidChromeVoiceRouting(),
            _attachAttempts: 0,
            _lastRemoteStream: null,
            _diag: { primed: false, attached: false }
        };
        try {
            var el = document.createElement('audio');
            el.autoplay = true;
            el.playsInline = true;
            el.setAttribute('autoplay', '');
            el.setAttribute('playsinline', '');
            el.setAttribute('webkit-playsinline', '');
            el.muted = false;
            el.volume = 1;
            el.controls = false;
            try { el.disableRemotePlayback = true; } catch (_) {}
            el.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none';
            document.body.appendChild(el);
            rig.remoteAudio = el;
            try { window.__lastCallRig = rig; } catch (_) {}

            // One-shot autoplay unlock inside the current user gesture.
            // v8 (2026-05-14): assign a tiny silent WAV data URL so the
            // muted-play() actually succeeds. On Android Chrome, calling
            // play() on an empty <audio> can reject with "no supported
            // sources", which leaves the element NOT user-activated; then
            // when pc.ontrack fires later (often > 5s, after the user
            // activation window has expired), el.play() is silently blocked
            // and the buyer hears nothing from the seller. We clear the src
            // before the WebRTC stream attaches so it does not influence
            // Chrome's audio stream-type classification.
            try {
                el.muted = true;
                el.volume = 1;
                try { el.src = 'data:audio/wav;base64,UklGRiQAAABXQVZFZm10IBAAAAABAAEAESsAACJWAAACABAAZGF0YQAAAAA='; } catch (_) {}
                var p = el.play();
                var finish = function() {
                    try { el.pause(); } catch (_) {}
                    try { el.removeAttribute('src'); el.load(); } catch (_) {}
                    try { el.muted = false; } catch (_) {}
                    rig.unlocked = true;
                    rig._diag.primed = true;
                    try { window.__lastCallRigUnlock = { ok: true, ts: Date.now() }; } catch (_) {}
                };
                if (p && p.then) p.then(finish).catch(function(err){
                    try { el.removeAttribute('src'); el.load(); } catch (_) {}
                    try { el.muted = false; } catch (_) {}
                    try { window.__lastCallRigUnlock = { ok: false, error: String(err && err.message || err), ts: Date.now() }; } catch (_) {}
                });
                else finish();
            } catch (e) { console.warn('[call] rig unlock failed:', e); }
        } catch (e) { console.warn('[call] audio rig init failed:', e); }
        return rig;
    }

    // Ringback: NO synthetic tone (it leaks into mic via speaker → echo).
    // Visual "Ringing…" in the modal is the primary affordance.
    // Android also vibrates while ringing so the user feels the call.
    function _startRingbackTone(rig) {
        if (!rig || rig.ringbackActive) return;
        rig.ringbackActive = true;
        if (rig.androidVoiceSafe) {
            try { navigator.vibrate && navigator.vibrate([180, 90, 180]); } catch (_) {}
            rig.ringbackTimer = setInterval(function(){
                try { navigator.vibrate && navigator.vibrate([180, 90, 180]); } catch (_) {}
            }, 3000);
        }
    }

    function _stopRingbackTone(rig) {
        if (!rig) return;
        rig.ringbackActive = false;
        try { if (rig.ringbackTimer) clearInterval(rig.ringbackTimer); } catch (_) {}
        rig.ringbackTimer = null;
        try { if (rig.androidVoiceSafe && navigator.vibrate) navigator.vibrate(0); } catch (_) {}
    }

    function _destroyCallAudioRig(rig) {
        if (!rig) return;
        _stopRingbackTone(rig);
        try { if (rig.remoteAudio) { rig.remoteAudio.pause(); rig.remoteAudio.srcObject = null; rig.remoteAudio.remove(); } } catch (_) {}
        rig.remoteAudio = null;
        rig._lastRemoteStream = null;
    }

    // Attach the WebRTC remote stream to the persistent rig <audio> element.
    // We do NOT recreate the element here — that was a workaround for the
    // synthetic-stream priming that no longer exists.
    function _attachRemoteStreamToRig(rig, stream) {
        if (!rig || !stream) return Promise.reject(new Error('no rig'));
        rig._lastRemoteStream = stream;
        rig._attachAttempts = (rig._attachAttempts || 0) + 1;
        var el = rig.remoteAudio;
        if (!el) {
            // Defensive: recreate if it was destroyed.
            el = document.createElement('audio');
            el.autoplay = true;
            el.playsInline = true;
            el.setAttribute('autoplay', '');
            el.setAttribute('playsinline', '');
            el.setAttribute('webkit-playsinline', '');
            el.muted = false;
            el.volume = 1;
            try { el.disableRemotePlayback = true; } catch (_) {}
            el.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none';
            document.body.appendChild(el);
            rig.remoteAudio = el;
        }
        try { el.pause(); } catch (_) {}
        try { el.srcObject = null; } catch (_) {}
        try { el.srcObject = stream; } catch (e) { return Promise.reject(e); }
        el.muted = false;
        // v15 (2026-05-15): drop playback volume to 0.72 for AEC3 headroom
        // against loud desktop speakers — the speaker reference saturates
        // AEC at volume 1.0, producing audible echo for the far end.
        // 0.72 is ~3 dB attenuation, perceptually small but enough margin
        // for the AEC nonlinear processor to fully suppress speaker leakage.
        el.volume = 0.72;
        // Pause any other audio/video on the page that could leak into the mic
        // (ringtones, ambient page audio, autoplay videos).
        try {
            var media = document.querySelectorAll('audio, video');
            for (var i = 0; i < media.length; i++) {
                var m = media[i];
                if (m === el) continue;
                if (!m.paused) { try { m.pause(); } catch (_) {} }
            }
        } catch (_) {}
        // setSinkId('communications') on desktop/Edge; ignored on Android Chrome
        // (which auto-routes WebRTC voice streams to the earpiece itself).
        try { _setCallAudioSink(el).catch(function(){}); } catch (_) {}

        try { rig._diag = rig._diag || {}; rig._diag.attached = true; window.__lastCallRemoteAttached = Date.now(); } catch (_) {}

        var doPlay = function() {
            try { var p = el.play(); return (p && p.then) ? p : Promise.resolve(); }
            catch (e) { return Promise.reject(e); }
        };
        // v8: 3-attempt retry ladder (80ms / 250ms / 600ms) — covers the
        // narrow window where the remote track is still in muted=true state
        // when pc.ontrack first fires.
        return doPlay().catch(function(err){
            console.warn('[call] remote play() failed, retry 1:', err && err.name, err && err.message);
            return new Promise(function(resolve, reject){
                setTimeout(function(){
                    doPlay().catch(function(err2){
                        console.warn('[call] remote play() failed, retry 2:', err2 && err2.name, err2 && err2.message);
                        return new Promise(function(resolve2, reject2){
                            setTimeout(function(){ doPlay().then(resolve2, reject2); }, 350);
                        });
                    }).then(resolve, reject);
                }, 80);
            });
        });
    }

    // Live pc.getStats diagnostic monitor — publishes structured snapshot to
    // window.__lastCallStats every 2s and self-heals a paused remote audio
    // element when a live remote track is present. Runs ALONGSIDE the existing
    // _startCallStatsMonitor (which drives UI quality indicators).
    function _startAudioDiagMonitor(pc, rig) {
        if (!pc || typeof pc.getStats !== 'function') return null;
        var lastInboundBytes = 0;
        var lastAudioTime = 0;
        var stuckAudioTicks = 0;
        var iv = setInterval(async function() {
            try {
                var s = await pc.getStats(null);
                var reports = {}, inAudio = null, outAudio = null, candPair = null;
                s.forEach(function(r){
                    reports[r.id] = r;
                    if (r.type === 'inbound-rtp' && (r.kind === 'audio' || r.mediaType === 'audio')) inAudio = r;
                    else if (r.type === 'outbound-rtp' && (r.kind === 'audio' || r.mediaType === 'audio')) outAudio = r;
                    else if (r.type === 'candidate-pair' && r.state === 'succeeded' && r.nominated) candPair = r;
                });
                var localCand = candPair ? reports[candPair.localCandidateId] : null;
                var remoteCand = candPair ? reports[candPair.remoteCandidateId] : null;
                var remoteTrack = null;
                var receivers = (typeof pc.getReceivers === 'function') ? pc.getReceivers() : [];
                for (var i=0;i<receivers.length;i++) { var t = receivers[i].track; if (t && t.kind === 'audio') { remoteTrack = t; break; } }
                var el = rig && rig.remoteAudio;
                window.__lastCallStats = {
                    runtimeVersion: window.__AUTOMAIL_BIZ_CALL_RUNTIME_VERSION,
                    ts: Date.now(),
                    iceState: pc.iceConnectionState,
                    connState: pc.connectionState,
                    inboundBytes: inAudio ? inAudio.bytesReceived : 0,
                    inboundPackets: inAudio ? inAudio.packetsReceived : 0,
                    outboundBytes: outAudio ? outAudio.bytesSent : 0,
                    outboundPackets: outAudio ? outAudio.packetsSent : 0,
                    pairLocal: localCand ? localCand.candidateType : null,
                    pairRemote: remoteCand ? remoteCand.candidateType : null,
                    pairLocalProtocol: localCand ? localCand.protocol || null : null,
                    pairRemoteProtocol: remoteCand ? remoteCand.protocol || null : null,
                    pairLocalNetworkType: localCand ? localCand.networkType || null : null,
                    pairRttMs: candPair && candPair.currentRoundTripTime != null ? Math.round(Number(candPair.currentRoundTripTime) * 1000) : null,
                    availableOutgoingBitrate: candPair ? candPair.availableOutgoingBitrate || null : null,
                    remoteTrack: remoteTrack ? { enabled: remoteTrack.enabled, muted: remoteTrack.muted, readyState: remoteTrack.readyState } : null,
                    audioEl: el ? { paused: el.paused, muted: el.muted, volume: el.volume, currentTime: el.currentTime, readyState: el.readyState, sinkId: el.sinkId || '', hasSrc: !!el.srcObject } : null,
                    attachAttempts: rig ? (rig._attachAttempts || 0) : 0,
                };
                // Self-heal: if connected with live remote track but element paused, force play.
                if (el && el.paused && remoteTrack && remoteTrack.readyState === 'live' && !remoteTrack.muted) {
                    el.play().catch(function(e){ console.warn('[call] self-heal play() failed:', e && e.name); });
                }
                var inboundBytesNow = inAudio ? Number(inAudio.bytesReceived || 0) : 0;
                var inboundFlowing = inboundBytesNow > lastInboundBytes;
                var audioTimeNow = el ? Number(el.currentTime || 0) : 0;
                if (inboundFlowing && el && !el.paused) {
                    if (audioTimeNow <= lastAudioTime + 0.01) stuckAudioTicks += 1;
                    else stuckAudioTicks = 0;
                    if (stuckAudioTicks >= 2 && rig && rig._lastRemoteStream && !rig._reattachInFlight) {
                        rig._reattachInFlight = true;
                        console.warn('[call] inbound audio flowing but element time is stuck - rebuilding remote audio element');
                        _attachRemoteStreamToRig(rig, rig._lastRemoteStream).then(function(){
                            stuckAudioTicks = 0;
                            rig._reattachInFlight = false;
                        }).catch(function(e){
                            console.warn('[call] remote audio rebuild failed:', e && e.name, e && e.message);
                            rig._reattachInFlight = false;
                        });
                    }
                } else if (!inboundFlowing) {
                    stuckAudioTicks = 0;
                }
                lastInboundBytes = inboundBytesNow;
                lastAudioTime = audioTimeNow;
            } catch (_) {}
        }, 2000);
        return iv;
    }

    function _callControlsHtml(audioBlocked) {
        var muted = !!(_activeCall && _activeCall.muted);
        var muteText = muted ? 'Unmute' : 'Mute';
        var enableAudio = audioBlocked ? '<button id="call-enable-audio-btn" class="lr-btn" style="padding:10px 14px;background:#4f46e5;color:#fff;border-color:#4f46e5;font-weight:700">Enable audio</button>' : '';
        return enableAudio + '<button id="call-mute-btn" class="lr-btn" style="padding:10px 14px;font-weight:700">' + muteText + '</button>' + _hangupButtonHtml();
    }

    function _wireCallButtons() {
        var hangupBtn = document.getElementById('call-hangup-btn');
        if (hangupBtn) hangupBtn.onclick = function(){ window.endSellerCall('user_hangup'); };
        var muteBtn = document.getElementById('call-mute-btn');
        if (muteBtn) muteBtn.onclick = function(){ window.toggleSellerCallMute(); };
        var audioBtn = document.getElementById('call-enable-audio-btn');
        if (audioBtn) audioBtn.onclick = function(){ window.enableSellerCallAudio(); };
    }

    function _showModal(html) {
        var existing = document.getElementById('call-buyer-modal');
        if (existing) existing.remove();
        var modal = document.createElement('div');
        modal.id = 'call-buyer-modal';
        modal.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,0.7);display:flex;align-items:center;justify-content:center;z-index:99999;backdrop-filter:blur(4px)';
        modal.innerHTML = '<div style="background:#fff;color:#0f172a;padding:28px 32px 24px;border-radius:18px;width:min(420px,calc(100vw - 32px));text-align:center;box-shadow:0 20px 60px rgba(5,8,22,0.28),0 0 0 1px rgba(99,102,241,0.14);font-family:system-ui,-apple-system,sans-serif">' + html + '</div>';
        document.body.appendChild(modal);
        return modal;
    }

    function _closeModal() {
        var m = document.getElementById('call-buyer-modal');
        if (m) m.remove();
    }

    function _updateModalState(stateText, extraButtonsHtml) {
        // Update the outbound-call modal (no-op when no modal exists)
        var modal = document.getElementById('call-buyer-modal');
        if (modal) {
            var stateEl = modal.querySelector('[data-call-state]');
            if (stateEl) stateEl.textContent = stateText;
            var btnWrap = modal.querySelector('[data-call-buttons]');
            if (btnWrap && extraButtonsHtml != null) {
                btnWrap.innerHTML = extraButtonsHtml;
                _wireCallButtons();
            }
        }
        // Also update BCW when the call was answered from the header widget
        if (_bcwAnsweredFromHeader) {
            _bcwShowActive(_bcwActiveDisplay, stateText);
            if (stateText === 'In call') _bcwStartDurationTimer();
        }
    }

    async function _fetchLiveKitToken(callId, headers) {
        if (!window.LivekitClient || !callId) return null;
        try {
            var res = await fetch(API_BASE + '/calls/' + encodeURIComponent(callId) + '/livekit-token?bust=' + Date.now(), {
                headers: headers,
                cache: 'no-store'
            });
            if (!res.ok) return null;
            var data = await res.json().catch(function(){ return null; });
            return data && data.enabled && data.url && data.token ? data : null;
        } catch (err) {
            console.warn('[call-livekit] token fetch failed:', err && err.message);
            return null;
        }
    }

    async function _tryStartLiveKitCall(opts) {
        opts = opts || {};
        if (!window.LivekitClient && window.AutomailBizModules) {
            try {
                await window.AutomailBizModules.load('livekitLoader');
                if (typeof window.ensureLiveKitClient === 'function') await window.ensureLiveKitClient();
            } catch (err) {
                console.warn('[call-livekit] lazy load failed, falling back to WebRTC:', err && err.message);
                return false;
            }
        }
        var LK = window.LivekitClient;
        if (!LK || !opts.callId || !opts.headers || !opts.localStream || !opts.audioRig) return false;
        var auth = await _fetchLiveKitToken(opts.callId, opts.headers);
        if (!auth) return false;

        var room = null;
        try {
            room = new LK.Room({
                adaptiveStream: true,
                dynacast: true,
                audioCaptureDefaults: LK_AUDIO_CAPTURE,
                publishDefaults: {
                    dtx: true,
                    red: true,
                    forceStereo: false,
                    stopMicTrackOnMute: false
                },
            });
            var remoteStream = new MediaStream();
            var localAudioPublication = null;
            var liveKitStatsTimer = null;
            var lastOutboundStats = null;
            var lastInboundStats = null;
            var lkAttachedAudioEls = [];   // LiveKit-managed <audio> elements via track.attach()
            var subscribedRemoteTracks = new WeakSet();
            var remoteAudio = opts.audioRig.remoteAudio || document.createElement('audio');
            if (!opts.audioRig.remoteAudio) {
                remoteAudio.autoplay = true; remoteAudio.playsInline = true; remoteAudio.muted = false; remoteAudio.volume = 1; remoteAudio.style.display = 'none';
                document.body.appendChild(remoteAudio);
            }
            var fdb = _ensureFirestore();
            var unsubCall = fdb ? fdb.collection('calls').doc(opts.callId).onSnapshot(function(snap) {
                if (!snap.exists || !_activeCall) return;
                var d = snap.data() || {};
                if (d.status === 'declined') window.endSellerCall('declined_by_seller');
                else if (d.status === 'missed') window.endSellerCall('no_answer');
                else if (d.status === 'completed') window.endSellerCall('remote_ended');
                else if (d.status === 'failed') window.endSellerCall('failed');
            }) : null;
            var ringTimer = opts.role === 'caller' ? setTimeout(function() {
                if (_activeCall && _activeCall.livekit && !_activeCall.connectedAt) window.endSellerCall('no_answer');
            }, RING_TIMEOUT_MS) : null;

            room.on(LK.RoomEvent.TrackSubscribed, function(track, publication, participant) {
                var isAudio = track && (track.kind === 'audio' || (LK.Track && LK.Track.Kind && track.kind === LK.Track.Kind.Audio));
                if (!isAudio) return;
                try { console.info('[call-livekit] TrackSubscribed audio from', participant && participant.identity, 'sid=', publication && publication.trackSid); } catch (_) {}
                // 1) LiveKit-managed <audio> via track.attach() — robust path
                //    handles muted/unmuted state, codec changes, srcObject reset.
                try {
                    if (typeof track.attach === 'function') {
                        var lkEl = track.attach();
                        if (lkEl) {
                            lkEl.autoplay = true;
                            lkEl.playsInline = true;
                            lkEl.setAttribute('playsinline', '');
                            lkEl.setAttribute('webkit-playsinline', '');
                            lkEl.muted = false;
                            lkEl.volume = 1;
                            try { lkEl.disableRemotePlayback = true; } catch (_) {}
                            lkEl.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none';
                            document.body.appendChild(lkEl);
                            lkAttachedAudioEls.push(lkEl);
                            try { _setCallAudioSink(lkEl).catch(function(){}); } catch (_) {}
                            var p = lkEl.play && lkEl.play();
                            if (p && p.catch) p.catch(function(err){ console.warn('[call-livekit] lk audio play() failed:', err && err.message); });
                            subscribedRemoteTracks.add(track);
                        }
                    }
                } catch (e) { console.warn('[call-livekit] track.attach() failed:', e && e.message); }
                // 2) Mirror into the legacy rig remoteAudio element for stats path
                try {
                    if (opts.audioRig && opts.audioRig.remoteAudio) {
                        opts.audioRig.remoteAudio.pause();
                        opts.audioRig.remoteAudio.srcObject = null;
                    }
                } catch (_) {}
                try {
                    var mediaValue = track.mediaStreamTrack;
                    var mediaTrack = typeof mediaValue === 'function' ? mediaValue.call(track) : mediaValue;
                    if (mediaTrack && !remoteStream.getTracks().some(function(t){ return t.id === mediaTrack.id; })) {
                        remoteStream.getAudioTracks().forEach(function(existing) {
                            if (existing.id !== mediaTrack.id) {
                                try { remoteStream.removeTrack(existing); } catch (_) {}
                            }
                        });
                        remoteStream.addTrack(mediaTrack);
                    }
                    if (_activeCall && _activeCall.callId === opts.callId) {
                        _activeCall.remoteAudioTrack = track;
                    }
                } catch (_) {}
                _stopRingbackTone(opts.audioRig);
                _attachRemoteStreamToRig(opts.audioRig, remoteStream).then(function(){
                    if (_activeCall && _activeCall.callId === opts.callId) {
                        _activeCall.remoteAudio = opts.audioRig.remoteAudio || remoteAudio;
                        if (!_activeCall.connectedAt) {
                            _updateModalState('In call', _callControlsHtml(false));
                            _startCallDuration();
                        }
                    }
                    console.info('[call-livekit] remote audio playing');
                }).catch(function(err) {
                    console.warn('[call-livekit] play() failed:', err && err.message);
                    _updateModalState('Audio ready - tap Enable audio', _callControlsHtml(true));
                });
                // 3) Track-level mute/unmute logs (visibility).
                try {
                    if (typeof track.on === 'function') {
                        track.on('muted', function(){ console.warn('[call-livekit] remote track muted'); });
                        track.on('unmuted', function(){ console.info('[call-livekit] remote track unmuted'); });
                    }
                } catch (_) {}
            });
            room.on(LK.RoomEvent.TrackUnsubscribed, function(track) {
                try { if (typeof track.detach === 'function') {
                    var detached = track.detach();
                    var arr = Array.isArray(detached) ? detached : (detached ? [detached] : []);
                    arr.forEach(function(el){ try { el.pause(); el.srcObject = null; el.remove(); } catch (_) {} });
                } } catch (_) {}
                lkAttachedAudioEls = lkAttachedAudioEls.filter(function(el){ return el && el.isConnected; });
                var mediaValue = track && track.mediaStreamTrack;
                var mediaTrack = typeof mediaValue === 'function' ? mediaValue.call(track) : mediaValue;
                if (!mediaTrack) return;
                try {
                    remoteStream.getAudioTracks().forEach(function(existing) {
                        if (existing.id === mediaTrack.id) remoteStream.removeTrack(existing);
                    });
                } catch (_) {}
            });
            // Force subscribe to audio tracks that are already published by the
            // time we connect, OR are published by a participant that joins
            // later. autoSubscribe:true should handle this, but we double-arm
            // it defensively (LiveKit issue #1742-class races).
            function _forceSubscribeAudio(participant) {
                try {
                    var pubs = participant && participant.audioTrackPublications;
                    if (!pubs || !pubs.forEach) return;
                    pubs.forEach(function(pub) {
                        try {
                            if (pub && typeof pub.setSubscribed === 'function' && !pub.isSubscribed) {
                                pub.setSubscribed(true);
                                console.info('[call-livekit] forced subscribe to', pub.trackSid);
                            }
                        } catch (_) {}
                    });
                } catch (_) {}
            }
            room.on(LK.RoomEvent.ParticipantConnected, function(participant) {
                try { console.info('[call-livekit] participant connected:', participant && participant.identity); } catch (_) {}
                _forceSubscribeAudio(participant);
            });
            room.on(LK.RoomEvent.TrackPublished, function(publication, participant) {
                try { console.info('[call-livekit] track published:', publication && publication.trackSid, 'by', participant && participant.identity); } catch (_) {}
                try {
                    if (publication && (publication.kind === 'audio' || (LK.Track && LK.Track.Kind && publication.kind === LK.Track.Kind.Audio))) {
                        if (typeof publication.setSubscribed === 'function') publication.setSubscribed(true);
                    }
                } catch (_) {}
            });
            room.on(LK.RoomEvent.ConnectionStateChanged, function(state) {
                try { console.info('[call-livekit] connection state:', state); } catch (_) {}
            });
            room.on(LK.RoomEvent.Reconnecting, function(){ _updateModalState('Reconnecting...', _callControlsHtml(false)); });
            room.on(LK.RoomEvent.Reconnected, function(){
                try {
                    if (_activeCall && _activeCall.audioRig && _activeCall.audioRig.remoteAudio) {
                        _activeCall.audioRig.remoteAudio.pause();
                        _activeCall.audioRig.remoteAudio.srcObject = null;
                    }
                } catch (_) {}
                // Re-arm subscription on every remote participant after reconnect.
                try {
                    if (room && room.remoteParticipants && room.remoteParticipants.forEach) {
                        room.remoteParticipants.forEach(function(p) { _forceSubscribeAudio(p); });
                    }
                } catch (_) {}
                if (_activeCall) _updateModalState('In call', _callControlsHtml(false));
            });
            room.on(LK.RoomEvent.Disconnected, function(){ if (_activeCall && _activeCall.livekit && _activeCall.callId === opts.callId) window.endSellerCall('remote_ended'); });

            function findLocalAudioTrack() {
                if (_activeCall && _activeCall.localAudioTrack) return _activeCall.localAudioTrack;
                try {
                    var pubs = room && room.localParticipant && room.localParticipant.audioTrackPublications;
                    if (pubs && pubs.values) {
                        var iter = pubs.values();
                        var next;
                        while (!(next = iter.next()).done) {
                            if (next.value && next.value.track) return next.value.track;
                        }
                    }
                } catch (_) {}
                return null;
            }

            async function publishLiveKitMicrophone() {
                try { opts.localStream.getTracks().forEach(function(t){ t.stop(); }); } catch (_) {}
                if (room.localParticipant && typeof room.localParticipant.setMicrophoneEnabled === 'function') {
                    localAudioPublication = await room.localParticipant.setMicrophoneEnabled(true, LK_AUDIO_CAPTURE, {
                        name: 'microphone', dtx: true, red: true, forceStereo: false
                    });
                    var lkTrack = (localAudioPublication && localAudioPublication.track) || findLocalAudioTrack();
                    if (lkTrack && typeof lkTrack.unmute === 'function') { try { await lkTrack.unmute(); } catch (_) {} }
                    if (_activeCall && _activeCall.callId === opts.callId) _activeCall.localAudioTrack = lkTrack || null;
                } else if (typeof LK.createLocalAudioTrack === 'function') {
                    var createdTrack = await LK.createLocalAudioTrack(LK_AUDIO_CAPTURE);
                    localAudioPublication = await room.localParticipant.publishTrack(createdTrack, {
                        source: LK.Track && LK.Track.Source ? LK.Track.Source.Microphone : undefined,
                        name: 'microphone', dtx: true, red: true, forceStereo: false
                    });
                    if (_activeCall && _activeCall.callId === opts.callId) _activeCall.localAudioTrack = createdTrack;
                } else {
                    var freshStream = await navigator.mediaDevices.getUserMedia({ audio: CALL_AUDIO_CONSTRAINTS, video: false });
                    var rawAudioTrack = freshStream.getAudioTracks()[0];
                    if (!rawAudioTrack) throw new Error('No microphone audio track available');
                    localAudioPublication = await room.localParticipant.publishTrack(rawAudioTrack, {
                        source: LK.Track && LK.Track.Source ? LK.Track.Source.Microphone : undefined,
                        name: 'microphone', dtx: true, red: true, forceStereo: false
                    });
                    if (_activeCall && _activeCall.callId === opts.callId) _activeCall.localStream = freshStream;
                }
                var localTrack = findLocalAudioTrack();
                var localMediaValue = localTrack && localTrack.mediaStreamTrack;
                var mediaTrack = (typeof localMediaValue === 'function' ? localMediaValue.call(localTrack) : localMediaValue) || (_activeCall && _activeCall.localStream && _activeCall.localStream.getAudioTracks()[0]);
                if (!mediaTrack || mediaTrack.readyState !== 'live') throw new Error('LiveKit microphone track is not live');
                try { mediaTrack.enabled = true; } catch (_) {}
                try {
                    var settings = mediaTrack.getSettings ? mediaTrack.getSettings() : {};
                    if (settings && settings.echoCancellation === false) console.warn('[call-livekit] Browser did not apply echoCancellation to microphone track', settings);
                } catch (_) {}
                if (_activeCall && _activeCall.callId === opts.callId) {
                    _activeCall.localStream = new MediaStream([mediaTrack]);
                    _activeCall.localAudioTrack = localTrack || _activeCall.localAudioTrack || null;
                }
                return mediaTrack;
            }

            async function readAudioStats() {
                var localTrack = findLocalAudioTrack();
                var sender = (localTrack && (localTrack.sender || localTrack.rtpSender)) || (localAudioPublication && localAudioPublication.track && localAudioPublication.track.sender);
                var remoteTrack = _activeCall && _activeCall.remoteAudioTrack;
                var receiver = remoteTrack && (remoteTrack.receiver || remoteTrack.rtpReceiver);
                var localMediaValue = localTrack && localTrack.mediaStreamTrack;
                var localMediaTrack = (typeof localMediaValue === 'function' ? localMediaValue.call(localTrack) : localMediaValue) || (_activeCall && _activeCall.localStream && _activeCall.localStream.getAudioTracks()[0]);
                var remoteMediaValue = remoteTrack && remoteTrack.mediaStreamTrack;
                var remoteMediaTrack = typeof remoteMediaValue === 'function' ? remoteMediaValue.call(remoteTrack) : remoteMediaValue;
                var out = {
                    ts: Date.now(), callId: opts.callId, role: opts.role, transport: 'livekit',
                    local: {
                        enabled: localMediaTrack ? localMediaTrack.enabled : null,
                        muted: localMediaTrack ? localMediaTrack.muted : null,
                        readyState: localMediaTrack ? localMediaTrack.readyState : null,
                        settings: localMediaTrack && localMediaTrack.getSettings ? localMediaTrack.getSettings() : null
                    },
                    remote: {
                        muted: remoteMediaTrack ? remoteMediaTrack.muted : null,
                        readyState: remoteMediaTrack ? remoteMediaTrack.readyState : null,
                        settings: remoteMediaTrack && remoteMediaTrack.getSettings ? remoteMediaTrack.getSettings() : null
                    }
                };
                if (sender && sender.getStats) {
                    var sReport = await sender.getStats();
                    sReport.forEach(function(stat) {
                        if (stat.type === 'outbound-rtp' && (stat.kind === 'audio' || stat.mediaType === 'audio')) {
                            out.local.packetsSent = stat.packetsSent || 0;
                            out.local.bytesSent = stat.bytesSent || 0;
                        }
                    });
                }
                if (receiver && receiver.getStats) {
                    var rReport = await receiver.getStats();
                    rReport.forEach(function(stat) {
                        if (stat.type === 'inbound-rtp' && (stat.kind === 'audio' || stat.mediaType === 'audio')) {
                            out.remote.packetsReceived = stat.packetsReceived || 0;
                            out.remote.bytesReceived = stat.bytesReceived || 0;
                            out.remote.audioLevel = stat.audioLevel || 0;
                            out.remote.totalAudioEnergy = stat.totalAudioEnergy || 0;
                        }
                    });
                }
                return out;
            }

            function startLiveKitStatsMonitor() {
                try { if (liveKitStatsTimer) clearInterval(liveKitStatsTimer); } catch (_) {}
                liveKitStatsTimer = setInterval(async function() {
                    try {
                        var stats = await readAudioStats();
                        window.__lastBizLiveKitAudioStats = stats;
                        lastOutboundStats = stats.local || lastOutboundStats;
                        lastInboundStats = stats.remote || lastInboundStats;
                    } catch (_) {}
                }, 2000);
                if (_activeCall && _activeCall.callId === opts.callId) _activeCall.localAudioStatsTimer = liveKitStatsTimer;
            }

            _activeCall = {
                callId: opts.callId, room: room, livekit: true, localStream: opts.localStream, remoteStream: remoteStream,
                unsubCall: unsubCall, ringTimer: ringTimer, headers: opts.headers, remoteAudio: remoteAudio, audioRig: opts.audioRig,
                connectedAt: null, durationTimer: null, muted: false, localAudioTrack: null, localAudioStatsTimer: null, remoteAudioTrack: null,
            };
            try { window.__automailBizCallActive = true; window.__lastBizLiveKitState = { ts: Date.now(), callId: opts.callId, room: auth.room || null, role: opts.role }; } catch (_) {}
            _wireCallButtons();
            _updateModalState(opts.role === 'caller' ? 'Ringing...' : 'Connecting...', _callControlsHtml(false));
            await room.connect(auth.url, auth.token, { autoSubscribe: true });
            try {
                if (room.remoteParticipants && room.remoteParticipants.forEach) {
                    room.remoteParticipants.forEach(function(p) { _forceSubscribeAudio(p); });
                }
            } catch (_) {}
            var liveKitMic = await publishLiveKitMicrophone();
            startLiveKitStatsMonitor();
            try { window.__lastBizLiveKitState.micSettings = liveKitMic.getSettings ? liveKitMic.getSettings() : null; } catch (_) {}
            return true;
        } catch (err) {
            console.warn('[call-livekit] start failed, falling back to WebRTC:', err && err.message);
            try { if (liveKitStatsTimer) clearInterval(liveKitStatsTimer); } catch (_) {}
            try { if (room && room.disconnect) await room.disconnect(); } catch (_) {}
            if (_activeCall && _activeCall.livekit && _activeCall.callId === opts.callId) {
                try { _activeCall.unsubCall && _activeCall.unsubCall(); } catch (_) {}
                try { clearTimeout(_activeCall.ringTimer); } catch (_) {}
                _activeCall = null;
            }
            return false;
        }
    }

    function _showSellerUnavailableModal(opts, info) {
        info = info || {};
        var reason = info.reason || 'unavailable';
        var reasonText = {
            calling_disabled: 'This seller is not accepting calls at the moment.',
            buyer_calls_disabled: 'This seller has disabled buyer calls.',
            marked_unavailable: 'Seller is currently busy.',
            manual_off: 'Seller is away right now.',
            out_of_hours: 'Seller is outside business hours.',
            unavailable: 'Seller is unavailable right now.',
        }[reason] || 'Seller is unavailable right now.';
        var nextTxt = '';
        if (info.nextAvailableAt) {
            try { nextTxt = '<div style="font-size:13px;color:#475569;margin-bottom:10px">Next available: ' + new Date(info.nextAvailableAt).toLocaleString() + '</div>'; } catch (_) {}
        }
        var allowCb = info.callbacksAllowed !== false; // default true unless explicitly disabled
        var html = '<div style="width:56px;height:56px;margin:0 auto 14px;border-radius:50%;background:#fef3c7;color:#b45309;display:flex;align-items:center;justify-content:center">' +
            '<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M10.68 13.31a16 16 0 0 0 3.41 2.6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.42 19.42 0 0 1-3.33-2.67m-2.67-3.34a19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91"/><line x1="23" y1="1" x2="1" y2="23"/></svg>' +
            '</div>' +
            '<div style="font-size:17px;font-weight:600;margin-bottom:6px;color:#0f172a">Seller unavailable</div>' +
            '<div style="font-size:13.5px;color:#475569;line-height:1.5;margin-bottom:10px">' + reasonText + '</div>' +
            nextTxt;
        if (allowCb) {
            html += '<div style="text-align:left;margin:14px 0;padding:12px;background:#f8fafc;border-radius:8px;font-size:13px">' +
                '<label style="display:flex;gap:8px;align-items:flex-start;cursor:pointer">' +
                '<input type="checkbox" id="cb-consent" checked style="margin-top:3px" />' +
                '<span>I consent to the seller calling me back. My contact will be shared only with this seller.</span>' +
                '</label>' +
                '<input id="cb-name" type="text" placeholder="Your name" style="margin-top:10px;width:100%;padding:6px 8px;border:1px solid #cbd5e1;border-radius:4px" />' +
                '<input id="cb-phone" type="tel" placeholder="Phone (optional)" style="margin-top:6px;width:100%;padding:6px 8px;border:1px solid #cbd5e1;border-radius:4px" />' +
                '<textarea id="cb-msg" placeholder="Message (optional)" style="margin-top:6px;width:100%;padding:6px 8px;border:1px solid #cbd5e1;border-radius:4px;min-height:50px"></textarea>' +
                '</div>' +
                '<div style="display:flex;gap:8px;justify-content:center">' +
                '<button id="cb-cancel" class="lr-btn" style="padding:8px 16px">Cancel</button>' +
                '<button id="cb-submit" class="lr-btn" style="padding:8px 16px;background:#0d9488;color:#fff;border-color:#0d9488">Request callback</button>' +
                '</div>';
        } else {
            html += '<button onclick="document.getElementById(\'call-buyer-modal\').remove()" class="lr-btn" style="padding:8px 16px">OK</button>';
        }
        _showModal(html);
        if (allowCb) {
            document.getElementById('cb-cancel').onclick = function(){ _closeModal(); };
            document.getElementById('cb-submit').onclick = async function() {
                var consent = document.getElementById('cb-consent').checked;
                if (!consent) { alert('Please consent to receive a callback.'); return; }
                var name = (document.getElementById('cb-name').value || '').trim();
                var phone = (document.getElementById('cb-phone').value || '').trim();
                var msg = (document.getElementById('cb-msg').value || '').trim();
                var btn = document.getElementById('cb-submit');
                btn.disabled = true; btn.textContent = 'Sending…';
                try {
                    var headers = await _authHeaders();
                    var res = await fetch(API_BASE + '/calls/callback-request', {
                        method: 'POST', headers: headers,
                        body: JSON.stringify({
                            sellerOwnerUid: opts.sellerOwnerUid,
                            listingId: opts.listingId || opts.listingSlug || '',
                            contactName: name,
                            contactPhone: phone,
                            message: msg,
                        }),
                    });
                    var data = await res.json().catch(function(){ return {}; });
                    if (!res.ok) throw new Error(data.error || 'Failed to send callback request');
                    _closeModal();
                    _showModal(
                        '<div style="width:56px;height:56px;margin:0 auto 14px;border-radius:50%;background:rgba(34,197,94,0.12);color:#16a34a;display:flex;align-items:center;justify-content:center">' +
                        '<svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="20 6 9 17 4 12"/></svg>' +
                        '</div>' +
                        '<div style="font-size:16px;font-weight:600;margin-bottom:6px;color:#0f172a">Callback requested</div>' +
                        '<div style="font-size:13px;color:#475569;margin-bottom:16px;line-height:1.5">Seller will call you back when available.</div>' +
                        '<button onclick="document.getElementById(\'call-buyer-modal\').remove()" class="lr-btn" style="padding:9px 18px">OK</button>'
                    );
                } catch (err) {
                    btn.disabled = false; btn.textContent = 'Request callback';
                    alert('Callback request failed: ' + err.message);
                }
            };
        }
    }

    window.startSellerCall = async function(opts) {
        opts = opts || {};
        if (typeof currentUser === 'undefined' || !currentUser) {
            if (typeof showAuthModal === 'function') showAuthModal('signup');
            else alert('Please sign in to call the seller.');
            return;
        }
        if (!opts.sellerOwnerUid) { alert('Missing seller info'); return; }
        if (_activeCall) { alert('You are already on a call.'); return; }

        // CRITICAL: create the audio rig synchronously inside the user click gesture.
        // This unlocks autoplay for the rest of the session so the seller's voice
        // plays the instant pc.ontrack fires - no Enable-audio tap required.
        var audioRig = _createCallAudioRig();

        var db = _ensureFirestore();
        if (!db) { _destroyCallAudioRig(audioRig); alert('Calling requires Firestore SDK. Please reload the page.'); return; }

        var modal = _showModal(
            '<div id="call-anim" style="position:relative;width:88px;height:88px;margin:0 auto 16px;border-radius:50%;background:linear-gradient(135deg,#6366f1 0%,#8b5cf6 100%);display:flex;align-items:center;justify-content:center;color:#fff">' +
            '<svg xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>' +
            '<span class="call-buyer-pulse"></span><span class="call-buyer-pulse" style="animation-delay:.8s"></span>' +
            '</div>' +
            '<div style="font-size:20px;font-weight:750;margin-bottom:4px;color:#0f172a;line-height:1.2">' + _escapeHtml(opts.bizName || 'Seller') + '</div>' +
            '<div data-call-state style="font-size:13.5px;color:#64748b;margin-bottom:10px">Checking availability…</div>' +
            '<div data-call-duration style="display:inline-flex;align-items:center;justify-content:center;min-width:64px;margin:0 auto 18px;padding:5px 10px;border-radius:999px;background:#f8fafc;border:1px solid #e2e8f0;color:#0f172a;font-variant-numeric:tabular-nums;font-weight:750">00:00</div>' +
            '<div data-call-buttons style="display:flex;gap:10px;justify-content:center;flex-wrap:wrap"></div>' +
            '<style>.call-buyer-pulse{position:absolute;inset:-6px;border-radius:50%;border:2px solid #6366f1;animation:callBuyerRing 1.6s ease-out infinite;opacity:0}@keyframes callBuyerRing{0%{transform:scale(.95);opacity:.55}100%{transform:scale(1.4);opacity:0}}</style>'
        );

        // Pre-flight: check seller availability
        var preHeaders = await _authHeaders();
        try {
            var availRes = await fetch(API_BASE + '/calls/availability?sellerOwnerUid=' + encodeURIComponent(opts.sellerOwnerUid), { headers: preHeaders });
            var availData = await availRes.json().catch(function(){ return {}; });
            if (availRes.ok && availData && availData.available === false) {
                _destroyCallAudioRig(audioRig);
                _closeModal();
                _showSellerUnavailableModal(opts, availData);
                return;
            }
        } catch (_) { /* non-fatal — proceed */ }

        _updateModalState('Requesting mic…');

        var localStream;
        try {
            localStream = await Promise.race([
                _acquireCallMic(),
                new Promise(function(_, reject) {
                    setTimeout(function() {
                        var err = new Error('Microphone permission timeout');
                        err.name = 'GumTimeout';
                        reject(err);
                    }, 30000);
                })
            ]);
        } catch (err) {
            _destroyCallAudioRig(audioRig);
            _closeModal();
            var micMsg = 'Microphone access denied. ';
            if (err && err.name === 'NotAllowedError') micMsg += 'Open site permissions and allow microphone access for this site.';
            else if (err && err.name === 'NotFoundError') micMsg += 'No microphone detected on this device.';
            else if (err && err.name === 'NotReadableError') micMsg += 'Microphone is in use by another app. Please close it and try again.';
            else if (err && err.name === 'GumTimeout') micMsg += 'Permission request timed out. Please try again and allow microphone access.';
            else micMsg += (err && err.message) || 'Unknown error.';
            alert(micMsg);
            return;
        }

        var headers = await _authHeaders();
        var iceServersPromise = _fetchIceServers();
        var initRes, initData;
        try {
            initRes = await fetch(API_BASE + '/calls/initiate', {
                method: 'POST', headers: headers,
                body: JSON.stringify({
                    sellerOwnerUid: opts.sellerOwnerUid,
                    listingId: opts.listingId || opts.listingSlug || '',
                    buyerDisplay: (currentUser.displayName || currentUser.email || 'Buyer').slice(0, 64),
                }),
            });
            initData = await initRes.json();
        } catch (err) {
            localStream.getTracks().forEach(function(t){ t.stop(); });
            _destroyCallAudioRig(audioRig);
            _closeModal();
            alert('Call failed: ' + err.message);
            return;
        }
        if (!initRes.ok) {
            localStream.getTracks().forEach(function(t){ t.stop(); });
            _destroyCallAudioRig(audioRig);
            _closeModal();
            // Availability / overflow path — seller offline or outside hours
            if (initRes.status === 409 && initData && initData.code === 'SELLER_UNAVAILABLE') {
                _showSellerUnavailableModal(opts, initData);
                return;
            }
            var reason = initData && initData.error ? initData.error : 'Call failed';
            if (reason.toLowerCase().indexOf('plan') >= 0 || initRes.status === 403) {
                _showModal(
                    '<div style="width:56px;height:56px;margin:0 auto 14px;border-radius:50%;background:rgba(99,102,241,0.12);color:#6366f1;display:flex;align-items:center;justify-content:center">' +
                    '<svg xmlns="http://www.w3.org/2000/svg" width="26" height="26" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>' +
                    '</div>' +
                    '<div style="font-size:17px;font-weight:600;margin-bottom:6px;color:#0f172a">Call not available</div>' +
                    '<div style="font-size:13.5px;color:#475569;margin-bottom:18px;line-height:1.5">' + reason + '</div>' +
                    '<button onclick="document.getElementById(\'call-buyer-modal\').remove()" class="lr-btn" style="padding:9px 18px">OK</button>'
                );
            } else {
                alert(reason);
            }
            return;
        }

        var callId = initData.callId;
        var sellerUid = initData.sellerUid || opts.sellerOwnerUid; // routed agent uid (may differ from owner)
        var selfUid = currentUser.uid;

        _updateModalState('Ringing…', _hangupButtonHtml());
        // Start audible ringback — the rig was created during the click gesture so this is allowed.
        _startRingbackTone(audioRig);

        // Prefer self-hosted LiveKit SFU media when configured. If the SFU is
        // unavailable, keep the old WebRTC path as automatic fallback.
        if (await _tryStartLiveKitCall({ callId: callId, headers: headers, localStream: localStream, audioRig: audioRig, role: 'caller' })) {
            return;
        }

        // Set up RTCPeerConnection
        var _iceList = (initData && Array.isArray(initData.iceServers) && initData.iceServers.length)
            ? initData.iceServers
            : await iceServersPromise;
        if (!_hasTurnServer(_iceList)) _updateModalState('Calling relay degraded — trying direct peer audio…', _hangupButtonHtml());
        var pc = new RTCPeerConnection({
            iceServers: _iceList,
            // v13 (2026-05-15): pool 0 — lazy gather to skip dead NICs
            // (virtual adapters, VPN, Hyper-V, WSL) that emit
            // "701 Address not associated with the desired network interface".
            iceCandidatePoolSize: 0,
            bundlePolicy: 'max-bundle',
            rtcpMuxPolicy: 'require'
        });
        _wirePeerDiagnostics(pc, 'buyer-call', callId, 'caller');
        _wireBenign701Suppressor(pc, 'buyer-call');
        var remoteStream = new MediaStream();
        // Reuse the autoplay-unlocked <audio> element from the rig.
        var remoteAudio = audioRig.remoteAudio || document.createElement('audio');
        if (!audioRig.remoteAudio) {
            remoteAudio.autoplay = true; remoteAudio.playsInline = true; remoteAudio.muted = false; remoteAudio.volume = 1;
            remoteAudio.style.display = 'none';
            document.body.appendChild(remoteAudio);
        }
        var sentCandidateBuffer = [];
        var candidateDrainTimer = setInterval(async function() {
            if (!_activeCall || !sentCandidateBuffer.length) return;
            var c = sentCandidateBuffer.shift();
            try {
                await _sendIceCandidate(callId, headers, selfUid, c);
            } catch (_) { sentCandidateBuffer.unshift(c); }
        }, 2000);
        var iceFailureTimer = null;

        pc.onicecandidate = async function(ev) {
            if (!ev.candidate) return;
            var c = ev.candidate.toJSON();
            try {
                await _sendIceCandidate(callId, headers, selfUid, c);
            } catch (_) { sentCandidateBuffer.push(c); }
        };

        pc.ontrack = function(ev) {
            var tracks = (ev.streams && ev.streams[0] && ev.streams[0].getTracks) ? ev.streams[0].getTracks() : (ev.track ? [ev.track] : []);
            tracks.forEach(function(t){
                try { t.enabled = true; } catch (_) {}
                if (!remoteStream.getTracks().some(function(existing){ return existing.id === t.id; })) {
                    remoteStream.addTrack(t);
                }
                if (!t.__automailRemoteTrackHandlers) {
                    t.__automailRemoteTrackHandlers = true;
                    t.onunmute = function(){
                        try { window.__lastCallRemoteUnmute = Date.now(); } catch (_) {}
                        if (audioRig.remoteAudio) audioRig.remoteAudio.play().catch(function(){});
                    };
                }
            });
            console.info('[call] ontrack fired — remote tracks:', remoteStream.getTracks().length, 'kinds:', remoteStream.getTracks().map(function(t){return t.kind+':'+t.readyState;}).join(','));
            try { window.__lastCallOnTrack = Date.now(); } catch (_) {}
            // Seller audio is here — stop ringback and hand the real stream to the
            // already-unlocked <audio> element.
            _stopRingbackTone(audioRig);
            _attachRemoteStreamToRig(audioRig, remoteStream).then(function(){
                remoteAudio = audioRig.remoteAudio;
                if (_activeCall && _activeCall.audioRig === audioRig) _activeCall.remoteAudio = remoteAudio;
                console.info('[call] remote audio playing');
            }).catch(function(err) {
                console.warn('[call] remote audio play failed, showing Enable audio CTA:', err && err.message);
                _updateModalState('Audio ready - tap Enable audio', _callControlsHtml(true));
            });
        };

        pc.onconnectionstatechange = function() {
            var s = pc.connectionState;
            if (s === 'connected') {
                clearTimeout(iceFailureTimer);
                _updateModalState('In call', _callControlsHtml(false));
                _startCallDuration();
                // v16 (2026-05-15): start RTP sender watchdog. Detects
                // Windows Chrome silent-sender bug + auto re-acquires the
                // mic + replaceTrack on the existing PC so the call stays
                // up. Bounded to 3 re-acquires per call.
                try {
                    if (_activeCall && !_activeCall._stopWatchdog) {
                        if (!_activeCall._micPipeline && window.__pendingMicPipeline) {
                            _activeCall._micPipeline = window.__pendingMicPipeline;
                            try { delete window.__pendingMicPipeline; } catch (_) {}
                        }
                        if (_activeCall._micPipeline) {
                            _activeCall._stopWatchdog = _startSenderWatchdog(pc, function(){
                                return {
                                    pipeline: _activeCall._micPipeline,
                                    onPipelineReplaced: function(p){ _activeCall._micPipeline = p; _activeCall.localStream = p.stream; }
                                };
                            });
                        }
                    }
                } catch (e) { console.warn('[call] watchdog start failed:', e && e.message); }
            } else if (s === 'failed') {
                window.endSellerCall('ice_failure', true);
            } else if (s === 'disconnected') {
                _updateModalState('Reconnecting…', _callControlsHtml(false));
                clearTimeout(iceFailureTimer);
                iceFailureTimer = setTimeout(function() {
                    if (_activeCall && pc.connectionState === 'disconnected') {
                        _updateModalState('Connection interrupted - keeping call open', _callControlsHtml(false));
                        try { pc.restartIce && pc.restartIce(); } catch(_) {}
                    }
                }, 60000);
                if (_activeCall) _activeCall.iceFailureTimer = iceFailureTimer;
            }
        };

        pc.oniceconnectionstatechange = function() {
            if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') {
                clearTimeout(iceFailureTimer);
                if (_activeCall && !_activeCall.connectedAt) {
                    _updateModalState('In call', _callControlsHtml(false));
                    _startCallDuration();
                }
            } else if (pc.iceConnectionState === 'failed') {
                window.endSellerCall('ice_failure', true);
            }
        };

        // Google Meet pattern: addTransceiver first, then replaceTrack.
        // Ensures the offer SDP carries a=sendrecv on the audio m-line and
        // that Chrome's AEC pipeline is correctly bound to this track.
        var _callerAudioTrack = localStream.getAudioTracks()[0] || null;
        try {
            if (typeof pc.addTransceiver === 'function') {
                var _callerTxr = pc.addTransceiver('audio', { direction: 'sendrecv', streams: [localStream] });
                if (_callerAudioTrack && _callerTxr.sender && typeof _callerTxr.sender.replaceTrack === 'function') {
                    _callerTxr.sender.replaceTrack(_callerAudioTrack).catch(function(){});
                }
            } else {
                localStream.getTracks().forEach(function(t){ pc.addTrack(t, localStream); });
            }
        } catch(_) {
            localStream.getTracks().forEach(function(t){ try { pc.addTrack(t, localStream); } catch(_2){} });
        }
        var voicePrep = _prepareAudioTransceiversForVoice(pc);
        try { window.__lastCallVoicePrep = { ts: Date.now(), callId: callId, role: 'caller', opusPreferred: voicePrep.opusPreferred, audioTransceivers: voicePrep.audioTransceivers }; } catch (_) {}

        // Subscribe to the ENTIRE /signaling subcollection — whoever answers
        // (routing may cascade through multiple agents) will write their SDP here.
        var seenCand = {};
        var pendingCand = [];
        var remoteSet = false;
        var acceptedPeerUid = null;
        var candUnsubs = {};

        function _subscribePeerCandidates(peerUid) {
            if (candUnsubs[peerUid]) return;
            candUnsubs[peerUid] = db.collection('calls').doc(callId)
                .collection('candidates').doc(peerUid).collection('items')
                .onSnapshot(function(snap) {
                    snap.docChanges().forEach(async function(chg) {
                        if (chg.type !== 'added') return;
                        var key = peerUid + ':' + chg.doc.id;
                        if (seenCand[key]) return;
                        seenCand[key] = true;
                        var c = chg.doc.data();
                        var cand = {
                            candidate: c.candidate,
                            sdpMid: c.sdpMid || undefined,
                            sdpMLineIndex: c.sdpMLineIndex == null ? undefined : Number(c.sdpMLineIndex),
                        };
                        if (!remoteSet) { pendingCand.push(cand); return; }
                        try { await pc.addIceCandidate(cand); } catch (e) { console.warn('[call] ice add failed:', e); }
                    });
                }, function(err) { console.warn('[call] cand onSnapshot err:', err); });
        }

        var unsubSignal = db.collection('calls').doc(callId).collection('signaling')
            .onSnapshot(async function(qs) {
                qs.docChanges().forEach(async function(chg) {
                    if (chg.type === 'removed') return;
                    var peerUid = chg.doc.id;
                    if (peerUid === selfUid) return; // skip our own offer
                    var data = chg.doc.data();
                    if (!data || data.type !== 'answer' || !data.sdp) return;
                    if (remoteSet) return;
                    try {
                        // Diagnostic: record the answer's audio direction so we
                        // can confirm seller is sending (sendrecv/sendonly) and
                        // not silently downgraded to recvonly.
                        try {
                            var dirMatch = /m=audio[\s\S]*?(?:^a=(sendrecv|sendonly|recvonly|inactive))/im.exec(data.sdp);
                            window.__lastCallAnswerDirection = { dir: dirMatch ? dirMatch[1] : 'unknown', from: peerUid, ts: Date.now() };
                        } catch (_) {}
                        await pc.setRemoteDescription({ type: 'answer', sdp: data.sdp });
                        remoteSet = true;
                        acceptedPeerUid = peerUid;
                        _subscribePeerCandidates(peerUid);
                        while (pendingCand.length) {
                            var c = pendingCand.shift();
                            try { await pc.addIceCandidate(c); } catch (_) {}
                        }
                        _updateModalState('Connecting…');
                    } catch (e) { console.warn('[call] setRemoteDescription failed:', e); }
                });
            }, function(err) { console.warn('[call] sdp onSnapshot err:', err); });

        // Listen on /calls/{callId} for status changes (declined/missed/canceled)
        var unsubCall = db.collection('calls').doc(callId)
            .onSnapshot(function(snap) {
                if (!snap.exists) return;
                var d = snap.data();
                if (d.status === 'declined') window.endSellerCall('declined_by_seller');
                else if (d.status === 'missed') window.endSellerCall('no_answer');
                else if (d.status === 'completed' && _activeCall) window.endSellerCall('remote_ended');
                else if (d.status === 'failed') window.endSellerCall('failed');
            });

        // Ring timeout
        var ringTimer = setTimeout(function() {
            if (_activeCall && pc.connectionState !== 'connected') {
                window.endSellerCall('no_answer');
            }
        }, RING_TIMEOUT_MS);

        _activeCall = {
            callId: callId, pc: pc, localStream: localStream, remoteStream: remoteStream,
            unsubSignal: unsubSignal, candUnsubs: candUnsubs, unsubCall: unsubCall,
            ringTimer: ringTimer, headers: headers, remoteAudio: remoteAudio,
            audioRig: audioRig,
            candidateDrainTimer: candidateDrainTimer, iceFailureTimer: iceFailureTimer,
            connectedAt: null, durationTimer: null, muted: false,
            statsTimer: _startCallStatsMonitor(pc, localStream),
            audioDiagTimer: _startAudioDiagMonitor(pc, audioRig),
        };
        try { window.__automailBizCallActive = true; } catch (_) {}

        _wireCallButtons();

        // Create offer
        try {
            var offer = await pc.createOffer();
            offer.sdp = _tuneOpusForSpeech(offer.sdp);
            offer.sdp = _forceAudioSendrecv(offer.sdp);
            await pc.setLocalDescription(offer);
            await fetch(API_BASE + '/calls/' + callId + '/signaling', {
                method: 'POST', headers: headers,
                body: JSON.stringify({ peerUid: selfUid, type: 'offer', sdp: offer.sdp }),
            });
        } catch (err) {
            console.error('[call] offer failed:', err);
            window.endSellerCall('offer_failed', true);
            return;
        }
    };

    window.toggleSellerCallMute = function() {
        if (!_activeCall || !_activeCall.localStream) return;
        _activeCall.muted = !_activeCall.muted;
        try {
            if (_activeCall.localAudioTrack && typeof _activeCall.localAudioTrack.mute === 'function' && typeof _activeCall.localAudioTrack.unmute === 'function') {
                if (_activeCall.muted) _activeCall.localAudioTrack.mute();
                else _activeCall.localAudioTrack.unmute();
            } else {
                _activeCall.localStream.getAudioTracks().forEach(function(t){ t.enabled = !_activeCall.muted; });
            }
        } catch (_) {}
        _updateModalState(_activeCall.connectedAt ? 'In call' : 'Connecting…', _callControlsHtml(false));
    };

    window.enableSellerCallAudio = function() {
        if (!_activeCall) return;
        var audio = (_activeCall.audioRig && _activeCall.audioRig.remoteAudio) || _activeCall.remoteAudio;
        if (!audio) return;
        var sink = _setCallAudioSink(audio).catch(function(){});
        sink.then(function(){ return audio.play(); }).then(function() {
            if (_activeCall) _activeCall.remoteAudio = audio;
            _updateModalState(_activeCall.connectedAt ? 'In call' : 'Connecting…', _callControlsHtml(false));
        }).catch(function() {
            _updateModalState('Audio blocked by browser', _callControlsHtml(true));
        });
    };

    window.endSellerCall = async function(reason, iceFailure) {
        if (!_activeCall) { _closeModal(); return; }
        var a = _activeCall; _activeCall = null;
        try { window.__automailBizCallActive = false; } catch (_) {}
        try { clearTimeout(a.ringTimer); } catch (_) {}
        try { clearInterval(a.candidateDrainTimer); } catch (_) {}
        try { clearInterval(a.statsTimer); } catch (_) {}
        try { clearInterval(a.audioDiagTimer); } catch (_) {}
        try { clearInterval(a.localAudioStatsTimer); } catch (_) {}
        try { clearTimeout(a.iceFailureTimer); } catch (_) {}
        _stopCallDuration(a);
        try { a.unsubSignal && a.unsubSignal(); } catch (_) {}
        try { a.unsubCandidates && a.unsubCandidates(); } catch (_) {}
        try { a.unsubCall && a.unsubCall(); } catch (_) {}
        try {
            if (a.candUnsubs) Object.keys(a.candUnsubs).forEach(function(k){ try { a.candUnsubs[k](); } catch(_){} });
        } catch (_) {}
        try { a.remoteStream && a.remoteStream.getTracks().forEach(function(t){ t.stop(); }); } catch (_) {}
        try { a.room && a.room.localParticipant && a.room.localParticipant.setMicrophoneEnabled && await a.room.localParticipant.setMicrophoneEnabled(false); } catch (_) {}
        try { a.localAudioTrack && a.localAudioTrack.stop && a.localAudioTrack.stop(); } catch (_) {}
        try { a.localStream && a.localStream.getTracks().forEach(function(t){ t.stop(); }); } catch (_) {}
        // v16: stop watchdog + tear down AudioContext pipeline.
        try { if (a._stopWatchdog) a._stopWatchdog(); } catch (_) {}
        try { _teardownMicPipeline(a._micPipeline); } catch (_) {}
        try { _teardownMicPipeline(window.__pendingMicPipeline); window.__pendingMicPipeline = null; } catch (_) {}
        try { if (a.room && a.room.disconnect) await a.room.disconnect(); } catch (_) {}
        try { a.pc && a.pc.close(); } catch (_) {}
        try { a.remoteAudio && a.remoteAudio.remove(); } catch (_) {}
        try { _destroyCallAudioRig(a.audioRig); } catch (_) {}
        try {
            await fetch(API_BASE + '/calls/' + a.callId + '/hangup', {
                method: 'POST', headers: a.headers,
                body: JSON.stringify({ reason: reason || 'user_hangup', iceFailure: !!iceFailure }),
            });
        } catch (_) {}
        // Show end state briefly, then close
        var endLabel = 'Call ended';
        if (reason === 'no_answer') endLabel = 'No answer. Try again later.';
        else if (reason === 'declined_by_seller') endLabel = 'Seller declined the call';
        else if (reason === 'ice_failure' || reason === 'ice_disconnected_timeout' || iceFailure) endLabel = 'Connection failed. Try again on a stronger network.';
        _updateModalState(endLabel, '<button onclick="document.getElementById(\'call-buyer-modal\').remove()" class="lr-btn" style="padding:8px 18px">Close</button>');
        setTimeout(function() { _closeModal(); }, 2500);
        // Clear BCW if call was answered from header
        if (_bcwAnsweredFromHeader) {
            clearInterval(_bcwDurationTimer); _bcwDurationTimer = null;
            _bcwAnsweredFromHeader = false; _bcwActiveDisplay = '';
            setTimeout(function() { _bcwHide(); }, 2500);
        }
    };

    var _incomingCallbackUnsub = null;
    var _lastIncomingCallbackId = null;
    var _incomingAuthObserved = false;

    // ── Buyer Call Widget (BCW) ────────────────────────────────────────────────
    // Persistent in-header widget for incoming seller callbacks.
    // States: hidden → ringing pill → active call bar (no redirect, no modal).
    var _bcwAnsweredFromHeader = false;
    var _bcwActiveDisplay = '';
    var _bcwDurationTimer = null;
    var _bcwDurationStart = 0;
    var _bcwRingPlaying = false;
    var _bcwRingTimer = null;
    var _bcwAudioCtx = null;
    var _bcwObservedCallId = null;
    var _bcwCallDocUnsub = null;

    function _bcwEl() { return document.getElementById('bcw'); }
    function _bcwHide() {
        var el = _bcwEl();
        if (el) { el.innerHTML = ''; el.style.display = 'none'; }
    }
    function _bcwFmt(sec) {
        sec = Math.max(0, Math.floor(sec || 0));
        return ('0' + Math.floor(sec / 60)).slice(-2) + ':' + ('0' + (sec % 60)).slice(-2);
    }

    // Ringtone: try MP3, fall back to Web Audio dual-tone (480+620 Hz)
    function _bcwStartRing() {
        if (_bcwRingPlaying) return;
        _bcwRingPlaying = true;
        var au = document.getElementById('bcw-ringtone-audio');
        if (au && au.src) {
            au.currentTime = 0;
            au.play().catch(function() { _bcwDoWebAudioRing(); });
            return;
        }
        _bcwDoWebAudioRing();
    }
    function _bcwDoWebAudioRing() {
        try {
            if (!_bcwAudioCtx || _bcwAudioCtx.state === 'closed') {
                _bcwAudioCtx = new (window.AudioContext || window.webkitAudioContext)();
            } else if (_bcwAudioCtx.state === 'suspended') {
                _bcwAudioCtx.resume();
            }
            function _cycle() {
                if (!_bcwRingPlaying) return;
                var ctx = _bcwAudioCtx;
                var o1 = ctx.createOscillator(), o2 = ctx.createOscillator();
                var g = ctx.createGain();
                o1.connect(g); o2.connect(g); g.connect(ctx.destination);
                o1.frequency.value = 480; o2.frequency.value = 620;
                g.gain.setValueAtTime(0, ctx.currentTime);
                g.gain.linearRampToValueAtTime(0.28, ctx.currentTime + 0.05);
                g.gain.setValueAtTime(0.28, ctx.currentTime + 1.9);
                g.gain.linearRampToValueAtTime(0, ctx.currentTime + 2.0);
                o1.start(ctx.currentTime); o1.stop(ctx.currentTime + 2.0);
                o2.start(ctx.currentTime); o2.stop(ctx.currentTime + 2.0);
                _bcwRingTimer = setTimeout(_cycle, 6000);
            }
            _cycle();
        } catch (e) { console.warn('[BCW] ring error:', e); }
    }
    function _bcwStopRing() {
        _bcwRingPlaying = false;
        clearTimeout(_bcwRingTimer);
        var au = document.getElementById('bcw-ringtone-audio');
        if (au) { try { au.pause(); au.currentTime = 0; } catch (_) {} }
    }

    function _bcwShowRinging(data) {
        var el = _bcwEl();
        if (!el) return;
        el.style.cssText = 'display:flex;align-items:center';
        el.innerHTML =
            '<div class="bcw-ring-pill">' +
            '<span class="bcw-ring-pulse"></span>' +
            '<span class="bcw-ring-pulse bcw-ring-pulse--2"></span>' +
            '<svg class="bcw-icon" viewBox="0 0 24 24" fill="currentColor" width="15" height="15">' +
            '<path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/>' +
            '</svg>' +
            '<div class="bcw-info">' +
            '<span class="bcw-label">Seller callback</span>' +
            '<span class="bcw-caller">' + _escapeHtml(data.fromDisplay || 'Seller') + '</span>' +
            '</div>' +
            '<button class="bcw-btn bcw-btn--decline" id="bcw-decline-btn">Decline</button>' +
            '<button class="bcw-btn bcw-btn--answer" id="bcw-answer-btn">Answer</button>' +
            '</div>';
        var decBtn = document.getElementById('bcw-decline-btn');
        var ansBtn = document.getElementById('bcw-answer-btn');
        if (decBtn) decBtn.onclick = function() { _bcwDeclineCallback(data); };
        if (ansBtn) ansBtn.onclick = function() { _bcwAnswerCallback(data); };
    }

    function _bcwShowActive(display, stateLabel, readOnly) {
        var el = _bcwEl();
        if (!el) return;
        el.style.cssText = 'display:flex;align-items:center';
        var isConn = stateLabel && (stateLabel === 'In call' || /^\d\d:\d\d$/.test(stateLabel));
        el.innerHTML =
            '<div class="bcw-active-pill">' +
            '<span class="bcw-active-dot' + (isConn ? ' bcw-active-dot--live' : '') + '"></span>' +
            '<svg class="bcw-icon" viewBox="0 0 24 24" fill="currentColor" width="14" height="14">' +
            '<path d="M6.62 10.79c1.44 2.83 3.76 5.14 6.59 6.59l2.2-2.2c.27-.27.67-.36 1.02-.24 1.12.37 2.33.57 3.57.57.55 0 1 .45 1 1V20c0 .55-.45 1-1 1-9.39 0-17-7.61-17-17 0-.55.45-1 1-1h3.5c.55 0 1 .45 1 1 0 1.25.2 2.45.57 3.57.11.35.03.74-.25 1.02l-2.2 2.2z"/>' +
            '</svg>' +
            '<div class="bcw-active-info">' +
            '<span class="bcw-active-name">' + _escapeHtml(display || 'Seller') + '</span>' +
            '<span class="bcw-active-state" id="bcw-state-lbl">' + _escapeHtml(stateLabel || 'Connecting\u2026') + '</span>' +
            '</div>' +
            (readOnly ? '<span class="bcw-btn bcw-btn--mute" style="cursor:default">Read only</span>' :
            '<button class="bcw-btn bcw-btn--mute" id="bcw-mute-btn">Mute</button>' +
            '<button class="bcw-btn bcw-btn--end" id="bcw-end-btn">End</button>') +
            '</div>';
        if (readOnly) return;
        var muteBtn = document.getElementById('bcw-mute-btn');
        var endBtn = document.getElementById('bcw-end-btn');
        if (muteBtn) muteBtn.onclick = _bcwToggleMute;
        if (endBtn) endBtn.onclick = function() { window.endSellerCall('user_hangup'); };
    }

    function _bcwStartDurationTimer() {
        _bcwDurationStart = Date.now();
        clearInterval(_bcwDurationTimer);
        _bcwDurationTimer = setInterval(function() {
            var lbl = document.getElementById('bcw-state-lbl');
            if (lbl) lbl.textContent = _bcwFmt(Math.floor((Date.now() - _bcwDurationStart) / 1000));
        }, 1000);
    }

    function _bcwToggleMute() {
        if (!_activeCall || !_activeCall.localStream) return;
        _activeCall.muted = !_activeCall.muted;
        try { _activeCall.localStream.getAudioTracks().forEach(function(t){ t.enabled = !_activeCall.muted; }); } catch (_) {}
        var btn = document.getElementById('bcw-mute-btn');
        if (btn) {
            btn.textContent = _activeCall.muted ? 'Unmute' : 'Mute';
            btn.className = 'bcw-btn bcw-btn--mute' + (_activeCall.muted ? ' bcw-btn--muted' : '');
        }
    }

    function _bcwDeclineCallback(data) {
        _bcwStopRing();
        _bcwHide();
        _lastIncomingCallbackId = null; // allow re-trigger if call comes again
        _authHeaders().then(function(h) {
            fetch(API_BASE + '/calls/' + data.callId + '/decline', {
                method: 'POST', headers: h,
                body: JSON.stringify({ reason: 'buyer_declined_callback' })
            }).catch(function() {});
        }).catch(function() {});
    }

    async function _bcwAnswerCallback(data) {
        _bcwStopRing();
        _bcwAnsweredFromHeader = true;
        _bcwActiveDisplay = data.fromDisplay || 'Seller';
        _bcwShowActive(_bcwActiveDisplay, 'Answering\u2026');
        await _answerIncomingCallback(data);
        // Patch display name into active call for endSellerCall cleanup
        if (_activeCall) _activeCall.bcwDisplay = _bcwActiveDisplay;
    }

    function _bcwObserveCallDoc(data) {
        if (!data || !data.callId) return;
        if (_bcwObservedCallId === data.callId) return;
        if (_bcwCallDocUnsub) { try { _bcwCallDocUnsub(); } catch (_) {} }
        var fdb = _ensureFirestore();
        if (!fdb) return;
        _bcwObservedCallId = data.callId;
        _bcwCallDocUnsub = fdb.collection('calls').doc(data.callId).onSnapshot(function(snap) {
            if (!snap.exists) return;
            var call = snap.data() || {};
            var status = String(call.status || '').toLowerCase();
            var terminal = ['completed','declined','missed','canceled','failed','blocked'].indexOf(status) >= 0;
            if (status === 'active' && !_activeCall && !_bcwAnsweredFromHeader) {
                _bcwStopRing();
                _bcwShowActive(data.fromDisplay || call.sellerDisplay || call.listingName || 'Seller', 'On another device', true);
            }
            if (terminal) {
                _bcwStopRing();
                _bcwHide();
                if (_bcwCallDocUnsub) { try { _bcwCallDocUnsub(); } catch (_) {} }
                _bcwCallDocUnsub = null;
                _bcwObservedCallId = null;
                _lastIncomingCallbackId = null;
            }
        }, function(err) { console.warn('[BCW] call observe failed:', err); });
    }
    // ── End BCW module ────────────────────────────────────────────────────────

    function _showIncomingCallback(data) {
        if (!data || !data.callId || _activeCall) return;
        if (_lastIncomingCallbackId === data.callId) return;
        _lastIncomingCallbackId = data.callId;
        _bcwObserveCallDoc(data);
        _showIncomingCallbackSystemNotification(data);
        _bcwShowRinging(data);
        _bcwStartRing();
    }

    async function _showIncomingCallbackSystemNotification(data) {
        try {
            if (typeof Notification === 'undefined' || Notification.permission !== 'granted') return;
            if (!('serviceWorker' in navigator)) return;
            var reg = await navigator.serviceWorker.getRegistration('/') || await navigator.serviceWorker.register('/service-worker.js', { scope: '/' });
            if (!reg || !reg.showNotification) return;
            var callId = data.callId || Date.now();
            await reg.showNotification('Incoming call from ' + (data.fromDisplay || data.listingName || 'Seller'), {
                body: 'Tap to answer in Sourcing Hub',
                icon: '/favicon.ico',
                badge: '/favicon.ico',
                tag: 'call_' + callId,
                renotify: true,
                requireInteraction: true,
                silent: false,
                vibrate: [200, 100, 200, 100, 200, 100, 200],
                actions: [{ action: 'answer', title: 'Answer' }],
                data: {
                    category: 'call_incoming',
                    callId: String(callId),
                    fromUid: data.fromUid || '',
                    callKind: 'seller_callback',
                    url: '/sourcing-hub?tab=calls&incoming=' + encodeURIComponent(callId)
                }
            });
        } catch (err) { console.warn('[BCW] system notification failed:', err && err.message); }
    }

    async function _answerIncomingCallback(data) {
        // CRITICAL: build audio rig inside the answer-click gesture for autoplay unlock.
        var audioRig = _createCallAudioRig();
        var headers = await _authHeaders();
        _updateModalState('Requesting mic\u2026');
        var localStream;
        try {
            localStream = await Promise.race([
                _acquireCallMic(),
                new Promise(function(_, reject) { setTimeout(function(){ var e = new Error('Microphone permission timeout'); e.name = 'GumTimeout'; reject(e); }, 30000); })
            ]);
        } catch (err) {
            _destroyCallAudioRig(audioRig);
            alert('Microphone access is required to answer this call.');
            if (_bcwAnsweredFromHeader) { _bcwAnsweredFromHeader = false; _bcwActiveDisplay = ''; _bcwHide(); }
            return;
        }
        try {
            var acceptRes = await fetch(API_BASE + '/calls/' + data.callId + '/accept', { method: 'POST', headers: headers });
            if (!acceptRes.ok) throw new Error('Call is no longer available');
        } catch (err) {
            localStream.getTracks().forEach(function(t){ t.stop(); });
            _destroyCallAudioRig(audioRig);
            _updateModalState(err.message || 'Call unavailable', '<button onclick="document.getElementById(\'call-buyer-modal\').remove()" class="lr-btn" style="padding:8px 18px">Close</button>');
            if (_bcwAnsweredFromHeader) { setTimeout(function(){ _bcwAnsweredFromHeader = false; _bcwActiveDisplay = ''; _bcwHide(); }, 2500); }
            return;
        }

        // Prefer self-hosted LiveKit SFU media when configured. If the SFU is
        // unavailable, keep the old WebRTC answer path as automatic fallback.
        if (await _tryStartLiveKitCall({ callId: data.callId, headers: headers, localStream: localStream, audioRig: audioRig, role: 'callee' })) {
            return;
        }

        var iceServers = await _fetchIceServers();
        if (!_hasTurnServer(iceServers)) _updateModalState('Calling relay degraded — trying direct peer audio…', _callControlsHtml(false));
        var pc = new RTCPeerConnection({
            iceServers: iceServers,
            // v13 (2026-05-15): pool 0 — lazy gather, skip dead NICs.
            iceCandidatePoolSize: 0,
            bundlePolicy: 'max-bundle',
            rtcpMuxPolicy: 'require'
        });
        _wirePeerDiagnostics(pc, 'callback-answer', data.callId, 'callee');
        _wireBenign701Suppressor(pc, 'callback-answer');
        var remoteStream = new MediaStream();
        var remoteAudio = audioRig.remoteAudio || document.createElement('audio');
        if (!audioRig.remoteAudio) {
            remoteAudio.autoplay = true; remoteAudio.playsInline = true; remoteAudio.muted = false; remoteAudio.volume = 1; remoteAudio.style.display = 'none';
            document.body.appendChild(remoteAudio);
        }
        var remoteUid = data.fromUid;
        var selfUid = (window.currentUser && window.currentUser.uid) || (firebase.auth().currentUser && firebase.auth().currentUser.uid);
        var seenCand = {};
        var pendingCand = [];
        var remoteSet = false;
        var sentCandidateBuffer = [];
        var candidateDrainTimer = setInterval(async function() {
            if (!_activeCall || !sentCandidateBuffer.length) return;
            var c = sentCandidateBuffer.shift();
            try { await _sendIceCandidate(data.callId, headers, selfUid, c); }
            catch (_) { sentCandidateBuffer.unshift(c); }
        }, 2000);
        var iceFailureTimer = null;

        pc.onicecandidate = async function(ev) {
            if (!ev.candidate) return;
            var c = ev.candidate.toJSON();
            try { await _sendIceCandidate(data.callId, headers, selfUid, c); }
            catch (_) { sentCandidateBuffer.push(c); }
        };
        pc.ontrack = function(ev) {
            var tracks = (ev.streams && ev.streams[0] && ev.streams[0].getTracks) ? ev.streams[0].getTracks() : (ev.track ? [ev.track] : []);
            tracks.forEach(function(t){
                try { t.enabled = true; } catch(_){}
                if (!remoteStream.getTracks().some(function(x){ return x.id === t.id; })) remoteStream.addTrack(t);
                if (!t.__automailRemoteTrackHandlers) {
                    t.__automailRemoteTrackHandlers = true;
                    t.onunmute = function(){
                        try { window.__lastCallRemoteUnmute = Date.now(); } catch (_) {}
                        if (audioRig.remoteAudio) audioRig.remoteAudio.play().catch(function(){});
                    };
                }
            });
            console.info('[callback-answer] ontrack — remote tracks:', remoteStream.getTracks().length);
            try { window.__lastCallOnTrack = Date.now(); } catch (_) {}
            _attachRemoteStreamToRig(audioRig, remoteStream).then(function(){
                remoteAudio = audioRig.remoteAudio;
                if (_activeCall && _activeCall.audioRig === audioRig) _activeCall.remoteAudio = remoteAudio;
                console.info('[callback-answer] remote audio playing');
            }).catch(function(err){
                console.warn('[callback-answer] play() failed:', err && err.message);
                _updateModalState('Audio ready - tap Enable audio', _callControlsHtml(true));
            });
        };
        pc.onconnectionstatechange = function() {
            if (pc.connectionState === 'connected') {
                clearTimeout(iceFailureTimer); _updateModalState('In call', _callControlsHtml(false)); _startCallDuration();
                // v16: callback-answer watchdog (mirrors caller path).
                try {
                    if (_activeCall && !_activeCall._stopWatchdog) {
                        if (!_activeCall._micPipeline && window.__pendingMicPipeline) {
                            _activeCall._micPipeline = window.__pendingMicPipeline;
                            try { delete window.__pendingMicPipeline; } catch (_) {}
                        }
                        if (_activeCall._micPipeline) {
                            _activeCall._stopWatchdog = _startSenderWatchdog(pc, function(){
                                return { pipeline: _activeCall._micPipeline, onPipelineReplaced: function(p){ _activeCall._micPipeline = p; _activeCall.localStream = p.stream; } };
                            });
                        }
                    }
                } catch (e) { console.warn('[call] callback-answer watchdog start failed:', e && e.message); }
            }
            else if (pc.connectionState === 'disconnected') {
                _updateModalState('Reconnecting…', _callControlsHtml(false));
                clearTimeout(iceFailureTimer);
                iceFailureTimer = setTimeout(function(){
                    if (_activeCall && pc.connectionState === 'disconnected') {
                        _updateModalState('Connection interrupted - keeping call open', _callControlsHtml(false));
                        try { pc.restartIce && pc.restartIce(); } catch(_) {}
                    }
                }, 60000);
                if (_activeCall) _activeCall.iceFailureTimer = iceFailureTimer;
            } else if (pc.connectionState === 'failed') window.endSellerCall('ice_failure', true);
        };
        pc.oniceconnectionstatechange = function() {
            if (pc.iceConnectionState === 'connected' || pc.iceConnectionState === 'completed') { clearTimeout(iceFailureTimer); if (_activeCall && !_activeCall.connectedAt) { _updateModalState('In call', _callControlsHtml(false)); _startCallDuration(); } }
            else if (pc.iceConnectionState === 'failed') window.endSellerCall('ice_failure', true);
        };
        // Google Meet callee pattern: do NOT addTrack before setRemoteDescription.
        // We'll bind the mic track via replaceTrack AFTER setRemoteDescription so
        // the browser creates transceivers from the offer m-lines first, then we
        // replace with our local audio — guaranteeing a=sendrecv in the answer.
        var voicePrep = { opusPreferred: false, audioTransceivers: 0 };

        var fdb = _ensureFirestore();
        var unsubSignal = fdb.collection('calls').doc(data.callId).collection('signaling').doc(remoteUid)
            .onSnapshot(async function(snap) {
                if (!snap.exists) return;
                var sig = snap.data();
                if (!sig || sig.type !== 'offer' || !sig.sdp || remoteSet) return;
                try {
                    await pc.setRemoteDescription({ type: 'offer', sdp: sig.sdp });
                    remoteSet = true;
                    // Bind local mic to the transceiver now created by setRemoteDescription.
                    var _calleeAudioTrack = localStream.getAudioTracks()[0] || null;
                    try {
                        var _calleeTxrs = pc.getTransceivers ? pc.getTransceivers() : [];
                        var _bound = false;
                        for (var _ti = 0; _ti < _calleeTxrs.length; _ti++) {
                            var _txr = _calleeTxrs[_ti];
                            var _kind = (_txr.receiver && _txr.receiver.track && _txr.receiver.track.kind) || 'audio';
                            if (_kind !== 'audio') continue;
                            try { _txr.direction = 'sendrecv'; } catch (_) {}
                            if (_calleeAudioTrack && _txr.sender && typeof _txr.sender.replaceTrack === 'function') {
                                await _txr.sender.replaceTrack(_calleeAudioTrack);
                                _bound = true;
                            }
                        }
                        if (!_bound && _calleeAudioTrack) { pc.addTrack(_calleeAudioTrack, localStream); }
                    } catch (_e) { if (_calleeAudioTrack) try { pc.addTrack(_calleeAudioTrack, localStream); } catch(_){} }
                    voicePrep = _prepareAudioTransceiversForVoice(pc);
                    try { window.__lastCallVoicePrep = { ts: Date.now(), callId: data.callId, role: 'callee', opusPreferred: voicePrep.opusPreferred, audioTransceivers: voicePrep.audioTransceivers }; } catch (_) {}
                    var answer = await pc.createAnswer();
                    answer.sdp = _tuneOpusForSpeech(answer.sdp);
                    answer.sdp = _forceAudioSendrecv(answer.sdp);
                    await pc.setLocalDescription(answer);
                    await fetch(API_BASE + '/calls/' + data.callId + '/signaling', { method: 'POST', headers: headers, body: JSON.stringify({ peerUid: selfUid, type: 'answer', sdp: answer.sdp }) });
                    while (pendingCand.length) { try { await pc.addIceCandidate(pendingCand.shift()); } catch (_) {} }
                    _updateModalState('Connecting…', _callControlsHtml(false));
                } catch (e) { console.warn('[callback-answer] SDP failed:', e); window.endSellerCall('answer_failed', true); }
            }, function(err) { console.warn('[callback-answer] signaling listener failed:', err); });
        var unsubCand = fdb.collection('calls').doc(data.callId).collection('candidates').doc(remoteUid).collection('items')
            .onSnapshot(function(snap) {
                snap.docChanges().forEach(async function(chg) {
                    if (chg.type !== 'added' || seenCand[chg.doc.id]) return;
                    seenCand[chg.doc.id] = true;
                    var c = chg.doc.data();
                    var cand = { candidate: c.candidate, sdpMid: c.sdpMid || undefined, sdpMLineIndex: c.sdpMLineIndex == null ? undefined : Number(c.sdpMLineIndex) };
                    if (!remoteSet) { pendingCand.push(cand); return; }
                    try { await pc.addIceCandidate(cand); } catch (_) {}
                });
            });
        var unsubCall = fdb.collection('calls').doc(data.callId).onSnapshot(function(snap) {
            if (!snap.exists || !_activeCall) return;
            var d = snap.data();
            if (d.status === 'completed' || d.status === 'declined' || d.status === 'failed' || d.status === 'missed') window.endSellerCall('remote_ended');
        });

        _activeCall = { callId: data.callId, pc: pc, localStream: localStream, remoteStream: remoteStream, unsubSignal: unsubSignal, unsubCandidates: unsubCand, unsubCall: unsubCall, headers: headers, remoteAudio: remoteAudio, audioRig: audioRig, candidateDrainTimer: candidateDrainTimer, iceFailureTimer: iceFailureTimer, statsTimer: _startCallStatsMonitor(pc, localStream), audioDiagTimer: _startAudioDiagMonitor(pc, audioRig), connectedAt: null, durationTimer: null, muted: false };
        try { window.__automailBizCallActive = true; } catch (_) {}
        _updateModalState('Connecting…', _callControlsHtml(false));
        _wireCallButtons();
    }

    function _ensureIncomingCallbackListener() {
        if (_incomingCallbackUnsub || _incomingAuthObserved) return;
        var fba = window.firebase && window.firebase.auth && window.firebase.auth();
        if (!fba) return;
        _incomingAuthObserved = true;
        fba.onAuthStateChanged(function(user) {
            if (_incomingCallbackUnsub) { try { _incomingCallbackUnsub(); } catch (_) {} _incomingCallbackUnsub = null; }
            if (!user) return;
            var dbi = _ensureFirestore();
            if (!dbi) return;
            _incomingCallbackUnsub = dbi.collection('users').doc(user.uid).collection('incoming_calls').orderBy('ringStartedAt', 'desc').limit(1)
                .onSnapshot(function(snap) {
                    if (snap.empty) return;
                    var d = snap.docs[0].data() || {};
                    var age = Date.now() - new Date(d.ringStartedAt || 0).getTime();
                    if (age > 45000) return;
                    _showIncomingCallback({ callId: d.callId, fromUid: d.fromUid, fromDisplay: d.fromDisplay, listingId: d.listingId });
                }, function(err) { console.warn('[buyer-call] incoming listener failed:', err); });
        });
    }

    var _incomingSetupTries = 0;
    var _incomingSetupTimer = setInterval(function() {
        _incomingSetupTries += 1;
        _ensureIncomingCallbackListener();
        if (_incomingAuthObserved || _incomingSetupTries > 20) clearInterval(_incomingSetupTimer);
    }, 1000);
})();
</script>
<script>
if ('serviceWorker' in navigator) {
  window.addEventListener('load', function() {
        var reloadingForUpdate = false;
        function reloadForUpdate() {
            if (reloadingForUpdate || window.__automailBizCallActive) return;
            reloadingForUpdate = true;
            window.location.reload();
        }
        navigator.serviceWorker.addEventListener('message', function(event) {
            var msg = event && event.data;
            if (msg && msg.type === 'BIZ_APP_UPDATED') reloadForUpdate();
        });
        navigator.serviceWorker.addEventListener('controllerchange', reloadForUpdate);
        navigator.serviceWorker.register('/service-worker.js', { updateViaCache: 'none' })
      .then(function(reg) {
        console.log('SW registered, scope:', reg.scope);
                try { reg.update(); } catch (_) {}
                if (reg.waiting) { try { reg.waiting.postMessage({ type: 'SKIP_WAITING' }); } catch (_) {} }
                reg.addEventListener('updatefound', function() {
                    var worker = reg.installing;
                    if (!worker) return;
                    worker.addEventListener('statechange', function() {
                        if (worker.state === 'installed' && navigator.serviceWorker.controller) {
                            try { worker.postMessage({ type: 'SKIP_WAITING' }); } catch (_) {}
                        }
                    });
                });
      })
      .catch(function(err) {
        console.log('SW registration failed:', err);
      });
  });
}
</script>

<!-- "I Need This" Modal -->
<div class="uc-need-modal" id="uc-need-modal">
    <div class="uc-need-modal-content">
        <h3>I Need This Service</h3>
        <p id="uc-need-desc">Tell suppliers you're looking for this. They'll reach out to you.</p>
        <input type="email" id="uc-need-email" placeholder="Your email address" />
        <input type="text" id="uc-need-city" placeholder="Your city (optional)" />
        <div class="uc-need-modal-actions">
            <button class="uc-btn-cancel" id="uc-need-cancel">Cancel</button>
            <button class="uc-btn-submit" id="uc-need-submit">Send Signal</button>
        </div>
    </div>
</div>

<script>
// ═══════════════════════════════════════════════════════════
// Use Case Search — Autocomplete, Smart Search, "I Need This"
// ═══════════════════════════════════════════════════════════
(function() {
    useCaseMode = false;
    let acTimeout;
    let activeAcIndex = -1;
    let lastUseCaseResults = null;

    const heroAc = document.getElementById('hero-autocomplete');
    const sfbAc = document.getElementById('sfb-autocomplete');
    const modeToggle = document.getElementById('uc-mode-toggle');
    const needModal = document.getElementById('uc-need-modal');
    let pendingNeedQuery = '';

    // Tab-based mode switching
    const tabNormal = document.getElementById('tab-normal');
    const tabUseCase = document.getElementById('tab-usecase');
    const ucHint = document.getElementById('uc-hint');
    const popularRow = document.getElementById('popular-searches-row');

    function setSearchMode(mode) {
        useCaseMode = (mode === 'usecase');
        // Update tab active states
        tabNormal.classList.toggle('active', !useCaseMode);
        tabUseCase.classList.toggle('active', useCaseMode);
        // Legacy toggle compat
        if (modeToggle) modeToggle.classList.toggle('active', useCaseMode);

        // Update hint visibility
        if (ucHint) ucHint.classList.toggle('show', useCaseMode);
        document.querySelectorAll('.search-target-toggle,.sfb-target').forEach(function(el) {
            el.style.display = useCaseMode ? 'none' : 'flex';
        });

        // Update popular searches: show different tags per mode
        if (popularRow) {
            var psContainer = document.getElementById('popular-searches');
            if (useCaseMode) {
                psContainer.innerHTML = '<span class="ps-label">Try:</span>' +
                    '<span class="ps-tag">cut stainless steel sheets</span>' +
                    '<span class="ps-tag">weld aluminum frames</span>' +
                    '<span class="ps-tag">pack 500ml bottles</span>' +
                    '<span class="ps-tag">print labels on pouches</span>' +
                    '<span class="ps-tag">test water quality</span>' +
                    '<span class="ps-tag">forge crankshafts</span>';
            } else {
                psContainer.innerHTML = '<span class="ps-label">Popular:</span>' +
                    '<span class="ps-tag">Steel manufacturer</span>' +
                    '<span class="ps-tag">IT services</span>' +
                    '<span class="ps-tag">Packaging supplier</span>' +
                    '<span class="ps-tag">Diamond wholesale</span>' +
                    '<span class="ps-tag">Pharma API</span>' +
                    '<span class="ps-tag">Auto parts</span>';
            }
            // Re-bind popular search tag clicks
            psContainer.querySelectorAll('.ps-tag').forEach(function(tag) {
                tag.addEventListener('click', function() {
                    var heroIn = document.getElementById('hero-search');
                    heroIn.value = tag.textContent;
                    if (useCaseMode) {
                        doUseCaseSearch(tag.textContent);
                    } else {
                        document.getElementById('hero-search-btn').click();
                    }
                });
            });
        }

        // Update placeholder
        const heroIn = document.getElementById('hero-search');
        const sfbIn = document.getElementById('sfb-search-input');
        if (useCaseMode) {
            heroIn.placeholder = 'What do you need? e.g. "cut stainless steel sheets"';
            if (sfbIn) sfbIn.placeholder = 'Search by use case, e.g. "weld aluminum frames"';
        } else {
            updateSearchPlaceholders();
        }
    }

    if (tabNormal) tabNormal.addEventListener('click', function() { setSearchMode('normal'); });
    if (tabUseCase) tabUseCase.addEventListener('click', function() { setSearchMode('usecase'); });

    // Fetch autocomplete suggestions — use-case mode hits use-case API,
    // normal mode hits categories + listing-name search (no extra backend needed)
    async function fetchAutocomplete(query) {
        if (query.length < 2) return [];
        try {
            if (useCaseMode) {
                const res = await fetch(API_BASE + '/marketplace/use-cases/autocomplete?q=' + encodeURIComponent(query) + '&limit=8');
                if (!res.ok) return [];
                const data = await res.json();
                return (data.suggestions || []).map(function(s) {
                    var label = typeof s === 'string' ? s : (s.label || s.text || s);
                    return { label: label, type: 'use case', kind: 'usecase' };
                });
            }
            // Normal mode — parallel: category match + listing-name match
            const [catRes, listRes] = await Promise.all([
                fetch(API_BASE + '/marketplace/categories/search?q=' + encodeURIComponent(query)).then(function(r){return r.ok?r.json():[];}).catch(function(){return [];}),
                fetch(API_BASE + '/marketplace/listings?q=' + encodeURIComponent(query) + '&limit=5').then(function(r){return r.ok?r.json():{listings:[]};}).catch(function(){return {listings:[]};})
            ]);
            const out = [];
            // Top 4 categories
            (catRes || []).slice(0, 4).forEach(function(c) {
                out.push({ label: c.label, type: 'category', kind: 'category', categoryId: c.id, sectorId: c.sector });
            });
            // Top 4 supplier names
            (listRes.listings || []).slice(0, 4).forEach(function(l) {
                out.push({ label: l.businessName, type: l.city || 'supplier', kind: 'supplier', slug: l.slug });
            });
            return out;
        } catch (e) { return []; }
    }

    // Render autocomplete dropdown
    function renderAc(el, suggestions, query) {
        if (!suggestions.length) {
            el.classList.remove('show');
            el.innerHTML = '';
            return;
        }
        activeAcIndex = -1;
        let html = '<div class="uc-ac-header">' + (useCaseMode ? 'Use Case Suggestions' : 'Suggestions') + '</div>';
        suggestions.forEach(function(s, i) {
            var label = typeof s === 'string' ? s : (s.label || s.text || s);
            var typeLabel = (typeof s === 'object' && s && s.type) ? s.type : (useCaseMode ? 'use case' : '');
            var dataAttrs = '';
            if (typeof s === 'object' && s) {
                if (s.kind) dataAttrs += ' data-kind="' + esc(s.kind) + '"';
                if (s.categoryId) dataAttrs += ' data-category="' + esc(s.categoryId) + '"';
                if (s.sectorId) dataAttrs += ' data-sector="' + esc(s.sectorId) + '"';
                if (s.slug) dataAttrs += ' data-slug="' + esc(s.slug) + '"';
            }
            const highlighted = String(label).replace(new RegExp('(' + query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + ')', 'gi'), '<strong>$1</strong>');
            html += '<div class="uc-ac-item" data-index="' + i + '" data-value="' + esc(String(label)) + '"' + dataAttrs + '>';
            html += '<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>';
            html += '<span>' + highlighted + '</span>';
            if (typeLabel) html += '<span class="uc-ac-type">' + esc(typeLabel) + '</span>';
            html += '</div>';
        });
        el.innerHTML = html;
        el.classList.add('show');
    }

    // Handle autocomplete input
    function onAcInput(input, acEl) {
        clearTimeout(acTimeout);
        const q = input.value.trim();
        if (q.length < 2) {
            acEl.classList.remove('show');
            return;
        }
        acTimeout = setTimeout(async function() {
            const suggestions = await fetchAutocomplete(q);
            renderAc(acEl, suggestions, q);
        }, 200);
    }

    // Keyboard navigation in autocomplete
    function onAcKeydown(e, acEl, input) {
        if (!acEl.classList.contains('show')) return;
        const items = acEl.querySelectorAll('.uc-ac-item');
        if (!items.length) return;

        if (e.key === 'ArrowDown') {
            e.preventDefault();
            activeAcIndex = Math.min(activeAcIndex + 1, items.length - 1);
            items.forEach(function(it, i) { it.classList.toggle('active', i === activeAcIndex); });
        } else if (e.key === 'ArrowUp') {
            e.preventDefault();
            activeAcIndex = Math.max(activeAcIndex - 1, 0);
            items.forEach(function(it, i) { it.classList.toggle('active', i === activeAcIndex); });
        } else if (e.key === 'Enter' && activeAcIndex >= 0) {
            e.preventDefault();
            const val = items[activeAcIndex].dataset.value;
            input.value = val;
            acEl.classList.remove('show');
            if (useCaseMode) {
                doUseCaseSearch(val);
            } else if (typeof doSearch === 'function') {
                doSearch(val);
            }
        } else if (e.key === 'Escape') {
            acEl.classList.remove('show');
        }
    }

    // Autocomplete click
    function onAcClick(acEl, input) {
        acEl.addEventListener('click', function(e) {
            const item = e.target.closest('.uc-ac-item');
            if (!item) return;
            input.value = item.dataset.value;
            acEl.classList.remove('show');
            const kind = item.dataset.kind;
            if (kind === 'usecase') {
                doUseCaseSearch(item.dataset.value);
            } else if (kind === 'supplier' && item.dataset.slug) {
                // Open the supplier drawer directly
                if (window.openListingDrawer) {
                    window.openListingDrawer(item.dataset.slug);
                } else {
                    location.href = '/s/' + item.dataset.slug;
                }
            } else if (kind === 'category') {
                // Filter listings by sector + run text search for the category label
                if (item.dataset.sector && typeof currentSector !== 'undefined') {
                    currentSector = item.dataset.sector;
                }
                currentSearch = item.dataset.value;
                syncSearchInputs(item.dataset.value);
                if (typeof loadListings === 'function') loadListings();
                if (typeof renderSidebar === 'function') renderSidebar();
                if (typeof updateActiveFilters === 'function') updateActiveFilters();
                if (typeof pushFilterState === 'function') pushFilterState();
                document.getElementById('listings').scrollIntoView({ behavior: 'smooth' });
            } else {
                // Fallback — plain text search
                if (typeof doSearch === 'function') doSearch(item.dataset.value);
            }
        });
    }

    // Bind to hero search
    var heroIn = document.getElementById('hero-search');
    heroIn.addEventListener('input', function() { onAcInput(heroIn, heroAc); });
    heroIn.addEventListener('keydown', function(e) { onAcKeydown(e, heroAc, heroIn); });
    onAcClick(heroAc, heroIn);

    // Bind to enterprise search bar
    var sfbIn = document.getElementById('sfb-search-input');
    sfbIn.addEventListener('input', function() { onAcInput(sfbIn, sfbAc); });
    sfbIn.addEventListener('keydown', function(e) { onAcKeydown(e, sfbAc, sfbIn); });
    onAcClick(sfbAc, sfbIn);

    // Close autocomplete on outside click
    document.addEventListener('click', function(e) {
        if (!e.target.closest('.hero-search') && !e.target.closest('.sfb-search')) {
            heroAc.classList.remove('show');
            sfbAc.classList.remove('show');
        }
    });

    // Override hero search button when in use case mode
    var originalHeroHandler = document.getElementById('hero-search-btn');
    originalHeroHandler.addEventListener('click', function(e) {
        if (useCaseMode) {
            e.stopImmediatePropagation();
            heroAc.classList.remove('show');
            var q = heroIn.value.trim();
            if (q.length >= 2) doUseCaseSearch(q);
        }
    }, true);

    // Override enterprise search enter key when in use case mode
    sfbIn.addEventListener('keydown', function(e) {
        if (e.key === 'Enter' && useCaseMode && activeAcIndex < 0) {
            e.preventDefault();
            sfbAc.classList.remove('show');
            var q = sfbIn.value.trim();
            if (q.length >= 2) doUseCaseSearch(q);
        }
    });
    heroIn.addEventListener('keydown', function(e) {
        if (e.key === 'Enter' && useCaseMode && activeAcIndex < 0) {
            e.preventDefault();
            heroAc.classList.remove('show');
            var q = heroIn.value.trim();
            if (q.length >= 2) doUseCaseSearch(q);
        }
    });

    // Use Case Search — calls the backend use-cases/search endpoint
    async function doUseCaseSearch(query) {
        currentSearch = query;
        syncSearchInputs(query);
        var container = document.getElementById('listings-container');
        var hadContent = container && container.children && container.children.length > 0;
        if (hadContent) {
            container.classList.add('is-refreshing');
            var countEl = document.getElementById('filter-count');
            if (countEl) countEl.textContent = 'Searching by use case...';
        } else {
            container.innerHTML = '<div class="loading"><div class="spinner"></div><p>Searching by use case...</p></div>';
        }
        document.getElementById('listings').scrollIntoView({ behavior: 'smooth' });

        try {
            var url = API_BASE + '/marketplace/use-cases/search?q=' + encodeURIComponent(query) + '&limit=30';
            if (currentSector) url += '&sector=' + encodeURIComponent(currentSector);

            var res = await fetch(url);
            if (!res.ok) throw new Error('Search failed');
            var data = await res.json();
            lastUseCaseResults = data;
            document.getElementById('featured-container').innerHTML = '';

            var results = data.results || [];
            if (results.length === 0) {
                container.innerHTML = '<div class="empty-state">' +
                    '<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg>' +
                    '<h3>No matches for "' + esc(query) + '"</h3>' +
                    '<p>No businesses match this use case yet. Let suppliers know you need this!</p>' +
                    '<button class="uc-need-this" id="uc-need-trigger">' +
                    '<svg viewBox="0 0 24 24"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>' +
                    'I Need This — Alert Suppliers' +
                    '</button>' +
                    '</div>';
                pendingNeedQuery = query;
                document.getElementById('uc-need-trigger').addEventListener('click', function() {
                    openNeedModal(query);
                });
                return;
            }

            renderUseCaseResults(results, query);
        } catch (err) {
            if (!hadContent) {
                container.innerHTML = '<div class="empty-state"><svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 8v4M12 16h.01"/></svg><h3>Search Error</h3><p>Please try again.</p></div>';
            }
        } finally {
            container.classList.remove('is-refreshing');
        }
    }

    // Render use case search results with match reasons
    function renderUseCaseResults(results, query) {
        var container = document.getElementById('listings-container');
        var headerH2 = document.querySelector('#listings h2');
        if (headerH2) {
            headerH2.innerHTML = 'Use Case Results for "' + esc(query) + '" <span style="font-weight:400;font-size:.85rem;color:var(--text-muted)">(' + results.length + ')</span>';
        }
        document.getElementById('filter-count').textContent = 'Showing ' + results.length + ' matches';
        document.getElementById('listing-total-count').textContent = '(' + results.length + ')';

        var html = '';
        results.forEach(function(r, i) {
            var l = r.listing || r;
            var initials = getInitials(l.businessName);
            var score = r.score || 0;
            var matchedUC = r.matchedUseCase || '';
            var matchedProd = r.matchedProduct || '';

            html += '<div class="listing-row' + (i < 3 ? ' animate-in' : '') + '">';
            html += '<div class="lr-check"><input type="checkbox" class="compare-cb" title="Add to compare (max 3)" data-name="' + esc(l.businessName) + '" data-slug="' + esc(l.slug || '') + '"></div>';
            html += '<div class="lr-num">' + (i + 1) + '</div>';
            html += '<div class="lr-logo">';
            if (l.logoUrl) {
                html += '<img src="' + esc(l.logoUrl) + '" alt="' + esc(l.businessName) + '" loading="lazy">';
            } else {
                html += initials;
            }
            if (l.isVerified) html += '<span class="online-dot"></span>';
            html += '</div>';
            html += '<div class="lr-info">';
            html += '<div class="lr-name">' + esc(l.businessName) + '</div>';
            html += '<div class="lr-tag">' + esc(l.tagline || '') + '</div>';

            // Match reason
            if (matchedUC || matchedProd) {
                html += '<div class="uc-match-reason">';
                if (matchedProd) html += 'Product: ' + esc(matchedProd);
                if (matchedUC) html += (matchedProd ? ' · ' : '') + 'Use case: ' + esc(matchedUC);
                html += ' · ' + Math.round(score) + '% match';
                html += '</div>';
            }

            // Use case tags on card
            var useCases = (l.products || []).flatMap(function(p) { return p.useCases || []; }).slice(0, 5);
            if (useCases.length > 0) {
                html += '<div class="lr-use-cases">';
                useCases.forEach(function(uc) {
                    var isMatched = matchedUC && uc.toLowerCase().includes(matchedUC.toLowerCase().split(' ')[0]);
                    html += '<span class="lr-uc-tag' + (isMatched ? ' matched' : '') + '">' + esc(uc) + '</span>';
                });
                html += '</div>';
            }

            html += '</div>';
            html += '<div class="lr-badges">';
            if (l.city) html += '<span class="lr-badge city"><svg viewBox="0 0 24 24"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg>' + esc(l.city) + '</span>';
            if (l.sector) html += '<span class="lr-badge">' + esc(getSectorLabel(l.sector)) + '</span>';
            if (l.isVerified) html += '<span class="lr-badge verified"><svg viewBox="0 0 24 24"><path d="M9 12l2 2 4-4"/></svg>Verified</span>';
            if (l.isSponsored || l.isBoosted) html += '<span class="lr-badge sponsored">Sponsored</span>';
            if (score >= 70) html += '<span class="lr-badge" style="background:#dcfce7;color:#16a34a">' + Math.round(score) + '% match</span>';
            html += '</div>';
            html += '<div class="lr-actions">';
            html += '<a href="/s/' + esc(l.slug) + '" class="lr-btn" style="text-decoration:none">View Page &rarr;</a>';
            html += '</div>';
            html += '</div>';
        });

        // Add "I need this" at the bottom for partial results
        html += '<div style="text-align:center;padding:20px 0">';
        html += '<button class="uc-need-this" id="uc-need-trigger-bottom">';
        html += '<svg viewBox="0 0 24 24"><path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>';
        html += 'Can\'t find what you need? Alert Suppliers';
        html += '</button>';
        html += '</div>';

        container.innerHTML = html;
        bindCompare();

        var bottomBtn = document.getElementById('uc-need-trigger-bottom');
        if (bottomBtn) {
            bottomBtn.addEventListener('click', function() { openNeedModal(query); });
        }
    }

    // "I Need This" Modal
    function openNeedModal(query) {
        pendingNeedQuery = query;
        document.getElementById('uc-need-desc').textContent = 'Let suppliers know you need: "' + query + '"';
        document.getElementById('uc-need-email').value = '';
        document.getElementById('uc-need-city').value = '';
        needModal.classList.add('show');
    }

    document.getElementById('uc-need-cancel').addEventListener('click', function() {
        needModal.classList.remove('show');
    });

    document.getElementById('uc-need-submit').addEventListener('click', async function() {
        var email = document.getElementById('uc-need-email').value.trim();
        var city = document.getElementById('uc-need-city').value.trim();
        if (!email || !email.includes('@')) {
            document.getElementById('uc-need-email').style.borderColor = '#ef4444';
            return;
        }
        var btn = document.getElementById('uc-need-submit');
        btn.textContent = 'Sending...';
        btn.disabled = true;

        try {
            await fetch(API_BASE + '/marketplace/use-cases/demand', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ useCase: pendingNeedQuery, email: email, city: city })
            });
            btn.textContent = 'Sent!';
            setTimeout(function() {
                needModal.classList.remove('show');
                btn.textContent = 'Send Signal';
                btn.disabled = false;
            }, 1500);
        } catch (e) {
            btn.textContent = 'Error — Retry';
            btn.disabled = false;
        }
    });

    needModal.addEventListener('click', function(e) {
        if (e.target === needModal) needModal.classList.remove('show');
    });
})();

// ═══════════════════════════════════════════════════════════
// Buyer Procurement Features
// ═══════════════════════════════════════════════════════════
(function() {
    // ─── State ───
    let shortlistSlugs = new Set();
    let savedProductIds = new Set();
    let buyerWsTab = 'shortlist';

    // ─── Auth helper (reuse global) ───
    async function authFetch(url, opts = {}) {
        if (!currentUser) { showAuthModal('login'); return null; }
        const token = await currentUser.getIdToken();
        const h = Object.assign({ 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + token }, opts.headers || {});
        const res = await fetch(url, Object.assign({}, opts, { headers: h }));
        if (!res.ok) {
            const err = await res.json().catch(function() { return { error: 'Request failed' }; });
            const e = new Error(err.error || err.message || 'Request failed');
            e.status = res.status;
            e.feature = err.feature;
            e.upgrade = !!err.upgrade;
            throw e;
        }
        return res.json();
    }

    // ─── Shortlist ───
    async function loadShortlist() {
        try {
            var data = await authFetch(API_BASE + '/buyer/shortlist');
            if (!data) return;
            shortlistSlugs = new Set((data.items || []).map(function(i) { return i.slug; }));
            updateShortlistButtons();
            updateBadge();
        } catch(e) { /* silent */ }
    }

    async function loadSavedProducts() {
        try {
            var data = await authFetch(API_BASE + '/buyer/saved-products');
            if (!data) return;
            savedProductIds = new Set((data.items || []).map(function(i) { return i.productId || i.id; }).filter(Boolean));
            updateSavedProductButtons();
            updateBadge();
        } catch(e) { /* silent */ }
    }

    function updateShortlistButtons() {
        document.querySelectorAll('.lr-shortlist').forEach(function(btn) {
            var slug = btn.getAttribute('data-slug');
            btn.classList.toggle('active', shortlistSlugs.has(slug));
            btn.innerHTML = shortlistSlugs.has(slug) ? '&#9829;' : '&#9825;';
        });
    }

    function updateSavedProductButtons() {
        document.querySelectorAll('.sr-product-save').forEach(function(btn) {
            var id = btn.getAttribute('data-product-id');
            var active = id && savedProductIds.has(id);
            btn.classList.toggle('on', active);
            btn.innerHTML = active ? '&#9829;' : '&#9825;';
            if (!btn.dataset.boundSave) {
                btn.dataset.boundSave = '1';
                btn.addEventListener('click', function(e) {
                    e.preventDefault();
                    e.stopPropagation();
                    var productId = btn.getAttribute('data-product-id');
                    if (!productId) return;
                    toggleSavedProduct(productId, {
                        listingSlug: btn.getAttribute('data-slug') || '',
                        supplierSlug: btn.getAttribute('data-slug') || '',
                        supplierName: btn.getAttribute('data-supplier-name') || '',
                        businessName: btn.getAttribute('data-supplier-name') || '',
                        productName: btn.getAttribute('data-product-name') || '',
                        sku: btn.getAttribute('data-sku') || '',
                        city: btn.getAttribute('data-city') || '',
                        state: btn.getAttribute('data-state') || '',
                        priceLabel: btn.getAttribute('data-price') || '',
                        moqLabel: btn.getAttribute('data-moq') || ''
                    });
                });
            }
        });
    }

    function updateBadge() {
        var badge = document.getElementById('bw-badge');
        var trigger = document.getElementById('buyer-ws-trigger');
        var count = shortlistSlugs.size + savedProductIds.size;
        if (count > 0) {
            badge.textContent = count;
            badge.style.display = 'flex';
            trigger.classList.add('visible');
        } else {
            badge.style.display = 'none';
        }
    }

    async function toggleShortlist(slug, name, city) {
        if (!currentUser) { showAuthModal('login'); return; }
        try {
            await authFetch(API_BASE + '/buyer/shortlist/' + encodeURIComponent(slug), {
                method: 'POST',
                body: JSON.stringify({ businessName: name, city: city })
            });
            if (shortlistSlugs.has(slug)) {
                shortlistSlugs.delete(slug);
            } else {
                shortlistSlugs.add(slug);
            }
            updateShortlistButtons();
            updateBadge();
        } catch(e) { console.error('Shortlist toggle failed:', e); }
    }

    function slugSegment(value) {
        return String(value || '').trim().toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').replace(/-{2,}/g, '-');
    }

    function savedProductIdFromListing(item) {
        var supplier = slugSegment(item.slug || item.listingSlug || item.supplierSlug || item.businessName || item.name);
        var product = slugSegment(item.productId || item.sku || item.productTitle || item.productName || item.title || item.name);
        return supplier && product ? supplier + '_' + product : '';
    }

    async function toggleSavedProduct(productId, payload) {
        if (!currentUser) { showAuthModal('login'); return; }
        try {
            var result = await authFetch(API_BASE + '/buyer/saved-products/' + encodeURIComponent(productId), {
                method: 'POST',
                body: JSON.stringify(Object.assign({ productId: productId }, payload || {}))
            });
            if (result && result.action === 'removed') savedProductIds.delete(productId);
            else savedProductIds.add(productId);
            updateSavedProductButtons();
            updateBadge();
            if (buyerWsTab === 'shortlist') renderShortlistTab();
        } catch(e) { console.error('Saved product toggle failed:', e); }
    }

    window.savedProductIdFromListing = savedProductIdFromListing;
    window.toggleSavedProduct = toggleSavedProduct;

    // ─── Inject shortlist + trust into listing cards ───
    var origRenderListings = window.renderListings || renderListings;
    // We hook into listing rendering by patching the global function
    // Instead of overriding, we'll add a MutationObserver for when listings change
    var listingsContainer = document.getElementById('listings-container');
    if (listingsContainer) {
        var observer = new MutationObserver(function() {
            enhanceListingCards();
            updateSavedProductButtons();
        });
        observer.observe(listingsContainer, { childList: true });
    }

    function enhanceListingCards() {
        var rows = document.querySelectorAll('.listing-row');
        rows.forEach(function(row) {
            if (row.querySelector('.lr-shortlist')) return; // already enhanced
            var link = row.querySelector('.lr-btn[href*="/s/"]');
            if (!link) return;
            var slug = link.getAttribute('href').replace('/s/', '');
            var name = '';
            var nameEl = row.querySelector('.lr-name');
            if (nameEl) name = nameEl.textContent;
            var city = '';
            var cityBadge = row.querySelector('.lr-badge.city');
            if (cityBadge) city = cityBadge.textContent.trim();

            // Add shortlist button
            row.style.position = 'relative';
            var heartBtn = document.createElement('button');
            heartBtn.className = 'lr-shortlist' + (shortlistSlugs.has(slug) ? ' active' : '');
            heartBtn.setAttribute('data-slug', slug);
            heartBtn.innerHTML = shortlistSlugs.has(slug) ? '&#9829;' : '&#9825;';
            heartBtn.title = 'Add to shortlist';
            heartBtn.addEventListener('click', function(e) {
                e.preventDefault();
                e.stopPropagation();
                toggleShortlist(slug, name, city);
            });
            row.appendChild(heartBtn);

            // Add trust badges to info section
            var infoEl = row.querySelector('.lr-info');
            if (infoEl) {
                var listing = allListings.find(function(l) { return l.slug === slug; });
                if (listing) {
                    var trustHtml = '<div class="lr-trust">';
                    if (listing.trustScore) {
                        trustHtml += '<span class="trust-score">' + Math.round(listing.trustScore) + '/100</span>';
                    }
                    if (listing.reviewStats && listing.reviewStats.count > 0) {
                        var stars = Math.round(listing.reviewStats.avgOverall || 0);
                        trustHtml += '<span class="review-stars">' + '★'.repeat(stars) + '☆'.repeat(5 - stars) + '</span>';
                        trustHtml += '<span>(' + listing.reviewStats.count + ')</span>';
                    }
                    trustHtml += '</div>';
                    infoEl.insertAdjacentHTML('beforeend', trustHtml);
                }
            }
        });
    }

    // ─── Buyer Workspace Panel ───
    var wsTrigger = document.getElementById('buyer-ws-trigger');
    var wsPanel = document.getElementById('buyer-ws');
    var wsClose = document.getElementById('buyer-ws-close');
    var wsBody = document.getElementById('bw-body');

    wsTrigger.addEventListener('click', function(e) {
        if (!currentUser) { showAuthModal('login'); return; }
        // Cockpit route: navigate to dedicated full-page workspace instead of drawer
        if (window._cockpitEnabled !== false) {
            e.preventDefault();
            window._enterCockpit && window._enterCockpit();
            return;
        }
        wsPanel.classList.add('open');
        document.getElementById('buyer-ws-backdrop').classList.add('open');
        renderBuyerWs();
    });
    wsClose.addEventListener('click', function() {
        wsPanel.classList.remove('open');
        wsPanel.classList.remove('fullpage');
        document.body.classList.remove('cockpit-mode');
        document.getElementById('buyer-ws-backdrop').classList.remove('open');
        // If we were on /cockpit, return to /
        if (location.pathname === '/cockpit') {
            history.pushState(null, '', '/');
        }
    });
    document.getElementById('buyer-ws-backdrop').addEventListener('click', function() {
        wsPanel.classList.remove('open');
        this.classList.remove('open');
    });

    // Tab switching
    document.querySelectorAll('.buyer-ws-tab').forEach(function(tab) {
        tab.addEventListener('click', function() {
            document.querySelectorAll('.buyer-ws-tab').forEach(function(t) { t.classList.remove('active'); });
            tab.classList.add('active');
            buyerWsTab = tab.getAttribute('data-bwtab');
            renderBuyerWs();
        });
    });

    async function renderBuyerWs() {
        if (!currentUser) return;
        wsBody.innerHTML = '<div style="text-align:center;padding:30px;color:var(--text-muted)">Loading...</div>';
        try {
            if (buyerWsTab === 'shortlist') await renderShortlistTab();
            else if (buyerWsTab === 'rfqs') await renderRfqsTab();
            else if (buyerWsTab === 'searches') await renderSearchesTab();
            else if (buyerWsTab === 'alerts') await renderAlertsTab();
            else if (buyerWsTab === 'notifications') await renderNotificationsTab();
        } catch(e) {
            // Universal Pricing v1: buyer gates removed — buyers are free forever.
            // Leaving a defensive catch so any transient error still renders cleanly.
            wsBody.innerHTML = '<div class="buyer-ws-empty"><div class="emoji">&#9888;&#65039;</div><p>' + esc(e.message || 'Something went wrong') + '</p></div>';
        }
    }

    async function renderShortlistTab() {
        var data = await authFetch(API_BASE + '/buyer/shortlist');
        var productData = await authFetch(API_BASE + '/buyer/saved-products');
        if (!data) return;
        var items = data.items || [];
        var products = (productData && productData.items) || [];
        savedProductIds = new Set(products.map(function(i) { return i.productId || i.id; }).filter(Boolean));
        if (items.length === 0 && products.length === 0) {
            wsBody.innerHTML = '<div class="buyer-ws-empty"><div class="emoji">&#9829;</div><p>No saved items yet.</p><p style="font-size:.8rem">Click the save icon on suppliers or products to keep them here.</p></div>';
            return;
        }
        var html = '<div style="margin-bottom:12px;font-size:.82rem;color:var(--text-muted)">' + items.length + ' suppliers &middot; ' + products.length + ' products saved</div>';
        if (products.length) {
            html += '<div style="font-size:.78rem;font-weight:700;margin:4px 0 8px;color:var(--text-muted)">Saved products</div>';
            products.forEach(function(item) {
                html += '<div class="buyer-ws-card">';
                html += '<div class="bw-name">' + esc(item.productName || item.name || 'Product') + '</div>';
                html += '<div class="bw-meta">' + esc([item.supplierName || item.businessName || 'Supplier', item.priceLabel || '', item.city || ''].filter(Boolean).join(' · ')) + '</div>';
                html += '<div class="bw-actions">';
                if (item.listingSlug || item.supplierSlug) html += '<a href="/s/' + esc(item.listingSlug || item.supplierSlug) + '" class="bw-btn" style="text-decoration:none">View Supplier</a>';
                html += '<button class="bw-btn" data-remove-product="' + esc(item.productId || item.id || '') + '" style="color:#ef4444">Remove</button>';
                html += '</div></div>';
            });
        }
        if (items.length) html += '<div style="font-size:.78rem;font-weight:700;margin:10px 0 8px;color:var(--text-muted)">Saved suppliers</div>';
        items.forEach(function(item) {
            html += '<div class="buyer-ws-card">';
            html += '<div class="bw-name">' + esc(item.businessName || item.slug) + '</div>';
            html += '<div class="bw-meta">' + esc(item.city || '') + '</div>';
            html += '<div class="bw-actions">';
            html += '<a href="/s/' + esc(item.slug) + '" class="bw-btn" style="text-decoration:none">View Page</a>';
            html += '<button class="bw-btn" onclick="document.getElementById(\'rfq-modal-overlay\').classList.add(\'show\')">Send RFQ</button>';
            html += '<button class="bw-btn" data-remove-slug="' + esc(item.slug) + '" style="color:#ef4444">Remove</button>';
            html += '</div></div>';
        });
        wsBody.innerHTML = html;

        // Bind remove buttons
        wsBody.querySelectorAll('[data-remove-slug]').forEach(function(btn) {
            btn.addEventListener('click', async function() {
                var slug = btn.getAttribute('data-remove-slug');
                try {
                    await authFetch(API_BASE + '/buyer/shortlist/' + encodeURIComponent(slug), { method: 'DELETE' });
                    shortlistSlugs.delete(slug);
                    updateShortlistButtons();
                    updateBadge();
                    renderShortlistTab();
                } catch(e) { /* silent */ }
            });
        });
        wsBody.querySelectorAll('[data-remove-product]').forEach(function(btn) {
            btn.addEventListener('click', async function() {
                var productId = btn.getAttribute('data-remove-product');
                if (!productId) return;
                try {
                    await authFetch(API_BASE + '/buyer/saved-products/' + encodeURIComponent(productId), { method: 'DELETE' });
                    savedProductIds.delete(productId);
                    updateSavedProductButtons();
                    updateBadge();
                    renderShortlistTab();
                } catch(e) { /* silent */ }
            });
        });
    }

    async function renderRfqsTab() {
        var data = await authFetch(API_BASE + '/rfq');
        if (!data) return;
        var rfqs = data.rfqs || [];
        if (rfqs.length === 0) {
            wsBody.innerHTML = '<div class="buyer-ws-empty"><div class="emoji"><svg viewBox="0 0 24 24" width="32" height="32" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="12" y1="18" x2="12" y2="12"/><line x1="9" y1="15" x2="15" y2="15"/></svg></div><p>No RFQs submitted yet.</p>' +
                '<button class="bw-btn primary" style="margin-top:12px" onclick="document.getElementById(\'rfq-modal-overlay\').classList.add(\'show\')">Create RFQ</button></div>';
            return;
        }
        var html = '<button class="bw-btn primary" style="margin-bottom:12px" onclick="document.getElementById(\'rfq-modal-overlay\').classList.add(\'show\')">+ New RFQ</button>';
        rfqs.forEach(function(r) {
            var statusColor = r.status === 'active' ? '#059669' : r.status === 'awarded' ? '#6366f1' : '#9ca3af';
            html += '<div class="buyer-ws-card">';
            html += '<div class="bw-name">' + esc(r.title) + '</div>';
            html += '<div class="bw-meta">' + esc(r.quantity + ' ' + r.unit) + ' &middot; ' + esc(r.deliveryCity || '') +
                ' &middot; <span style="color:' + statusColor + ';font-weight:600">' + esc(r.status) + '</span></div>';
            if (r.quotesCount > 0) {
                html += '<div class="bw-meta" style="color:var(--accent);font-weight:500">' + r.quotesCount + ' quote(s) received</div>';
            }
            html += '</div>';
        });
        wsBody.innerHTML = html;
    }

    async function renderSearchesTab() {
        var data = await authFetch(API_BASE + '/buyer/searches');
        if (!data) return;
        var searches = data.searches || [];
        if (searches.length === 0) {
            wsBody.innerHTML = '<div class="buyer-ws-empty"><div class="emoji"><svg viewBox="0 0 24 24" width="32" height="32" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg></div><p>No saved searches yet.</p><p style="font-size:.8rem">Save your search criteria to get alerts when new suppliers match.</p></div>';
            return;
        }
        var html = '';
        searches.forEach(function(s) {
            html += '<div class="buyer-ws-card">';
            html += '<div class="bw-name">' + esc(s.name) + '</div>';
            html += '<div class="bw-meta">';
            if (s.query) html += 'Query: ' + esc(s.query) + ' ';
            if (s.sector) html += '&middot; ' + esc(s.sector) + ' ';
            if (s.city) html += '&middot; ' + esc(s.city);
            html += '</div>';
            html += '<div class="bw-actions">';
            html += '<button class="bw-btn" data-toggle-alert="' + esc(s.id) + '">' + (s.alertsEnabled ? '<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:3px"><path d="M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9M13.73 21a2 2 0 01-3.46 0"/></svg>Alerts On' : '<svg viewBox="0 0 24 24" width="12" height="12" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:3px"><path d="M13.73 21a2 2 0 01-3.46 0M18.63 13A17.89 17.89 0 0118 8M6.26 6.26A5.86 5.86 0 006 8c0 7-3 9-3 9h14"/><line x1="1" y1="1" x2="23" y2="23"/></svg>Alerts Off') + '</button>';
            html += '<button class="bw-btn" data-delete-search="' + esc(s.id) + '" style="color:#ef4444">Delete</button>';
            html += '</div></div>';
        });
        wsBody.innerHTML = html;

        wsBody.querySelectorAll('[data-toggle-alert]').forEach(function(btn) {
            btn.addEventListener('click', async function() {
                try {
                    await authFetch(API_BASE + '/buyer/searches/' + btn.getAttribute('data-toggle-alert') + '/toggle-alerts', { method: 'POST' });
                    renderSearchesTab();
                } catch(e) { /* silent */ }
            });
        });
        wsBody.querySelectorAll('[data-delete-search]').forEach(function(btn) {
            btn.addEventListener('click', async function() {
                try {
                    await authFetch(API_BASE + '/buyer/searches/' + btn.getAttribute('data-delete-search'), { method: 'DELETE' });
                    renderSearchesTab();
                } catch(e) { /* silent */ }
            });
        });
    }

    async function renderAlertsTab() {
        var data = await authFetch(API_BASE + '/buyer/alerts');
        if (!data) return;
        var alerts = data.alerts || [];
        if (alerts.length === 0) {
            wsBody.innerHTML = '<div class="buyer-ws-empty"><div class="emoji"><svg viewBox="0 0 24 24" width="32" height="32" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9M13.73 21a2 2 0 01-3.46 0"/></svg></div><p>No alerts yet.</p><p style="font-size:.8rem">Save a search with alerts enabled to get notified of new suppliers.</p></div>';
            return;
        }
        var html = '<div style="display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px"><button class="bw-btn" style="font-size:.75rem" id="mark-all-read">Mark All Read</button><button class="bw-btn" style="font-size:.75rem" id="clear-alerts">Clear Alerts</button></div>';
        alerts.forEach(function(a) {
            var isUnread = a.read === false || a.isRead === false || (!('read' in a) && !a.isRead && !a.readAt);
            var unread = isUnread ? 'font-weight:600' : '';
            html += '<div class="buyer-ws-card" style="' + unread + '">';
            html += '<div class="bw-name">' + esc(a.title || 'New Supplier Alert') + (isUnread ? ' <span class="alert-dot"></span>' : '') + '</div>';
            html += '<div class="bw-meta">' + esc(a.message || '') + '</div>';
            if (a.slug) html += '<a href="/s/' + esc(a.slug) + '" class="bw-btn" style="display:inline-block;margin-top:6px;text-decoration:none;font-size:.72rem">View Listing</a>';
            html += '</div>';
        });
        wsBody.innerHTML = html;

        var markAllBtn = document.getElementById('mark-all-read');
        if (markAllBtn) {
            markAllBtn.addEventListener('click', async function() {
                try {
                    await authFetch(API_BASE + '/buyer/alerts/read-all', { method: 'POST' });
                    renderAlertsTab();
                } catch(e) { /* silent */ }
            });
        }
        var clearAlertsBtn = document.getElementById('clear-alerts');
        if (clearAlertsBtn) {
            clearAlertsBtn.addEventListener('click', async function() {
                try {
                    await authFetch(API_BASE + '/buyer/alerts', { method: 'DELETE' });
                    renderAlertsTab();
                } catch(e) { /* silent */ }
            });
        }
    }

    // ─── Push Notifications Tab ───
    async function renderNotificationsTab() {
        if (!window.AutomailPush) {
            wsBody.innerHTML = '<div class="bw-push-empty"><svg viewBox="0 0 24 24" width="28" height="28" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" style="margin-bottom:6px;opacity:.6"><path d="M13.73 21a2 2 0 01-3.46 0M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9"/><line x1="1" y1="1" x2="23" y2="23"/></svg><div>Push notifications are not supported on this device.</div></div>';
            return;
        }
        var perm = window.AutomailPush.getPermission();
        var email = (currentUser && currentUser.email) || '';
        var prefs = null;
        try { var r = await window.AutomailPush.getPreferences(email); prefs = r && r.preferences; } catch(_) {}

        var I = {
            bell:    '<path d="M18 8A6 6 0 006 8c0 7-3 9-3 9h18s-3-2-3-9M13.73 21a2 2 0 01-3.46 0"/>',
            reply:   '<polyline points="9 17 4 12 9 7"/><path d="M20 18v-2a4 4 0 00-4-4H4"/>',
            doc:     '<path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/>',
            clock:   '<circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/>',
            search:  '<circle cx="11" cy="11" r="8"/><line x1="21" y1="21" x2="16.65" y2="16.65"/>',
            chat:    '<path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/>',
            send:    '<line x1="22" y1="2" x2="11" y2="13"/><polygon points="22 2 15 22 11 13 2 9 22 2"/>',
            bellOff: '<path d="M13.73 21a2 2 0 01-3.46 0M18.63 13A17.89 17.89 0 0118 8M6.26 6.26A5.86 5.86 0 006 8c0 7-3 9-3 9h14M18 8a6 6 0 00-9.33-5"/><line x1="1" y1="1" x2="23" y2="23"/>'
        };
        function svg(d, size) {
            size = size || 14;
            return '<svg viewBox="0 0 24 24" width="'+size+'" height="'+size+'" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">'+d+'</svg>';
        }

        var categories = [
            { key: 'seller_reply',       icon: I.reply,  label: 'Seller replied to your inquiry',     desc: 'Direct reply from a supplier you contacted',         recommended: true },
            { key: 'rfq_new_quote',      icon: I.doc,    label: 'New quote on your RFQ',              desc: 'A seller submitted a price quote for your request',  recommended: true },
            { key: 'rfq_expiring',       icon: I.clock,  label: 'Your RFQ is expiring soon',          desc: 'Last call for quotes before the deadline' },
            { key: 'saved_search_match', icon: I.search, label: 'New supplier matches saved search',  desc: 'A newly-listed supplier matches your criteria',      recommended: true },
            { key: 'biz_chat_message',   icon: I.chat,   label: 'New chat message from seller',       desc: 'A seller sent you a new message on the marketplace', recommended: true }
        ];

        var statusText, statusClass;
        if (perm === 'granted')      { statusText = 'Enabled on this device';      statusClass = 'on'; }
        else if (perm === 'denied')  { statusText = 'Blocked — change in browser'; statusClass = 'blocked'; }
        else                         { statusText = 'Not enabled yet';             statusClass = 'off'; }

        var html = '';
        html += '<div class="bw-push-hero">';
        html +=   '<div class="bw-push-hero-row">';
        html +=     '<div class="bw-push-hero-icon">' + svg(I.bell, 20) + '</div>';
        html +=     '<div style="flex:1;min-width:0">';
        html +=       '<div class="bw-push-hero-title">Push notifications</div>';
        html +=       '<span class="bw-push-status ' + statusClass + '"><span class="bw-push-status-dot"></span>' + esc(statusText) + '</span>';
        html +=     '</div>';
        html +=   '</div>';
        html +=   '<div class="bw-push-actions">';
        if (perm !== 'granted') {
            html += '<button class="bw-btn primary" id="enable-push-btn">' + svg(I.bell, 13) + ' Enable push</button>';
        } else {
            html += '<button class="bw-btn" id="test-push-btn">' + svg(I.send, 13) + ' Send test</button>';
            html += '<button class="bw-btn" id="disable-push-btn">' + svg(I.bellOff, 13) + ' Disable here</button>';
        }
        html +=   '</div>';
        html += '</div>';

        if (prefs) {
            html += '<div class="bw-push-group-label">' + svg(I.bell, 12) + ' What to notify me about</div>';
            html += '<div class="buyer-ws-card" style="padding:4px 14px;margin-bottom:4px">';
            categories.forEach(function(c) {
                var enabled = (prefs.categories && prefs.categories[c.key] !== false);
                html += '<div class="bw-push-item">';
                html +=   '<div class="bw-push-item-icon">' + svg(c.icon, 14) + '</div>';
                html +=   '<div class="bw-push-item-text">';
                html +=     '<div class="bw-push-item-label">' + esc(c.label) + (c.recommended ? ' <span class="bw-push-rec">Recommended</span>' : '') + '</div>';
                html +=     '<div class="bw-push-item-desc">' + esc(c.desc) + '</div>';
                html +=   '</div>';
                html +=   '<button class="bw-push-switch" data-key="' + c.key + '" data-on="' + (enabled ? '1' : '0') + '" aria-pressed="' + (enabled ? 'true' : 'false') + '"><span class="bw-push-thumb"></span></button>';
                html += '</div>';
            });
            html += '</div>';
        } else if (perm !== 'granted') {
            html += '<div class="bw-push-empty">Enable push notifications to customize which alerts you receive.</div>';
        }

        wsBody.innerHTML = html;

        var enableBtn = document.getElementById('enable-push-btn');
        if (enableBtn) {
            enableBtn.addEventListener('click', async function() {
                enableBtn.disabled = true;
                enableBtn.innerHTML = svg(I.clock, 13) + ' Enabling…';
                var res = await window.AutomailPush.enable(email);
                if (res.success) {
                    renderNotificationsTab();
                } else {
                    showBizToast(_pushErrMsg(res.reason), true);
                    renderNotificationsTab();
                }
            });
        }
        var testBtn = document.getElementById('test-push-btn');
        if (testBtn) {
            testBtn.addEventListener('click', async function() {
                try { await window.AutomailPush.sendTest(); showBizToast('Test notification sent — check your device.', false); }
                catch(e) { showBizToast('Test failed: ' + (e && e.message ? e.message : e), true); }
            });
        }
        var disableBtn = document.getElementById('disable-push-btn');
        if (disableBtn) {
            disableBtn.addEventListener('click', async function() {
                await window.AutomailPush.disable(email);
                renderNotificationsTab();
            });
        }
        wsBody.querySelectorAll('.bw-push-switch').forEach(function(btn) {
            btn.addEventListener('click', async function() {
                var key = btn.getAttribute('data-key');
                var isOn = btn.getAttribute('data-on') === '1';
                btn.setAttribute('data-on', isOn ? '0' : '1');
                btn.setAttribute('aria-pressed', isOn ? 'false' : 'true');
                var patch = { categories: {} };
                patch.categories[key] = !isOn;
                try {
                    await window.AutomailPush.setPreferences(email, patch);
                } catch(e) {
                    btn.setAttribute('data-on', isOn ? '1' : '0');
                    btn.setAttribute('aria-pressed', isOn ? 'true' : 'false');
                    alert('Failed to save: ' + e.message);
                }
            });
        });
    }

    // ─── RFQ Modal ───
    var rfqOverlay = document.getElementById('rfq-modal-overlay');
    initRfqCategoryCombobox();
    document.getElementById('rfq-cancel').addEventListener('click', function() {
        rfqOverlay.classList.remove('show');
    });
    rfqOverlay.addEventListener('click', function(e) {
        if (e.target === rfqOverlay) rfqOverlay.classList.remove('show');
    });

    document.getElementById('rfq-submit').addEventListener('click', async function() {
        var btn = this;
        if (!currentUser || !currentUser.email) {
            alert('Please sign in to post an RFQ.');
            showAuthModal && showAuthModal('login');
            return;
        }
        var title = document.getElementById('rfq-title').value.trim();
        var qty = parseInt(document.getElementById('rfq-qty').value) || 0;
        var unit = document.getElementById('rfq-unit').value.trim();
        var city = document.getElementById('rfq-city').value.trim();
        if (!title || !selectedRfqCategory || !qty || !unit || !city) {
            alert('Please fill all required fields (Product, Category, Quantity, Unit, City).');
            return;
        }
        function normalizeRfqUnit(v) {
            var s = String(v || '').trim().toLowerCase();
            if (/^(pc|pcs|piece|pieces|unit|units|nos|no\.)$/.test(s)) return 'pieces';
            if (/^(kg|kgs|kilogram|kilograms)$/.test(s)) return 'kg';
            if (/^(ton|tons|tonne|tonnes|mt)$/.test(s)) return 'tons';
            if (/^(m|meter|meters|metre|metres)$/.test(s)) return 'meters';
            if (/^(l|ltr|liter|liters|litre|litres)$/.test(s)) return 'liters';
            if (/^(set|sets)$/.test(s)) return 'sets';
            if (/^(pair|pairs)$/.test(s)) return 'pairs';
            if (/^(box|boxes|carton|cartons)$/.test(s)) return 'boxes';
            if (/^(roll|rolls)$/.test(s)) return 'rolls';
            if (/^(sqft|sq ft|square feet)$/.test(s)) return 'sqft';
            if (/^(sqm|sq m|square meter|square meters)$/.test(s)) return 'sqm';
            return 'other';
        }
        var minBudget = parseInt(document.getElementById('rfq-budget-min').value) || 0;
        var maxBudget = parseInt(document.getElementById('rfq-budget-max').value) || 0;
        var body = {
            productName: title,
            buyerName: (currentUser.displayName || (currentUser.email || '').split('@')[0] || 'Buyer'),
            buyerEmail: currentUser.email,
            category: selectedRfqCategory.label,
            sector: selectedRfqCategory.sectorLabel,
            quantity: qty,
            unit: normalizeRfqUnit(unit),
            specifications: document.getElementById('rfq-desc').value.trim() || undefined,
            targetPrice: maxBudget || minBudget || undefined,
            targetCurrency: 'INR',
            deliveryCity: city,
            deliveryDeadline: document.getElementById('rfq-deadline').value || undefined,
            maxSellers: 10,
            idempotencyKey: 'rfq-' + Date.now() + '-' + Math.random().toString(36).slice(2)
        };
        // Clean undefined
        Object.keys(body).forEach(function(k) { if (body[k] === undefined) delete body[k]; });

        btn.textContent = 'Submitting...';
        btn.disabled = true;
        try {
            await authFetch(API_BASE + '/rfq', { method: 'POST', body: JSON.stringify(body) });
            btn.textContent = 'Submitted!';
            setTimeout(function() {
                rfqOverlay.classList.remove('show');
                btn.textContent = 'Submit RFQ';
                btn.disabled = false;
                // Clear form
                document.getElementById('rfq-title').value = '';
                document.getElementById('rfq-qty').value = '';
                document.getElementById('rfq-unit').value = '';
                document.getElementById('rfq-desc').value = '';
                document.getElementById('rfq-budget-min').value = '';
                document.getElementById('rfq-budget-max').value = '';
                document.getElementById('rfq-city').value = '';
                document.getElementById('rfq-deadline').value = '';
                setRfqCategoryById('');
            }, 1200);
        } catch(e) {
            alert('Failed: ' + e.message);
            btn.textContent = 'Submit RFQ';
            btn.disabled = false;
        }
    });

    // ─── Save Current Search ───
    window.saveCurrentSearch = async function() {
        if (!currentUser) { showAuthModal('login'); return; }
        var name = prompt('Name this saved search:');
        if (!name) return;
        try {
            await authFetch(API_BASE + '/buyer/searches', {
                method: 'POST',
                body: JSON.stringify({
                    name: name,
                    query: currentSearch || '',
                    sector: currentSector || '',
                    city: selectedCities[0] || currentCity || '',
                    alertsEnabled: true
                })
            });
            alert('Search saved! You\'ll get alerts for new matching suppliers.');
        } catch(e) { alert('Failed: ' + e.message); }
    };

    // ─── Open RFQ Modal (global, called from header CTA) ───
    window.openRfqModal = function() {
        if (!currentUser) { showAuthModal('login'); return; }
        initRfqCategoryCombobox();
        document.getElementById('rfq-modal-overlay').classList.add('show');
    };

    // ─── Show trigger + Post Requirement when user is logged in ───
    firebase.auth().onAuthStateChanged(function(user) {
        if (user) {
            currentUser = user;
            document.getElementById('buyer-ws-trigger').classList.add('visible');
            var postReqBtn = document.getElementById('nav-post-req-btn');
            if (postReqBtn) postReqBtn.style.display = '';
            loadShortlist();
            loadSavedProducts();
        } else {
            document.getElementById('buyer-ws-trigger').classList.remove('visible');
            var postReqBtn2 = document.getElementById('nav-post-req-btn');
            if (postReqBtn2) postReqBtn2.style.display = 'none';
            shortlistSlugs = new Set();
            savedProductIds = new Set();
        }
    });
})();
</script>

<script>
/* ── How It Works — Tab Switching ── */
document.querySelectorAll('.hiw-tab-btn').forEach(function(btn) {
    btn.addEventListener('click', function() {
        document.querySelectorAll('.hiw-tab-btn').forEach(function(b) { b.classList.remove('active'); });
        document.querySelectorAll('.hiw-tab-content').forEach(function(c) { c.classList.remove('hiw-active'); });
        btn.classList.add('active');
        var target = document.getElementById('hiw-tab-' + btn.dataset.tab);
        if (target) target.classList.add('hiw-active');
    });
});
/* ── FAQ — Tab Switching ── */
document.querySelectorAll('.faq-tab-btn').forEach(function(btn) {
    btn.addEventListener('click', function() {
        document.querySelectorAll('.faq-tab-btn').forEach(function(b) { b.classList.remove('active'); });
        document.querySelectorAll('.faq-tab-content').forEach(function(c) { c.classList.remove('faq-active'); });
        btn.classList.add('active');
        var target = document.getElementById('faq-tab-' + btn.dataset.faqtab);
        if (target) target.classList.add('faq-active');
    });
});

// ═══════════════════════════════════════════════════════════
// Language Pill (EN / हि / गु) — Google Translate widget shim
// Phase 1: UI state only. Flip ENABLE_GTRANSLATE to true after
// you activate the Google Cloud Translation API key on the project.
// ═══════════════════════════════════════════════════════════
(function(){
    var ENABLE_GTRANSLATE = true; // Google Translate widget — wired via cookie + element.js
    var pill = document.getElementById('lang-pill');
    if (!pill) return;
    var sel = document.getElementById('lang-select');

    function setActive(lang){
        if (sel && sel.value !== lang) sel.value = lang;
        // Legacy button-pill compat (in case mobile-drawer still uses it)
        pill.querySelectorAll('.lp-btn').forEach(function(b){
            var on = b.getAttribute('data-lang') === lang;
            b.classList.toggle('on', on);
        });
        try { localStorage.setItem('automail.lang', lang); } catch(e){}
    }

    function applyLanguage(lang, opts){
        setActive(lang);
        if (!ENABLE_GTRANSLATE) return; // UI-only until API is enabled
        // Google Translate widget cookie protocol: set 'googtrans' cookie then either trigger
        // the in-page widget (if loaded) or reload — reloading is the most reliable path.
        try {
            var val = lang === 'en' ? '/en/en' : '/en/' + lang;
            // Clear any prior cookie scoped to host & root domain, then set fresh
            document.cookie = 'googtrans=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';
            document.cookie = 'googtrans=' + val + ';path=/';
            try {
                var rootDomain = '.' + location.hostname.split('.').slice(-2).join('.');
                document.cookie = 'googtrans=' + val + ';path=/;domain=' + rootDomain;
            } catch(_){}
            // If we're not in the initial restore call, force a reload so the widget picks up the cookie.
            if (opts && opts.reload === false) {
                if (lang !== 'en' && !window._gtLoaded) loadGoogleTranslate();
                return;
            }
            // Reload only if the change is user-initiated and we're not already on the requested lang
            location.reload();
        } catch(e){ console.warn('translate apply failed', e); }
    }

    function loadGoogleTranslate(){
        if (window._gtLoaded) return; window._gtLoaded = true;
        var mount = document.createElement('div');
        mount.id = 'google_translate_element';
        mount.style.cssText = 'position:absolute;left:-9999px;top:-9999px;visibility:hidden';
        document.body.appendChild(mount);
        // Google Translate's element.js requires the callback to be named exactly `googleTranslateElementInit` on window
        window.googleTranslateElementInit = function(){
            try {
                // eslint-disable-next-line no-undef
                new google.translate.TranslateElement({pageLanguage:'en', includedLanguages:'en,hi,gu', autoDisplay:false, layout: google.translate.TranslateElement.InlineLayout.SIMPLE}, 'google_translate_element');
            } catch(e){ console.warn('GTranslate init failed', e); }
        };
        var s = document.createElement('script');
        s.src = 'https://translate.google.com/translate_a/element.js?cb=googleTranslateElementInit';
        s.async = true; s.defer = true;
        document.body.appendChild(s);
    }

    pill.addEventListener('click', function(e){
        var btn = e.target.closest('.lp-btn'); if (!btn) return;
        applyLanguage(btn.getAttribute('data-lang'));
    });
    if (sel) sel.addEventListener('change', function(){ applyLanguage(sel.value); });

    // Restore saved preference (no reload — just sync the UI + ensure widget is loaded if non-EN)
    var saved = 'en';
    try { saved = localStorage.getItem('automail.lang') || 'en'; } catch(e){}
    applyLanguage(saved, { reload: false });
    if (saved !== 'en') loadGoogleTranslate();
})();

// ═══════════════════════════════════════════════════════════
// Buyer Cockpit — full-page route at /cockpit
// Reuses the existing #buyer-ws panel with .fullpage modifier.
// ALL backend wiring (renderShortlistTab/renderRfqsTab/renderSearchesTab/
// renderAlertsTab/renderNotificationsTab) is unchanged — we only swap
// the panel layout and route. Auth-gated; redirects unauth users to home.
// ═══════════════════════════════════════════════════════════
(function(){
    var COCKPIT_PATH = '/cockpit';

    function enterCockpit() {
        var panel = document.getElementById('buyer-ws');
        if (!panel) return;
        // Auth gate
        if (!window.currentUser) {
            if (typeof showAuthModal === 'function') showAuthModal('login');
            return;
        }
        // Close any open detail drawer
        try {
            var ld = document.getElementById('listing-drawer');
            if (ld) ld.classList.remove('open');
            var bd = document.getElementById('drawer-backdrop');
            if (bd) bd.classList.remove('open');
        } catch(e){}

        document.body.classList.add('cockpit-mode');
        panel.classList.add('open', 'fullpage');
        // Hide drawer backdrop (cockpit is full-page, not modal)
        var wsBack = document.getElementById('buyer-ws-backdrop');
        if (wsBack) wsBack.classList.remove('open');
        // Inject summary tiles + back link above tabs once
        ensureCockpitChrome();
        // Trigger render via existing function
        if (typeof renderBuyerWs === 'function') renderBuyerWs();
        // Update URL without reloading
        if (location.pathname !== COCKPIT_PATH) {
            history.pushState({cockpit:true}, '', COCKPIT_PATH);
        }
        // Scroll to top
        window.scrollTo(0,0);
    }

    function exitCockpit() {
        var panel = document.getElementById('buyer-ws');
        if (!panel) return;
        document.body.classList.remove('cockpit-mode');
        panel.classList.remove('open', 'fullpage');
    }

    function ensureCockpitChrome() {
        // Replace the panel header title to read "Buyer Cockpit" in fullpage mode
        var hdr = document.querySelector('#buyer-ws .buyer-ws-header h3');
        if (hdr && !hdr.dataset.cockpitTitleApplied) {
            hdr.dataset.cockpitTitleApplied = '1';
            hdr.dataset.original = hdr.innerHTML;
        }
        if (document.body.classList.contains('cockpit-mode') && hdr) {
            hdr.innerHTML = '<svg viewBox="0 0 24 24" width="22" height="22" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" style="vertical-align:middle;margin-right:9px"><rect x="3" y="3" width="7" height="9"/><rect x="14" y="3" width="7" height="5"/><rect x="14" y="12" width="7" height="9"/><rect x="3" y="16" width="7" height="5"/></svg>Sourcing Hub <span style="font-weight:500;color:var(--text-muted);font-size:.78em;margin-left:8px">Inbox · landed cost · calls · chats · shortlists</span>';
        }

        // Inject "Back to directory" link inside header (once)
        var hdrEl = document.querySelector('#buyer-ws .buyer-ws-header');
        if (hdrEl && !hdrEl.querySelector('.cockpit-back-btn')) {
            var back = document.createElement('a');
            back.href = '/';
            back.className = 'cockpit-back-btn';
            back.style.cssText = 'display:none;align-items:center;gap:6px;font-size:.85rem;color:var(--text-muted);text-decoration:none;font-weight:500;padding:6px 12px;border:1px solid var(--border);border-radius:8px;background:var(--bg)';
            back.innerHTML = '<svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M19 12H5M12 19l-7-7 7-7"/></svg>Back to directory';
            back.addEventListener('click', function(e){
                e.preventDefault();
                exitCockpit();
                history.pushState(null, '', '/');
            });
            hdrEl.appendChild(back);
        }
        var backBtn = hdrEl && hdrEl.querySelector('.cockpit-back-btn');
        if (backBtn) backBtn.style.display = document.body.classList.contains('cockpit-mode') ? 'inline-flex' : 'none';
    }

    // Expose for nav trigger
    window._enterCockpit = enterCockpit;
    window._exitCockpit = exitCockpit;

    // popstate: handle back/forward
    window.addEventListener('popstate', function() {
        if (location.pathname === COCKPIT_PATH) {
            enterCockpit();
        } else if (document.body.classList.contains('cockpit-mode')) {
            exitCockpit();
        }
    });

    // Initial route check (after auth resolves)
    function tryInitialRoute(){
        if (location.pathname !== COCKPIT_PATH) return;
        // Wait for currentUser to be set by firebase.auth().onAuthStateChanged
        if (typeof window.currentUser === 'undefined' || window.currentUser === null) {
            // Give auth one more chance
            setTimeout(function(){
                if (location.pathname === COCKPIT_PATH) {
                    if (window.currentUser) enterCockpit();
                    else { history.replaceState(null,'','/'); if (typeof showAuthModal==='function') showAuthModal('login'); }
                }
            }, 1500);
            return;
        }
        enterCockpit();
    }

    if (document.readyState === 'complete' || document.readyState === 'interactive') {
        setTimeout(tryInitialRoute, 200);
    } else {
        document.addEventListener('DOMContentLoaded', function(){ setTimeout(tryInitialRoute, 200); });
    }
})();
</script>

<!-- ════════════════════════════════════════════════════════════════
     SR-PAGE v2 — DOM relocation + sector tiles + trending RFQs + HIW tabs.
     Runs after main app init so #listings, #sectors, etc. exist.
     ════════════════════════════════════════════════════════════════ -->
<script>
(function(){
  'use strict';

  // ── 1. Relocate existing live elements into sr-page mount points ────
  function relocate(srcId, mountId){
    var src = document.getElementById(srcId);
    var mount = document.getElementById(mountId);
    if (src && mount && src.parentNode !== mount) {
      mount.appendChild(src);
    }
  }
  function doRelocate(){
    relocate('featured-container', 'sr-mount-featured');
    relocate('listings',           'sr-mount-listings-header');
    relocate('listings-container', 'sr-mount-listings');
    relocate('load-more-bar',      'sr-mount-loadmore');
    // Sectors UL goes into Lane 1; add the showroom sector-list class for styling.
    var sectorsUl = document.getElementById('sectors');
    var sectorsMount = document.getElementById('sr-mount-sectors');
    if (sectorsUl && sectorsMount && sectorsUl.parentNode !== sectorsMount) {
      sectorsUl.classList.add('sr-sector-list');
      sectorsMount.appendChild(sectorsUl);
    } else if (sectorsUl) {
      sectorsUl.classList.add('sr-sector-list');
    }
  }
  // Run early + retry, in case JS rebuilds inner HTML after init.
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', doRelocate);
  } else {
    doRelocate();
  }
  setTimeout(doRelocate, 400);
  setTimeout(doRelocate, 1500);
  setTimeout(doRelocate, 4000);

  // ── 2. Wire popular search tags to hero search ─────────────────────
  document.addEventListener('click', function(ev){
    var t = ev.target.closest('.sr-page .ps-tag, .sr-page .sr-popular span:not(b)');
    if (!t) return;
    var input = document.getElementById('hero-search');
    var btn = document.getElementById('hero-search-btn');
    if (input && btn) {
      input.value = (t.textContent || '').trim();
      btn.click();
    }
  });

  // ── 3. Wire sector tiles + city tiles ──────────────────────────────
  document.addEventListener('click', function(ev){
    var sec = ev.target.closest('.sr-sec-tile[data-sector]');
    if (sec) {
      ev.preventDefault();
      var s = sec.getAttribute('data-sector');
      if (typeof window.filterBySector === 'function') {
        window.filterBySector(s);
      } else if (typeof window.filterBySectorName === 'function') {
        window.filterBySectorName(s);
      } else {
        // Fallback: set hero search and submit
        var input = document.getElementById('hero-search');
        var btn = document.getElementById('hero-search-btn');
        if (input && btn) { input.value = s; btn.click(); }
      }
      var anchor = document.getElementById('listings');
      if (anchor) anchor.scrollIntoView({behavior:'smooth'});
      return;
    }
    var city = ev.target.closest('.sr-city[data-city]');
    if (city) {
      ev.preventDefault();
      var sel = document.getElementById('hero-city-select');
      var c = city.getAttribute('data-city');
      if (sel) {
        var found = false;
        for (var i=0;i<sel.options.length;i++){ if (sel.options[i].value===c||sel.options[i].text===c){ sel.selectedIndex=i; found=true; break; } }
        if (!found) { var opt=document.createElement('option'); opt.value=c; opt.text=c; opt.selected=true; sel.add(opt); }
        var btn2 = document.getElementById('hero-search-btn');
        if (btn2) btn2.click();
      }
      var anchor2 = document.getElementById('listings');
      if (anchor2) anchor2.scrollIntoView({behavior:'smooth'});
    }
  });

  // ── 4. HIW tabs ─────────────────────────────────────────────────────
  document.addEventListener('click', function(ev){
    var tab = ev.target.closest('.sr-hiw-tabs button[data-hiw]');
    if (!tab) return;
    var which = tab.getAttribute('data-hiw');
    var tabs = tab.parentNode.querySelectorAll('button');
    tabs.forEach(function(b){ b.classList.toggle('on', b===tab); });
    var b = document.getElementById('sr-hiw-buyer');
    var s = document.getElementById('sr-hiw-seller');
    if (b) b.style.display = (which==='buyer'?'grid':'none');
    if (s) s.style.display = (which==='seller'?'grid':'none');
  });

  // ── 5. Search-pill mode toggle (hero) ──────────────────────────────
  document.addEventListener('click', function(ev){
    var pillBtn = ev.target.closest('.sr-search-pill button[data-mode]');
    if (!pillBtn) return;
    var mode = pillBtn.getAttribute('data-mode');
    if (mode === 'rfq') return;  // handled by inline onclick (opens modal)
    var sib = pillBtn.parentNode.querySelectorAll('button');
    sib.forEach(function(b){ b.classList.toggle('on', b===pillBtn); });
    var hidden = document.getElementById('uc-mode-toggle');
    if (hidden) {
      hidden.dataset.mode = mode;
      hidden.dispatchEvent(new Event('change', {bubbles:true}));
    }
  });

  // ── 6. Populate trending RFQs (live from Firestore, fallback static) ──
  async function loadTrendingRfqs(){
    var mount = document.getElementById('sr-trending-rfqs');
    if (!mount) return;
    var rows = [];
    try {
      if (window.firebase && window.firebase.firestore) {
        var snap = await window.firebase.firestore().collection('rfqs')
          .orderBy('createdAt','desc').limit(4).get();
        snap.forEach(function(d){ var x = d.data(); rows.push({title:x.title||x.productName||'RFQ', city:x.city||x.deliveryCity||'', qty:x.quantity||x.qty||'', unit:x.unit||'', deadline:x.deadline||''}); });
      }
    } catch(e) { /* fall through to static */ }
    if (!rows.length) {
      rows = [
        {title:'500 kg Stainless Steel Sheets, 2mm', city:'Mumbai',     qty:500,   unit:'kg',  deadline:'5 days', _demo:true},
        {title:'10,000 PET bottles, 500ml, food-grade', city:'Surat',   qty:10000, unit:'pcs', deadline:'7 days', _demo:true},
        {title:'Custom CNC machining – aluminium brackets', city:'Pune', qty:200,   unit:'pcs', deadline:'10 days', _demo:true},
        {title:'Organic cotton bulk – GOTS certified', city:'Ahmedabad',qty:2,     unit:'tons',deadline:'14 days', _demo:true}
      ];
    }
    var esc = function(s){ return String(s==null?'':s).replace(/[&<>"']/g, function(c){return ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[c];}); };
        mount.innerHTML = rows.map(function(r){
      var sub = [r.qty?(esc(r.qty)+(r.unit?' '+esc(r.unit):'')):'', r.city?esc(r.city):'', r.deadline?('Due '+esc(r.deadline)):''].filter(Boolean).join(' · ');
      var demoTag = '';
            return '<div class="sr-rfq-row"><div class="sr-rfq-info"><b>'+esc(r.title)+'</b><span>'+sub+'</span></div><span class="sr-bid-now" style="cursor:default;pointer-events:none">Demand signal</span></div>';
    }).join('');
  }
  if (document.readyState === 'loading') {
    document.addEventListener('DOMContentLoaded', function(){ setTimeout(loadTrendingRfqs, 800); });
  } else {
    setTimeout(loadTrendingRfqs, 800);
  }

  // ── 7. Populate sector tile counts from #sectors UL once it loads ──
  function syncSectorTileCounts(){
    var ul = document.getElementById('sectors');
    if (!ul) return;
    var counts = {};
    ul.querySelectorAll('a').forEach(function(a){
      var slug = (a.getAttribute('data-sector') || a.getAttribute('href') || '').replace(/^#/, '').toLowerCase();
      var num  = (a.querySelector('small,.count') || {}).textContent || '';
      if (slug) counts[slug] = num.trim();
    });
    document.querySelectorAll('.sr-sec-tile[data-sector]').forEach(function(t){
      var key = (t.getAttribute('data-sector')||'').toLowerCase();
      var span = t.querySelector('span');
      if (span) {
        var hit = counts[key] || counts[key.replace(/[^a-z0-9]/g,'')] || '';
        span.textContent = hit || 'Suppliers';
      }
    });
  }
  setTimeout(syncSectorTileCounts, 1500);
  setTimeout(syncSectorTileCounts, 4000);

  // ── 8. Recently viewed (Lane 3) ────────────────────────────────────
  function syncRecentlyViewed(){
    var mount = document.getElementById('sr-recent-list');
    var counter = document.getElementById('sr-recent-count');
    if (!mount) return;
    var raw = [];
    try { raw = JSON.parse(localStorage.getItem('biz:recentlyViewed') || '[]'); } catch(e){}
    if (!Array.isArray(raw)) raw = [];
    raw = raw.slice(0,4);
    if (counter) counter.textContent = raw.length ? '('+raw.length+')' : '';
    if (!raw.length) { mount.innerHTML = '<div style="font-size:.82rem;color:var(--sr-muted)">No recent items yet.</div>'; return; }
    var esc = function(s){ return String(s==null?'':s).replace(/[&<>"']/g, function(c){return ({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"})[c];}); };
    mount.innerHTML = raw.map(function(r){
      return '<div style="font-size:.82rem;padding:6px 0;border-bottom:1px solid var(--sr-border)"><a href="/s/'+esc(r.slug||'')+'" onclick="event.preventDefault();window.openListingDrawer&&window.openListingDrawer(\''+esc(r.slug||'')+'\')">'+esc(r.name||r.businessName||'Listing')+'</a></div>';
    }).join('');
  }
  setTimeout(syncRecentlyViewed, 1500);
  window.addEventListener('storage', syncRecentlyViewed);

})();
</script>

<!-- ═══════════════════════════════════════════════════════════
     SOURCING HUB v3  (Notion-style, replaces Cockpit v2)
     - Full-bleed shell at #cockpit-app (id retained for code compat)
     - Aesthetic: white canvas #fff · sidebar #f7f7f5 · ink #37352f · accent #2383e2
     - Routes: Overview · Inbox (Multi-Quote) · Landed Cost · RFQ Studio
                · Chat · Calls · Shortlists · Spotlight · Suppliers · Searches · Alerts
     - Locked Features: 1 Landed-Cost Calculator · 12 Multi-Quote Inbox · 19 Spotlight
     - Wires: /api/buyer/dashboard · /api/rfq · /api/buyer/shortlist
              /api/biz-chat/chats · /api/calls/log/list · /api/marketplace/listings
     ═══════════════════════════════════════════════════════════ -->
<style>
/* Hide legacy side-panel cockpit when SH v3 is active */
body.cockpit-mode.cockpit-v2 #buyer-ws,
body.cockpit-mode.cockpit-v2 #buyer-ws-backdrop { display:none !important; }
body.cockpit-mode.cockpit-v2 .nav-wrap,
body.cockpit-mode.cockpit-v2 footer,
body.cockpit-mode.cockpit-v2 .hero,
body.cockpit-mode.cockpit-v2 .stats-bar,
body.cockpit-mode.cockpit-v2 #listings,
body.cockpit-mode.cockpit-v2 #featured,
body.cockpit-mode.cockpit-v2 .home-section,
body.cockpit-mode.cockpit-v2 #faq-section,
body.cockpit-mode.cockpit-v2 .testimonials,
body.cockpit-mode.cockpit-v2 .top-strip,
body.cockpit-mode.cockpit-v2 .sticky-fb,
body.cockpit-mode.cockpit-v2 .sr-page,
body.cockpit-mode.cockpit-v2 #sr-page-root,
body.cockpit-mode.cockpit-v2 .nav-bar,
body.cockpit-mode.cockpit-v2 .topbar,
body.cockpit-mode.cockpit-v2 .filters-section,
body.cockpit-mode.cockpit-v2 .compare-tray,
body.cockpit-mode.cockpit-v2 .mobile-sticky-cta,
body.cockpit-mode.cockpit-v2 .home-customer-impact,
body.cockpit-mode.cockpit-v2 .trust-strip,
body.cockpit-mode.cockpit-v2 .how-it-works,
body.cockpit-mode.cockpit-v2 .faq,
body.cockpit-mode.cockpit-v2 .cta,
body.cockpit-mode.cockpit-v2 .newsletter,
body.cockpit-mode.cockpit-v2 #sectors { display:none !important; }
body.cockpit-mode.cockpit-v2 { overflow:hidden; background:#fff; }

#cockpit-app { display:none; }
body.cockpit-mode.cockpit-v2 #cockpit-app { display:grid; }

/* === Notion-style design tokens === */
#cockpit-app{
  --sh-canvas:#ffffff;
  --sh-side:#fbfbfa;
  --sh-side-hover:#efeeec;
  --sh-border:#ebecf0;
  --sh-border-soft:#f1f1ef;
  --sh-ink:#37352f;
  --sh-ink-soft:#6b6b6b;
  --sh-ink-faint:#9b9aa0;
  --sh-accent:#2383e2;
  --sh-accent-hover:#1a6dc4;
  --sh-accent-soft:#e7f1fb;
  --sh-soft:#f7f6f3;
  --sh-row-hover:#f7f6f3;
  --sh-green:#0f7b6c;     --sh-green-bg:#ddedea;
  --sh-orange:#cb912f;    --sh-orange-bg:#faebdd;
  --sh-red:#b71c1c;       --sh-red-bg:#fbe4e4;
  --sh-purple:#6940a5;    --sh-purple-bg:#eae4f2;
  position:fixed; inset:0; z-index:9000;
  grid-template-columns:248px 1fr;
  background:var(--sh-canvas); color:var(--sh-ink);
  font-family:'Inter',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
  font-size:15px; line-height:1.55;
}
#cockpit-app *{box-sizing:border-box}
#cockpit-app svg{ width:16px; height:16px; flex-shrink:0; }
#cockpit-app .sh-h1 svg, #cockpit-app .sh-stat svg { width:16px; height:16px; }
#cockpit-app .sh-empty svg{ width:32px; height:32px; }

/* Sidebar — Notion shell */
.sh-side{
  background:var(--sh-side); border-right:1px solid var(--sh-border);
  display:flex; flex-direction:column;
  padding:14px 0 8px; overflow-y:auto;
}
.sh-side-brand{
  display:flex; align-items:center; gap:10px;
  padding:0 14px 14px; font-weight:600; font-size:15px; color:var(--sh-ink);
}
.sh-side-brand .sh-logo{
  width:24px; height:24px; border-radius:6px;
  background:linear-gradient(135deg,#2383e2,#6940a5);
  display:flex; align-items:center; justify-content:center;
  font-weight:700; color:#fff; font-size:13px;
}
.sh-side-brand .sh-brand-sub{ font-size:11px; color:var(--sh-ink-faint); font-weight:500; }
.sh-side-section{
  font-size:11px; text-transform:uppercase; letter-spacing:.6px;
  color:var(--sh-ink-faint); padding:14px 14px 4px; font-weight:600;
}
.sh-nav-item{
  display:flex; align-items:center; gap:10px;
  padding:5px 14px; cursor:pointer; font-size:14px;
  color:var(--sh-ink); user-select:none;
  border-radius:0; line-height:1.4; min-height:30px;
  transition:background .08s;
}
.sh-nav-item:hover{ background:var(--sh-side-hover); }
.sh-nav-item.active{ background:var(--sh-side-hover); font-weight:500; }
.sh-nav-item svg{ width:16px; height:16px; flex-shrink:0; color:var(--sh-ink-soft); stroke-width:1.6; }
.sh-nav-item.active svg{ color:var(--sh-ink); }
.sh-nav-item .sh-badge{
  margin-left:auto; min-width:18px; height:18px; padding:0 6px;
  border-radius:9px; background:var(--sh-accent); color:#fff;
  font-size:11px; font-weight:600; display:flex; align-items:center; justify-content:center;
}
.sh-side-foot{
  margin-top:auto; padding:10px 14px; font-size:13px; color:var(--sh-ink-soft);
  border-top:1px solid var(--sh-border);
}
.sh-side-foot .sh-back{
  display:flex; align-items:center; gap:8px; cursor:pointer;
  padding:6px 0; color:var(--sh-ink-soft);
}
.sh-side-foot .sh-back:hover{ color:var(--sh-accent); }

/* Main content */
.sh-main{ overflow-y:auto; background:var(--sh-canvas); }
.sh-topbar{
  display:flex; align-items:center; gap:12px;
  padding:12px 40px; border-bottom:1px solid var(--sh-border);
  position:sticky; top:0; background:var(--sh-canvas); z-index:10;
  font-size:13px; color:var(--sh-ink-soft);
}
.sh-topbar .sh-crumb-page{ color:var(--sh-ink); font-weight:500; }
.sh-topbar .sh-spacer{ flex:1; }
.sh-topbar .sh-user{
  display:flex; align-items:center; gap:8px; color:var(--sh-ink-soft); font-size:13px;
}
.sh-topbar .sh-avatar{
  width:24px; height:24px; border-radius:50%;
  background:linear-gradient(135deg,#2383e2,#6940a5);
  display:flex; align-items:center; justify-content:center;
  color:#fff; font-weight:600; font-size:11px;
}
.sh-content{ padding:32px 48px 64px; max-width:1200px; }
.sh-content.sh-wide{ max-width:none; }
.sh-h1{ font-size:32px; font-weight:700; color:var(--sh-ink); margin:0 0 4px; line-height:1.2; letter-spacing:-.01em; }
.sh-sub{ color:var(--sh-ink-soft); font-size:14px; margin:0 0 28px; }

/* Stat tiles — minimal Notion */
.sh-stats{ display:grid; grid-template-columns:repeat(4,1fr); gap:1px; background:var(--sh-border); border:1px solid var(--sh-border); border-radius:6px; overflow:hidden; margin-bottom:32px; }
.sh-stat{ background:var(--sh-canvas); padding:18px 20px; cursor:pointer; transition:background .08s; }
.sh-stat:hover{ background:var(--sh-soft); }
.sh-stat-label{ font-size:12px; color:var(--sh-ink-soft); font-weight:500; margin-bottom:6px; display:flex; align-items:center; gap:6px; }
.sh-stat-label svg{ width:14px; height:14px; color:var(--sh-ink-faint); stroke-width:1.6; }
.sh-stat-value{ font-size:28px; font-weight:600; color:var(--sh-ink); line-height:1; }
.sh-stat-trend{ font-size:12px; margin-top:6px; color:var(--sh-green); font-weight:500; }
.sh-stat-trend.down{ color:var(--sh-red); }

/* Section headers */
.sh-sec-head{ display:flex; align-items:center; margin:24px 0 12px; gap:10px; }
.sh-sec-head h3{ margin:0; font-size:13px; font-weight:600; color:var(--sh-ink-soft); text-transform:uppercase; letter-spacing:.5px; }
.sh-sec-head .sh-link{ margin-left:auto; font-size:13px; color:var(--sh-accent); text-decoration:none; cursor:pointer; }
.sh-sec-head .sh-link:hover{ text-decoration:underline; }
.sh-sec-head .sh-pill{ background:var(--sh-soft); color:var(--sh-ink-soft); padding:1px 8px; border-radius:10px; font-size:11px; font-weight:600; }

/* Generic card */
.sh-card{ background:var(--sh-canvas); border:1px solid var(--sh-border); border-radius:6px; overflow:hidden; }
.sh-card-pad{ padding:18px 20px; }
.sh-grid-2{ display:grid; grid-template-columns:1fr 1fr; gap:16px; }

/* Empty state */
.sh-empty{ text-align:center; padding:48px 16px; color:var(--sh-ink-soft); }
.sh-empty svg{ width:36px; height:36px; opacity:.35; margin-bottom:8px; stroke-width:1.4; color:var(--sh-ink-soft); }
.sh-empty .sh-empty-title{ font-weight:500; color:var(--sh-ink); margin-bottom:4px; font-size:14px; }
.sh-empty .sh-empty-msg{ font-size:13px; }

/* List rows — Notion-style row hover */
.sh-row{
  display:flex; align-items:center; gap:12px; padding:8px 12px;
  border-radius:4px; cursor:pointer; transition:background .08s;
  font-size:14px; min-height:44px;
}
.sh-row:hover{ background:var(--sh-row-hover); }
.sh-row.active{ background:var(--sh-accent-soft); }
.sh-avatar{
  width:28px; height:28px; border-radius:6px; flex-shrink:0;
  background:var(--sh-accent-soft); color:var(--sh-accent);
  display:flex; align-items:center; justify-content:center;
  font-weight:600; font-size:12px;
}
.sh-row-main{ flex:1; min-width:0; }
.sh-row-title{ font-weight:500; color:var(--sh-ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sh-row-sub{ font-size:12px; color:var(--sh-ink-soft); margin-top:2px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sh-row-meta{ font-size:12px; color:var(--sh-ink-faint); flex-shrink:0; }

/* Tags */
.sh-tag{ padding:2px 8px; border-radius:3px; font-size:12px; font-weight:500; display:inline-block; }
.sh-tag-best{ background:var(--sh-green-bg); color:var(--sh-green); }
.sh-tag-pending{ background:var(--sh-orange-bg); color:var(--sh-orange); }
.sh-tag-new{ background:var(--sh-accent-soft); color:var(--sh-accent); }
.sh-tag-verified{ background:var(--sh-green-bg); color:var(--sh-green); }
.sh-tag-soft{ background:var(--sh-soft); color:var(--sh-ink-soft); }

/* Buttons */
.sh-btn{ padding:6px 12px; border-radius:4px; font-size:14px; font-weight:500;
  border:1px solid transparent; cursor:pointer; display:inline-flex; align-items:center; gap:6px;
  text-decoration:none; transition:background .08s,border-color .08s; line-height:1.4;
  background:transparent; color:var(--sh-ink); }
.sh-btn:hover{ background:var(--sh-side-hover); }
.sh-btn-primary{ background:var(--sh-accent); color:#fff; }
.sh-btn-primary:hover{ background:var(--sh-accent-hover); }
.sh-btn-ghost{ border-color:var(--sh-border); color:var(--sh-ink); background:var(--sh-canvas); }
.sh-btn-ghost:hover{ background:var(--sh-soft); }
.sh-btn svg{ width:14px; height:14px; stroke-width:1.7; }

/* Filter chips */
.sh-chips{ display:flex; gap:6px; flex-wrap:wrap; margin-bottom:12px; }
.sh-chip{ padding:4px 12px; border-radius:14px; font-size:13px; cursor:pointer;
  background:var(--sh-soft); color:var(--sh-ink-soft); border:1px solid transparent; }
.sh-chip:hover{ background:var(--sh-side-hover); }
.sh-chip.active{ background:var(--sh-ink); color:#fff; }

/* Inputs */
.sh-input{ width:100%; border:1px solid var(--sh-border); border-radius:4px;
  padding:7px 10px; font-size:14px; font-family:inherit; color:var(--sh-ink);
  background:var(--sh-canvas); }
.sh-input:focus{ outline:none; border-color:var(--sh-accent); box-shadow:0 0 0 2px var(--sh-accent-soft); }

/* Spotlight rail */
.sh-spotlight-rail{ display:flex; gap:14px; overflow-x:auto; padding-bottom:4px; margin:0 -4px; scrollbar-width:thin; }
.sh-spotlight-rail .sh-empty{ padding:16px 24px; }
.sh-spotlight-card{
  flex:0 0 240px; background:var(--sh-canvas);
  border:1px solid var(--sh-border); border-radius:8px; padding:14px;
  cursor:pointer; transition:border-color .12s,transform .12s;
}
.sh-spotlight-card:hover{ border-color:var(--sh-accent); transform:translateY(-1px); }
.sh-spotlight-card .sh-sp-name{ font-weight:600; color:var(--sh-ink); font-size:14px; margin-bottom:4px; line-height:1.3; }
.sh-spotlight-card .sh-sp-loc{ font-size:12px; color:var(--sh-ink-soft); margin-bottom:8px; }
.sh-spotlight-card .sh-sp-tags{ display:flex; gap:4px; flex-wrap:wrap; }

/* Inbox split-pane (Multi-Quote — F12) */
.sh-split{ display:grid; grid-template-columns:380px 1fr; gap:1px; background:var(--sh-border);
  border:1px solid var(--sh-border); border-radius:6px; overflow:hidden; height:calc(100vh - 180px); }
.sh-split-side{ background:var(--sh-canvas); overflow-y:auto; padding:8px; }
.sh-split-main{ background:var(--sh-canvas); overflow-y:auto; padding:24px 32px; }
.sh-quote-row{
  padding:12px; border-radius:4px; cursor:pointer; margin-bottom:2px;
  border-left:2px solid transparent;
}
.sh-quote-row:hover{ background:var(--sh-row-hover); }
.sh-quote-row.active{ background:var(--sh-accent-soft); border-left-color:var(--sh-accent); }
.sh-quote-top{ display:flex; align-items:baseline; gap:8px; font-size:13px; color:var(--sh-ink-soft); margin-bottom:4px; }
.sh-quote-name{ font-weight:600; color:var(--sh-ink); font-size:14px; }
.sh-quote-prev{ font-size:13px; color:var(--sh-ink-soft); overflow:hidden; text-overflow:ellipsis; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }

/* Normalized quote table */
.sh-quote-fields{ display:grid; grid-template-columns:140px 1fr; gap:0; background:var(--sh-border); border:1px solid var(--sh-border); border-radius:6px; overflow:hidden; }
.sh-quote-fields .sh-qf-k,.sh-quote-fields .sh-qf-v{ background:var(--sh-canvas); padding:10px 14px; font-size:14px; }
.sh-quote-fields .sh-qf-k{ color:var(--sh-ink-soft); font-weight:500; }
.sh-quote-fields .sh-qf-v{ color:var(--sh-ink); }

/* Chat enterprise (F4) — toolbar, filters, tags, priority, bulk actions */
.sh-ch-toolbar{ display:flex; flex-direction:column; gap:10px; margin-bottom:14px; }
.sh-ch-stats{ display:flex; gap:8px; flex-wrap:wrap; }
.sh-ch-stat{ background:var(--sh-canvas); border:1px solid var(--sh-border); padding:8px 12px; border-radius:6px; min-width:90px; }
.sh-ch-stat-lab{ font-size:10px; text-transform:uppercase; letter-spacing:.4px; color:var(--sh-ink-faint); font-weight:600; }
.sh-ch-stat-val{ font-size:18px; font-weight:600; color:var(--sh-ink); margin-top:2px; font-variant-numeric:tabular-nums; }
.sh-ch-stat-val.unread{ color:var(--sh-accent); }
.sh-ch-stat-val.urgent{ color:#c44; }
.sh-ch-bar{ display:flex; gap:8px; align-items:center; flex-wrap:wrap; }
.sh-ch-search{ flex:1; min-width:200px; position:relative; }
.sh-ch-search input{ width:100%; padding:8px 12px 8px 32px; border:1px solid var(--sh-border); border-radius:6px; font-size:13px; outline:none; box-sizing:border-box; font-family:inherit; }
.sh-ch-search input:focus{ border-color:var(--sh-accent); }
.sh-ch-search-icon{ position:absolute; left:10px; top:50%; transform:translateY(-50%); font-size:12px; opacity:.5; pointer-events:none; }
.sh-ch-sort-btn{ padding:8px 12px; border:1px solid var(--sh-border); border-radius:6px; background:var(--sh-canvas); cursor:pointer; font-size:12px; color:var(--sh-ink); display:inline-flex; align-items:center; gap:4px; font-family:inherit; }
.sh-ch-sort-btn:hover{ background:var(--sh-soft); }
.sh-ch-filters{ display:flex; gap:6px; flex-wrap:wrap; align-items:center; }
.sh-ch-fchip{ padding:5px 12px; border:1px solid var(--sh-border); border-radius:14px; background:var(--sh-canvas); cursor:pointer; font-size:12px; color:var(--sh-ink-soft); user-select:none; transition:all .1s; }
.sh-ch-fchip:hover{ background:var(--sh-soft); }
.sh-ch-fchip.on{ background:var(--sh-accent); color:#fff; border-color:var(--sh-accent); }
.sh-ch-fchip .ct{ display:inline-block; margin-left:4px; padding:0 5px; border-radius:8px; background:rgba(0,0,0,.08); font-size:10px; font-weight:600; }
.sh-ch-fchip.on .ct{ background:rgba(255,255,255,.25); }
.sh-ch-row{ display:flex; align-items:center; gap:10px; padding:10px 12px; border-radius:6px; cursor:pointer; transition:background .08s; border:1px solid transparent; position:relative; }
.sh-ch-row:hover{ background:var(--sh-row-hover); }
.sh-ch-row.starred{ background:linear-gradient(90deg, #fff7e6 0%, transparent 50%); }
.sh-ch-row.archived{ opacity:.55; }
.sh-ch-row.urgent::before{ content:''; position:absolute; left:0; top:8px; bottom:8px; width:3px; background:#c44; border-radius:2px; }
.sh-ch-cb{ width:16px; height:16px; cursor:pointer; flex-shrink:0; accent-color:var(--sh-accent); }
.sh-ch-star{ background:none; border:none; cursor:pointer; padding:2px 4px; font-size:16px; line-height:1; color:#d8d6d2; flex-shrink:0; }
.sh-ch-star.on{ color:#f5b800; }
.sh-ch-star:hover{ color:#f5b800; }
.sh-ch-main{ flex:1; min-width:0; }
.sh-ch-title-row{ display:flex; align-items:center; gap:6px; }
.sh-ch-title{ font-weight:500; color:var(--sh-ink); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.sh-ch-prio{ display:inline-block; padding:1px 6px; border-radius:3px; font-size:9px; font-weight:700; letter-spacing:.4px; text-transform:uppercase; flex-shrink:0; }
.sh-ch-prio-high{ background:#fde7e7; color:#c44; }
.sh-ch-prio-med{ background:#fff5e0; color:#a86400; }
.sh-ch-prio-low{ background:var(--sh-soft); color:var(--sh-ink-faint); }
.sh-ch-status-tag{ display:inline-block; padding:1px 6px; border-radius:3px; font-size:9px; font-weight:600; letter-spacing:.3px; flex-shrink:0; }
.sh-ch-status-await-you{ background:#fde7e7; color:#c44; }
.sh-ch-status-await-them{ background:var(--sh-soft); color:var(--sh-ink-faint); }
.sh-ch-status-replied{ background:var(--sh-green-bg); color:var(--sh-green); }
.sh-ch-sub{ font-size:12px; color:var(--sh-ink-soft); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top:2px; display:flex; gap:6px; align-items:center; }
.sh-ch-tags{ display:inline-flex; gap:4px; flex-wrap:wrap; }
.sh-ch-tag{ display:inline-flex; align-items:center; gap:3px; padding:1px 6px; border-radius:10px; font-size:10px; font-weight:500; background:var(--sh-soft); color:var(--sh-ink-soft); }
.sh-ch-tag-hot{ background:#fde7e7; color:#c44; }
.sh-ch-tag-followup{ background:#fff5e0; color:#a86400; }
.sh-ch-tag-negotiating{ background:var(--sh-accent-soft); color:var(--sh-accent); }
.sh-ch-tag-closed{ background:var(--sh-green-bg); color:var(--sh-green); }
.sh-ch-tag-x{ cursor:pointer; opacity:.5; font-weight:600; }
.sh-ch-tag-x:hover{ opacity:1; }
.sh-ch-meta{ font-size:11px; color:var(--sh-ink-faint); flex-shrink:0; text-align:right; }
.sh-ch-meta-unread{ display:inline-block; min-width:18px; padding:1px 6px; border-radius:9px; background:var(--sh-accent); color:#fff; font-size:10px; font-weight:600; margin-left:4px; }
.sh-ch-actions{ display:flex; gap:4px; align-items:center; flex-shrink:0; }
.sh-ch-actions .sh-lc-iconbtn{ font-size:11px; }
.sh-ch-bulkbar{ display:flex; gap:8px; align-items:center; padding:8px 12px; background:var(--sh-accent-soft); border:1px solid var(--sh-accent); border-radius:6px; margin-bottom:8px; font-size:12px; color:var(--sh-ink); }
.sh-ch-bulkbar b{ color:var(--sh-accent); font-weight:600; }
.sh-ch-bulkbtn{ padding:4px 10px; border:1px solid var(--sh-border); background:var(--sh-canvas); border-radius:4px; cursor:pointer; font-size:11px; color:var(--sh-ink); font-family:inherit; }
.sh-ch-bulkbtn:hover{ background:#fff; }
.sh-ch-bulkbtn.danger{ color:#c44; border-color:#f0c0c0; }
.sh-ch-empty-mini{ padding:30px 20px; text-align:center; color:var(--sh-ink-faint); font-size:13px; }
.sh-ch-tagmenu{ position:fixed; min-width:180px; background:#fff; border:1px solid var(--sh-border); border-radius:6px; box-shadow:0 8px 32px rgba(0,0,0,.15); z-index:9500; padding:6px; }
.sh-ch-tagmenu-item{ padding:6px 10px; cursor:pointer; font-size:12px; border-radius:4px; display:flex; align-items:center; gap:6px; }
.sh-ch-tagmenu-item:hover{ background:var(--sh-soft); }
.sh-ch-tagmenu-sep{ height:1px; background:var(--sh-border); margin:4px 0; }

/* Landed-Cost table (F1) — compact fit-without-scroll layout */
.sh-lc-table{ width:100%; border-collapse:separate; border-spacing:0; border:1px solid var(--sh-border); border-radius:6px; overflow:hidden; font-size:12px; table-layout:fixed; }
.sh-lc-table th{ text-align:left; padding:7px 6px; font-weight:600; font-size:10px; color:var(--sh-ink-soft); background:var(--sh-soft); border-bottom:1px solid var(--sh-border); text-transform:uppercase; letter-spacing:.3px; }
.sh-lc-table td{ padding:6px 6px; border-bottom:1px solid var(--sh-border-soft); vertical-align:middle; overflow:hidden; }
.sh-lc-table tr:last-child td{ border-bottom:none; }
.sh-lc-table tr.best td{ background:var(--sh-green-bg); }
.sh-lc-input{ width:100%; min-width:0; border:1px solid transparent; border-radius:3px; padding:4px 6px; font-size:12px; font-family:inherit; background:transparent; box-sizing:border-box; }
.sh-lc-input:hover{ border-color:var(--sh-border); background:var(--sh-canvas); }
.sh-lc-input:focus{ outline:none; border-color:var(--sh-accent); background:var(--sh-canvas); }
.sh-lc-table th:nth-child(1),.sh-lc-table td:nth-child(1){ width:11%; }
.sh-lc-table th:nth-child(2),.sh-lc-table td:nth-child(2){ width:11%; }
.sh-lc-table th:nth-child(3),.sh-lc-table td:nth-child(3){ width:5%; }
.sh-lc-table th:nth-child(4),.sh-lc-table td:nth-child(4){ width:6%; }
.sh-lc-table th:nth-child(5),.sh-lc-table td:nth-child(5){ width:9%; }
.sh-lc-table th:nth-child(6),.sh-lc-table td:nth-child(6){ width:6%; text-align:center; white-space:nowrap; font-variant-numeric:tabular-nums; color:var(--sh-ink-soft); }
.sh-lc-table th:nth-child(7),.sh-lc-table td:nth-child(7){ width:9%; }
.sh-lc-table th:nth-child(8),.sh-lc-table td:nth-child(8){ width:5%; white-space:nowrap; }
.sh-lc-table th:nth-child(9),.sh-lc-table td:nth-child(9){ width:5%; white-space:nowrap; }
.sh-lc-table th:nth-child(10),.sh-lc-table td:nth-child(10){ width:9%; white-space:nowrap; }
.sh-lc-table th:nth-child(11),.sh-lc-table td:nth-child(11){ width:9%; white-space:nowrap; }
.sh-lc-table th:nth-child(12),.sh-lc-table td:nth-child(12){ width:6%; white-space:nowrap; }
.sh-lc-table th:nth-child(13),.sh-lc-table td:nth-child(13){ width:7%; white-space:nowrap; }
.sh-lc-table th:nth-child(14),.sh-lc-table td:nth-child(14){ width:5%; }
.sh-lc-wrap{ overflow:visible; margin-bottom:6px; border:1px solid var(--sh-border); border-radius:6px; background:var(--sh-canvas); }
.sh-lc-wrap .sh-lc-table{ border:none; border-radius:0; margin:0; }
.sh-lc-table tr.sh-lc-primary.worst td{ background:#fff7f5; }
.sh-lc-num{ font-variant-numeric:tabular-nums; font-size:11px; }
.sh-lc-total{ font-weight:600; font-size:12px; }
.sh-lc-pair{ display:flex; gap:3px; align-items:center; }
.sh-lc-pair .sh-lc-cd{ flex:0 0 52px; font-size:10px; padding:4px 14px 4px 6px; }
.sh-lc-pair input{ flex:1; min-width:40px; }
.sh-lc-tag{ display:inline-block; padding:1px 4px; border-radius:3px; font-size:9px; font-weight:600; letter-spacing:.3px; margin-left:3px; vertical-align:middle; }
.sh-lc-tag-auto{ background:var(--sh-soft); color:var(--sh-ink-faint); }
.sh-lc-tag-manual{ background:#fff5e0; color:#a86400; }
.sh-lc-delta{ display:inline-block; color:#c44; font-size:10px; margin-left:2px; font-weight:500; }
.sh-lc-actions{ white-space:nowrap; text-align:right; padding-right:4px !important; }
.sh-lc-iconbtn{ width:22px; height:22px; padding:0; border:1px solid var(--sh-border); background:var(--sh-canvas); border-radius:3px; cursor:pointer; font-size:12px; color:var(--sh-ink-soft); margin-left:1px; }
.sh-lc-iconbtn:hover{ background:var(--sh-soft); color:var(--sh-ink); }
/* Custom in-app dropdown — replaces native <select> for full styling control */
.sh-lc-cd{ position:relative; width:100%; border:1px solid transparent; border-radius:3px; padding:4px 16px 4px 6px; font-size:12px; cursor:pointer; background:transparent; box-sizing:border-box; user-select:none; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; line-height:18px; color:var(--sh-ink); }
.sh-lc-cd:hover{ border-color:var(--sh-border); background:var(--sh-canvas); }
.sh-lc-cd::after{ content:'▾'; position:absolute; right:4px; top:50%; transform:translateY(-50%); font-size:9px; color:var(--sh-ink-faint); pointer-events:none; }
.sh-lc-cd.open{ border-color:var(--sh-accent); background:var(--sh-canvas); }
.sh-lc-cd-pop{ position:fixed; min-width:180px; max-width:260px; background:#fff; border:1px solid var(--sh-border); border-radius:6px; box-shadow:0 8px 32px rgba(0,0,0,.18); z-index:9500; display:flex; flex-direction:column; overflow:hidden; }
.sh-lc-cd-search{ width:100%; border:none; border-bottom:1px solid var(--sh-border); padding:8px 10px; font-size:12px; outline:none; box-sizing:border-box; font-family:inherit; }
.sh-lc-cd-list{ overflow-y:auto; max-height:240px; flex:1; }
.sh-lc-cd-item{ padding:7px 10px; cursor:pointer; font-size:12px; color:var(--sh-ink); white-space:nowrap; }
.sh-lc-cd-item:hover, .sh-lc-cd-item.kbd{ background:var(--sh-soft); }
.sh-lc-cd-item.sel{ background:var(--sh-accent); color:#fff; }
.sh-lc-cd-empty{ padding:14px 10px; font-size:11px; color:var(--sh-ink-faint); text-align:center; }
.sh-lc-detail td{ background:#fafaf9 !important; padding:14px 16px !important; border-bottom:1px solid var(--sh-border) !important; }
.sh-lc-detail-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(180px, 1fr)); gap:12px 16px; }
.sh-lc-detail-grid label{ display:flex; flex-direction:column; gap:4px; font-size:12px; color:var(--sh-ink-soft); }
.sh-lc-detail-grid label > span{ font-weight:500; }
.sh-lc-detail-grid label em{ color:var(--sh-ink-faint); font-style:normal; font-size:11px; font-weight:400; }
.sh-lc-detail-grid label.sh-lc-notes{ grid-column:1 / -1; }
.sh-lc-detail-grid textarea.sh-lc-input{ resize:vertical; min-height:42px; }
.sh-lc-breakdown{ margin-top:12px; padding:10px 12px; background:var(--sh-canvas); border:1px solid var(--sh-border); border-radius:5px; font-size:12px; line-height:1.6; color:var(--sh-ink-soft); }
.sh-lc-breakdown b{ color:var(--sh-ink); font-weight:600; }
.sh-lc-head{ display:flex; align-items:flex-end; justify-content:space-between; gap:16px; flex-wrap:wrap; margin-bottom:18px; }
.sh-lc-head h1{ margin-bottom:4px; }
.sh-lc-head .sh-sub{ margin:0; }
.sh-lc-toolbar{ display:flex; gap:6px; flex-wrap:wrap; }
.sh-lc-toolbar .sh-btn{ font-size:12px; padding:6px 10px; }
.sh-lc-summary{ margin-top:18px; background:var(--sh-canvas); border:1px solid var(--sh-border); border-radius:6px; overflow:hidden; }
.sh-lc-summary-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(140px, 1fr)); }
.sh-lc-summary-grid > div{ padding:14px 18px; border-right:1px solid var(--sh-border); border-bottom:1px solid var(--sh-border); }
.sh-lc-summary-grid > div:last-child{ border-right:none; }
.sh-lc-sum-lab{ font-size:11px; color:var(--sh-ink-soft); text-transform:uppercase; letter-spacing:.4px; margin-bottom:4px; font-weight:500; }
.sh-lc-sum-val{ font-size:18px; font-weight:600; color:var(--sh-ink); font-variant-numeric:tabular-nums; }
.sh-lc-savings{ color:#1a7f4f; }
.sh-lc-howto{ margin-top:18px; padding:14px 18px; background:var(--sh-soft); border-radius:6px; font-size:12px; color:var(--sh-ink-soft); line-height:1.7; }
.sh-lc-howto b{ color:var(--sh-ink); }
.sh-lc-howto ul{ margin:8px 0 0 0; padding-left:20px; }
.sh-lc-howto li{ margin-bottom:6px; }

/* Calls — enterprise list */
.sh-call-row{
        display:grid; grid-template-columns:36px minmax(260px,1fr) 72px 96px minmax(360px,auto);
  align-items:center; gap:14px; padding:12px 16px;
  border-bottom:1px solid var(--sh-border-soft); transition:background .08s;
}
.sh-call-row:hover{ background:var(--sh-row-hover); }
.sh-call-row:last-child{ border-bottom:none; }
.sh-call-dir{ width:24px; height:24px; border-radius:50%; background:var(--sh-soft); display:flex; align-items:center; justify-content:center; }
.sh-call-dir.in{ color:var(--sh-green); background:var(--sh-green-bg); }
.sh-call-dir.out{ color:var(--sh-accent); background:var(--sh-accent-soft); }
.sh-call-dir.miss{ color:var(--sh-red); background:var(--sh-red-bg); }
.sh-call-dir svg{ width:13px; height:13px; stroke-width:2; }
.sh-call-name{ font-weight:500; font-size:14px; color:var(--sh-ink); }
.sh-call-meta{ font-size:12px; color:var(--sh-ink-soft); }
.sh-call-time{ font-size:12px; color:var(--sh-ink-faint); white-space:nowrap; }
.sh-call-dur{ font-size:12px; color:var(--sh-ink-soft); font-variant-numeric:tabular-nums; }
.sh-call-main{ min-width:0; }
.sh-call-actions{display:flex;justify-content:flex-end;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.sh-call-actions .sh-btn{min-height:34px;white-space:nowrap}
.sh-call-timeline{ display:flex; flex-wrap:wrap; gap:8px; margin-top:8px; }
.sh-call-step{ display:inline-flex; align-items:center; gap:5px; font-size:11px; color:var(--sh-ink-soft); white-space:nowrap; }
.sh-call-step i{ width:7px; height:7px; border-radius:50%; background:var(--sh-border); box-shadow:0 0 0 3px var(--sh-soft); }
.sh-call-step.done i{ background:var(--sh-green); }
.sh-call-step b{ font-weight:600; color:var(--sh-ink); }
.sh-call-step em{ font-style:normal; color:var(--sh-ink-faint); }
.sh-tl-list{ margin-top:16px; display:flex; flex-direction:column; gap:0; }
.sh-tl-row{ display:grid; grid-template-columns:18px 1fr; gap:12px; padding:12px 0; border-bottom:1px solid var(--sh-border-soft); }
.sh-tl-row > span{ width:10px; height:10px; border-radius:50%; background:var(--sh-accent); margin-top:4px; box-shadow:0 0 0 4px var(--sh-accent-soft); }
.sh-tl-row strong{ display:block; font-size:14px; color:var(--sh-ink); }
.sh-tl-row p{ margin:3px 0 0; font-size:12px; color:var(--sh-ink-soft); line-height:1.45; }
.sh-tl-row em{ display:block; margin-top:4px; font-style:normal; font-size:11px; color:var(--sh-ink-faint); }
@media(max-width:1180px){ .sh-call-row{ grid-template-columns:32px minmax(220px,1fr) 70px 90px; } .sh-call-actions{grid-column:2 / -1;justify-content:flex-start} }
@media(max-width:900px){ .sh-call-row{ grid-template-columns:32px 1fr; align-items:flex-start; } .sh-call-dur,.sh-call-time,.sh-call-actions{ grid-column:2 / -1; } }

/* Sourcing Hub settings */
.sh-settings-grid{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(320px,.9fr);gap:16px;align-items:start}
.sh-settings-section{display:flex;flex-direction:column;gap:14px}
.sh-field-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}
.sh-field{display:flex;flex-direction:column;gap:5px;font-size:12px;color:var(--sh-ink-soft);font-weight:650}
.sh-field.full{grid-column:1 / -1}
.sh-field input,.sh-field select,.sh-field textarea{width:100%;box-sizing:border-box;border:1px solid #d9e2f0;border-radius:8px;padding:9px 10px;font:inherit;font-size:13px;color:#101828;background:#fff;outline:none}
.sh-field textarea{min-height:74px;resize:vertical;line-height:1.45}
.sh-field input:focus,.sh-field select:focus,.sh-field textarea:focus{border-color:#6366f1;box-shadow:0 0 0 3px rgba(99,102,241,.12)}
.sh-settings-msg{display:none;border-radius:8px;padding:9px 11px;font-size:12px;font-weight:650}
.sh-settings-msg.ok{display:block;background:#ecfdf5;color:#047857;border:1px solid #a7f3d0}
.sh-settings-msg.err{display:block;background:#fef2f2;color:#b42318;border:1px solid #fecaca}
.sh-interest-toolbar{display:grid;grid-template-columns:minmax(150px,220px) minmax(0,1fr);gap:10px;margin-bottom:10px}
.sh-interest-list{max-height:260px;overflow:auto;border:1px solid #d9e2f0;border-radius:8px;background:#fff}
.sh-interest-row{display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid #edf2fa;font-size:12px;cursor:pointer}
.sh-interest-row:last-child{border-bottom:0}
.sh-interest-row:hover{background:#f5f8ff}
.sh-interest-row input{accent-color:#6366f1}
.sh-interest-row span{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sh-interest-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.sh-interest-tag{display:inline-flex;align-items:center;gap:5px;padding:4px 8px;border-radius:999px;background:#eef2ff;color:#3730a3;font-size:11px;font-weight:700}
.sh-push-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 0;border-bottom:1px solid #edf2fa}
.sh-push-row:last-child{border-bottom:0}
.sh-push-row b{display:block;font-size:13px;color:#101828}
.sh-push-row span{display:block;font-size:11px;color:#667085;margin-top:2px}
@media(max-width:980px){.sh-settings-grid{grid-template-columns:1fr}.sh-field-grid{grid-template-columns:1fr}.sh-interest-toolbar{grid-template-columns:1fr}}

/* Modal — for New Call listing search */
.sh-modal{ position:fixed; inset:0; background:rgba(15,15,15,.4); z-index:9500;
  display:none; align-items:flex-start; justify-content:center; padding-top:80px; }
.sh-modal.open{ display:flex; }
.sh-modal-card{ width:560px; max-width:calc(100vw - 32px); background:var(--sh-canvas);
  border-radius:8px; box-shadow:0 8px 32px rgba(15,15,15,.18); overflow:hidden; }
.sh-modal-head{ padding:14px 18px; border-bottom:1px solid var(--sh-border); display:flex; align-items:center; gap:10px; font-weight:600; }
.sh-modal-head svg{ width:18px; height:18px; flex-shrink:0; }
.sh-modal-head .sh-x{ margin-left:auto; cursor:pointer; color:var(--sh-ink-soft); padding:4px; border-radius:4px; display:flex; }
.sh-modal-head .sh-x svg{ width:16px; height:16px; }
.sh-modal-head .sh-x:hover{ background:var(--sh-soft); }
.sh-modal-body{ padding:14px 18px; }
.sh-modal-list{ max-height:360px; overflow-y:auto; margin-top:8px; }

/* Skeleton */
.sh-skel{ background:linear-gradient(90deg,var(--sh-soft) 0%,var(--sh-side-hover) 50%,var(--sh-soft) 100%);
  background-size:200% 100%; animation:shSkel 1.4s infinite; border-radius:4px; height:14px; }
@keyframes shSkel{ 0%{background-position:200% 0} 100%{background-position:-200% 0} }

/* Kanban (Suppliers CRM) */
.sh-kanban{ display:grid; grid-template-columns:repeat(4,1fr); gap:12px; }
.sh-kan-col{ background:var(--sh-soft); border-radius:6px; padding:10px; min-height:240px; }
.sh-kan-head{ display:flex; align-items:center; gap:8px; font-size:13px; font-weight:600; color:var(--sh-ink); margin-bottom:10px; padding:0 4px; }
.sh-kan-count{ background:var(--sh-canvas); padding:1px 8px; border-radius:10px; font-size:11px; color:var(--sh-ink-soft); border:1px solid var(--sh-border); }
.sh-kan-card{ background:var(--sh-canvas); border:1px solid var(--sh-border); border-radius:5px; padding:10px 12px; margin-bottom:6px; cursor:pointer; transition:border-color .12s; }
.sh-kan-card:hover{ border-color:var(--sh-accent); }
.sh-kan-name{ font-size:14px; font-weight:500; color:var(--sh-ink); }
.sh-kan-meta{ font-size:12px; color:var(--sh-ink-soft); margin-top:3px; }

/* Chat panel must float above Sourcing Hub overlay (cockpit-app z:9000) */
body.cockpit-mode .chat-panel,
body.cockpit-mode .chat-fab,
body.cockpit-mode .chat-list-overlay { z-index: 9100 !important; }

/* Automail premium refresh - brand-aligned, behavior-preserving Sourcing Hub skin */
body.cockpit-mode.cockpit-v2{background:#f6f8ff;}
#cockpit-app{
    --sh-canvas:#f6f8ff;
    --sh-panel:#ffffff;
    --sh-side:#0a0f1e;
    --sh-side-hover:rgba(255,255,255,.08);
    --sh-border:#dfe6f3;
    --sh-border-soft:#edf2fa;
    --sh-ink:#101828;
    --sh-ink-soft:#667085;
    --sh-ink-faint:#98a2b3;
    --sh-accent:#6366f1;
    --sh-accent-hover:#4f46e5;
    --sh-accent-soft:#eef2ff;
    --sh-soft:#f2f5fb;
    --sh-row-hover:#f5f8ff;
    --sh-green:#059669;--sh-green-bg:#ecfdf5;
    --sh-orange:#b54708;--sh-orange-bg:#fff7ed;
    --sh-red:#b42318;--sh-red-bg:#fef3f2;
    --sh-purple:#6941c6;--sh-purple-bg:#f4f3ff;
    grid-template-columns:280px minmax(0,1fr);
    background:#f6f8fb;
    letter-spacing:0;
}
.sh-side{background:#0f172a;border-right:1px solid rgba(255,255,255,.08);box-shadow:18px 0 44px rgba(10,15,30,.14);padding:18px 12px 12px;color:#e2e8f0;}
.sh-side-brand{padding:0 6px 18px;margin-bottom:4px;color:#f8fafc;gap:12px;}
.sh-side-brand .sh-logo{width:40px;height:40px;border-radius:8px;background:#111827;border:1px solid rgba(255,255,255,.14);box-shadow:0 16px 34px rgba(0,0,0,.24);overflow:hidden;}
.sh-side-brand .sh-logo img{width:100%;height:100%;object-fit:cover;display:block;}
.sh-wordmark{font-weight:900;font-size:20px;line-height:1;letter-spacing:0;color:#f8fafc;background:none;-webkit-text-fill-color:currentColor;}
.sh-wordmark span:last-child{color:#a5b4fc;}
.sh-side-brand .sh-brand-sub{font-size:11px;color:#94a3b8;letter-spacing:.04em;text-transform:uppercase;margin-top:4px;}
.sh-side-section{padding:16px 8px 6px;color:#94a3b8;font-size:10px;letter-spacing:.12em;}
.sh-nav-item{color:#cbd5e1;border-radius:8px;padding:9px 10px;min-height:38px;margin:1px 0;font-size:13px;transition:background .16s,color .16s,transform .16s;}
.sh-nav-item:hover{background:rgba(255,255,255,.07);color:#fff;transform:translateX(2px);}
.sh-nav-item.active{background:#1e293b;color:#fff;font-weight:750;box-shadow:inset 3px 0 0 #10b981;}
.sh-nav-item svg{color:#94a3b8;}
.sh-nav-item.active svg{color:#a5b4fc;}
.sh-nav-item .sh-badge{background:#10b981;color:#06251c;min-width:20px;height:20px;font-weight:800;}
.sh-side-foot{border-top:1px solid rgba(255,255,255,.08);padding:12px 8px 0;color:#94a3b8;}
.sh-side-foot .sh-back{border:1px solid rgba(255,255,255,.10);border-radius:8px;padding:9px 10px;color:#cbd5e1;background:rgba(255,255,255,.04);}
.sh-side-foot .sh-back:hover{background:rgba(16,185,129,.12);color:#d1fae5;}
.sh-main{background:transparent;}
.sh-topbar{padding:14px 40px;background:rgba(255,255,255,.78);border-bottom:1px solid rgba(217,226,240,.88);backdrop-filter:blur(14px);box-shadow:0 10px 34px rgba(16,24,40,.05);}
.sh-topbar-title{display:flex;flex-direction:column;gap:1px;}
.sh-topbar-kicker{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.12em;color:#6366f1;}
.sh-topbar .sh-crumb-page{font-size:14px;font-weight:800;color:#101828;}
.sh-topbar .sh-user{background:#fff;border:1px solid #dfe6f3;border-radius:999px;padding:5px 6px 5px 12px;color:#667085;box-shadow:0 8px 22px rgba(16,24,40,.06);}
.sh-topbar .sh-avatar,.sh-avatar{background:#4f46e5;color:#fff;}
.sh-topbar .sh-avatar{width:28px;height:28px;border-radius:999px;}
.sh-content{padding:30px 40px 64px;max-width:1240px;}
.sh-h1{font-size:28px;font-weight:900;color:#101828;letter-spacing:0;margin-top:4px;}
.sh-sub{color:#667085;font-size:14px;}
.sh-hero-panel{position:relative;display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:20px;margin-bottom:22px;padding:20px 22px;border:1px solid #dfe6f3;border-left:4px solid #6366f1;border-radius:8px;background:#fff;box-shadow:0 10px 28px rgba(16,24,40,.06);overflow:hidden;}
.sh-hero-panel::before{display:none;}
.sh-hero-copy,.sh-hero-metrics{position:relative;z-index:1;}
.sh-brand-row{display:inline-flex;align-items:center;gap:9px;margin-bottom:10px;padding:6px 10px;border:1px solid #c7d2fe;border-radius:999px;background:#eef2ff;color:#4f46e5;font-size:10px;font-weight:850;text-transform:uppercase;letter-spacing:.1em;}
.sh-brand-row img{width:20px;height:20px;border-radius:5px;}
.sh-hero-panel h1{margin:0 0 5px;color:#101828;font-size:26px;line-height:1.16;font-weight:900;letter-spacing:0;}
.sh-hero-panel p{margin:0;max-width:620px;color:#667085;font-size:13px;line-height:1.55;}
.sh-hero-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:0;justify-content:flex-end;}
.sh-hero-actions .sh-btn{min-height:40px;border-radius:8px;padding:9px 13px;font-weight:800;}
.sh-hero-actions .sh-btn-primary{background:#4f46e5;box-shadow:0 12px 28px rgba(79,70,229,.18);}
.sh-hero-actions .sh-btn-ghost{background:#fff;border-color:#d9e2f0;color:#344054;}
.sh-hero-actions .sh-btn-ghost:hover{background:#f8fbff;border-color:#c7d2fe;}
.sh-hero-metrics{display:grid;grid-template-columns:1fr;gap:10px;align-content:center;}
.sh-hero-metric{padding:14px;border-radius:8px;background:#f8fbff;border:1px solid #dfe6f3;}
.sh-hero-metric span{display:block;font-size:10px;text-transform:uppercase;letter-spacing:.1em;color:#667085;font-weight:800;}
.sh-hero-metric b{display:block;margin-top:3px;font-size:22px;line-height:1;color:#101828;font-weight:900;font-variant-numeric:tabular-nums;}
.sh-stats{gap:12px;background:transparent;border:0;border-radius:0;overflow:visible;}
.sh-stat{background:#fff;border:1px solid #dfe6f3;border-radius:8px;padding:18px;box-shadow:0 10px 28px rgba(16,24,40,.06);}
.sh-stat:hover{background:#fff;border-color:#c7d2fe;transform:translateY(-1px);box-shadow:0 18px 42px rgba(99,102,241,.12);}
.sh-stat-label{color:#667085;font-size:11px;text-transform:uppercase;letter-spacing:.06em;font-weight:800;}
.sh-stat-label svg{color:#6366f1;}
.sh-stat-value{color:#101828;font-size:30px;font-weight:900;}
.sh-card,.sh-spotlight-card,.sh-split,.sh-lc-wrap,.sh-lc-summary,.sh-kan-card,.sh-ch-stat,.sh-modal-card{background:#fff;border-color:#dfe6f3;border-radius:8px;box-shadow:0 10px 28px rgba(16,24,40,.06);}
.sh-card{overflow:hidden;}
.sh-card::before,.sh-spotlight-card::before,.sh-kan-card::before{content:'';display:block;height:3px;background:#6366f1;opacity:.9;}
.sh-card-pad{padding:18px 20px;}
.sh-sec-head h3,.sh-lc-sum-lab{color:#667085;font-weight:850;letter-spacing:.08em;}
.sh-sec-head .sh-link{color:#4f46e5;font-weight:800;}
.sh-row,.sh-ch-row,.sh-quote-row,.sh-call-row{transition:background .16s,border-color .16s,transform .16s;}
.sh-row:hover,.sh-ch-row:hover,.sh-quote-row:hover,.sh-call-row:hover{background:#f5f8ff;}
.sh-row.active,.sh-quote-row.active{background:#eef2ff;border-left-color:#6366f1;}
.sh-btn{border-radius:8px;font-weight:750;transition:transform .16s,box-shadow .16s,background .16s,border-color .16s;}
.sh-btn:hover{transform:translateY(-1px);}
.sh-btn-primary{background:#4f46e5;box-shadow:0 10px 24px rgba(79,70,229,.18);}
.sh-btn-primary:hover{background:#4338ca;}
.sh-btn-ghost{background:#fff;border-color:#d9e2f0;color:#344054;}
.sh-btn-ghost:hover{background:#f8fbff;border-color:#c7d2fe;}
.sh-chip,.sh-ch-fchip{border-radius:999px;background:#fff;border:1px solid #dfe6f3;color:#667085;font-weight:750;}
.sh-chip.active,.sh-ch-fchip.on{background:#101828;color:#fff;border-color:#101828;}
.sh-input,.sh-ch-search input,.sh-lc-input,.sh-lc-cd{border-radius:8px;}
.sh-input:focus,.sh-ch-search input:focus,.sh-lc-input:focus,.sh-lc-cd.open{border-color:#6366f1;box-shadow:0 0 0 4px rgba(99,102,241,.10);}
.sh-spotlight-card{padding:0;overflow:hidden;}
.sh-spotlight-card .sh-sp-name,.sh-spotlight-card .sh-sp-loc,.sh-spotlight-card .sh-sp-tags{margin-left:14px;margin-right:14px;}
.sh-spotlight-card .sh-sp-name{margin-top:14px;color:#101828;font-weight:850;}
.sh-spotlight-card .sh-sp-tags{margin-bottom:14px;}
.sh-lc-table{border-color:#dfe6f3;border-radius:8px;}
.sh-lc-table th{background:#f2f5fb;color:#667085;font-weight:850;letter-spacing:.06em;}
.sh-lc-table td{background:#fff;}
.sh-lc-table tr.sh-lc-primary.best td{background:#f0fdf4;}
.sh-lc-table tr.sh-lc-primary.worst td{background:#fff7ed;}
.sh-lc-detail td{background:#f8fbff !important;}
.sh-lc-breakdown,.sh-lc-howto{border:1px solid #dfe6f3;background:#f8fbff;border-radius:8px;}
.sh-kan-col{background:#eef2ff;border:1px solid #dfe6f3;border-radius:8px;}
.sh-kan-card{padding:0 12px 10px;overflow:hidden;}
.sh-kan-card::before{margin:0 -12px 10px;}
.sh-tag{border-radius:999px;font-weight:750;}
.sh-ch-tagmenu,.sh-lc-cd-pop{border-color:#dfe6f3;border-radius:8px;box-shadow:0 18px 48px rgba(16,24,40,.18);}

/* Responsive */
@media(max-width:1100px){
  #cockpit-app{ grid-template-columns:220px 1fr; }
  .sh-stats{ grid-template-columns:repeat(2,1fr); }
  .sh-grid-2{ grid-template-columns:1fr; }
  .sh-kanban{ grid-template-columns:repeat(2,1fr); }
  .sh-split{ grid-template-columns:320px 1fr; }
  .sh-content{ padding:24px 32px 48px; }
    .sh-hero-panel{grid-template-columns:1fr;}
    .sh-hero-actions{justify-content:flex-start;}
    .sh-hero-metrics{grid-template-columns:repeat(3,1fr);}
}
@media(max-width:760px){
  #cockpit-app{ grid-template-columns:1fr; }
  .sh-side{ display:none; }
  .sh-content{ padding:16px; }
  .sh-stats{ grid-template-columns:1fr 1fr; }
  .sh-kanban{ grid-template-columns:1fr; }
  .sh-split{ grid-template-columns:1fr; height:auto; }
  .sh-topbar{ padding:12px 16px; }
    .sh-hero-panel{padding:16px;}
    .sh-hero-panel h1{font-size:24px;}
    .sh-hero-metrics{grid-template-columns:1fr;}
    .sh-topbar .sh-user span{display:none;}
}
</style>

<div id="cockpit-app" aria-label="Sourcing Hub"></div>

<script>
(function(){
  'use strict';
  var legacyEnter = window._enterCockpit;
  var legacyExit = window._exitCockpit;
  var hubLoad = null;

  function loadHub() {
    if (window.SourcingHubV3) return Promise.resolve(window.SourcingHubV3);
    if (!window.AutomailBizModules) return Promise.reject(new Error('module loader unavailable'));
    if (!hubLoad) {
      hubLoad = window.AutomailBizModules.load('sourcingHub').then(function(){
        if (!window.SourcingHubV3) throw new Error('Sourcing Hub module did not register');
        return window.SourcingHubV3;
      });
    }
    return hubLoad;
  }

  function enter() {
    return loadHub().then(function(hub){
      if (hub && typeof hub.enter === 'function') return hub.enter();
      if (typeof legacyEnter === 'function') return legacyEnter();
    }).catch(function(err){
      console.warn('[sourcing-hub] lazy load failed:', err && err.message);
      if (typeof legacyEnter === 'function') return legacyEnter();
    });
  }

  function exit() {
    if (window.SourcingHubV3 && typeof window.SourcingHubV3.exit === 'function') return window.SourcingHubV3.exit();
    if (typeof legacyExit === 'function') return legacyExit();
  }

  window.ensureSourcingHub = loadHub;
  window._enterCockpit = enter;
  window._exitCockpit = exit;

  window.addEventListener('popstate', function(){
    var path = location.pathname;
    if (path === '/cockpit' || path === '/sourcing-hub') enter();
    else exit();
  });

  function initialRoute() {
    if (location.pathname !== '/cockpit' && location.pathname !== '/sourcing-hub') return;
    var tries = 0;
    var timer = setInterval(function(){
      tries += 1;
      if (window.currentUser) { clearInterval(timer); enter(); }
      else if (tries > 20) {
        clearInterval(timer);
        if (typeof window.showAuthModal === 'function') window.showAuthModal('login');
      }
    }, 250);
  }

  if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', initialRoute, { once: true });
  else initialRoute();
})();
</script>

<!-- ============================================================ -->
<!-- Automail T&C + role-switch gate (Phase 0 — 2026-05-16)       -->
<!-- Mirror of TNC_VERSION in backend/src/config/tnc.js           -->
<!-- ============================================================ -->
<style>
  .am-tnc-overlay{position:fixed;inset:0;background:rgba(15,23,42,.78);z-index:99999;display:none;align-items:center;justify-content:center;padding:16px}
  .am-tnc-overlay.visible{display:flex}
  .am-tnc-modal{background:#fff;border-radius:16px;max-width:720px;width:100%;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.35);font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica,Arial,sans-serif;color:#0f172a}
  .am-tnc-head{padding:20px 24px 8px}
  .am-tnc-head h2{margin:0;font-size:20px}
  .am-tnc-head p{margin:6px 0 0;color:#64748b;font-size:13px}
  .am-tnc-body{flex:1;overflow-y:auto;padding:12px 24px;margin:8px 0;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:13px;line-height:1.55;white-space:pre-wrap;background:#f8fafc;border-top:1px solid #e2e8f0;border-bottom:1px solid #e2e8f0}
  .am-tnc-hint{padding:4px 24px;color:#64748b;font-size:12px}
  .am-tnc-check{padding:12px 24px 4px;display:flex;gap:10px;align-items:flex-start;font-size:14px;cursor:pointer}
  .am-tnc-check input{margin-top:3px}
  .am-tnc-err{padding:0 24px 4px;color:#dc2626;font-size:13px}
  .am-tnc-foot{padding:12px 24px 20px;display:flex;gap:12px;justify-content:flex-end}
  .am-tnc-btn{border:none;border-radius:8px;padding:10px 22px;font-weight:600;cursor:pointer}
  .am-tnc-btn-primary{background:#94a3b8;color:#fff}
  .am-tnc-btn-primary.enabled{background:#4f46e5}
  .am-tnc-btn-primary:disabled{cursor:not-allowed}
  .am-tnc-btn-ghost{background:transparent;border:1px solid #cbd5e1;color:#334155}
</style>
<div id="am-tnc-overlay" class="am-tnc-overlay" role="dialog" aria-modal="true" aria-labelledby="am-tnc-title">
  <div class="am-tnc-modal">
    <div class="am-tnc-head">
      <h2 id="am-tnc-title">Automail Terms of Service</h2>
      <p id="am-tnc-subtitle">Please review the latest Terms.</p>
    </div>
    <div id="am-tnc-body" class="am-tnc-body"></div>
    <div id="am-tnc-hint" class="am-tnc-hint" style="display:none">Scroll to the bottom to continue.</div>
    <label class="am-tnc-check"><input id="am-tnc-agree" type="checkbox" disabled><span id="am-tnc-agree-label">I have read and agree to the Automail Terms of Service.</span></label>
    <div id="am-tnc-err" class="am-tnc-err" style="display:none"></div>
    <div class="am-tnc-foot">
      <button id="am-tnc-logout" class="am-tnc-btn am-tnc-btn-ghost" type="button">Sign out</button>
      <button id="am-tnc-accept" class="am-tnc-btn am-tnc-btn-primary" type="button" disabled>I agree</button>
    </div>
  </div>
</div>
<script>
(function(){
  var TNC_VERSION = '2026-05-16-v1';
  var API_BASE = (window.API_BASE || 'https://api.automail.digital/api');
  var TNC_COMMON = [
    'AUTOMAIL — TERMS OF SERVICE',
    '',
    'Last updated: 16 May 2026',
    'Version: ' + TNC_VERSION,
    '',
    'Welcome to Automail. By creating an account, accessing or using the Automail',
    'platform — including the user web app, the Automail Biz directory and the',
    'Automail Biz Android application (collectively, the "Service") — you agree',
    'to be bound by these Terms of Service ("Terms"). If you do not agree, do',
    'not use the Service.',
    '',
    '1. ACCEPTANCE OF TERMS',
    '   These Terms form a binding agreement. You must be at least 18 and able',
    '   to enter a contract under applicable law.',
    '',
    '2. THE SERVICE',
    '   Automail provides email marketing automation, a B2B business directory,',
    '   RFQ workflows, buyer–seller chat and voice calling.',
    '',
    '3. ACCOUNTS AND ROLES',
    '   You may register as a Buyer, a Seller, or both. Each role has its own',
    '   onboarding and these Terms must be accepted separately for each role.',
    '   You agree to provide accurate, current and complete information,',
    '   including GSTIN (where applicable), business identity, contact details',
    '   and pincode.',
    '',
    '4. BUYER TERMS',
    '   Buyers may search the directory, send inquiries, post RFQs, chat with',
    '   sellers and place calls subject to plan limits. Inquiry, RFQ and chat',
    '   metadata is shared with the matched seller so they can respond.',
    '',
    '5. SELLER TERMS',
    '   Sellers may publish a Business Page, list products and services,',
    '   receive inquiries and RFQs, run promotions and accept buyer calls. You',
    '   represent you have all rights to upload product imagery, certifications',
    '   and any third-party trademarks displayed on your Business Page.',
    '',
    '6. PAYMENTS, CREDITS AND REFUNDS',
    '   Subscriptions renew automatically. Wallet top-ups, promotion credits',
    '   and add-ons are non-refundable except where mandated by law.',
    '',
    '7. ACCEPTABLE USE',
    '   You will not (a) send unsolicited bulk email outside Automail policy;',
    '   (b) scrape or reverse-engineer the Service; (c) upload malicious or',
    '   infringing content; (d) impersonate any business; (e) circumvent rate',
    '   limits or anti-fraud controls.',
    '',
    '8. PRIVACY',
    '   Our handling of personal data is described in the Automail Privacy',
    '   Policy.',
    '',
    '9. INTELLECTUAL PROPERTY',
    '   Automail owns the Service. You retain ownership of User Content and',
    '   grant Automail a worldwide, royalty-free licence to host, display and',
    '   transmit your User Content as needed to operate the Service.',
    '',
    '10. THIRD-PARTY SERVICES',
    '    The Service integrates with Google, Razorpay, Firebase, LiveKit and',
    '    others. Your use of those services is governed by their own terms.',
    '',
    '11. WARRANTY DISCLAIMER',
    '    THE SERVICE IS PROVIDED "AS IS".',
    '',
    '12. LIMITATION OF LIABILITY',
    '    TO THE MAXIMUM EXTENT PERMITTED BY LAW, AUTOMAIL WILL NOT BE LIABLE',
    '    FOR INDIRECT OR CONSEQUENTIAL DAMAGES. OUR AGGREGATE LIABILITY IS',
    '    LIMITED TO AMOUNTS YOU PAID IN THE 12 MONTHS PRECEDING THE CLAIM,',
    '    OR INR 1,000, WHICHEVER IS GREATER.',
    '',
    '13. SUSPENSION AND TERMINATION',
    '    You may close your account at any time. We may suspend or terminate',
    '    access for breach of these Terms, fraud, security risk, or law.',
    '',
    '14. GOVERNING LAW',
    '    Laws of India. Courts at Rajkot, Gujarat have exclusive jurisdiction,',
    '    subject to mandatory consumer protection law.',
    '',
    '15. CONTACT',
    '    support@automail.digital'
  ].join('\n');

  var TNC_BUYER = [
    '',
    'BUYER ADDENDUM',
    '',
    'B1. Your name, organisation, location and GSTIN (where provided) will be',
    '    shared with matched sellers so they can respond.',
    'B2. You will not use buyer-side features to harvest seller contact data',
    '    for unsolicited bulk outreach outside Automail.',
    'B3. Reviews must reflect a genuine purchase or interaction.',
    'B4. Free-tier limits on calls, RFQs and chats are published in the app.'
  ].join('\n');

  var TNC_SELLER = [
    '',
    'SELLER ADDENDUM',
    '',
    'S1. You operate a Business Page representing your real business. You will',
    '    not list goods you cannot supply or misstate certifications.',
    'S2. You are responsible for fulfilling orders, honouring quoted prices,',
    '    MOQ and lead times, and complying with applicable export, customs,',
    '    BIS, FSSAI and other regulatory requirements.',
    'S3. Promotional credits and listing boosts are non-refundable except',
    '    where required by law.',
    'S4. Buyer contact data shared through inquiries, RFQs, chats and calls',
    '    is for the sole purpose of responding to that specific buyer.',
    'S5. You authorise Automail to display your Business Page, products,',
    '    certifications and reviews in the directory and matched RFQ feeds.'
  ].join('\n');

  function tncText(role){ return TNC_COMMON + '\n\n' + (role === 'seller' ? TNC_SELLER : TNC_BUYER); }

  function authHeaders(){
    return new Promise(function(res){
      try{
        var u = window.firebase && window.firebase.auth && window.firebase.auth().currentUser;
        if (u && u.getIdToken) u.getIdToken().then(function(t){ res({ 'Authorization':'Bearer '+t, 'Content-Type':'application/json' }); }).catch(function(){ res({'Content-Type':'application/json'}); });
        else res({'Content-Type':'application/json'});
      }catch(e){ res({'Content-Type':'application/json'}); }
    });
  }
  function apiGet(path){
    return authHeaders().then(function(h){ return fetch(API_BASE + path, { headers:h, credentials:'include' }); })
      .then(function(r){ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); });
  }
  function apiPost(path, body){
    return authHeaders().then(function(h){ return fetch(API_BASE + path, { method:'POST', headers:h, credentials:'include', body: JSON.stringify(body||{}) }); })
      .then(function(r){ return r.json().catch(function(){return {};}).then(function(d){ if(!r.ok) throw new Error(d.error || ('HTTP '+r.status)); return d; }); });
  }

  var state = { me: null, role: 'buyer', hitBottom: false, agreed: false, submitting: false };

  function el(id){ return document.getElementById(id); }

  function show(role){
    state.role = role || 'buyer';
    state.hitBottom = false;
    state.agreed = false;
    el('am-tnc-subtitle').textContent = 'Please review the latest Terms (version ' + TNC_VERSION + ') for your ' + state.role + ' role.';
    el('am-tnc-title').textContent = 'Automail Terms of Service · ' + (state.role === 'seller' ? 'Seller' : 'Buyer');
    el('am-tnc-agree-label').textContent = 'I have read and agree to the Automail Terms of Service (version ' + TNC_VERSION + ') for the ' + state.role + ' role.';
    var body = el('am-tnc-body');
    body.textContent = tncText(state.role);
    body.scrollTop = 0;
    el('am-tnc-agree').checked = false;
    el('am-tnc-agree').disabled = true;
    el('am-tnc-accept').disabled = true;
    el('am-tnc-accept').classList.remove('enabled');
    el('am-tnc-err').style.display = 'none';
    el('am-tnc-overlay').classList.add('visible');
    // Auto-hit-bottom if content already fits.
    setTimeout(function(){
      if (body.scrollHeight <= body.clientHeight + 4) {
        state.hitBottom = true;
        el('am-tnc-agree').disabled = false;
        el('am-tnc-hint').style.display = 'none';
      } else {
        el('am-tnc-hint').style.display = 'block';
      }
    }, 50);
  }

  function hide(){ el('am-tnc-overlay').classList.remove('visible'); }

  el('am-tnc-body').addEventListener('scroll', function(){
    if (state.hitBottom) return;
    var b = el('am-tnc-body');
    if (b.scrollTop + b.clientHeight >= b.scrollHeight - 24){
      state.hitBottom = true;
      el('am-tnc-agree').disabled = false;
      el('am-tnc-hint').style.display = 'none';
    }
  });

  el('am-tnc-agree').addEventListener('change', function(e){
    state.agreed = !!e.target.checked;
    var btn = el('am-tnc-accept');
    btn.disabled = !(state.agreed && state.hitBottom);
    btn.classList.toggle('enabled', !btn.disabled);
  });

  el('am-tnc-accept').addEventListener('click', function(){
    if (state.submitting) return;
    state.submitting = true;
    el('am-tnc-accept').textContent = 'Recording…';
    apiPost('/auth/accept-tnc', { role: state.role, version: TNC_VERSION })
      .then(function(){
        state.submitting = false;
        el('am-tnc-accept').textContent = 'I agree';
        hide();
        // Refresh /me so downstream code sees the new state.
        return refreshMe();
      })
      .catch(function(err){
        state.submitting = false;
        el('am-tnc-accept').textContent = 'I agree';
        var e = el('am-tnc-err');
        e.textContent = err && err.message ? err.message : 'Could not record acceptance.';
        e.style.display = 'block';
      });
  });

  el('am-tnc-logout').addEventListener('click', function(){
    try { window.firebase && window.firebase.auth && window.firebase.auth().signOut(); } catch (e) {}
    hide();
  });

  function refreshMe(){
    return apiGet('/auth/me').then(function(me){
      state.me = me;
      window.AutomailMe = me;
      if (me && me.needsTnc) show(me.activeRole || 'buyer');
      return me;
    }).catch(function(){ /* unauthenticated or backend down — silent */ });
  }

  function switchRole(role){
    return apiPost('/auth/switch-role', { role: role }).then(function(resp){
      return refreshMe().then(function(){ return resp; });
    });
  }

  // Bind to Firebase auth state. Wait briefly for firebase to load.
  function bind(){
    try {
      if (!(window.firebase && window.firebase.auth)) { setTimeout(bind, 300); return; }
      window.firebase.auth().onAuthStateChanged(function(user){
        if (user) refreshMe();
        else { state.me = null; window.AutomailMe = null; hide(); }
      });
    } catch (e) { setTimeout(bind, 500); }
  }
  bind();

  window.AutomailTnc = {
    version: TNC_VERSION,
    show: show,
    hide: hide,
    refreshMe: refreshMe,
    switchRole: switchRole,
    getMe: function(){ return state.me; }
  };
})();
</script>
</body>
</html>
