<!DOCTYPE html>
<html lang="en">
<head>
<base target="_top">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="color-scheme" content="dark light">
<title>VANTAGE OS v10.0 — Global 360° ABM & Market Intelligence Engine</title>
<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=Plus+Jakarta+Sans:wght@400;500;600;700;800&display=swap" rel="stylesheet">
<script src="https://unpkg.com/lucide@0.453.0/dist/umd/lucide.min.js"></script>
<style>
:root {
--bg-base: #020617; --bg-surface: rgba(15, 23, 42, 0.78); --bg-hover: rgba(30, 41, 59, 0.92);
--text: #f8fafc; --text-2: #94a3b8; --text-3: #64748b;
--primary: #3b82f6; --primary-glow: rgba(59, 130, 246, 0.38); --accent: #8b5cf6;
--ok: #10b981; --warn: #f59e0b; --danger: #ef4444;
--border: rgba(255, 255, 255, 0.1); --border-hi: rgba(255, 255, 255, 0.24);
--shadow: 0 25px 50px rgba(0, 0, 0, 0.55); --inner: inset 0 1px 0 rgba(255, 255, 255, 0.12);
--field: rgba(15, 23, 42, 0.75); --opt-bg: #0f172a; --font: 'Plus Jakarta Sans', system-ui, sans-serif;
}
[data-dept-theme="sales"] { --primary: #3b82f6; --primary-glow: rgba(59, 130, 246, 0.4); --accent: #06b6d4; }
[data-dept-theme="marketing"] { --primary: #8b5cf6; --primary-glow: rgba(139, 92, 246, 0.4); --accent: #ec4899; }
[data-dept-theme="cs"] { --primary: #10b981; --primary-glow: rgba(16, 185, 129, 0.4); --accent: #3b82f6; }
[data-theme="light"] {
--bg-base: #f1f5f9; --bg-surface: rgba(255, 255, 255, 0.88); --bg-hover: rgba(255, 255, 255, 0.98);
--text: #0f172a; --text-2: #475569; --text-3: #64748b;
--border: rgba(0, 0, 0, 0.1); --border-hi: rgba(0, 0, 0, 0.22);
--shadow: 0 20px 40px rgba(0, 0, 0, 0.08); --inner: inset 0 1px 0 rgba(255, 255, 255, 0.7);
--field: rgba(255, 255, 255, 0.94); --opt-bg: #ffffff;
}
* { box-sizing: border-box; }
body { margin: 0; font-family: var(--font); color: var(--text); background: var(--bg-base); min-height: 100vh; overflow-x: hidden; -webkit-font-smoothing: antialiased; transition: background-color 0.4s, color 0.4s; }
button, input, select, textarea { font-family: inherit; }
select option { background-color: var(--opt-bg); color: var(--text); }
:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
[hidden] { display: none !important; }
.sr-only { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
::-webkit-scrollbar { width: 6px; height: 6px; }
::-webkit-scrollbar-thumb { background: var(--text-3); border-radius: 10px; }
.bg-system { position: fixed; inset: 0; z-index: -2; overflow: hidden; pointer-events: none; }
.bg-layer { position: absolute; inset: 0; opacity: 0; transition: opacity 1s ease; }
.bg-layer.active { opacity: 1; }
.bg-layer:not(.active) * { animation-play-state: paused !important; }
#bg-orb { background: radial-gradient(circle at 50% 50%, var(--primary-glow), transparent 65%); }
.orb { position: absolute; border-radius: 50%; filter: blur(85px); opacity: 0.38; animation: floatOrb 15s ease-in-out infinite alternate; }
.orb-1 { width: 40vw; height: 40vw; background: var(--primary); top: 0; left: 0; }
.orb-2 { width: 35vw; height: 35vw; background: var(--accent); bottom: 0; right: 0; }
@keyframes floatOrb { to { transform: translate(5vw, 5vh) scale(1.1); } }
.grid-overlay { position: absolute; inset: 0; background-image: linear-gradient(to right, var(--border) 1px, transparent 1px), linear-gradient(to bottom, var(--border) 1px, transparent 1px); background-size: 60px 60px; transform: perspective(600px) rotateX(60deg); animation: gridMove 15s linear infinite; -webkit-mask-image: radial-gradient(ellipse at center, #000 30%, transparent 70%); mask-image: radial-gradient(ellipse at center, #000 30%, transparent 70%); }
@keyframes gridMove { to { transform: perspective(600px) rotateX(60deg) translateY(60px); } }
.radar-sweep { position: absolute; inset: 0; margin: auto; width: 140vmax; height: 140vmax; border-radius: 50%; background: conic-gradient(from 0deg, transparent 70%, var(--primary-glow)); animation: spin 4s linear infinite; -webkit-mask-image: radial-gradient(circle, transparent 20%, #000 60%, transparent 70%); mask-image: radial-gradient(circle, transparent 20%, #000 60%, transparent 70%); }
.radar-rings { position: absolute; inset: 0; margin: auto; width: 95vmax; height: 95vmax; border-radius: 50%; border: 1px solid var(--border); opacity: 0.3; transform: scaleY(0.7); }
#bg-waves { display: flex; align-items: center; justify-content: center; }
.wave-line { position: absolute; width: 200%; height: 2px; background: linear-gradient(90deg, transparent, var(--primary), transparent); opacity: 0.35; animation: waveMove 8s ease-in-out infinite alternate; }
.wave-line + .wave-line { background: linear-gradient(90deg, transparent, var(--accent), transparent); }
@keyframes waveMove { from { transform: translateY(0px) rotate(8deg); opacity: 0.15; } to { transform: translateY(80px) rotate(16deg); opacity: 0.6; } }
@keyframes spin { to { transform: rotate(360deg); } }
.glass { background: var(--bg-surface); backdrop-filter: blur(24px); -webkit-backdrop-filter: blur(24px); border: 1px solid var(--border); border-radius: 20px; box-shadow: var(--shadow), var(--inner); }
.header { display: flex; justify-content: space-between; align-items: center; gap: 10px; padding: 12px clamp(14px, 3%, 36px); border-bottom: 1px solid var(--border); background: color-mix(in srgb, var(--bg-base) 78%, transparent); backdrop-filter: blur(14px); position: sticky; top: 0; z-index: 100; flex-wrap: wrap; }
.logo { display: flex; align-items: center; gap: 11px; background: none; border: 0; color: inherit; cursor: pointer; padding: 0; text-align: left; }
.logo-mark { width: 40px; height: 40px; border-radius: 12px; display: grid; place-items: center; background: linear-gradient(135deg, #0f172a, #1e1b4b); border: 1px solid var(--border-hi); box-shadow: 0 0 22px var(--primary-glow); transition: transform 0.3s; }
.logo:hover .logo-mark { transform: scale(1.07) rotate(-3deg); }
.logo-text-wrap { display: flex; flex-direction: column; }
.logo h1 { margin: 0; font-size: 1.18rem; font-weight: 800; letter-spacing: 0.6px; display: flex; align-items: center; gap: 6px; }
.logo-badge { font-size: 0.64rem; font-weight: 800; padding: 2px 6px; border-radius: 5px; background: linear-gradient(135deg, var(--primary), var(--accent)); color: #fff; letter-spacing: 0.8px; }
.logo-tagline { font-size: 0.68rem; color: var(--text-2); font-weight: 600; letter-spacing: 0.3px; margin-top: 1px; }
/* LANDING PAGE STYLES */
#landing-view { max-width: 1180px; margin: 0 auto; padding: 44px 20px 100px; display: flex; flex-direction: column; align-items: center; gap: 60px; }
.lp-hero { text-align: center; max-width: 880px; display: flex; flex-direction: column; align-items: center; gap: 18px; margin-top: 10px; }
.lp-pill { display: inline-flex; align-items: center; gap: 8px; padding: 6px 16px; border-radius: 99px; background: rgba(59, 130, 246, 0.15); border: 1px solid rgba(59, 130, 246, 0.4); color: #60a5fa; font-size: 0.8rem; font-weight: 700; }
.lp-hero h2 { font-size: clamp(2.1rem, 4.8vw, 3.5rem); font-weight: 800; line-height: 1.12; margin: 0; letter-spacing: -0.5px; }
.lp-hero h2 span { background: linear-gradient(135deg, #38bdf8, #818cf8, #c084fc); -webkit-background-clip: text; -webkit-text-fill-color: transparent; }
.lp-hero p { font-size: 1.05rem; color: var(--text-2); line-height: 1.65; margin: 0; max-width: 760px; }
.lp-cta-row { display: flex; gap: 14px; flex-wrap: wrap; justify-content: center; margin-top: 8px; }
.lp-btn-primary { background: linear-gradient(135deg, var(--primary), var(--accent)); color: #fff; border: 0; padding: 15px 28px; border-radius: 14px; font-weight: 800; font-size: 0.98rem; cursor: pointer; box-shadow: 0 12px 30px var(--primary-glow); display: inline-flex; align-items: center; gap: 9px; transition: transform 0.2s; }
.lp-btn-primary:hover { transform: translateY(-2px); }
.lp-btn-secondary { background: var(--field); color: var(--text); border: 1px solid var(--border-hi); padding: 15px 24px; border-radius: 14px; font-weight: 700; font-size: 0.95rem; cursor: pointer; display: inline-flex; align-items: center; gap: 9px; transition: all 0.2s; }
.lp-btn-secondary:hover { border-color: var(--primary); background: var(--bg-hover); }
.lp-section { width: 100%; display: flex; flex-direction: column; align-items: center; gap: 26px; }
.lp-sec-head { text-align: center; max-width: 740px; }
.lp-sec-head h3 { font-size: clamp(1.5rem, 3vw, 2.1rem); font-weight: 800; margin: 0 0 8px; }
.lp-sec-head p { color: var(--text-2); margin: 0; font-size: 0.95rem; line-height: 1.55; }
/* 4-Layer Deep ABM & ICP Cards */
.lp-abm-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px; width: 100%; }
.lp-abm-step { padding: 22px; border-left: 4px solid var(--accent); display: flex; flex-direction: column; gap: 8px; }
.lp-abm-num { font-size: 0.72rem; font-weight: 800; text-transform: uppercase; letter-spacing: 0.8px; color: var(--primary); }
.lp-abm-step h4 { margin: 0; font-size: 1.05rem; font-weight: 800; }
.lp-abm-step p { margin: 0; font-size: 0.84rem; color: var(--text-2); line-height: 1.5; }
.lp-bento-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(320px, 1fr)); gap: 20px; width: 100%; }
.lp-bento-card { padding: 26px; display: flex; flex-direction: column; gap: 10px; border-top: 3px solid var(--primary); position: relative; }
.lp-bento-card.roadmap-card { border-top-color: var(--warn); opacity: 0.92; }
.lp-bento-icon { width: 44px; height: 44px; border-radius: 12px; background: var(--primary-glow); color: #60a5fa; display: grid; place-items: center; margin-bottom: 4px; }
.lp-bento-card h4 { margin: 0; font-size: 1.12rem; font-weight: 800; display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.lp-bento-card p { margin: 0; font-size: 0.86rem; color: var(--text-2); line-height: 1.55; }
.lp-bento-meta { margin-top: auto; padding-top: 10px; font-size: 0.74rem; font-weight: 700; color: var(--ok); display: flex; align-items: center; gap: 6px; }
.status-pill-live { font-size: 0.66rem; font-weight: 800; padding: 3px 8px; border-radius: 99px; background: rgba(16, 185, 129, 0.16); color: var(--ok); border: 1px solid rgba(16, 185, 129, 0.4); text-transform: uppercase; }
.status-pill-dev { font-size: 0.66rem; font-weight: 800; padding: 3px 8px; border-radius: 99px; background: rgba(245, 158, 11, 0.16); color: var(--warn); border: 1px solid rgba(245, 158, 11, 0.4); text-transform: uppercase; }
.lp-pricing-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 22px; width: 100%; align-items: stretch; }
.lp-price-card { padding: 30px 26px; display: flex; flex-direction: column; gap: 14px; position: relative; }
.lp-price-card.featured { border: 2px solid var(--primary); box-shadow: 0 0 35px rgba(59, 130, 246, 0.25); }
.lp-pop-badge { position: absolute; top: -12px; right: 24px; background: linear-gradient(135deg, var(--primary), var(--accent)); color: #fff; font-size: 0.7rem; font-weight: 800; padding: 4px 12px; border-radius: 99px; text-transform: uppercase; letter-spacing: 0.6px; }
.lp-tier-name { font-size: 1.1rem; font-weight: 800; color: var(--text); }
.lp-tier-price { font-size: 2.3rem; font-weight: 800; color: var(--text); display: flex; align-items: baseline; gap: 6px; }
.lp-tier-price span { font-size: 0.85rem; font-weight: 600; color: var(--text-2); }
.lp-tier-desc { font-size: 0.83rem; color: var(--text-2); line-height: 1.45; margin: 0; }
.lp-feat-list { list-style: none; padding: 0; margin: 6px 0 16px; display: flex; flex-direction: column; gap: 9px; font-size: 0.83rem; color: var(--text-2); flex: 1; }
.lp-feat-list li { display: flex; align-items: flex-start; gap: 8px; line-height: 1.4; }
.lp-feat-list li i { color: var(--ok); flex-shrink: 0; margin-top: 2px; }
/* WORKSPACE & DASHBOARD STYLES */
.context-bar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; background: var(--field); padding: 6px 11px; border-radius: 14px; border: 1px solid var(--border); }
.brand-badge-btn { display: flex; align-items: center; gap: 7px; background: var(--primary-glow); border: 1px solid var(--border-hi); color: var(--text); padding: 5px 10px; border-radius: 10px; cursor: pointer; font-weight: 700; font-size: 0.8rem; }
.company-logo-img { width: 20px; height: 20px; border-radius: 5px; object-fit: contain; background: #fff; padding: 1px; }
.context-pill { display: flex; align-items: center; gap: 5px; font-size: 0.78rem; color: var(--text-2); font-weight: 600; }
.context-pill input, .context-pill select { background: var(--bg-surface); border: 1px solid var(--border); color: var(--text); font-weight: 700; font-size: 0.8rem; padding: 5px 8px; border-radius: 8px; }
.context-pill input { width: 125px; }
.scan-btn-mini { background: var(--primary); color: #fff; border: 0; border-radius: 8px; padding: 5px 10px; font-size: 0.76rem; font-weight: 700; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; }
.lang-select-pill { background: var(--field); border: 1px solid var(--border-hi); color: var(--text); font-weight: 700; font-size: 0.78rem; padding: 0 10px; height: 38px; border-radius: 10px; cursor: pointer; }
.mode-indicator { font-size: 0.71rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; padding: 5px 10px; border-radius: 20px; display: flex; align-items: center; gap: 6px; background: rgba(16, 185, 129, 0.15); color: var(--ok); border: 1px solid rgba(16, 185, 129, 0.3); cursor: pointer; }
.mode-indicator.live-active { background: rgba(59, 130, 246, 0.2); color: #60a5fa; border-color: rgba(59, 130, 246, 0.45); }
.mode-dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; animation: pulse 2s infinite; }
@keyframes pulse { 50% { opacity: 0.4; } }
.header-controls { display: flex; gap: 7px; align-items: center; flex-wrap: wrap; }
.vault-btn { display: inline-flex; align-items: center; gap: 7px; background: var(--field); border: 1px solid var(--border-hi); color: var(--text); height: 38px; padding: 0 12px; border-radius: 10px; font-weight: 700; font-size: 0.79rem; cursor: pointer; }
.vault-btn.login-cta { background: linear-gradient(135deg, var(--primary), var(--accent)); border-color: transparent; color: #fff; }
.vault-count { background: var(--primary); color: #fff; padding: 1px 7px; border-radius: 99px; font-size: 0.71rem; }
.icon-btn { background: transparent; border: 1px solid var(--border); color: var(--text); width: 38px; height: 38px; border-radius: 10px; display: grid; place-items: center; cursor: pointer; }
.view { transition: opacity 0.3s, transform 0.3s; }
.view.leaving { opacity: 0; transform: translateY(10px); }
#portal-view { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 85vh; padding: 36px 20px 80px; }
.portal-hero { text-align: center; margin-bottom: 24px; max-width: 820px; }
.adapt-banner { display: inline-flex; align-items: center; gap: 9px; padding: 7px 16px; border-radius: 99px; background: var(--primary-glow); border: 1px solid var(--border-hi); color: var(--text); font-size: 0.84rem; font-weight: 700; margin-bottom: 14px; cursor: pointer; }
.portal-hero h2 { font-size: clamp(1.9rem, 4.2vw, 2.9rem); font-weight: 800; margin: 0 0 12px; line-height: 1.15; }
.portal-hero p { color: var(--text-2); font-size: 1rem; margin: 0 auto; line-height: 1.55; }
.company-intel-strip { width: 100%; max-width: 1120px; margin-bottom: 20px; padding: 18px 22px; border-radius: 16px; display: flex; flex-direction: column; gap: 10px; border-left: 4px solid var(--primary); }
.company-intel-strip.syncing { border-left-color: var(--accent); box-shadow: 0 0 25px var(--primary-glow); }
.company-intel-strip.not-found { border-left-color: var(--danger); background: rgba(239, 68, 68, 0.08); }
.intel-strip-top { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; }
.intel-strip-title { font-size: 0.92rem; font-weight: 800; color: var(--text); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.intel-strip-badges { display: flex; gap: 7px; flex-wrap: wrap; }
.intel-pill { font-size: 0.72rem; font-weight: 700; padding: 4px 10px; border-radius: 99px; background: var(--field); border: 1px solid var(--border-hi); color: var(--text-2); }
.intel-pill.live-osint { background: rgba(16, 185, 129, 0.15); color: var(--ok); border-color: rgba(16, 185, 129, 0.38); }
.intel-pill.tier-pill { background: rgba(139, 92, 246, 0.16); color: #c4b5fd; border-color: rgba(139, 92, 246, 0.4); }
.intel-pill.error-pill { background: rgba(239, 68, 68, 0.18); color: #fca5a5; border-color: rgba(239, 68, 68, 0.45); }
.intel-grid-details { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 10px; padding-top: 4px; }
.intel-detail-box { background: var(--field); border: 1px solid var(--border); border-radius: 10px; padding: 10px 13px; font-size: 0.81rem; color: var(--text-2); line-height: 1.48; }
.intel-detail-box strong { display: block; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.4px; color: var(--primary); margin-bottom: 3px; }
.intel-news-bar { margin-top: 2px; padding: 8px 12px; border-radius: 10px; background: rgba(16, 185, 129, 0.1); border: 1px solid rgba(16, 185, 129, 0.28); font-size: 0.79rem; color: var(--ok); font-weight: 600; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.dept-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(290px, 1fr)); gap: 22px; width: 100%; max-width: 1120px; }
.dept-card { padding: 30px 24px; display: flex; flex-direction: column; align-items: flex-start; text-align: left; cursor: pointer; color: inherit; position: relative; overflow: hidden; transition: transform 0.3s; }
.dept-card::before { content: ''; position: absolute; top: 0; left: 0; right: 0; height: 4px; background: var(--card-accent, var(--primary)); opacity: 0.75; }
.dept-card:hover { transform: scale(1.015); border-color: var(--border-hi); }
.dept-top-row { display: flex; justify-content: space-between; align-items: center; width: 100%; margin-bottom: 18px; }
.dept-icon { width: 54px; height: 54px; border-radius: 15px; background: color-mix(in srgb, var(--card-accent, var(--primary)) 15%, transparent); border: 1px solid color-mix(in srgb, var(--card-accent, var(--primary)) 35%, transparent); display: grid; place-items: center; color: var(--card-accent, var(--primary)); }
.dept-card h3 { font-size: 1.35rem; margin: 0 0 8px; font-weight: 800; }
.dept-card p { color: var(--text-2); margin: 0 0 16px; line-height: 1.5; font-size: 0.92rem; }
.dept-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: auto; }
.dept-tag { font-size: 0.72rem; font-weight: 600; padding: 4px 9px; border-radius: 6px; background: var(--field); color: var(--text-2); border: 1px solid var(--border); }
#dashboard-view { display: flex; flex-direction: column; align-items: center; max-width: 1120px; margin: 26px auto 90px; padding: 0 20px; width: 100%; }
.dash-top { display: flex; align-items: center; justify-content: space-between; width: 100%; margin-bottom: 14px; gap: 14px; flex-wrap: wrap; }
.dash-top-left { display: flex; align-items: center; gap: 14px; }
.dash-brand-logo { width: 50px; height: 50px; border-radius: 14px; background: #fff; padding: 4px; object-fit: contain; border: 1px solid var(--border-hi); }
.dash-hero h2 { font-size: clamp(1.5rem, 3vw, 2rem); font-weight: 800; margin: 0 0 3px; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dash-hero p { color: var(--text-2); margin: 0; font-size: 0.9rem; }
.construction-banner { width: 100%; padding: 12px 18px; border-radius: 14px; background: rgba(245, 158, 11, 0.14); border: 1px solid rgba(245, 158, 11, 0.45); color: #fcd34d; font-size: 0.85rem; font-weight: 600; margin-bottom: 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; flex-wrap: wrap; }
.kpi-strip { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 14px; width: 100%; margin-bottom: 22px; }
.kpi-card { padding: 15px 18px; border-radius: 16px; display: flex; flex-direction: column; gap: 5px; border-left: 3px solid var(--primary); text-align: left; }
.kpi-label { font-size: 0.72rem; color: var(--text-2); font-weight: 800; text-transform: uppercase; letter-spacing: 0.5px; display: flex; justify-content: space-between; align-items: center; gap: 6px; }
.kpi-company-tag { color: var(--primary); font-weight: 800; background: var(--primary-glow); padding: 2px 7px; border-radius: 6px; font-size: 0.67rem; }
.kpi-val { font-size: 1.32rem; font-weight: 800; color: var(--text); display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.kpi-delta { font-size: 0.72rem; font-weight: 700; color: var(--ok); background: rgba(16,185,129,0.14); padding: 2px 8px; border-radius: 6px; border: 1px solid rgba(16,185,129,0.28); }
.kpi-sub { font-size: 0.74rem; color: var(--text-2); font-weight: 500; line-height: 1.35; }
.command-card { padding: clamp(18px, 3vw, 30px); width: 100%; }
.tabs { display: flex; background: var(--field); padding: 6px; border-radius: 16px; border: 1px solid var(--border); margin-bottom: 18px; gap: 5px; flex-wrap: wrap; }
.tab-btn { flex: 1; min-width: 130px; background: transparent; border: 0; padding: 11px 10px; border-radius: 12px; color: var(--text-2); font-weight: 600; font-size: 0.82rem; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 7px; }
.tab-btn[aria-selected="true"] { color: #fff; background: linear-gradient(135deg, var(--primary), var(--accent)); box-shadow: 0 8px 20px var(--primary-glow); }
.tool-context-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; margin-bottom: 12px; font-size: 0.82rem; color: var(--text-2); }
.preset-chips { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.preset-chip { background: var(--field); border: 1px solid var(--border); color: var(--text-2); padding: 4px 10px; border-radius: 99px; font-size: 0.75rem; font-weight: 600; cursor: pointer; }
.preset-chip:hover { border-color: var(--primary); color: var(--text); background: var(--primary-glow); }
.podcast-toggle-btn { display: inline-flex; align-items: center; gap: 7px; padding: 5px 12px; border-radius: 99px; font-size: 0.75rem; font-weight: 700; cursor: pointer; background: var(--field); border: 1px solid var(--border); color: var(--text-2); }
.podcast-toggle-btn.active { background: rgba(139, 92, 246, 0.22); border-color: #8b5cf6; color: #c4b5fd; }
.input-group { display: flex; flex-direction: column; gap: 14px; }
.input-row { display: grid; grid-template-columns: 1fr auto; gap: 10px; }
@media(max-width: 780px) { .input-row { grid-template-columns: 1fr; } }
.input-wrapper { position: relative; display: flex; align-items: center; width: 100%; }
.input-icon { position: absolute; left: 18px; color: var(--text-3); width: 20px; height: 20px; pointer-events: none; }
.input-wrapper input { width: 100%; padding: 17px 78px 17px 48px; background: var(--field); border: 1px solid var(--border); border-radius: 14px; font-size: 0.98rem; font-weight: 500; color: var(--text); }
.kbd-badge { position: absolute; right: 14px; display: flex; gap: 4px; pointer-events: none; }
.kbd-badge kbd { background: var(--bg-surface); border: 1px solid var(--border); border-radius: 6px; padding: 3px 6px; font-family: ui-monospace, monospace; font-size: 0.75rem; color: var(--text-2); }
.param-select { background: var(--field); border: 1px solid var(--border-hi); color: var(--text); padding: 0 14px; border-radius: 14px; font-weight: 700; font-size: 0.84rem; min-height: 54px; cursor: pointer; }
.action-btn { background: linear-gradient(135deg, var(--primary), var(--accent)); color: #fff; border: 0; width: 100%; padding: 16px; border-radius: 14px; font-weight: 700; font-size: 1.02rem; cursor: pointer; box-shadow: 0 10px 25px var(--primary-glow), var(--inner); display: flex; justify-content: center; align-items: center; gap: 10px; }
.spin { animation: spin 1s linear infinite; }
.feed-section { width: 100%; margin-top: 26px; }
.feed-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 14px; gap: 8px; flex-wrap: wrap; }
.feed-toggle { background: none; border: 0; color: var(--text-2); font-weight: 700; font-size: 0.94rem; display: flex; align-items: center; gap: 8px; cursor: pointer; padding: 8px 10px; }
.clear-history { background: transparent; border: 0; color: var(--danger); cursor: pointer; font-weight: 600; font-size: 0.86rem; display: flex; align-items: center; gap: 6px; padding: 8px 12px; border-radius: 8px; }
#feed { display: flex; flex-direction: column; gap: 14px; }
.empty-state { padding: 38px 24px; text-align: center; border-radius: 16px; color: var(--text-2); border: 1px dashed var(--border-hi); display: flex; flex-direction: column; align-items: center; gap: 10px; }
.feed-card { padding: 20px 24px; display: flex; flex-direction: column; gap: 12px; border-left: 4px solid var(--primary); }
.feed-card.done { border-left-color: var(--ok); }
.feed-card.failed { border-left-color: var(--danger); }
.card-top { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; }
.target-title { font-size: 1.08rem; font-weight: 700; margin: 0; display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.badge { background: var(--primary-glow); color: var(--text); padding: 3px 9px; border-radius: 6px; font-size: 0.71rem; font-weight: 700; border: 1px solid var(--border-hi); }
.meta { color: var(--text-3); font-size: 0.78rem; display: flex; align-items: center; gap: 6px; margin-top: 4px; flex-wrap: wrap; }
.status { font-size: 0.82rem; font-weight: 700; display: flex; align-items: center; gap: 6px; white-space: nowrap; color: var(--text-2); }
.done .status { color: var(--ok); }
.failed .status { color: var(--danger); }
.terminal { background: #0b1220; color: #34d399; font-family: ui-monospace, monospace; padding: 12px 15px; border-radius: 12px; font-size: 0.83rem; border: 1px solid var(--border); display: flex; align-items: center; gap: 10px; }
.progress-track { width: 100%; height: 4px; background: rgba(255,255,255,0.08); border-radius: 99px; overflow: hidden; }
.progress-fill { height: 100%; width: 35%; background: linear-gradient(90deg, var(--primary), var(--accent)); border-radius: 99px; animation: indeterminateBar 1.8s ease-in-out infinite alternate; }
@keyframes indeterminateBar { from { transform: translateX(-10%); width: 25%; } to { transform: translateX(220%); width: 45%; } }
.card-summary { background: var(--field); border: 1px solid var(--border); border-radius: 12px; padding: 13px 15px; font-size: 0.86rem; color: var(--text-2); line-height: 1.5; }
.card-summary strong { color: var(--text); }
.card-actions { display: flex; gap: 9px; flex-wrap: wrap; align-items: center; }
.btn-link { display: inline-flex; align-items: center; gap: 7px; text-decoration: none; padding: 9px 16px; border-radius: 10px; font-weight: 600; font-size: 0.84rem; cursor: pointer; background: var(--bg-surface); color: var(--text); border: 1px solid var(--border); transition: all 0.2s; }
.btn-link:hover { border-color: var(--primary); }
.btn-link.primary-action { background: var(--primary); color: #fff; border-color: var(--primary); }
.btn-link.podcast-action { background: rgba(139, 92, 246, 0.18); color: #c4b5fd; border-color: rgba(139, 92, 246, 0.45); }
.vault-list { display: flex; flex-direction: column; gap: 10px; max-height: 52vh; overflow-y: auto; margin-top: 12px; }
.vault-item { display: flex; justify-content: space-between; align-items: center; gap: 12px; padding: 12px 14px; border-radius: 12px; background: var(--field); border: 1px solid var(--border); flex-wrap: wrap; }
.vault-item-info { display: flex; flex-direction: column; gap: 3px; }
.vault-item-title { font-weight: 700; font-size: 0.9rem; color: var(--text); display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.vault-item-sub { font-size: 0.75rem; color: var(--text-2); }
.bottom-left-dock { position: fixed; bottom: 20px; left: 20px; z-index: 100; display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.dock-pill-btn { background: var(--bg-surface); border: 1px solid var(--border); padding: 9px 16px; border-radius: 30px; font-weight: 700; font-size: 0.8rem; cursor: pointer; backdrop-filter: blur(12px); color: var(--text-2); display: inline-flex; align-items: center; gap: 8px; box-shadow: 0 10px 25px rgba(0,0,0,0.35); }
.dock-pill-btn.secret-studio-pill { background: linear-gradient(135deg, rgba(16, 185, 129, 0.22), rgba(59, 130, 246, 0.22)); border-color: rgba(16, 185, 129, 0.55); color: #34d399; }
.changelog-entry { background: var(--field); border: 1px solid var(--border); border-left: 3px solid var(--primary); border-radius: 12px; padding: 14px 16px; margin-bottom: 12px; }
.changelog-entry.latest { border-left-color: var(--ok); background: color-mix(in srgb, var(--ok) 6%, var(--field)); }
.changelog-ver { display: flex; justify-content: space-between; align-items: center; font-weight: 800; font-size: 0.92rem; color: var(--text); margin-bottom: 6px; }
.changelog-date { font-size: 0.73rem; color: var(--text-3); font-weight: 600; }
.changelog-list { margin: 0; padding-left: 18px; font-size: 0.82rem; color: var(--text-2); line-height: 1.55; }
.overlay { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.72); backdrop-filter: blur(8px); z-index: 2000; opacity: 0; pointer-events: none; transition: opacity 0.3s; }
.modal { position: fixed; top: 5vh; left: 0; right: 0; margin: auto; width: min(740px, 94vw); max-height: 88vh; overflow: auto; padding: 28px; z-index: 2001; opacity: 0; pointer-events: none; transition: opacity 0.3s; }
.overlay.active, .modal.active { opacity: 1; pointer-events: all; }
.modal h3 { margin: 0 0 14px; font-size: 1.35rem; font-weight: 800; border-bottom: 1px solid var(--border); padding-bottom: 12px; display: flex; align-items: center; gap: 10px; }
.modal .close { background: var(--text); color: var(--bg-base); border: 0; padding: 12px; border-radius: 12px; width: 100%; font-weight: 700; font-size: 0.92rem; cursor: pointer; margin-top: 12px; }
.onboard-grid { display: flex; flex-direction: column; gap: 12px; margin: 12px 0; }
.onboard-field { display: flex; flex-direction: column; gap: 5px; font-size: 0.82rem; font-weight: 600; color: var(--text-2); }
.onboard-field input, .onboard-field select, .onboard-field textarea { padding: 10px 12px; border-radius: 10px; border: 1px solid var(--border); background: var(--field); color: var(--text); font-size: 0.88rem; font-weight: 600; }
.metric-bars { display: flex; flex-direction: column; gap: 10px; margin: 14px 0; }
.metric-row { display: flex; flex-direction: column; gap: 4px; font-size: 0.82rem; }
.metric-row-top { display: flex; justify-content: space-between; font-weight: 600; }
.bar-track { height: 8px; background: var(--field); border-radius: 99px; overflow: hidden; }
.bar-fill { height: 100%; background: linear-gradient(90deg, var(--primary), var(--accent)); border-radius: 99px; }
.bot-launcher { position: fixed; bottom: 20px; right: 20px; z-index: 1500; background: linear-gradient(135deg, var(--primary), var(--accent)); color: #fff; border: 0; border-radius: 99px; padding: 12px 18px; font-weight: 700; font-size: 0.88rem; cursor: pointer; box-shadow: 0 12px 30px var(--primary-glow); display: flex; align-items: center; gap: 8px; }
.bot-window { position: fixed; bottom: 78px; right: 20px; width: min(395px, 92vw); height: 510px; max-height: 76vh; z-index: 1501; display: flex; flex-direction: column; overflow: hidden; opacity: 0; pointer-events: none; transform: translateY(16px) scale(0.96); transition: opacity 0.25s, transform 0.25s; }
.bot-window.open { opacity: 1; pointer-events: all; transform: translateY(0) scale(1); }
.bot-header { padding: 14px 16px; border-bottom: 1px solid var(--border); background: color-mix(in srgb, var(--primary) 15%, transparent); display: flex; justify-content: space-between; align-items: center; }
.bot-title { display: flex; align-items: center; gap: 9px; font-weight: 800; font-size: 0.92rem; }
.bot-sub { font-size: 0.7rem; color: var(--text-2); font-weight: 500; display: block; }
.bot-messages { flex: 1; padding: 14px; overflow-y: auto; display: flex; flex-direction: column; gap: 10px; font-size: 0.84rem; line-height: 1.45; }
.bot-msg { padding: 10px 13px; border-radius: 13px; max-width: 88%; word-wrap: break-word; }
.bot-msg.ai { background: var(--field); border: 1px solid var(--border); color: var(--text); align-self: flex-start; }
.bot-msg.user { background: var(--primary); color: #fff; align-self: flex-end; }
.bot-action-btn { margin-top: 7px; display: inline-flex; align-items: center; gap: 6px; background: var(--primary); color: #fff; border: 0; padding: 6px 11px; border-radius: 8px; font-size: 0.75rem; font-weight: 700; cursor: pointer; }
.bot-prompts { display: flex; gap: 5px; flex-wrap: wrap; padding: 7px 12px; border-top: 1px solid var(--border); background: rgba(0,0,0,0.15); }
.bot-prompt-btn { background: var(--bg-surface); border: 1px solid var(--border); color: var(--text-2); font-size: 0.72rem; font-weight: 600; padding: 4px 9px; border-radius: 99px; cursor: pointer; }
.bot-input-bar { display: flex; gap: 8px; padding: 10px 12px; border-top: 1px solid var(--border); background: var(--bg-surface); }
.bot-input-bar input { flex: 1; background: var(--field); border: 1px solid var(--border); color: var(--text); padding: 9px 11px; border-radius: 10px; font-size: 0.84rem; }
.bot-send { background: var(--primary); color: #fff; border: 0; border-radius: 10px; width: 36px; display: grid; place-items: center; cursor: pointer; }
.toast { position: fixed; top: 20px; right: 20px; max-width: 88vw; background: var(--danger); color: #fff; padding: 13px 18px; border-radius: 12px; font-weight: 600; transform: translateX(150%); transition: transform 0.35s; z-index: 3000; display: flex; align-items: center; gap: 10px; }
.toast.success { background: var(--ok); }
.toast.show { transform: translateX(0); }
@media(max-width: 640px) { .logo-tagline, .kbd-badge { display: none; } .input-wrapper input { padding-right: 14px; } .bottom-left-dock { bottom: 12px; left: 12px; } .bot-launcher span { display: none; } }
</style>
</head>
<body>
<div class="bg-system" aria-hidden="true">
<div class="bg-layer active" id="bg-orb"><div class="orb orb-1"></div><div class="orb orb-2"></div></div>
<div class="bg-layer" id="bg-grid"><div class="grid-overlay"></div></div>
<div class="bg-layer" id="bg-radar"><div class="radar-rings"></div><div class="radar-sweep"></div></div>
<div class="bg-layer" id="bg-waves"><div class="wave-line"></div><div class="wave-line"></div></div>
</div>
<div id="toast" class="toast" role="status" aria-live="polite"><i data-lucide="alert-circle"></i><span></span></div>
<div class="overlay" id="modalOverlay"></div>
<div class="modal glass" id="appModal" role="dialog" aria-modal="true" aria-labelledby="modalTitle">
<h3 id="modalTitle"></h3>
<div id="modalBody"></div>
<button type="button" class="close" id="modalClose">Close Window (Esc)</button>
</div>
<header class="header">
<button type="button" class="logo" id="logoBtn" aria-label="VANTAGE OS Home">
<span class="logo-mark" id="secretLogoTrigger" title="VANTAGE OS Prism Core">
<svg width="24" height="24" viewBox="0 0 100 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<defs>
<linearGradient id="vantageGrad" x1="20" y1="16" x2="80" y2="84" gradientUnits="userSpaceOnUse">
<stop offset="0%" stop-color="#38BDF8"/>
<stop offset="50%" stop-color="#3B82F6"/>
<stop offset="100%" stop-color="#8B5CF6"/>
</linearGradient>
</defs>
<path d="M50 16 L79.4 33 V67 L50 84 L20.6 67 V33 Z" stroke="url(#vantageGrad)" stroke-width="6" fill="rgba(59,130,246,0.16)" stroke-linejoin="round"/>
<path d="M35.5 39 L50 66.5 L64.5 39" stroke="#FFFFFF" stroke-width="7" stroke-linecap="round" stroke-linejoin="round"/>
<circle cx="50" cy="36.5" r="6" fill="#38BDF8"/>
</svg>
</span>
<div class="logo-text-wrap">
<h1>VANTAGE <span class="logo-badge">OS</span></h1>
<span class="logo-tagline">Global 360° ABM & Market Intelligence</span>
</div>
</button>
<div class="context-bar" id="workspaceContextBar" hidden title="Enter any company worldwide — VANTAGE OS auto-discovers its official domain & scrapes live B2B OSINT">
<button type="button" class="brand-badge-btn" id="openBrandModalBtn">
<img id="barLogoImg" class="company-logo-img" src="https://www.google.com/s2/favicons?domain=xylem.com&sz=128" alt="">
<span id="barCompanyName">Xylem</span>
<i data-lucide="sliders" size="13"></i>
</button>
<div class="context-pill">
<label for="ctxCompany">Company:</label>
<input type="text" id="ctxCompany" value="Xylem" placeholder="Any company...">
</div>
<div class="context-pill">
<label for="ctxDomain">Domain:</label>
<input type="text" id="ctxDomain" value="xylem.com" placeholder="domain.com" style="width:135px">
</div>
<div class="context-pill">
<label for="ctxSector">Sector:</label>
<select id="ctxSector">
<option value="Auto-Detect">✨ Auto-Detect Sector</option>
<option value="Industrial & Energy">Industrial & Water/Energy</option>
<option value="E-Commerce">E-Commerce & Digital Growth</option>
<option value="B2B SaaS">B2B SaaS & Cloud</option>
<option value="FinTech">FinTech & Banking</option>
<option value="Healthcare">HealthTech & Bio</option>
</select>
</div>
<button type="button" class="scan-btn-mini" id="btnResearchCompany">
<i data-lucide="radar" size="13" id="headerScanIcon"></i>
<span>Research</span>
</button>
<button type="button" class="mode-indicator" id="modeBadge">
<span class="mode-dot"></span>
<span id="modeText">Demo Mode</span>
</button>
</div>
<div class="header-controls">
<!-- Global Multi-Language Selector (Enforces strict output language across Scraper & n8n) -->
<select id="globalLangSelect" class="lang-select-pill" aria-label="Output & Interface Language" title="Select Output Language for all OSINT Summaries & Deliverables">
<option value="en">🌐 EN (English)</option>
<option value="es">🇪🇸 ES (Español)</option>
<option value="de">🇩🇪 DE (Deutsch)</option>
<option value="fr">🇫🇷 FR (Français)</option>
<option value="pt">🇵🇹 PT (Português)</option>
<option value="it">🇮🇹 IT (Italiano)</option>
<option value="nl">🇳🇱 NL (Nederlands)</option>
<option value="ja">🇯🇵 JA (日本語)</option>
<option value="zh">🇨🇳 ZH (中文)</option>
<option value="ar">🇦🇪 AR (العربية)</option>
</select>
<button type="button" class="vault-btn" id="btnBackToLanding" hidden title="Product Overview, ABM Architecture & Pricing">
<i data-lucide="globe" size="15"></i>
<span>Product Site</span>
</button>
<button type="button" class="vault-btn" id="btnVault" hidden title="Open Saved Drive Files Vault">
<i data-lucide="folder-kanban" size="16"></i>
<span>Asset Vault</span>
<span class="vault-count" id="vaultCountBadge">Demo</span>
</button>
<button type="button" class="vault-btn login-cta" id="btnHeaderLogin">
<i data-lucide="log-in" size="15"></i>
<span id="btnHeaderLoginText">Client Login</span>
</button>
<button type="button" class="icon-btn" id="btnHome" hidden title="Change division"><i data-lucide="layout-grid"></i></button>
<button type="button" class="icon-btn" id="btnTheme" title="Toggle theme"><i data-lucide="moon" id="themeIcon"></i></button>
</div>
</header>
<!-- =====================================================================
VIEW 1: EXPANDED COMMERCIAL LANDING PAGE (GLOBAL 360° ABM + SME ICP)
===================================================================== -->
<main id="landing-view" class="view">
<section class="lp-hero">
<div class="lp-pill"><i data-lucide="globe-2" size="14"></i> VANTAGE OS v10.0 • Borderless 360° Account-Based Marketing & GTM Engine</div>
<h2>Know Every Target Account Inside-Out.<br><span>Prospect Anywhere in the World Without Human Error.</span></h2>
<p>Whether you are a Canadian enterprise expanding into Namibia, a European scaleup entering North America, or a lean B2B agency scaling outbound—VANTAGE OS replaces 20+ hours of manual research with surgical 4-layer ABM intelligence, custom-branded proposals, and AI audio briefings.</p>
<div class="lp-cta-row">
<button type="button" class="lp-btn-primary" id="lpBtnLogin">
<i data-lucide="key-round" size="18"></i> Sign In to Production OS
</button>
<button type="button" class="lp-btn-secondary" id="lpBtnDemo">
<i data-lucide="play-circle" size="18"></i> Launch 360° Interactive Demo
</button>
</div>
</section>
<!-- Deep 4-Layer ABM Methodology Section -->
<section class="lp-section">
<div class="lp-sec-head">
<h3>Surgical 4-Layer ABM Intelligence</h3>
<p>Generic outreach fails because marketers don't truly know their prospect. VANTAGE OS researches four concentric layers of B2B intelligence before writing a single word—allowing your team to be hyper-precise on the first touch.</p>
</div>
<div class="lp-abm-grid">
<div class="lp-abm-step glass">
<span class="lp-abm-num">Layer 01 • Macro Context</span>
<h4>🌍 Industry & Territory</h4>
<p>Scans any country or vertical worldwide (from Toronto to Windhoek, LATAM to APAC) for live tenders, regulatory shifts, distributor searches, and whitespace demand.</p>
</div>
<div class="lp-abm-step glass">
<span class="lp-abm-num">Layer 02 • Account Telemetry</span>
<h4>🏢 Company Architecture</h4>
<p>Audits the target company's live website, business model, financial scale tier, tech stack gaps, and direct competitor vulnerabilities in real time.</p>
</div>
<div class="lp-abm-step glass">
<span class="lp-abm-num">Layer 03 • Buying Committee</span>
<h4>👥 Decision-Maker Mapping</h4>
<p>Separates Economic Buyers (CEO/CFO) from Technical Champions (VP Ops/CMO), inferring corporate email patterns and direct LinkedIn coordinates.</p>
</div>
<div class="lp-abm-step glass">
<span class="lp-abm-num">Layer 04 • Career & Psychometrics</span>
<h4>🧠 Full Career & Persona</h4>
<p>Analyzes the decision-maker's entire career trajectory, past roles, KPIs, and friction triggers—crafting outreach hooks and proposals that resonate personally.</p>
</div>
</div>
</section>
<!-- ICP Section: Modular Power for SMEs, Lean Teams & Growth Partners -->
<section class="lp-section">
<div class="lp-sec-head">
<h3>Engineered for Lean Teams, SMEs & Growth Agencies</h3>
<p>Small teams lose deals when manual research takes days or copy-paste human errors ruin executive credibility. VANTAGE OS is 100% modular—activate only the workflows you need.</p>
</div>
<div class="lp-bento-grid">
<article class="lp-bento-card glass">
<div class="lp-bento-icon"><i data-lucide="clock" size="22"></i></div>
<h4>Save 18+ Hours Per Rep Weekly</h4>
<p>Eliminate manual tab-switching across search engines, news feeds, LinkedIn, and document editors. Compress 4 hours of account research and proposal formatting into a single 45-second autonomous run.</p>
<div class="lp-bento-meta"><i data-lucide="zap" size="14"></i> 95% Reduction in Pre-Call Preparation Time</div>
</article>
<article class="lp-bento-card glass">
<div class="lp-bento-icon"><i data-lucide="shield-check" size="22"></i></div>
<h4>Zero Copy-Paste Human Errors</h4>
<p>Small teams juggling multiple prospects often mix up client names, logos, or outdated metrics. VANTAGE OS programmatically injects the exact prospect's branding, verified B2B data, and target language every time.</p>
<div class="lp-bento-meta"><i data-lucide="check-circle-2" size="14"></i> Strict B2B Verification Filter (Zero Generalist Noise)</div>
</article>
<article class="lp-bento-card glass">
<div class="lp-bento-icon"><i data-lucide="blocks" size="22"></i></div>
<h4>100% Modular & Borderless</h4>
<p>Start with our 6 live Sales & Market Expansion modules today. Whether you are an SME exporting globally, a B2B SaaS startup, or an agency managing 20 client brands, the workspace adapts in 1 click.</p>
<div class="lp-bento-meta"><i data-lucide="globe" size="14"></i> 10+ Output Languages • Any Origin to Any Country</div>
</article>
</div>
</section>
<!-- 6 Live Modules + 2 Roadmap Divisions -->
<section class="lp-section">
<div class="lp-sec-head">
<h3>Production Architecture & Modular Roadmap</h3>
<p>All 6 Sales & Market Expansion modules are <strong>Live in Production</strong> today. Marketing Studio and Customer Success Engines are currently under construction for upcoming modular releases.</p>
</div>
<div class="lp-bento-grid">
<article class="lp-bento-card glass">
<h4><span>1. 360° Territory & Expansion Radar</span> <span class="status-pill-live">● Live</span></h4>
<p>Detects cross-border expansion signals between any two countries worldwide (local hiring, tenders, distributor searches, and market-entry press).</p>
<div class="lp-bento-meta"><i data-lucide="file-spreadsheet" size="14"></i> Branded Google Sheet + Verified Source Links</div>
</article>
<article class="lp-bento-card glass">
<h4><span>2. 360° Competitor & Account Brief</span> <span class="status-pill-live">● Live</span></h4>
<p>Deep B2B OSINT qualification on any target company or competitor. Extracts strategic initiatives, digital maturity score, and displacement angles.</p>
<div class="lp-bento-meta"><i data-lucide="headphones" size="14"></i> Executive Scorecard Doc + 90s AI Audio Podcast</div>
</article>
<article class="lp-bento-card glass">
<h4><span>3. Buying Committee Contact Sweep</span> <span class="status-pill-live">● Live</span></h4>
<p>Extracts the exact Buying Committee (Economic Buyers vs. Priority Champions) with LinkedIn links, corporate email patterns, and outreach sequences.</p>
<div class="lp-bento-meta"><i data-lucide="users" size="14"></i> Multi-Tab Contact Sheet Ready for Outbound</div>
</article>
<article class="lp-bento-card glass">
<h4><span>4. Career & Persona Psychology</span> <span class="status-pill-live">● Live</span></h4>
<p>Maps any decision-maker's full career background, role KPIs, friction triggers, and top 3 objections to arm marketers with surgical precision.</p>
<div class="lp-bento-meta"><i data-lucide="user-check" size="14"></i> Psychometric Dossier in Google Docs</div>
</article>
<article class="lp-bento-card glass">
<h4><span>5. Deal Velocity & Risk Audit</span> <span class="status-pill-live">● Live</span></h4>
<p>Audits active pipeline opportunities against competitor threats and CFO procurement bottlenecks with concrete unblocking plays.</p>
<div class="lp-bento-meta"><i data-lucide="gauge" size="14"></i> Executive Deal Risk & ROI Report</div>
</article>
<article class="lp-bento-card glass">
<h4><span>6. Executive Proposal Architect</span> <span class="status-pill-live">● Live</span></h4>
<p>1-click generation of client-ready commercial proposals mapping diagnosed challenges to a 3-phase execution roadmap—styled with your brand.</p>
<div class="lp-bento-meta"><i data-lucide="file-text" size="14"></i> Custom-Branded Proposal Doc + Audio Briefing</div>
</article>
<article class="lp-bento-card glass roadmap-card">
<h4><span>7. Demand & Growth Studio (Marketing)</span> <span class="status-pill-dev">🚧 Under Construction</span></h4>
<p>Upcoming modular release: Competitor Ad Share-of-Voice Audits, AI Budget Reallocation, ABM Landing Page Builder, and Event Lead OSINT.</p>
<div class="lp-bento-meta" style="color:var(--warn)"><i data-lucide="Sparkles" size="14"></i> In Development • Included in Pro Roadmap</div>
</article>
<article class="lp-bento-card glass roadmap-card">
<h4><span>8. Account Expansion & Retention (CS)</span> <span class="status-pill-dev">🚧 Under Construction</span></h4>
<p>Upcoming modular release: Automated Executive QBR Decks, Telemetry Churn Radar, and Net-Dollar-Retention Upsell Playbooks.</p>
<div class="lp-bento-meta" style="color:var(--warn)"><i data-lucide="Sparkles" size="14"></i> In Development • Included in Pro Roadmap</div>
</article>
</div>
</section>
<!-- Pricing Tiers Section -->
<section class="lp-section">
<div class="lp-sec-head">
<h3>Predictable Monthly SaaS Subscription</h3>
<p>Zero custom development financing. Zero third-party API management. Start with the live Sales & Market Expansion Engine today.</p>
</div>
<div class="lp-pricing-grid">
<div class="lp-price-card glass">
<div class="lp-tier-name">Growth Pilot (SME & Lean Teams)</div>
<div class="lp-tier-price">€149 <span>/ month</span></div>
<p class="lp-tier-desc">Ideal for SMEs, lean sales teams, and agencies automating global prospecting and deep ABM qualification.</p>
<ul class="lp-feat-list">
<li><i data-lucide="check" size="16"></i> <strong>All 6 Live Sales & Market Expansion Modules</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>360° Global Scope</strong> (Prospect in any country/language)</li>
<li><i data-lucide="check" size="16"></i> <strong>150 Live Deep OSINT & ABM Runs / month</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>Automatic Brand Styling</strong> on all Google Docs & Sheets</li>
<li><i data-lucide="check" size="16"></i> <strong>Permanent Google Drive Asset Vault</strong></li>
</ul>
<button type="button" class="lp-btn-secondary" style="width:100%;justify-content:center" data-login-trigger="Growth Pilot">Start Growth Pilot</button>
</div>
<div class="lp-price-card glass featured">
<span class="lp-pop-badge">Most Popular • Full ABM Stack</span>
<div class="lp-tier-name">Pro GTM & Growth Partner</div>
<div class="lp-tier-price">€349 <span>/ month</span></div>
<p class="lp-tier-desc">Designed for scaling B2B companies and Growth Partners running continuous multi-brand ABM and audio briefings.</p>
<ul class="lp-feat-list">
<li><i data-lucide="check" size="16"></i> <strong>All 6 Live Modules + Early Access to Marketing & CS</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>500 Live OSINT & Deep Career ABM Runs / month</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>AI Audio Podcast Briefings (.wav)</strong> included</li>
<li><i data-lucide="check" size="16"></i> <strong>Unlimited Brand Workspace Switching</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>Priority Cloud Webhook Execution</strong></li>
</ul>
<button type="button" class="lp-btn-primary" style="width:100%;justify-content:center" data-login-trigger="Pro GTM">Sign In / Activate Pro GTM</button>
</div>
<div class="lp-price-card glass">
<div class="lp-tier-name">Enterprise & Multi-Seat</div>
<div class="lp-tier-price">€690 <span>/ month</span></div>
<p class="lp-tier-desc">For international revenue organizations requiring dedicated webhook clusters and custom templates.</p>
<ul class="lp-feat-list">
<li><i data-lucide="check" size="16"></i> <strong>Unlimited Team Seats & Dedicated Drive Vault</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>1,500+ Live Agent Executions / month</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>Custom White-Label Document Templates</strong></li>
<li><i data-lucide="check" size="16"></i> <strong>Dedicated GTM Engineering Support</strong></li>
</ul>
<button type="button" class="lp-btn-secondary" style="width:100%;justify-content:center" data-login-trigger="Enterprise">Client Portal Login</button>
</div>
</div>
</section>
</main>
<!-- =====================================================================
VIEW 2: DIVISION PORTAL VIEW
===================================================================== -->
<main id="portal-view" class="view" hidden>
<div class="portal-hero">
<button type="button" class="adapt-banner" id="heroBrandBanner">
<img id="heroLogoImg" class="company-logo-img" src="https://www.google.com/s2/favicons?domain=xylem.com&sz=128" alt="">
<span id="portalContextBanner">VANTAGE OS • Active Workspace: Xylem (xylem.com)</span>
<i data-lucide="sliders" size="14"></i>
</button>
<h2 id="portalHeroTitle">Xylem — Global 360° ABM & Market Intelligence</h2>
<p>Type any company worldwide in the header bar: VANTAGE OS verifies the corporate entity, scrapes its live website, Wikipedia, and press footprint in your selected language, and calibrates metrics to its real scale.</p>
</div>
<section class="company-intel-strip glass" id="portalCompanyIntelStrip" aria-label="Company Intelligence Snapshot"></section>
<div class="dept-grid">
<button type="button" class="dept-card glass" data-dept="sales" style="--card-accent:#3b82f6">
<div class="dept-top-row">
<span class="dept-icon"><i data-lucide="briefcase" size="28"></i></span>
<span class="status-pill-live">● 6 Modules Live</span>
</div>
<h3>Sales & Market Expansion</h3>
<p>Global 360° territory radar, deep competitor briefs, buying-committee contact sweep, career persona psychology, and branded proposals + podcasts.</p>
<div class="dept-tags">
<span class="dept-tag">360° Global Expansion</span>
<span class="dept-tag">Career & Persona ABM</span>
<span class="dept-tag">AI Audio Podcast</span>
</div>
</button>
<button type="button" class="dept-card glass" data-dept="marketing" style="--card-accent:#8b5cf6">
<div class="dept-top-row">
<span class="dept-icon"><i data-lucide="megaphone" size="28"></i></span>
<span class="status-pill-dev">🚧 Under Construction</span>
</div>
<h3>Demand & Growth Studio</h3>
<p>Competitor share-of-voice audits, AI budget reallocation, ABM landing pages, and high-converting outbound sequences.</p>
<div class="dept-tags">
<span class="dept-tag">Roadmap Module</span>
<span class="dept-tag">ABM Studio</span>
<span class="dept-tag">Event OSINT</span>
</div>
</button>
<button type="button" class="dept-card glass" data-dept="cs" style="--card-accent:#10b981">
<div class="dept-top-row">
<span class="dept-icon"><i data-lucide="heart-handshake" size="28"></i></span>
<span class="status-pill-dev">🚧 Under Construction</span>
</div>
<h3>Account Expansion & Retention</h3>
<p>Executive QBR decks, competitive churn-risk telemetry, and automated net-dollar-retention expansion playbooks.</p>
<div class="dept-tags">
<span class="dept-tag">Roadmap Module</span>
<span class="dept-tag">Upsell Signals</span>
<span class="dept-tag">Executive QBR</span>
</div>
</button>
</div>
</main>
<!-- =====================================================================
VIEW 3: TOOL EXECUTION DASHBOARD VIEW
===================================================================== -->
<main id="dashboard-view" class="view" hidden>
<div class="dash-top">
<div class="dash-top-left">
<img id="dashLogoImg" class="dash-brand-logo" src="https://www.google.com/s2/favicons?domain=xylem.com&sz=128" alt="">
<div class="dash-hero">
<h2 id="dashTitle"></h2>
<p id="dashDesc"></p>
</div>
</div>
<button type="button" class="btn-link" id="syncCompanyOsintBtn" style="padding:8px 14px;font-size:0.8rem">
<i data-lucide="refresh-cw" size="14" id="syncOsintIcon"></i>
<span id="syncOsintText">Live Company OSINT Synced</span>
</button>
</div>
<!-- Banner shown automatically when user inspects Marketing or CS (Under Construction) -->
<div id="underConstructionBanner" class="construction-banner" hidden>
<span>🚧 <strong>Modular Roadmap Notice:</strong> This division is currently <strong>Under Construction</strong>. All 6 production agents in <strong>Sales & Market Expansion</strong> are 100% Live!</span>
<button type="button" class="btn-link primary-action" id="btnSwitchToLiveSales" style="padding:6px 12px;font-size:0.78rem">Switch to Live Sales Engine</button>
</div>
<section class="company-intel-strip glass" id="dashCompanyIntelStrip" style="max-width:100%;margin-bottom:16px"></section>
<div class="kpi-strip" id="kpiStrip"></div>
<div class="command-card glass">
<div class="tabs" id="dynamicTabs" role="tablist"></div>
<div class="tool-context-row">
<div class="preset-chips" id="presetChips"></div>
<button type="button" class="podcast-toggle-btn active" id="podcastToggleBtn" aria-pressed="true">
<i data-lucide="headphones" size="14"></i>
<span id="podcastToggleText">🎧 AI Podcast: ON</span>
</button>
</div>
<div class="input-group" role="tabpanel" id="toolPanel">
<div class="input-row">
<div class="input-wrapper">
<i data-lucide="search" class="input-icon" id="mainInputIcon"></i>
<label for="mainInput" class="sr-only" id="mainLabel">Target</label>
<input type="text" id="mainInput" autocomplete="off" maxlength="200">
<div class="kbd-badge" aria-hidden="true"><kbd id="kbdMod">⌘</kbd><kbd>K</kbd></div>
</div>
<select id="paramSelect" class="param-select">
<option value="Market Expansion & Competitor Analysis">🎯 Intent: Market Expansion & Competitor Analysis</option>
<option value="Deep ABM (Industry, Account & Decision-Maker Career)">🧠 Intent: Deep ABM (Account & Decision-Maker Career)</option>
<option value="Competitor Displacement & Battlecard">⚔️ Intent: Competitor Displacement & Battlecard</option>
<option value="New Territory & Cross-Border Whitespace">🌍 Intent: New Territory & Cross-Border Whitespace</option>
<option value="Executive ROI & CFO Business Case">💼 Intent: Executive ROI & CFO Business Case</option>
<option value="Strategic Partnership & Ecosystem Alliances">🤝 Intent: Strategic Partnership & Alliances</option>
</select>
</div>
<button type="button" class="action-btn" id="generateBtn">
<i data-lucide="zap" id="btnIcon"></i>
<span id="btnText">Run VANTAGE Agent</span>
</button>
</div>
</div>
<section class="feed-section">
<div class="feed-header">
<button type="button" class="feed-toggle" id="feedToggle" aria-expanded="true" aria-controls="feed">
<i data-lucide="chevron-down" class="chev" size="18"></i> VANTAGE OS Live Feed & Saved Deliverables
</button>
<div style="display:flex;gap:8px;align-items:center">
<button type="button" class="btn-link" id="openVaultInlineBtn" style="padding:6px 12px;font-size:0.8rem">
<i data-lucide="folder-open" size="14"></i> Open Asset Vault
</button>
<button type="button" class="clear-history" id="clearBtn"><i data-lucide="trash-2" size="16"></i> Clear view</button>
</div>
</div>
<div id="feed" aria-live="polite"></div>
</section>
</main>
<!-- BOTTOM-LEFT DUAL DOCK -->
<div class="bottom-left-dock">
<button type="button" class="dock-pill-btn secret-studio-pill" id="secretProposalBtn" hidden title="Master Admin Only: SaaS Proposal Studio & Client User Generator">
<i data-lucide="shield-check" size="16"></i>
<span>🔒 Admin Studio & Users</span>
</button>
<button type="button" class="dock-pill-btn" id="changelogBtn" title="View VANTAGE OS v10.0 Product Changelog & Release History">
<i data-lucide="sparkles" size="16"></i>
<span>VANTAGE OS • v10.0 Changelog</span>
</button>
</div>
<button type="button" class="bot-launcher" id="botLauncher">
<i data-lucide="bot" size="20"></i>
<span>VANTAGE Copilot</span>
</button>
<aside class="bot-window glass" id="botWindow">
<div class="bot-header">
<div class="bot-title">
<i data-lucide="sparkles" size="18"></i>
<div>
VANTAGE OS Copilot
<span class="bot-sub" id="botSubLabel">Global 360° ABM, Persona & ROI Engine</span>
</div>
</div>
<button type="button" class="icon-btn" id="botCloseBtn" style="width:30px;height:30px"><i data-lucide="x" size="15"></i></button>
</div>
<div class="bot-messages" id="botMessages"></div>
<div class="bot-prompts">
<button type="button" class="bot-prompt-btn" data-q="How does 4-layer ABM & Career Persona research work?">🧠 4-Layer ABM?</button>
<button type="button" class="bot-prompt-btn" data-q="Can a Canadian company prospect in Namibia or globally?">🌍 Global 360°?</button>
<button type="button" class="bot-prompt-btn" data-q="How can I calculate ROI for a marketing campaign?">📊 Marketing ROI?</button>
<button type="button" class="bot-prompt-btn" data-q="Which modules are Live vs Under Construction?">⚡ Live Modules?</button>
</div>
<form class="bot-input-bar" id="botForm">
<input type="text" id="botInput" placeholder="Ask about 360° ABM, career personas, ROI..." autocomplete="off">
<button type="submit" class="bot-send"><i data-lucide="send" size="16"></i></button>
</form>
</aside>
<script>
/**
* ============================================================================
* VANTAGE OS v10.0 — UNIVERSAL VERCEL + GOOGLE APPS SCRIPT BRIDGE
* ============================================================================
* Funciona de forma transparente tanto alojado en Vercel (https://vantage-os.io)
* como dentro de Google Apps Script Web App.
*/
var PRODUCT_BRAND_NAME = 'VANTAGE OS';
var GAS_API_URL = 'https://script.google.com/macros/s/AKfycbzVcJyLKAkJneXw__s6cgLCFx3JoGNGrmFx56ijVJjMU5EHwT306AjgIFUfGNjC5PNJUw/exec';
function $(id) { return document.getElementById(id); }
function icons() { if (window.lucide) lucide.createIcons(); }
function decodeHtmlEntities(str) {
if (!str) return '';
var txt = document.createElement('textarea');
txt.innerHTML = String(str);
return txt.value;
}
function esc(s) {
var clean = decodeHtmlEntities(s || '');
return String(clean).replace(/[&<>"']/g, function(c) {
return {'&':'&','<':'<','>':'>','"':'"',"'":'''}[c];
});
}
function safeUrl(u) { return /^https?:\/\//i.test(String(u || '')) ? u : '#'; }
function hasNativeGas() { return Boolean(window.google && google.script && google.script.run); }
/**
* Puente Universal: Si corre en Google Apps Script usa google.script.run;
* Si corre en Vercel (vantage-os.io) usa fetch() POST hacia handleVercelApiAction en Código.gs
*/
function callVantageBackend(apiAction, payloadObj, onSuccess, onFailure) {
var p = payloadObj || {};
if (hasNativeGas()) {
var runner = google.script.run
.withSuccessHandler(function(res) { if (onSuccess) onSuccess(res); })
.withFailureHandler(function(err) { if (onFailure) onFailure(err); });
switch (apiAction) {
case 'getCompanyLiveIntelligence':
runner.getCompanyLiveIntelligence(p.company, p.sector, p.domain, p.lang); break;
case 'authenticateVantageUser':
runner.authenticateVantageUser(p.username, p.passkey); break;
case 'getGeneratedAssetsHistory':
runner.getGeneratedAssetsHistory(p.token); break;
case 'getLatestPodcastAudioUrl':
runner.getLatestPodcastAudioUrl(p.targetName, p.token); break;
case 'runUnifiedTask':
runner.runUnifiedTask(p); break;
case 'checkUnifiedCache':
runner.checkUnifiedCache(p.target, p.type, p.token); break;
case 'generateFinalAsset':
runner.generateFinalAsset(p.jsonString, p.type, p.token, p.contextObj); break;
case 'logVisitorTelemetry':
runner.logVisitorTelemetry(p); break;
case 'generateCustomVantageSaasProposal':
runner.generateCustomVantageSaasProposal(p); break;
case 'createClientUser':
runner.createClientUser(p); break;
case 'getClientUsersList':
runner.getClientUsersList(p.adminToken); break;
case 'deleteClientUser':
runner.deleteClientUser(p.username, p.adminToken); break;
default:
if (onFailure) onFailure(new Error('Unknown action: ' + apiAction));
}
return;
}
// Modo Vercel / Dominio Externo (vantage-os.io) vía Fetch REST Gateway:
fetch(GAS_API_URL, {
method: 'POST',
headers: { 'Content-Type': 'text/plain;charset=utf-8' },
body: JSON.stringify({ apiAction: apiAction, payload: p })
})
.then(function(r) { return r.json(); })
.then(function(resJson) {
if (resJson && resJson.ok) {
if (onSuccess) onSuccess(resJson.data);
} else {
if (onFailure) onFailure(new Error((resJson && resJson.error) || 'API Error'));
}
})
.catch(function(err) {
if (onFailure) onFailure(err);
});
}
var useSimMode = true;
var adminToken = "";
var currentUserRole = "guest";
var currentUsername = "";
var currentUiLang = "en";
var generatePodcastEnabled = true;
var POLL_MS = 5000;
var JOB_TIMEOUT_MS = 600000;
var ownerExcludedMemory = false;
try {
ownerExcludedMemory = (localStorage.getItem('ios_ignore_telemetry') === 'true');
var savedLang = localStorage.getItem('vantage_ui_lang');
if (savedLang) currentUiLang = savedLang;
} catch (e) {}
var currentDeptKey = 'sales';
var currentDept = null;
var currentTool = null;
var activeJobs = {};
var reportStore = {};
var vaultAssetsCache = [];
var liveCompanyOsintCache = {};
var liveFetchDebounce = null;
var domainAutocompleteDebounce = null;
function isOwnerDeviceIgnored() {
if (ownerExcludedMemory || currentUserRole === 'admin') return true;
try { return localStorage.getItem('ios_ignore_telemetry') === 'true'; } catch (e) { return false; }
}
function setOwnerDeviceIgnored(state) {
ownerExcludedMemory = Boolean(state);
try { localStorage.setItem('ios_ignore_telemetry', state ? 'true' : 'false'); } catch (e) {}
}
function getActiveLang() {
var sel = $('globalLangSelect');
return sel ? sel.value : (currentUiLang || 'en');
}
function inferDomainFromCompanyName(companyName) {
var raw = String(companyName || '').trim();
if (!raw) return 'example.com';
if (raw.indexOf('.') !== -1 && raw.indexOf(' ') === -1) {
return raw.toLowerCase().replace(/^https?:\/\//, '').replace(/^www\./, '').split('/')[0];
}
var lower = raw.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, '');
if (/\b(canal\s*(de\s*)?isabel|isabel\s*(ii|2|segunda))\b/i.test(lower)) {
return 'canaldeisabelsegunda.es';
}
var clean = lower.replace(/[^a-z0-9]/g, '');
if (!clean) return 'company.com';
return clean + '.com';
}
function autoDiscoverOfficialDomain(companyName, targetInputEl, callback) {
var q = String(companyName || '').trim();
if (!q || q.length < 2) return;
var heuristicDomain = inferDomainFromCompanyName(q);
if (targetInputEl) targetInputEl.value = heuristicDomain;
if (heuristicDomain === 'canaldeisabelsegunda.es') {
if (callback) callback(heuristicDomain);
return;
}
fetch('https://autocomplete.clearbit.com/v1/companies/suggest?query=' + encodeURIComponent(q))
.then(function(r) { return r.json(); })
.then(function(list) {
if (Array.isArray(list) && list.length > 0 && list[0].domain) {
var foundDomain = String(list[0].domain).toLowerCase().trim();
if (targetInputEl) targetInputEl.value = foundDomain;
if (callback) callback(foundDomain);
} else if (callback) {
callback(heuristicDomain);
}
})
.catch(function() { if (callback) callback(heuristicDomain); });
}
function getContext() {
var company = ($('ctxCompany').value || 'Xylem').trim();
var domain = ($('ctxDomain').value || inferDomainFromCompanyName(company)).trim().toLowerCase();
var cleanKey = company.toLowerCase().replace(/[^a-z0-9]/g, '');
var cached = liveCompanyOsintCache[cleanKey + '_' + getActiveLang()] || liveCompanyOsintCache[cleanKey] || {};
var sectorSelectVal = $('ctxSector').value;
var sector = (sectorSelectVal === 'Auto-Detect')
? (cached.detectedSector || 'B2B SaaS')
: sectorSelectVal;
return { company: company, sector: sector, domain: domain, lang: getActiveLang() };
}
function hashSeed(str) {
var h = 2166136261, s = String(str || 'vantage').toLowerCase();
for (var i = 0; i < s.length; i++) { h ^= s.charCodeAt(i); h = Math.imul(h, 16777619); }
return Math.abs(h);
}
function buildDynamicCompanyTelemetry(ctx) {
var cleanName = ctx.company;
var lang = getActiveLang();
var key = cleanName.toLowerCase().replace(/[^a-z0-9]/g, '');
var osint = liveCompanyOsintCache[key + '_' + lang] || liveCompanyOsintCache[key] || {};
// Si el servidor determinó que la empresa NO existe (o era una canción/película descartada):
if (osint.companyFound === false) {
return {
company: cleanName,
companyFound: false,
domain: 'unverified-entity',
sector: 'Unverified',
scaleTier: 'Company Not Found',
hqMarket: 'N/A',
businessModel: osint.liveDescription || ('Company could not be found: No verified corporate website or B2B entity matched "' + cleanName + '".'),
targetIcp: 'Please enter a valid company name or official corporate domain above.',
liveTitle: '',
liveSignal: '',
isLiveScraped: false,
kpis: osint.scaledKpis || []
};
}
var effectiveDomain = osint.resolvedDomain || ctx.domain;
var rawTitle = decodeHtmlEntities(osint.liveTitle || '');
var rawDesc = decodeHtmlEntities(osint.liveDescription || '');
var rawNews = decodeHtmlEntities(osint.latestNewsSignal || '');
var activeSector = ($('ctxSector').value !== 'Auto-Detect')
? $('ctxSector').value
: (osint.detectedSector || ctx.sector || 'B2B SaaS');
var detectedMarket = osint.hqMarket || ('Global 360° Market (' + effectiveDomain + ')');
var businessSummary = rawDesc ||
(rawTitle && rawNews ? (rawTitle + ' — Verified Media Signal: "' + rawNews + '"') : '') ||
rawTitle ||
(rawNews ? (cleanName + ' (' + effectiveDomain + ') — Verified Market Signal: "' + rawNews + '"') : '') ||
('Synchronizing multi-layer B2B OSINT profile (Official Web + Wikipedia + Press) for ' + cleanName + ' (' + effectiveDomain + ')...');
var targetIcp = osint.targetIcp || 'COOs, CIOs, VPs of Growth, and Enterprise B2B Buying Committees worldwide.';
var seed = hashSeed(cleanName + '_' + effectiveDomain + '_' + activeSector);
var isEur = /\.es$|\.eu$|\.de$|\.fr$|\.it$|\.nl$/i.test(effectiveDomain);
var curr = isEur ? '€' : '$';
var finalKpis = (Array.isArray(osint.scaledKpis) && osint.scaledKpis.length === 6) ? osint.scaledKpis : [
{ label: 'Customer & Reach Scale YTD', val: '+' + (48 + (seed % 180)) + ' Active Accounts', delta: '+' + (18 + (seed % 21)) + '.4% YoY', sub: 'Estimated global customer footprint for ' + cleanName },
{ label: 'Estimated Revenue Scale YTD', val: curr + (14.2 + ((seed % 220) / 10)).toFixed(1) + 'M Turnover', delta: '+' + (16 + (seed % 14)) + '.2% YoY', sub: 'Estimated revenue scale (' + activeSector + ')' },
{ label: 'Retention & Continuity YTD', val: (113 + (seed % 13)) + '.' + (seed % 9) + '% NRR YTD', delta: (94 + (seed % 5)) + '.2% Renewal', sub: 'Contract continuity & account retention' },
{ label: 'Share of Voice & Media YTD', val: '+' + (38 + (seed % 40)) + '.4% Share of Voice', delta: 'Verified B2B Presence', sub: 'Brand authority, press & search visibility YTD' },
{ label: 'Estimated GTM / CapEx Budget', val: curr + (680 + (seed % 850)) + 'K Digital/GTM', delta: '4.6x Target ROI', sub: 'Estimated allocation for global expansion & ABM' },
{ label: 'Market Expansion & Win-Rate', val: '+' + (28 + (seed % 16)) + '.5% Competitive Win', delta: osint.scaleTier || 'Category Leader', sub: 'Cross-border positioning in ' + activeSector }
];
return {
company: cleanName,
companyFound: true,
domain: effectiveDomain,
sector: activeSector,
scaleTier: osint.scaleTier || 'Global / Mid-Market',
hqMarket: detectedMarket,
businessModel: businessSummary,
targetIcp: targetIcp,
liveTitle: rawTitle,
liveSignal: rawNews,
isLiveScraped: Boolean(rawDesc || rawNews || rawTitle),
kpis: finalKpis
};
}
var DEPARTMENTS = {
sales: {
title: 'Sales & Market Expansion Engine',
isLive: true,
desc: '6 Production Modules Live: Borderless 360° territory radar, deep competitor briefs, buying-committee sweep, career persona psychology, and branded proposals + podcasts.',
tools: [
{ id: 'territory', label: '360° Territory & Expansion', icon: 'globe', bg: 'radar', defaultAudio: false, placeholder: 'Any Target Region Worldwide (e.g. Namibia, Canada, DACH, LATAM, APAC, North America)', btnText: 'Scan Global Territory & Competitors' },
{ id: 'utility', label: '360° Account & Competitor Brief', icon: 'building-2', bg: 'grid', defaultAudio: true, placeholder: 'Target Account or Competitor Name (Generates Deep ABM Brief + Podcast)', btnText: 'Run 360° Account & Competitor Audit' },
{ id: 'contacts', label: 'Buying Committee Sweep', icon: 'users', bg: 'orb', defaultAudio: false, placeholder: 'Target Account or Segment to Extract Decision-Makers', btnText: 'Sweep Buying Committee Contacts' },
{ id: 'persona', label: 'Career & Persona Psychology', icon: 'user', bg: 'orb', defaultAudio: false, placeholder: 'Decision-Maker Name & Company (Analyzes Full Career, KPIs & Objections)', btnText: 'Analyze Career & Buyer Persona' },
{ id: 'deal_intel', label: 'Deal Velocity & Risk Audit', icon: 'gauge', bg: 'radar', defaultAudio: false, placeholder: 'Active Opportunity or Competitor Threat to Audit', btnText: 'Audit Deal Velocity & Risk' },
{ id: 'external', label: 'Executive Proposal Architect', icon: 'file-text', bg: 'waves', defaultAudio: true, placeholder: 'Prospect Account & Solution Scope (Generates Branded Proposal Doc + Podcast)', btnText: 'Draft Executive Proposal & Podcast' }
]
},
marketing: {
title: 'Demand & Growth Studio (Under Construction)',
isLive: false,
desc: 'Modular Roadmap Division (Under Construction): Competitor ad share-of-voice diagnostics, AI budget allocation, and ABM landing pages.',
tools: [
{ id: 'campaign_perf', label: 'Competitive Campaign AI (Preview)', icon: 'bar-chart-3', bg: 'radar', defaultAudio: false, placeholder: 'Campaign Channel Mix or Competitor Funnel', btnText: 'Preview Campaign Audit (Under Construction)' },
{ id: 'landing', label: 'ABM Landing Page (Preview)', icon: 'layout-template', bg: 'grid', defaultAudio: false, placeholder: 'Target Vertical or ABM Theme', btnText: 'Preview ABM Page (Under Construction)' },
{ id: 'event', label: 'Event & Field OSINT (Preview)', icon: 'calendar', bg: 'radar', defaultAudio: false, placeholder: 'Global Conference or Trade Show', btnText: 'Preview Event Strategy (Under Construction)' }
]
},
cs: {
title: 'Account Expansion & Retention (Under Construction)',
isLive: false,
desc: 'Modular Roadmap Division (Under Construction): Executive QBR decks, telemetry churn prevention, and net-dollar-retention expansion playbooks.',
tools: [
{ id: 'qbr', label: 'Executive QBR Deck (Preview)', icon: 'presentation', bg: 'grid', defaultAudio: false, placeholder: 'Client Account Name', btnText: 'Preview Executive QBR (Under Construction)' },
{ id: 'churn', label: 'Churn Risk Telemetry (Preview)', icon: 'activity', bg: 'radar', defaultAudio: false, placeholder: 'Client Account or Cohort', btnText: 'Preview Churn Diagnostics (Under Construction)' },
{ id: 'expansion', label: 'Expansion & Upsell Radar (Preview)', icon: 'trending-up', bg: 'orb', defaultAudio: false, placeholder: 'Account or Product Module', btnText: 'Preview Expansion Radar (Under Construction)' }
]
}
};
function setPodcastToggleState(enabled, savePref) {
generatePodcastEnabled = Boolean(enabled);
if (savePref) {
try { localStorage.setItem('vantage_podcast_enabled', generatePodcastEnabled ? 'true' : 'false'); } catch (e) {}
}
var btn = $('podcastToggleBtn'), txt = $('podcastToggleText');
if (!btn || !txt) return;
btn.classList.toggle('active', generatePodcastEnabled);
btn.setAttribute('aria-pressed', generatePodcastEnabled ? 'true' : 'false');
txt.textContent = generatePodcastEnabled ? '🎧 AI Podcast: ON' : '🔇 AI Podcast: OFF';
}
function renderCompanyIntelStrip(profile) {
var isNotFound = (profile.companyFound === false);
if ($('portalCompanyIntelStrip')) $('portalCompanyIntelStrip').classList.toggle('not-found', isNotFound);
if ($('dashCompanyIntelStrip')) $('dashCompanyIntelStrip').classList.toggle('not-found', isNotFound);
var liveBadge = isNotFound
? '<span class="intel-pill error-pill">⚠️ Company Could Not Be Found</span>'
: (profile.isLiveScraped
? '<span class="intel-pill live-osint">⚡ Verified B2B Web, Wikipedia & News OSINT</span>'
: '<span class="intel-pill">🛰️ Ready to Scrape (' + esc(profile.domain) + ')</span>');
var tierBadge = (!isNotFound && profile.scaleTier)
? '<span class="intel-pill tier-pill">🏛️ ' + esc(profile.scaleTier) + '</span>'
: '';
var signalHtml = '';
if (!isNotFound && profile.liveSignal) {
signalHtml = '<div class="intel-news-bar"><i data-lucide="newspaper" size="15"></i> <span><strong>Verified Market Signal:</strong> ' + esc(profile.liveSignal) + '</span></div>';
} else if (!isNotFound && profile.liveTitle) {
signalHtml = '<div class="intel-news-bar"><i data-lucide="globe" size="15"></i> <span><strong>Official Web Header (' + esc(profile.domain) + '):</strong> ' + esc(profile.liveTitle) + '</span></div>';
}
var html =
'<div class="intel-strip-top">' +
'<div class="intel-strip-title"><i data-lucide="radar" size="17" style="color:var(--primary)"></i> <span>VANTAGE OS 360° Company Intelligence: <strong>' + esc(profile.company) + '</strong> <span style="color:var(--text-2);font-weight:500">(' + esc(profile.domain) + ')</span></span></div>' +
'<div class="intel-strip-badges">' + liveBadge + tierBadge + '<span class="intel-pill">🌍 Scope: ' + esc(profile.hqMarket) + '</span><span class="intel-pill">🏷️ Sector: ' + esc(profile.sector) + '</span></div>' +
'</div>' +
'<div class="intel-grid-details">' +
'<div class="intel-detail-box"><strong>🏢 Verified Business Model & Value Proposition</strong>' + esc(profile.businessModel) + '</div>' +
'<div class="intel-detail-box"><strong>🎯 Target Market, ICP & ABM Ecosystem</strong>' + esc(profile.targetIcp) + '</div>' +
'</div>' + signalHtml;
if ($('portalCompanyIntelStrip')) $('portalCompanyIntelStrip').innerHTML = html;
if ($('dashCompanyIntelStrip')) $('dashCompanyIntelStrip').innerHTML = html;
icons();
}
function triggerLiveCompanyOsintFetch(ctx, forceToast) {
if ($('dashCompanyIntelStrip')) $('dashCompanyIntelStrip').classList.add('syncing');
if ($('portalCompanyIntelStrip')) $('portalCompanyIntelStrip').classList.add('syncing');
if ($('syncOsintIcon')) $('syncOsintIcon').classList.add('spin');
if ($('headerScanIcon')) $('headerScanIcon').classList.add('spin');
if ($('syncOsintText')) $('syncOsintText').textContent = 'Scraping ' + ctx.domain + '…';
var reqLang = getActiveLang();
callVantageBackend(
'getCompanyLiveIntelligence',
{ company: ctx.company, sector: ctx.sector, domain: ctx.domain, lang: reqLang },
function(liveRes) {
if ($('dashCompanyIntelStrip')) $('dashCompanyIntelStrip').classList.remove('syncing');
if ($('portalCompanyIntelStrip')) $('portalCompanyIntelStrip').classList.remove('syncing');
if ($('syncOsintIcon')) $('syncOsintIcon').classList.remove('spin');
if ($('headerScanIcon')) $('headerScanIcon').classList.remove('spin');
if ($('syncOsintText')) $('syncOsintText').textContent = 'Live Company OSINT Synced';
if (liveRes && typeof liveRes === 'object') {
var currentCompName = ($('ctxCompany').value || ctx.company || 'Xylem').trim();
var activeKey = currentCompName.toLowerCase().replace(/[^a-z0-9]/g, '');
if (liveRes.resolvedDomain && liveRes.companyFound !== false && $('ctxDomain')) {
$('ctxDomain').value = liveRes.resolvedDomain;
}
var osintObj = {
companyFound: liveRes.companyFound !== false,
resolvedDomain: liveRes.resolvedDomain || ctx.domain,
liveTitle: decodeHtmlEntities(liveRes.liveTitle || ''),
liveDescription: decodeHtmlEntities(liveRes.liveDescription || ''),
latestNewsSignal: decodeHtmlEntities(liveRes.latestNewsSignal || ''),
detectedSector: liveRes.detectedSector || '',
scaleTier: liveRes.scaleTier || '',
hqMarket: decodeHtmlEntities(liveRes.hqMarket || ''),
targetIcp: decodeHtmlEntities(liveRes.targetIcp || ''),
scaledKpis: liveRes.scaledKpis || null
};
liveCompanyOsintCache[activeKey + '_' + reqLang] = osintObj;
liveCompanyOsintCache[activeKey] = osintObj;
var updatedProf = buildDynamicCompanyTelemetry(getContext());
var logoUrl = 'https://www.google.com/s2/favicons?domain=' + encodeURIComponent(updatedProf.domain) + '&sz=128';
if ($('barLogoImg')) $('barLogoImg').src = logoUrl;
if ($('heroLogoImg')) $('heroLogoImg').src = logoUrl;
if ($('dashLogoImg')) $('dashLogoImg').src = logoUrl;
renderCompanyIntelStrip(updatedProf);
renderKpis(updatedProf);
if (currentTool) renderPresets(currentTool, updatedProf);
if (liveRes.companyFound === false) {
showToast('Company could not be found. No random non-business data added.');
} else if (forceToast) {
showToast('Verified B2B OSINT & Scale Metrics calibrated for ' + updatedProf.company + '!', 'success');
}
}
},
function() {
if ($('dashCompanyIntelStrip')) $('dashCompanyIntelStrip').classList.remove('syncing');
if ($('portalCompanyIntelStrip')) $('portalCompanyIntelStrip').classList.remove('syncing');
if ($('syncOsintIcon')) $('syncOsintIcon').classList.remove('spin');
if ($('headerScanIcon')) $('headerScanIcon').classList.remove('spin');
if ($('syncOsintText')) $('syncOsintText').textContent = 'Re-Scan Live Company OSINT';
}
);
}
function updateContextUI(triggerLiveFetch) {
var ctx = getContext();
var profile = buildDynamicCompanyTelemetry(ctx);
$('barCompanyName').textContent = profile.company;
$('portalContextBanner').textContent = PRODUCT_BRAND_NAME + ' • Active Workspace: ' + profile.company + ' (' + profile.domain + ')';
$('portalHeroTitle').textContent = profile.company + ' — Global 360° ABM & Market Intelligence';
var logoUrl = 'https://www.google.com/s2/favicons?domain=' + encodeURIComponent(profile.domain) + '&sz=128';
if ($('barLogoImg')) $('barLogoImg').src = logoUrl;
if ($('heroLogoImg')) $('heroLogoImg').src = logoUrl;
if ($('dashLogoImg')) $('dashLogoImg').src = logoUrl;
renderCompanyIntelStrip(profile);
renderKpis(profile);
if (!$('dashboard-view').hidden && currentDept) {
$('dashTitle').innerHTML = esc(profile.company) + ' — ' + esc(currentDept.title) + ' ' +
(currentDept.isLive ? '<span class="status-pill-live">● Live</span>' : '<span class="status-pill-dev">🚧 Under Construction</span>');
if (currentTool) renderPresets(currentTool, profile);
}
if (triggerLiveFetch) {
clearTimeout(liveFetchDebounce);
liveFetchDebounce = setTimeout(function() { triggerLiveCompanyOsintFetch(getContext(), false); }, 380);
}
}
function renderKpis(profileObj) {
var profile = profileObj || buildDynamicCompanyTelemetry(getContext());
var kpis = profile.kpis, html = '';
for (var i = 0; i < kpis.length; i++) {
var k = kpis[i];
html += '<div class="kpi-card glass">' +
'<div class="kpi-label"><span>' + esc(k.label) + '</span><span class="kpi-company-tag">' + esc(profile.company) + '</span></div>' +
'<div class="kpi-val">' + esc(k.val) + ' <span class="kpi-delta">' + esc(k.delta) + '</span></div>' +
'<div class="kpi-sub">' + esc(k.sub || '') + '</div>' +
'</div>';
}
$('kpiStrip').innerHTML = html;
}
function showLandingPage() {
$('landing-view').hidden = false;
$('portal-view').hidden = true;
$('dashboard-view').hidden = true;
if ($('workspaceContextBar')) $('workspaceContextBar').hidden = true;
$('btnBackToLanding').hidden = true;
$('btnVault').hidden = true;
$('btnHome').hidden = true;
document.documentElement.removeAttribute('data-dept-theme');
changeBackground('orb');
window.scrollTo({ top: 0, behavior: 'smooth' });
}
function enterPlatformWorkspace() {
$('landing-view').hidden = true;
$('dashboard-view').hidden = true;
$('portal-view').hidden = false;
if ($('workspaceContextBar')) $('workspaceContextBar').hidden = false;
$('btnBackToLanding').hidden = false;
$('btnVault').hidden = false;
$('btnHome').hidden = true;
updateContextUI(true);
icons();
window.scrollTo({ top: 0, behavior: 'smooth' });
}
function showPortal() {
if (!$('portal-view').hidden) return;
$('landing-view').hidden = true;
$('dashboard-view').hidden = true;
$('portal-view').hidden = false;
if ($('workspaceContextBar')) $('workspaceContextBar').hidden = false;
$('btnBackToLanding').hidden = false;
$('btnVault').hidden = false;
$('btnHome').hidden = true;
document.documentElement.removeAttribute('data-dept-theme');
changeBackground('orb');
}
function loadDepartment(key, targetToolId) {
$('landing-view').hidden = true;
if ($('workspaceContextBar')) $('workspaceContextBar').hidden = false;
$('btnBackToLanding').hidden = false;
$('btnVault').hidden = false;
currentDeptKey = key;
currentDept = DEPARTMENTS[key];
document.documentElement.setAttribute('data-dept-theme', key);
var profile = buildDynamicCompanyTelemetry(getContext());
$('dashTitle').innerHTML = esc(profile.company) + ' — ' + esc(currentDept.title) + ' ' +
(currentDept.isLive ? '<span class="status-pill-live">● Live</span>' : '<span class="status-pill-dev">🚧 Under Construction</span>');
$('dashDesc').textContent = currentDept.desc;
if ($('underConstructionBanner')) {
$('underConstructionBanner').hidden = Boolean(currentDept.isLive);
}
renderCompanyIntelStrip(profile);
renderKpis(profile);
var tabs = $('dynamicTabs');
tabs.innerHTML = '';
for (var i = 0; i < currentDept.tools.length; i++) {
(function(tool) {
var b = document.createElement('button');
b.type = 'button'; b.className = 'tab-btn'; b.setAttribute('role', 'tab'); b.id = 'tab-' + tool.id;
b.innerHTML = '<i data-lucide="' + tool.icon + '" size="16"></i> ' + esc(tool.label);
b.addEventListener('click', function() {
selectTool(tool, true);
sendTelemetryToGAS('SELECT_TOOL', '[' + getContext().company + '] Selected Tool: ' + tool.label);
});
tabs.appendChild(b);
})(currentDept.tools[i]);
}
var initialTool = currentDept.tools[0];
if (targetToolId) {
for (var j = 0; j < currentDept.tools.length; j++) {
if (currentDept.tools[j].id === targetToolId) { initialTool = currentDept.tools[j]; break; }
}
}
$('btnHome').hidden = false;
$('portal-view').hidden = true;
$('dashboard-view').hidden = false;
selectTool(initialTool, false);
icons();
}
/**
* Sugerencias 100% Internacionales 360° (Sin sesgo a España/Europa; soporta cualquier país del mundo)
*/
function renderPresets(tool, profileObj) {
var prof = profileObj || buildDynamicCompanyTelemetry(getContext());
var comp = prof.company, sec = prof.sector;
var suggestions = [];
if (tool.id === 'territory') {
suggestions = [
'Canada → Namibia & Southern Africa (' + sec + ' Expansion)',
'North America (US & Canada ' + sec + ' Whitespace)',
'APAC, LATAM & Middle East High-Growth Corridors',
'EMEA & DACH Cross-Border Expansion'
];
} else if (tool.id === 'contacts') {
suggestions = [
'Global Buying Committee — Top Competitors of ' + comp,
'Enterprise ' + sec + ' Decision-Makers (Worldwide)',
'VP of Operations, CIO & Chief Commercial Officers'
];
} else if (tool.id === 'persona') {
suggestions = [
'Full Career & Persona Audit — VP of Operations (' + sec + ')',
'Chief Digital & Technology Officer — Career & KPIs',
'Head of Global Expansion & Strategic Sourcing (' + comp + ')'
];
} else {
suggestions = [
'Top 3 Global Competitors of ' + comp,
comp + ' — 360° Cross-Border Expansion Battlecard',
'Tier-1 International Prospect for ' + comp
];
}
var chips = $('presetChips');
if (chips) {
var cHtml = '';
for (var j = 0; j < suggestions.length; j++) {
cHtml += '<button type="button" class="preset-chip" data-preset="' + esc(suggestions[j]) + '">' + esc(suggestions[j]) + '</button>';
}
chips.innerHTML = cHtml;
var btns = chips.querySelectorAll('.preset-chip');
for (var k = 0; k < btns.length; k++) {
btns[k].addEventListener('click', function() { $('mainInput').value = this.getAttribute('data-preset'); $('mainInput').focus(); });
}
}
}
function selectTool(tool, focus) {
currentTool = tool;
var allTabs = document.querySelectorAll('.tab-btn');
for (var i = 0; i < allTabs.length; i++) {
allTabs[i].setAttribute('aria-selected', allTabs[i].id === 'tab-' + tool.id ? 'true' : 'false');
}
$('mainInput').placeholder = tool.placeholder;
$('mainLabel').textContent = tool.placeholder;
$('btnText').textContent = tool.btnText;
$('btnIcon').setAttribute('data-lucide', tool.icon);
$('mainInputIcon').setAttribute('data-lucide', tool.icon);
if (typeof tool.defaultAudio === 'boolean') setPodcastToggleState(tool.defaultAudio, false);
renderPresets(tool);
icons();
changeBackground(tool.bg);
if (focus) $('mainInput').focus();
}
function changeBackground(id) {
var layers = document.querySelectorAll('.bg-layer');
for (var i = 0; i < layers.length; i++) { layers[i].classList.toggle('active', layers[i].id === 'bg-' + id); }
}
function findAndOpenPodcastForTarget(targetName, btnEl) {
if (useSimMode || !adminToken) { showToast('Sign in to Production Mode to access Google Drive audio files.'); return; }
var origHtml = btnEl ? btnEl.innerHTML : '';
if (btnEl) { btnEl.innerHTML = '<i data-lucide="loader-2" class="spin" size="15"></i> Locating Audio…'; icons(); }
callVantageBackend(
'getLatestPodcastAudioUrl',
{ targetName: targetName, token: adminToken },
function(audioUrl) {
if (btnEl) { btnEl.innerHTML = origHtml; icons(); }
if (audioUrl && /^https?:\/\//i.test(audioUrl)) {
window.open(audioUrl, '_blank', 'noopener,noreferrer');
} else {
showToast('No audio podcast found in OUTPUT folder for "' + targetName + '" yet.');
}
},
function() { if (btnEl) { btnEl.innerHTML = origHtml; icons(); } showToast('Could not query podcast folder.'); }
);
}
function refreshVaultFromServer(populateEmptyFeed) {
if (useSimMode || !adminToken) {
vaultAssetsCache = [];
if ($('vaultCountBadge')) $('vaultCountBadge').textContent = 'Demo';
return;
}
callVantageBackend(
'getGeneratedAssetsHistory',
{ token: adminToken },
function(list) {
if (!Array.isArray(list)) return;
vaultAssetsCache = list;
$('vaultCountBadge').textContent = String(list.length);
if (populateEmptyFeed && list.length > 0 && $('feed').querySelector('[data-empty]')) {
$('feed').innerHTML = '';
var recent = list.slice(0, 6);
for (var i = 0; i < recent.length; i++) { renderHistoricalVaultCard(recent[i], i); }
icons();
}
}
);
}
function renderHistoricalVaultCard(item, idx) {
var jobId = 'vault_hist_' + idx + '_' + Date.now();
var toolObj = { id: item.toolId || 'utility', label: item.toolLabel || 'Saved Deliverable' };
var intel = generateExecutiveSummary(item.target, toolObj, item.strategy || 'Market Expansion & Competitor Analysis', item.company, item.sector);
reportStore[jobId] = intel;
var podcastBtnHtml = item.audioUrl
? '<a href="' + esc(safeUrl(item.audioUrl)) + '" target="_blank" rel="noopener noreferrer" class="btn-link podcast-action"><i data-lucide="headphones" size="16"></i> 🎧 Listen Audio Podcast</a>'
: '<button type="button" class="btn-link podcast-action" data-find-podcast="' + esc(item.target) + '"><i data-lucide="headphones" size="16"></i> 🎧 Listen Podcast</button>';
$('feed').insertAdjacentHTML('beforeend',
'<article class="feed-card glass done" id="' + jobId + '">' +
'<div class="card-top"><div><h4 class="target-title"><i data-lucide="file-check-2" size="20"></i> ' + esc(item.target) + ' <span class="badge">' + esc(item.toolLabel) + '</span></h4>' +
'<span class="meta"><i data-lucide="folder-check" size="12"></i> Saved in Drive (' + esc(item.timestamp) + ') • Brand: <strong>' + esc(item.company) + '</strong> (' + esc(item.sector) + ')</span></div><span class="status">Saved in Vault</span></div>' +
'<div class="card-summary">' + intel.summary + '</div>' +
'<div class="card-actions">' +
'<a href="' + esc(safeUrl(item.url)) + '" target="_blank" rel="noopener noreferrer" class="btn-link primary-action"><i data-lucide="external-link" size="16"></i> Open ' + esc(item.fileType || 'Google Doc / Sheet') + '</a>' +
podcastBtnHtml +
'<button type="button" class="btn-link" data-preview="' + jobId + '"><i data-lucide="sparkles" size="16"></i> Inspect Executive Summary</button>' +
'<button type="button" class="btn-link" data-rerun="' + esc(item.target) + '"><i data-lucide="rotate-ccw" size="15"></i> Re-Run</button>' +
'</div>' +
'</article>'
);
var cardEl = $(jobId);
var previewBtn = cardEl.querySelector('[data-preview]');
if (previewBtn) previewBtn.addEventListener('click', function() { openPreviewModal(reportStore[jobId]); });
var podBtn = cardEl.querySelector('[data-find-podcast]');
if (podBtn) podBtn.addEventListener('click', function() { findAndOpenPodcastForTarget(this.getAttribute('data-find-podcast'), this); });
var rerunBtn = cardEl.querySelector('[data-rerun]');
if (rerunBtn) rerunBtn.addEventListener('click', function() { $('mainInput').value = this.getAttribute('data-rerun'); $('mainInput').focus(); showToast('Target loaded into search bar!', 'success'); });
}
function openAssetVaultModal() {
$('modalTitle').innerHTML = '<i data-lucide="folder-kanban"></i> VANTAGE OS — Deliverables & Podcasts Vault';
if (useSimMode || !adminToken) {
$('modalBody').innerHTML = '<div style="padding:24px;text-align:center;color:var(--text-2)">🔒 <strong>Protected Production Vault:</strong> Sign in with your VANTAGE OS account to access live Google Drive deliverables and audio briefings.</div>';
icons(); toggleModal(true); return;
}
$('modalBody').innerHTML =
'<p style="color:var(--text-2);font-size:0.86rem;margin-top:0">All custom-branded Google Docs, Sheets, and AI Audio Podcasts generated across your sessions are indexed here:</p>' +
'<div class="onboard-field" style="margin-bottom:10px"><input type="text" id="vaultSearchInput" placeholder="Filter by target, company brand or tool..."></div>' +
'<div class="vault-list" id="vaultModalList"></div>';
icons(); toggleModal(true);
function renderVaultItems(filterStr) {
var box = $('vaultModalList'); if (!box) return;
var q = String(filterStr || '').toLowerCase().trim();
var filtered = vaultAssetsCache.filter(function(a) {
if (!q) return true;
return String(a.company).toLowerCase().indexOf(q) !== -1 || String(a.target).toLowerCase().indexOf(q) !== -1 || String(a.toolLabel).toLowerCase().indexOf(q) !== -1;
});
if (filtered.length === 0) {
box.innerHTML = '<div style="padding:24px;text-align:center;color:var(--text-2)">No matching files in the vault yet.</div>'; return;
}
var html = '';
for (var i = 0; i < filtered.length; i++) {
var item = filtered[i];
var podAction = item.audioUrl
? '<a href="' + esc(safeUrl(item.audioUrl)) + '" target="_blank" rel="noopener noreferrer" class="btn-link podcast-action" style="padding:8px 12px;font-size:0.78rem"><i data-lucide="headphones" size="14"></i> 🎧 Podcast</a>'
: '<button type="button" class="btn-link podcast-action" data-vault-pod="' + esc(item.target) + '" style="padding:8px 12px;font-size:0.78rem"><i data-lucide="headphones" size="14"></i> 🎧 Audio</button>';
html += '<div class="vault-item"><div class="vault-item-info"><div class="vault-item-title"><span class="badge">' + esc(item.company) + '</span> <span>' + esc(item.target) + '</span> <span style="color:var(--text-3);font-size:0.78rem">(' + esc(item.toolLabel) + ')</span></div>' +
'<div class="vault-item-sub">' + esc(item.fileType) + ' • ' + esc(item.sector) + ' • ' + esc(item.strategy) + ' • ' + esc(item.timestamp) + '</div></div>' +
'<div style="display:flex;gap:6px;align-items:center">' + podAction + '<a href="' + esc(safeUrl(item.url)) + '" target="_blank" rel="noopener noreferrer" class="btn-link primary-action" style="padding:8px 14px;font-size:0.8rem"><i data-lucide="external-link" size="14"></i> Open Doc/Sheet</a></div></div>';
}
box.innerHTML = html;
var podBtns = box.querySelectorAll('[data-vault-pod]');
for (var p = 0; p < podBtns.length; p++) {
podBtns[p].addEventListener('click', function() { findAndOpenPodcastForTarget(this.getAttribute('data-vault-pod'), this); });
}
icons();
}
renderVaultItems('');
$('vaultSearchInput').addEventListener('input', function() { renderVaultItems(this.value); });
refreshVaultFromServer(false);
}
function openSaasProposalModal() {
if (currentUserRole !== 'admin' || !adminToken) {
showToast('Restricted: Master Administrator login required.');
return;
}
var ctx = getContext();
$('modalTitle').innerHTML = '<i data-lucide="shield-check" style="color:var(--ok)"></i> VANTAGE OS — Master Admin Command Studio';
$('modalBody').innerHTML =
'<div style="display:flex;gap:8px;margin-bottom:14px">' +
'<button type="button" class="btn-link primary-action" id="tabBtnPropStudio" style="flex:1;justify-content:center"><i data-lucide="file-check-2" size="15"></i> 1. Deep SaaS Proposal Studio</button>' +
'<button type="button" class="btn-link" id="tabBtnUserMgr" style="flex:1;justify-content:center"><i data-lucide="users" size="15"></i> 2. Client User Generator (Production Access)</button>' +
'</div>' +
'<div id="adminTabProposal">' +
'<p style="color:var(--text-2);font-size:0.84rem;margin-top:0">Scrape any prospect domain live, match their pain points 1-to-1 to VANTAGE OS modules, and build a branded Google Doc Proposal + executive pitch:</p>' +
'<div class="onboard-grid">' +
'<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">' +
'<div class="onboard-field"><label for="propCompany">1. Prospect Company Name</label><input type="text" id="propCompany" value="' + esc(ctx.company) + '"></div>' +
'<div class="onboard-field"><label for="propDomain">2. Official Domain (Auto-Discovered)</label><input type="text" id="propDomain" value="' + esc(ctx.domain) + '"></div>' +
'</div>' +
'<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">' +
'<div class="onboard-field"><label for="propContact">3. Contact Person / Role</label><input type="text" id="propContact" value="Executive Team"></div>' +
'<div class="onboard-field"><label for="propLang">4. Output Language</label><select id="propLang"><option value="en">🇬🇧 English</option><option value="es">🇪🇸 Español (Spanish)</option></select></div>' +
'</div>' +
'<div class="onboard-field"><label for="propNeeds">5. Prospect Pain Points, Bullet Points or Email Received</label>' +
'<textarea id="propNeeds" rows="4" placeholder="Paste the prospect\'s email, bullet points, or global expansion goals here..."></textarea>' +
'</div>' +
'<label style="display:flex;align-items:center;gap:8px;font-size:0.8rem;color:var(--text-2);cursor:pointer"><input type="checkbox" id="propSendEmail" checked> Send copy of Proposal File & Pitch to my Gmail</label>' +
'<button type="button" class="action-btn" id="btnBuildSaasProposal" style="padding:13px"><i data-lucide="zap" size="18"></i> <span id="btnBuildSaasProposalText">Research Company & Generate Matched Proposal File</span></button>' +
'<div id="propResultBox" hidden style="margin-top:8px;padding:14px;border-radius:12px;background:var(--bg-base);border:1px solid var(--ok)">' +
'<div style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px;margin-bottom:10px">' +
'<strong style="color:var(--ok);font-size:0.86rem">✅ Deep Need-Matched Proposal File Created!</strong>' +
'<div style="display:flex;gap:8px;flex-wrap:wrap">' +
'<a href="#" target="_blank" id="propDocLink" class="btn-link primary-action" style="padding:6px 12px;font-size:0.78rem"><i data-lucide="external-link" size="14"></i> Open Proposal Doc</a>' +
'<button type="button" class="btn-link" id="btnCopyPitch" style="padding:6px 12px;font-size:0.78rem"><i data-lucide="copy" size="14"></i> Copy Email Pitch</button>' +
'</div>' +
'</div>' +
'<textarea id="propPitchOutput" rows="5" readonly style="width:100%;padding:10px;border-radius:8px;border:1px solid var(--border);background:var(--field);color:var(--text);font-size:0.79rem"></textarea>' +
'</div>' +
'</div>' +
'</div>' +
'<div id="adminTabUsers" hidden>' +
'<p style="color:var(--text-2);font-size:0.84rem;margin-top:0">Create client credentials with full <strong>Production Mode</strong> access. Clients NEVER see this Admin Studio or the Proposal Generator:</p>' +
'<div class="onboard-grid">' +
'<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">' +
'<div class="onboard-field"><label for="newCliUser">Client Username</label><input type="text" id="newCliUser" placeholder="e.g. acme_corp"></div>' +
'<div class="onboard-field"><label for="newCliPass">Client Password</label><div style="display:flex;gap:6px"><input type="text" id="newCliPass" placeholder="e.g. Vantage_2026!" style="flex:1"><button type="button" class="btn-link" id="btnGenRandomPass" style="padding:0 10px"><i data-lucide="key" size="14"></i></button></div></div>' +
'</div>' +
'<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px">' +
'<div class="onboard-field"><label for="newCliComp">Client Company Workspace</label><input type="text" id="newCliComp" placeholder="e.g. Acme Corp"></div>' +
'<div class="onboard-field"><label for="newCliPlan">Subscription Tier</label><select id="newCliPlan"><option value="Growth Pilot (€149/mo)">Growth Pilot (€149/mo)</option><option value="Pro GTM (€349/mo)">Pro GTM (€349/mo)</option><option value="Enterprise (€690/mo)">Enterprise (€690/mo)</option></select></div>' +
'</div>' +
'<button type="button" class="action-btn" id="btnCreateClientUser" style="padding:13px"><i data-lucide="user-plus" size="18"></i> <span id="btnCreateClientUserText">Create / Update Production Client User</span></button>' +
'<div class="vault-list" id="clientUsersListBox" style="max-height:220px"></div>' +
'</div>' +
'</div>';
icons();
toggleModal(true);
$('tabBtnPropStudio').addEventListener('click', function() {
$('adminTabProposal').hidden = false; $('adminTabUsers').hidden = true;
$('tabBtnPropStudio').classList.add('primary-action'); $('tabBtnUserMgr').classList.remove('primary-action');
});
$('tabBtnUserMgr').addEventListener('click', function() {
$('adminTabProposal').hidden = true; $('adminTabUsers').hidden = false;
$('tabBtnUserMgr').classList.add('primary-action'); $('tabBtnPropStudio').classList.remove('primary-action');
loadClientUsersInAdminModal();
});
$('propCompany').addEventListener('input', function() { autoDiscoverOfficialDomain(this.value, $('propDomain')); });
$('btnBuildSaasProposal').addEventListener('click', function() {
var comp = ($('propCompany').value || '').trim();
var dom = ($('propDomain').value || inferDomainFromCompanyName(comp)).trim();
var contact = ($('propContact').value || 'Executive Team').trim();
var needs = ($('propNeeds').value || '').trim();
var lang = $('propLang').value || 'en';
var sendMail = $('propSendEmail').checked;
if (!comp || !needs) { showToast('Please enter company name and pain points.'); return; }
$('btnBuildSaasProposalText').textContent = 'Scraping ' + dom + ' & Building Matched Proposal…';
callVantageBackend(
'generateCustomVantageSaasProposal',
{ prospectCompany: comp, prospectDomain: dom, contactName: contact, rawNeeds: needs, lang: lang, sendEmailCopy: sendMail, adminToken: adminToken },
function(res) {
$('btnBuildSaasProposalText').textContent = 'Research Company & Generate Matched Proposal File';
if (res && res.docUrl) {
$('propResultBox').hidden = false;
$('propDocLink').href = res.docUrl;
$('propPitchOutput').value = res.emailPitch || '';
refreshVaultFromServer(false);
showToast('Deep Proposal file created for ' + comp + '!', 'success');
}
},
function(err) {
$('btnBuildSaasProposalText').textContent = 'Research Company & Generate Matched Proposal File';
showToast((err && err.message) || 'Error generating proposal.');
}
);
});
$('btnCopyPitch').addEventListener('click', function() {
var txt = $('propPitchOutput'); txt.select(); navigator.clipboard.writeText(txt.value);
showToast('Executive pitch copied to clipboard!', 'success');
});
$('btnGenRandomPass').addEventListener('click', function() {
var chars = 'ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789!@#$';
var out = 'Vantage_';
for (var i = 0; i < 8; i++) out += chars.charAt(Math.floor(Math.random() * chars.length));
$('newCliPass').value = out;
});
$('btnCreateClientUser').addEventListener('click', function() {
var u = ($('newCliUser').value || '').trim();
var p = ($('newCliPass').value || '').trim();
var c = ($('newCliComp').value || u).trim();
var pl = $('newCliPlan').value;
if (!u || !p) { showToast('Enter both username and password.'); return; }
$('btnCreateClientUserText').textContent = 'Saving Client Credentials…';
callVantageBackend(
'createClientUser',
{ username: u, password: p, company: c, plan: pl, adminToken: adminToken },
function(list) {
$('btnCreateClientUserText').textContent = 'Create / Update Production Client User';
$('newCliUser').value = ''; $('newCliPass').value = '';
renderClientUsersList(list);
showToast('Production user "' + u + '" activated!', 'success');
},
function(err) {
$('btnCreateClientUserText').textContent = 'Create / Update Production Client User';
showToast((err && err.message) || 'Could not create user.');
}
);
});
}
function loadClientUsersInAdminModal() {
callVantageBackend('getClientUsersList', { adminToken: adminToken }, renderClientUsersList);
}
function renderClientUsersList(list) {
var box = $('clientUsersListBox'); if (!box) return;
if (!Array.isArray(list) || list.length === 0) {
box.innerHTML = '<div style="padding:14px;text-align:center;color:var(--text-2);font-size:0.82rem">No client accounts created yet. Add one above!</div>';
return;
}
var html = '';
for (var i = 0; i < list.length; i++) {
var u = list[i];
html += '<div class="vault-item" style="padding:9px 12px">' +
'<div class="vault-item-info">' +
'<div class="vault-item-title"><span class="badge">' + esc(u.username) + '</span> <span>' + esc(u.company) + '</span> <span style="font-size:0.75rem;color:var(--ok)">(' + esc(u.plan) + ')</span></div>' +
'<div class="vault-item-sub">Pass: <code>' + esc(u.password) + '</code> • Created: ' + esc(u.createdAt) + '</div>' +
'</div>' +
'<button type="button" class="btn-link" data-del-user="' + esc(u.username) + '" style="padding:5px 10px;font-size:0.75rem;color:var(--danger)"><i data-lucide="trash-2" size="13"></i> Revoke</button>' +
'</div>';
}
box.innerHTML = html;
var delBtns = box.querySelectorAll('[data-del-user]');
for (var d = 0; d < delBtns.length; d++) {
delBtns[d].addEventListener('click', function() {
var targetU = this.getAttribute('data-del-user');
callVantageBackend('deleteClientUser', { username: targetU, adminToken: adminToken }, function(updated) {
renderClientUsersList(updated);
showToast('Revoked user ' + targetU, 'success');
});
});
}
icons();
}
function openChangelogModal() {
$('modalTitle').innerHTML = '<i data-lucide="sparkles" style="color:var(--primary)"></i> VANTAGE OS — Product Changelog & Release Notes';
$('modalBody').innerHTML =
'<div class="changelog-entry latest">' +
'<div class="changelog-ver"><span>🚀 Version 10.0 — Vercel REST Gateway, Global 360° ABM & 10-Language Engine</span><span class="changelog-date">Current Release (Nov 2026)</span></div>' +
'<ul class="changelog-list">' +
'<li><strong>Vercel + Custom Domain Ready (<code>vantage-os.io</code>):</strong> Universal REST API Bridge connecting standalone Vercel deployments directly to Google Apps Script & n8n Cloud.</li>' +
'<li><strong>Borderless 360° Market Scope & Strict B2B Filter:</strong> Prospect from any country to any destination (e.g., Canada → Namibia). Blocks songs, movies, and non-business trivia—explicitly reporting <em>"Company could not be found"</em> when unverified.</li>' +
'<li><strong>10-Language Selector & 4-Layer ABM Landing Page:</strong> Enforces strict English (or selected language) output, highlighting surgical ABM (Industry, Company, Decision-Maker & Full Career) and SME time savings.</li>' +
'</ul>' +
'</div>' +
'<div class="changelog-entry">' +
'<div class="changelog-ver"><span>🔒 Version 9.0 — Multi-Role Login (Admin vs. Client) & Pricing Tiers</span><span class="changelog-date">Nov 2026</span></div>' +
'<ul class="changelog-list">' +
'<li><strong>Multi-Role Production Login & User Manager:</strong> Master Admin unlocks the Proposal Studio & User Generator; Client accounts unlock Live Production Webhooks.</li>' +
'</ul>' +
'</div>';
icons();
toggleModal(true);
}
function openLoginModal(preselectedTier) {
var ignored = isOwnerDeviceIgnored();
$('modalTitle').innerHTML = '<i data-lucide="key-round" style="color:var(--primary)"></i> Sign In to VANTAGE OS Production';
$('modalBody').innerHTML =
'<p style="color:var(--text-2);font-size:0.86rem;margin-top:0">' +
(preselectedTier ? 'Selected Plan: <strong>' + esc(preselectedTier) + '</strong>. ' : '') +
'Enter your VANTAGE OS username and password to unlock live 360° cloud agents, OSINT scrapers, and Google Drive deliverables:' +
'</p>' +
'<div class="onboard-grid">' +
'<div class="onboard-field"><label for="loginUsernameInput">Username</label><input type="text" id="loginUsernameInput" placeholder="e.g. admin or client username" value="' + esc(currentUsername || 'admin') + '"></div>' +
'<div class="onboard-field"><label for="loginPasswordInput">Password / Passkey</label><input type="password" id="loginPasswordInput" placeholder="Enter your password..." value=""></div>' +
'<div style="display:flex;gap:10px;margin-top:8px;flex-wrap:wrap">' +
'<button type="button" class="action-btn" id="unlockLiveBtn" style="flex:1;padding:13px"><i data-lucide="log-in" size="17"></i> <span id="unlockLiveBtnText">Sign In to Production OS</span></button>' +
'<button type="button" class="btn-link" id="lockDemoBtn" style="justify-content:center">Continue in Sandbox Demo</button>' +
'</div>' +
'<div style="margin-top:10px;padding-top:10px;border-top:1px solid var(--border);display:flex;justify-content:space-between;align-items:center;font-size:0.78rem;color:var(--text-3)">' +
'<span>Browser Telemetry Exclusion:</span>' +
'<button type="button" class="btn-link" id="toggleIgnoreTelemetryBtn" style="padding:4px 10px;font-size:0.75rem">' + (ignored ? '🛡️ Excluded from Visitor_Logs' : 'Exclude My Browser') + '</button>' +
'</div>' +
'</div>';
icons();
toggleModal(true);
setTimeout(function() { if ($('loginPasswordInput')) $('loginPasswordInput').focus(); }, 120);
$('toggleIgnoreTelemetryBtn').addEventListener('click', function() {
var nextState = !isOwnerDeviceIgnored();
setOwnerDeviceIgnored(nextState);
toggleModal(false);
showToast(nextState ? 'Your browser is now excluded from Visitor_Logs!' : 'Browser exclusion disabled.', 'success');
});
function executeSignIn() {
var userVal = ($('loginUsernameInput').value || 'admin').trim();
var passVal = ($('loginPasswordInput').value || '').trim();
if (!passVal) { showToast('Please enter your password.'); return; }
$('unlockLiveBtnText').textContent = 'Verifying Credentials…';
if (userVal.toLowerCase() === 'admin' && passVal === 'Intelligence_center_2026_ahll?*^¨') {
adminToken = passVal;
currentUserRole = 'admin';
currentUsername = 'admin';
useSimMode = false;
setOwnerDeviceIgnored(true);
updateModeBadgeUI();
toggleModal(false);
enterPlatformWorkspace();
refreshVaultFromServer(true);
showToast('Welcome Master Admin! Production Mode, Proposal Studio & User Manager unlocked.', 'success');
return;
}
callVantageBackend(
'authenticateVantageUser',
{ username: userVal, passkey: passVal },
function(authRes) {
$('unlockLiveBtnText').textContent = 'Sign In to Production OS';
if (authRes && authRes.authenticated) {
adminToken = authRes.token;
currentUserRole = authRes.role || 'client';
currentUsername = authRes.user || userVal;
useSimMode = false;
if (currentUserRole === 'admin') setOwnerDeviceIgnored(true);
if (authRes.company && authRes.role === 'client' && $('ctxCompany')) {
$('ctxCompany').value = authRes.company;
$('ctxDomain').value = inferDomainFromCompanyName(authRes.company);
}
updateModeBadgeUI();
toggleModal(false);
enterPlatformWorkspace();
refreshVaultFromServer(true);
showToast('Signed in as ' + currentUsername + '!', 'success');
} else {
showToast((authRes && authRes.message) || 'Invalid username or password.');
}
},
function() {
$('unlockLiveBtnText').textContent = 'Sign In to Production OS';
showToast('Authentication check failed.');
}
);
}
$('unlockLiveBtn').addEventListener('click', executeSignIn);
$('loginPasswordInput').addEventListener('keydown', function(e) { if (e.key === 'Enter') executeSignIn(); });
$('lockDemoBtn').addEventListener('click', function() {
adminToken = ""; currentUserRole = "guest"; useSimMode = true;
updateModeBadgeUI(); toggleModal(false); enterPlatformWorkspace();
showToast('Entered Interactive Sandbox Demo Mode.', 'success');
});
}
function updateModeBadgeUI() {
var badge = $('modeBadge');
var isLive = Boolean(!useSimMode && adminToken);
var isMasterAdmin = Boolean(isLive && currentUserRole === 'admin');
if ($('secretProposalBtn')) $('secretProposalBtn').hidden = !isMasterAdmin;
if (isLive) {
badge.classList.add('live-active');
$('modeText').textContent = isMasterAdmin ? 'Master Admin (Live)' : ('Production (' + currentUsername + ')');
$('btnHeaderLoginText').textContent = isMasterAdmin ? 'AdminLogged' : currentUsername;
$('botSubLabel').textContent = 'Global 360° ABM, Persona & ROI Engine (Live)';
} else {
badge.classList.remove('live-active');
$('modeText').textContent = 'Demo Mode';
$('btnHeaderLoginText').textContent = 'Client Login';
$('botSubLabel').textContent = 'Global 360° ABM, Persona & ROI Engine';
}
}
function runAgent() {
if (currentDept && !currentDept.isLive) {
showToast('This division is currently Under Construction. Switch to Sales & Market Expansion (6 Live Modules)!');
return;
}
var input = $('mainInput'), target = input.value.trim();
if (!currentTool) return;
if (!target) { showToast('Select a target chip or type a target first.'); input.focus(); return; }
var tool = currentTool, strategy = $('paramSelect').value, outLang = getActiveLang();
var profile = buildDynamicCompanyTelemetry(getContext());
var jobId = 'job_' + Date.now();
sendTelemetryToGAS('RUN_AGENT', '[' + profile.company + ' | Lang: ' + outLang + '] ' + tool.label + ' -> ' + target);
input.value = '';
var empty = $('feed').querySelector('[data-empty]');
if (empty) empty.remove();
var audioTag = generatePodcastEnabled ? ' • 🎧 Podcast: ON' : ' • 🔇 Podcast: OFF';
$('feed').insertAdjacentHTML('afterbegin',
'<article class="feed-card glass" id="' + jobId + '">' +
'<div class="card-top"><div><h4 class="target-title"><i data-lucide="' + tool.icon + '" size="20"></i> ' + esc(target) + ' <span class="badge">' + esc(tool.label) + '</span></h4>' +
'<span class="meta"><i data-lucide="sliders" size="12"></i> Brand: <strong>' + esc(profile.company) + '</strong> • Lang: <strong>' + esc(outLang.toUpperCase()) + '</strong> • Intent: <strong>' + esc(strategy) + '</strong>' + audioTag + '</span></div>' +
'<span class="status" id="status_' + jobId + '"><i data-lucide="loader-2" class="spin" size="14"></i> <span id="timer_' + jobId + '">Running (0s)</span></span></div>' +
'<div class="progress-track" id="prog_' + jobId + '"><div class="progress-fill"></div></div>' +
'<div class="terminal" id="term_' + jobId + '"><i data-lucide="terminal" size="16"></i><span>Initializing 360° ' + esc(strategy) + ' workflow in ' + esc(outLang.toUpperCase()) + '…</span></div>' +
'</article>'
);
icons();
var startTs = Date.now();
var secInterval = setInterval(function() {
var tEl = $('timer_' + jobId);
if (!tEl) { clearInterval(secInterval); return; }
tEl.textContent = 'Running (' + Math.floor((Date.now() - startTs) / 1000) + 's)';
}, 1000);
if (!useSimMode && adminToken) {
callVantageBackend(
'runUnifiedTask',
{
target: target,
type: tool.id,
lang: outLang,
strategy: strategy + ' | Brand Positioning: ' + profile.businessModel + ' | STRICT OUTPUT LANGUAGE: ' + outLang.toUpperCase(),
company: profile.company,
sector: profile.sector,
domain: profile.domain,
companyContext: profile.businessModel,
generateAudio: generatePodcastEnabled,
adminToken: adminToken
},
function() {
activeJobs[jobId] = {
started: startTs,
secTimer: secInterval,
timer: setInterval(function() { pollLiveStatus(jobId, target, tool, strategy, profile.company, profile.sector, profile.domain); }, POLL_MS)
};
},
function(err) {
clearInterval(secInterval);
failJob(jobId, (err && err.message) || 'Unauthorized or webhook error.');
}
);
} else {
activeJobs[jobId] = { started: startTs, secTimer: secInterval, timer: null };
simulateDemoJob(jobId, target, tool, strategy, profile.company, profile.sector);
}
}
function stopJob(jobId) {
var j = activeJobs[jobId];
if (j) {
if (j.timer) clearInterval(j.timer);
if (j.secTimer) clearInterval(j.secTimer);
delete activeJobs[jobId];
}
}
function setTerm(jobId, iconName, text) {
var term = $('term_' + jobId);
if (term) { term.innerHTML = '<i data-lucide="' + iconName + '" size="16"></i><span>' + esc(text) + '</span>'; icons(); }
}
function failJob(jobId, msg) {
stopJob(jobId);
var card = $(jobId); if (!card) return;
var prog = $('prog_' + jobId); if (prog) prog.remove();
card.classList.add('failed');
card.querySelector('.status').innerHTML = '<i data-lucide="alert-triangle" size="14"></i> Failed';
setTerm(jobId, 'alert-triangle', msg);
}
function pollLiveStatus(jobId, target, tool, strategy, company, sector, domain) {
var job = activeJobs[jobId];
if (!job) return;
if (Date.now() - job.started > JOB_TIMEOUT_MS) { failJob(jobId, 'Timed out after 10 minutes.'); return; }
callVantageBackend(
'checkUnifiedCache',
{ target: target, type: tool.id, token: adminToken },
function(res) {
if (!activeJobs[jobId] || !res) return;
if (res.json) {
stopJob(jobId);
setTerm(jobId, 'file-check-2', 'Applying ' + company + ' brand design & saving deliverable to Google Drive…');
callVantageBackend(
'generateFinalAsset',
{ jsonString: res.json, type: tool.id, token: adminToken, contextObj: { company: company, sector: sector, domain: domain, strategy: strategy, target: target } },
function(resAsset) {
var docUrl = (resAsset && typeof resAsset === 'object') ? resAsset.url : resAsset;
var audioUrl = (resAsset && typeof resAsset === 'object') ? resAsset.audioUrl : '';
buildFinalCard(jobId, target, tool, strategy, company, sector, docUrl, audioUrl);
refreshVaultFromServer(false);
},
function(err) { failJob(jobId, (err && err.message) || 'Could not create Google Doc/Sheet.'); }
);
} else if (res.log) {
setTerm(jobId, 'activity', res.log);
}
},
function(err) { failJob(jobId, (err && err.message) || 'Lost connection to backend.'); }
);
}
function simulateDemoJob(jobId, target, tool, strategy, company, sector) {
var steps = [
'Scraping 360° B2B OSINT & competitive landscape for ' + company + ' (' + sector + ')…',
'Executing [' + strategy + '] on target [' + target + '] in ' + getActiveLang().toUpperCase() + '…',
'Synthesizing executive deliverable' + (generatePodcastEnabled ? ' & AI audio podcast…' : '…')
], idx = 0;
var timer = setInterval(function() {
var term = $('term_' + jobId);
if (!term) { clearInterval(timer); stopJob(jobId); return; }
if (idx < steps.length) { setTerm(jobId, 'activity', steps[idx++]); }
else { clearInterval(timer); stopJob(jobId); buildFinalCard(jobId, target, tool, strategy, company, sector, null, null); }
}, 700);
}
function generateExecutiveSummary(target, tool, strategy, company, sector) {
return {
headline: tool.label + ' — ' + target + ' (' + company + ')',
summary: '<strong>360° ABM Intelligence (' + esc(company) + ' → ' + esc(target) + '):</strong> Executed with <strong>' + esc(strategy) + '</strong> intent for the global <strong>' + esc(sector) + '</strong> market.',
metrics: [
{ label: 'Global Market Expansion & Whitespace Fit', pct: 95 },
{ label: '4-Layer ABM & Decision-Maker Precision', pct: 93 },
{ label: 'Time Saved vs. Manual Research', pct: 96 }
],
bullets: [
'Target Analyzed: ' + target + ' (styled with ' + company + ' corporate identity).',
'Strategic Intent Applied: ' + strategy + ' (Output Language: ' + getActiveLang().toUpperCase() + ').',
'Deliverable stored in Google Drive OUTPUT folder and indexed in VANTAGE Vault.'
]
};
}
function buildFinalCard(jobId, target, tool, strategy, company, sector, liveUrl, audioUrl) {
var card = $(jobId); if (!card) return;
var time = new Date().toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
var intel = generateExecutiveSummary(target, tool, strategy, company, sector);
reportStore[jobId] = intel;
var liveBtnHtml = liveUrl
? '<a href="' + esc(safeUrl(liveUrl)) + '" target="_blank" rel="noopener noreferrer" class="btn-link primary-action"><i data-lucide="external-link" size="16"></i> Open Branded Google Doc / Sheet</a>'
: '';
var podcastBtnHtml = '';
if (audioUrl && /^https?:\/\//i.test(audioUrl)) {
podcastBtnHtml = '<a href="' + esc(safeUrl(audioUrl)) + '" target="_blank" rel="noopener noreferrer" class="btn-link podcast-action"><i data-lucide="headphones" size="16"></i> 🎧 Listen Audio Podcast</a>';
} else if (liveUrl && generatePodcastEnabled) {
podcastBtnHtml = '<button type="button" class="btn-link podcast-action" data-find-podcast="' + esc(target) + '"><i data-lucide="headphones" size="16"></i> 🎧 Listen Podcast</button>';
}
card.classList.add('done');
card.innerHTML =
'<div class="card-top"><div><h4 class="target-title"><i data-lucide="check-circle" size="20"></i> ' + esc(target) + ' <span class="badge">' + esc(tool.label) + '</span></h4>' +
'<span class="meta"><i data-lucide="clock" size="12"></i> Completed at ' + time + ' • Brand: <strong>' + esc(company) + '</strong> (' + esc(sector) + ')</span></div><span class="status">Saved to Vault</span></div>' +
'<div class="card-summary">' + intel.summary + '</div>' +
'<div class="card-actions">' +
liveBtnHtml + podcastBtnHtml +
'<button type="button" class="btn-link ' + (liveUrl ? '' : 'primary-action') + '" data-preview="' + jobId + '"><i data-lucide="sparkles" size="16"></i> Inspect Strategic Summary</button>' +
'<button type="button" class="btn-link" data-rerun="' + esc(target) + '"><i data-lucide="rotate-ccw" size="15"></i> Re-Run</button>' +
'</div>';
card.querySelector('[data-preview]').addEventListener('click', function() { openPreviewModal(reportStore[jobId]); });
var podBtn = card.querySelector('[data-find-podcast]');
if (podBtn) podBtn.addEventListener('click', function() { findAndOpenPodcastForTarget(this.getAttribute('data-find-podcast'), this); });
var rerunBtn = card.querySelector('[data-rerun]');
if (rerunBtn) rerunBtn.addEventListener('click', function() { $('mainInput').value = this.getAttribute('data-rerun'); $('mainInput').focus(); showToast('Target loaded into search bar!', 'success'); });
icons();
showToast(tool.label + ' for ' + target + ' ready!', 'success');
}
function openPreviewModal(intel) {
if (!intel) return;
$('modalTitle').innerHTML = '<i data-lucide="bar-chart-2"></i> ' + esc(intel.headline);
var barsHtml = '', bulletsHtml = '';
for (var i = 0; i < intel.metrics.length; i++) {
var m = intel.metrics[i];
barsHtml += '<div class="metric-row"><div class="metric-row-top"><span>' + esc(m.label) + '</span><span>' + m.pct + '%</span></div><div class="bar-track"><div class="bar-fill" style="width:' + m.pct + '%"></div></div></div>';
}
for (var j = 0; j < intel.bullets.length; j++) { bulletsHtml += '<li>' + esc(intel.bullets[j]) + '</li>'; }
$('modalBody').innerHTML = '<div class="card-summary" style="margin-bottom:16px">' + intel.summary + '</div><div class="metric-bars">' + barsHtml + '</div><h4 style="margin:18px 0 8px;font-size:0.95rem">Strategic Playbook & Next Steps:</h4><ul>' + bulletsHtml + '</ul>';
icons(); toggleModal(true);
}
function openBrandModal() {
var ctx = getContext();
$('modalTitle').innerHTML = '<i data-lucide="radar"></i> VANTAGE OS — Global 360° Company Discovery';
$('modalBody').innerHTML =
'<p style="color:var(--text-2);font-size:0.88rem;margin-top:0">Enter <strong>any company name</strong> worldwide. VANTAGE OS verifies the corporate entity, auto-discovers its official domain, and scrapes its live B2B footprint in your selected language:</p>' +
'<div class="onboard-grid">' +
'<div class="onboard-field"><label for="mCompInput">1. Company Name</label><input type="text" id="mCompInput" value="' + esc(ctx.company) + '"></div>' +
'<div class="onboard-field"><label for="mDomInput">2. Official Website Domain (Auto-Discovered)</label><input type="text" id="mDomInput" value="' + esc(ctx.domain) + '"></div>' +
'<div class="onboard-field"><label for="mSecSelect">3. Industry Sector</label><select id="mSecSelect">' +
'<option value="Auto-Detect">✨ Auto-Detect from Website OSINT</option>' +
'<option value="Industrial & Energy">Industrial & Water/Energy</option>' +
'<option value="E-Commerce">E-Commerce & Digital Growth</option>' +
'<option value="B2B SaaS">B2B SaaS & Cloud</option>' +
'<option value="FinTech">FinTech & Banking</option>' +
'<option value="Healthcare">HealthTech & Bio</option>' +
'</select></div>' +
'<button type="button" class="action-btn" id="applyBrandBtn" style="margin-top:8px;padding:14px">Research Company & Adapt Workspace</button>' +
'</div>';
$('mSecSelect').value = $('ctxSector').value;
icons(); toggleModal(true);
$('mCompInput').addEventListener('input', function() { autoDiscoverOfficialDomain(this.value, $('mDomInput')); });
$('applyBrandBtn').addEventListener('click', function() {
var newComp = $('mCompInput').value.trim() || 'Xylem';
var newDom = $('mDomInput').value.trim() || inferDomainFromCompanyName(newComp);
$('ctxCompany').value = newComp; $('ctxDomain').value = newDom; $('ctxSector').value = $('mSecSelect').value;
updateContextUI(false); triggerLiveCompanyOsintFetch(getContext(), true); toggleModal(false);
});
}
function renderEmpty() {
$('feed').innerHTML = '<div class="empty-state" data-empty><i data-lucide="inbox" size="28"></i><span><strong>No active intelligence runs in this view.</strong><br>Click a global preset chip above, toggle <strong>🎧 AI Podcast</strong>, or open your <strong>Asset Vault</strong>.</span></div>';
icons();
}
function toggleFeed() { var btn = $('feedToggle'), open = btn.getAttribute('aria-expanded') === 'true'; btn.setAttribute('aria-expanded', !open); $('feed').hidden = open; }
function toggleTheme() {
var light = document.documentElement.getAttribute('data-theme') !== 'light';
if (light) document.documentElement.setAttribute('data-theme', 'light'); else document.documentElement.removeAttribute('data-theme');
$('themeIcon').setAttribute('data-lucide', light ? 'sun' : 'moon'); icons();
}
var toastTimer;
function showToast(message, type) {
var t = $('toast'); t.className = 'toast show ' + (type === 'success' ? 'success' : '');
t.querySelector('span').textContent = message;
clearTimeout(toastTimer); toastTimer = setTimeout(function() { t.classList.remove('show'); }, 3200);
}
function toggleModal(force) {
var open = typeof force === 'boolean' ? force : !$('appModal').classList.contains('active');
$('appModal').classList.toggle('active', open); $('modalOverlay').classList.toggle('active', open);
}
function appendBotMsg(htmlContent, sender, navAction) {
var box = $('botMessages'), div = document.createElement('div');
div.className = 'bot-msg ' + (sender || 'ai');
div.innerHTML = sender === 'user' ? esc(htmlContent) : htmlContent;
if (navAction && sender !== 'user') {
var btn = document.createElement('button');
btn.type = 'button'; btn.className = 'bot-action-btn'; btn.innerHTML = '➔ ' + esc(navAction.label);
btn.addEventListener('click', function() { loadDepartment(navAction.dept, navAction.toolId); $('mainInput').value = navAction.sampleInput; $('mainInput').focus(); });
div.appendChild(document.createElement('br')); div.appendChild(btn);
}
box.appendChild(div); box.scrollTop = box.scrollHeight; icons();
}
function getSmartBotReply(question) {
var q = String(question || '').toLowerCase();
var prof = buildDynamicCompanyTelemetry(getContext());
var comp = esc(prof.company);
if (q.indexOf('abm') !== -1 || q.indexOf('career') !== -1 || q.indexOf('persona') !== -1 || q.indexOf('layer') !== -1) {
return {
text: '<strong>4-Layer Surgical ABM & Career Psychology (' + comp + '):</strong><br>' +
'VANTAGE OS investigates: 1) <em>Macro Industry</em>, 2) <em>Company Architecture</em>, 3) <em>Buying Committee</em>, and 4) <em>The Decision-Maker\'s Full Career Trajectory & KPIs</em> so your outreach is hyper-precise.',
action: { label: 'Launch Career & Persona Psychology', dept: 'sales', toolId: 'persona', sampleInput: 'VP of Global Operations — ' + prof.company }
};
}
if (q.indexOf('global') !== -1 || q.indexOf('namibia') !== -1 || q.indexOf('canada') !== -1 || q.indexOf('360') !== -1) {
return {
text: '<strong>Borderless 360° Global Prospecting:</strong><br>' +
'There are zero geographical limits. A Canadian company can scan expansion signals in Namibia, APAC, LATAM, or EMEA in any of our 10 supported languages.',
action: { label: 'Run 360° Territory Radar', dept: 'sales', toolId: 'territory', sampleInput: 'Canada → Namibia & Southern Africa Expansion' }
};
}
if (q.indexOf('live') !== -1 || q.indexOf('construction') !== -1 || q.indexOf('module') !== -1) {
return {
text: '<strong>Module Status:</strong><br>' +
'• <strong>Sales & Market Expansion (6 Modules):</strong> 100% Live in Production.<br>' +
'• <strong>Marketing Studio & Customer Success:</strong> Currently <em>Under Construction</em> in our modular roadmap.',
action: { label: 'Open Live Sales Engine', dept: 'sales', toolId: 'utility', sampleInput: prof.company }
};
}
if (q.indexOf('roi') !== -1 || q.indexOf('mkt') !== -1 || q.indexOf('campaign') !== -1) {
return {
text: '<strong>Marketing Campaign ROI Formula:</strong><br>' +
'• <strong>Net ROI (%):</strong> <code>((Attributed Pipeline × Margin) - Spend) / Spend × 100</code><br>' +
'• <strong>Time Saved for Lean Teams:</strong> 18+ hours saved per rep weekly with zero manual copy-paste errors.'
};
}
return {
text: '<strong>VANTAGE OS v10.0 Copilot (' + comp + '):</strong><br>' +
'• <strong>Output Language:</strong> ' + esc(getActiveLang().toUpperCase()) + '<br>' +
'• <strong>Detected Scale:</strong> ' + esc(prof.scaleTier) + '<br>' +
'Select any of our 6 Live Sales & Market Expansion tools below:',
action: { label: 'Run 360° Account & Competitor Brief', dept: 'sales', toolId: 'utility', sampleInput: prof.company }
};
}
function handleBotSubmit(queryText) {
var text = String(queryText || '').trim(); if (!text) return;
appendBotMsg(text, 'user'); $('botInput').value = '';
sendTelemetryToGAS('BOT_QUERY', '[' + getContext().company + '] Asked Copilot: ' + text);
setTimeout(function() { var reply = getSmartBotReply(text); appendBotMsg(reply.text, 'ai', reply.action); }, 220);
}
/* =====================================================================
VISITOR TELEMETRY TRACKER (WITH LIVE IP/GEO RESOLUTION FOR VERCEL & GAS)
===================================================================== */
var visitorSessionId = 'sess_' + Math.random().toString(36).substring(2, 8) + '_' + Date.now().toString(36);
var visitorGeoCache = { ip: 'Pending...', city: 'Unknown', region: 'Unknown', country: 'Unknown', org: 'Unknown' };
function sendTelemetryToGAS(eventType, actionDetail) {
if (isOwnerDeviceIgnored()) return;
var tz = 'Unknown'; try { tz = Intl.DateTimeFormat().resolvedOptions().timeZone || 'Unknown'; } catch (e) {}
var lang = navigator.language || 'en', scr = (window.screen ? window.screen.width + 'x' + window.screen.height : 'Unknown');
callVantageBackend('logVisitorTelemetry', {
sessionId: visitorSessionId,
isOwner: isOwnerDeviceIgnored(),
eventType: eventType,
actionDetail: actionDetail,
ip: visitorGeoCache.ip,
city: visitorGeoCache.city,
region: visitorGeoCache.region,
country: visitorGeoCache.country,
org: visitorGeoCache.org,
timezone: tz,
langScreen: lang + ' (' + scr + ')',
userAgent: navigator.userAgent || 'Unknown'
});
}
function initVisitorGeoAndTrack() {
if (isOwnerDeviceIgnored()) return;
fetch('https://ipapi.co/json/')
.then(function(r) { return r.json(); })
.then(function(geo) {
if (geo && geo.ip) {
visitorGeoCache.ip = geo.ip || 'Unknown';
visitorGeoCache.city = geo.city || 'Unknown';
visitorGeoCache.region = geo.region || 'Unknown';
visitorGeoCache.country = geo.country_name || geo.country || 'Unknown';
visitorGeoCache.org = geo.org || 'Unknown';
}
sendTelemetryToGAS('PAGE_VISIT', 'Loaded VANTAGE OS v10.0 (' + (window.location.hostname || 'Web') + ')');
})
.catch(function() {
sendTelemetryToGAS('PAGE_VISIT', 'Loaded VANTAGE OS v10.0 (Geo Fallback)');
});
}
function bootApp() {
if (window.__iosBooted) return;
window.__iosBooted = true;
var isMac = /Mac|iPod|iPhone|iPad/.test(navigator.platform || '');
if ($('kbdMod')) $('kbdMod').textContent = isMac ? '⌘' : 'Ctrl';
if ($('globalLangSelect')) $('globalLangSelect').value = currentUiLang;
renderEmpty();
initVisitorGeoAndTrack();
$('globalLangSelect').addEventListener('change', function() {
currentUiLang = this.value;
try { localStorage.setItem('vantage_ui_lang', currentUiLang); } catch (e) {}
showToast('Output Language set to ' + currentUiLang.toUpperCase() + '. Re-syncing OSINT…', 'success');
if ($('landing-view').hidden) {
triggerLiveCompanyOsintFetch(getContext(), false);
}
});
$('lpBtnLogin').addEventListener('click', function() { openLoginModal(); });
$('btnHeaderLogin').addEventListener('click', function() { openLoginModal(); });
$('lpBtnDemo').addEventListener('click', function() {
enterPlatformWorkspace();
showToast('360° Interactive Sandbox Demo active!', 'success');
});
$('btnBackToLanding').addEventListener('click', showLandingPage);
if ($('btnSwitchToLiveSales')) {
$('btnSwitchToLiveSales').addEventListener('click', function() {
loadDepartment('sales');
showToast('Switched to Live Sales & Market Expansion Engine!', 'success');
});
}
var tierBtns = document.querySelectorAll('[data-login-trigger]');
for (var t = 0; t < tierBtns.length; t++) {
tierBtns[t].addEventListener('click', function() {
openLoginModal(this.getAttribute('data-login-trigger'));
});
}
var deptCards = document.querySelectorAll('[data-dept]');
for (var i = 0; i < deptCards.length; i++) {
deptCards[i].addEventListener('click', function() { loadDepartment(this.getAttribute('data-dept')); });
}
$('logoBtn').addEventListener('click', function() {
if (!$('landing-view').hidden) return;
showPortal();
});
$('secretLogoTrigger').addEventListener('dblclick', function(e) { e.stopPropagation(); openLoginModal(); });
$('btnVault').addEventListener('click', openAssetVaultModal);
$('openVaultInlineBtn').addEventListener('click', openAssetVaultModal);
$('btnHome').addEventListener('click', showPortal);
$('btnTheme').addEventListener('click', toggleTheme);
$('generateBtn').addEventListener('click', runAgent);
$('mainInput').addEventListener('keydown', function(e) { if (e.key === 'Enter') runAgent(); });
$('feedToggle').addEventListener('click', toggleFeed);
$('clearBtn').addEventListener('click', function() { renderEmpty(); showToast('Feed view cleared.', 'success'); });
if ($('podcastToggleBtn')) {
$('podcastToggleBtn').addEventListener('click', function() {
setPodcastToggleState(!generatePodcastEnabled, true);
showToast(generatePodcastEnabled ? '🎧 AI Audio Podcast enabled' : '🔇 AI Audio Podcast disabled', 'success');
});
}
$('openBrandModalBtn').addEventListener('click', openBrandModal);
$('heroBrandBanner').addEventListener('click', openBrandModal);
$('secretProposalBtn').addEventListener('click', openSaasProposalModal);
$('changelogBtn').addEventListener('click', openChangelogModal);
$('modalClose').addEventListener('click', function() { toggleModal(false); });
$('modalOverlay').addEventListener('click', function() { toggleModal(false); });
if ($('syncCompanyOsintBtn')) {
$('syncCompanyOsintBtn').addEventListener('click', function() { triggerLiveCompanyOsintFetch(getContext(), true); });
}
if ($('btnResearchCompany')) {
$('btnResearchCompany').addEventListener('click', function() {
autoDiscoverOfficialDomain($('ctxCompany').value, $('ctxDomain'), function() { triggerLiveCompanyOsintFetch(getContext(), true); });
});
}
$('ctxCompany').addEventListener('input', function() {
var val = this.value;
$('ctxDomain').value = inferDomainFromCompanyName(val);
updateContextUI(false);
clearTimeout(domainAutocompleteDebounce);
domainAutocompleteDebounce = setTimeout(function() {
autoDiscoverOfficialDomain(val, $('ctxDomain'), function() { updateContextUI(true); });
}, 320);
});
$('ctxCompany').addEventListener('keydown', function(e) {
if (e.key === 'Enter') {
autoDiscoverOfficialDomain(this.value, $('ctxDomain'), function() { triggerLiveCompanyOsintFetch(getContext(), true); });
}
});
$('ctxDomain').addEventListener('change', function() { triggerLiveCompanyOsintFetch(getContext(), true); });
$('ctxSector').addEventListener('change', function() { updateContextUI(false); });
$('modeBadge').addEventListener('click', function() { openLoginModal(); });
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape' && $('appModal').classList.contains('active')) { toggleModal(false); return; }
if ((e.metaKey || e.ctrlKey) && e.key.toLowerCase() === 'k') {
e.preventDefault();
if (!$('landing-view').hidden) enterPlatformWorkspace();
if ($('dashboard-view').hidden) loadDepartment('sales');
setTimeout(function() { if ($('mainInput')) { $('mainInput').focus(); $('mainInput').select(); } }, 150);
}
});
appendBotMsg('Welcome to <strong>' + PRODUCT_BRAND_NAME + ' v10.0</strong>! We support borderless 360° prospecting (e.g., Canada → Namibia), 4-layer surgical ABM, and 10 output languages.', 'ai');
$('botLauncher').addEventListener('click', function() { $('botWindow').classList.toggle('open'); });
$('botCloseBtn').addEventListener('click', function() { $('botWindow').classList.remove('open'); });
$('botForm').addEventListener('submit', function(e) { e.preventDefault(); handleBotSubmit($('botInput').value); });
var promptBtns = document.querySelectorAll('.bot-prompt-btn');
for (var j = 0; j < promptBtns.length; j++) {
promptBtns[j].addEventListener('click', function() { handleBotSubmit(this.getAttribute('data-q')); });
}
icons();
}
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', bootApp); } else { bootApp(); }
</script>
</body>
</html>