LeadGenPro / lead_gen /static /index.html
MaSTer-suFYan
Fix pipeline stuck bug and add lead clearing controls
26a54a9
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="LeadGen Pro β€” Intelligent Business Lead Generation Dashboard">
<title>LeadGen Pro β€” Dashboard</title>
<link rel="stylesheet" href="/styles.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.0/dist/chart.umd.min.js"></script>
</head>
<body>
<div class="app-container">
<!-- Mobile menu button -->
<button class="mobile-menu-btn" id="mobile-menu-btn" onclick="document.getElementById('sidebar').classList.toggle('open');document.getElementById('sidebar-overlay').classList.toggle('show');">&#9776;</button>
<div class="sidebar-overlay" id="sidebar-overlay" onclick="document.getElementById('sidebar').classList.remove('open');this.classList.remove('show');"></div>
<!-- ═══ SIDEBAR ═══ -->
<aside class="sidebar" id="sidebar">
<div class="sidebar-header">
<div class="sidebar-logo">
<div class="logo-icon"><svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg></div>
<div class="logo-text">
<h1>LeadGen Pro</h1>
<span>Intelligence Engine</span>
</div>
</div>
</div>
<nav class="sidebar-nav">
<button class="nav-item active" data-page="dashboard">
<span class="icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><rect x="7" y="10" width="3" height="8" rx="1"/><rect x="14" y="6" width="3" height="12" rx="1"/></svg></span> Dashboard
</button>
<button class="nav-item" data-page="generate">
<span class="icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg></span> Generate Leads
</button>
<button class="nav-item" data-page="leads">
<span class="icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="3" width="18" height="18" rx="2"/><path d="M8 7h8"/><path d="M8 11h8"/><path d="M8 15h5"/></svg></span> All Leads
</button>
<button class="nav-item" data-page="exports">
<span class="icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 15v4a2 2 0 01-2 2H5a2 2 0 01-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" y1="15" x2="12" y2="3"/></svg></span> Exports
</button>
<div class="nav-divider"></div>
<div style="padding: 12px 16px;">
<div class="td-small">Database</div>
<div style="font-weight: 700; font-size: 1.1rem;" id="sidebar-total">0</div>
<div class="td-small">total leads</div>
<button class="btn btn-xs btn-danger" style="margin-top: 8px; width: 100%;" onclick="App.clearAllLeads()">Clear All Data</button>
</div>
</nav>
<div class="sidebar-footer">
LeadGen Pro v2.0 &mdash; For authorized business use only
</div>
</aside>
<!-- ═══ MAIN CONTENT ═══ -->
<main class="main-content">
<!-- ─── DASHBOARD PAGE ─── -->
<section class="page-section active" id="page-dashboard">
<div class="page-header">
<div>
<h2>Dashboard</h2>
<p>Overview of your lead generation pipeline</p>
</div>
<div class="header-actions">
<button class="btn btn-primary" onclick="App.goTo('generate')">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg> Generate Leads
</button>
</div>
</div>
<!-- Stats -->
<div class="stats-grid" id="stats-grid">
<div class="stat-card"><div class="stat-icon blue"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><rect x="7" y="10" width="3" height="8" rx="1"/><rect x="14" y="6" width="3" height="12" rx="1"/></svg></div><div class="stat-value" id="stat-total">0</div><div class="stat-label">Total Leads</div></div>
<div class="stat-card"><div class="stat-icon red"><span class="dot dot-high"></span></div><div class="stat-value" id="stat-high">0</div><div class="stat-label">High Priority</div></div>
<div class="stat-card"><div class="stat-icon amber"><span class="dot dot-medium"></span></div><div class="stat-value" id="stat-medium">0</div><div class="stat-label">Medium Priority</div></div>
<div class="stat-card"><div class="stat-icon green"><span class="dot dot-low"></span></div><div class="stat-value" id="stat-low">0</div><div class="stat-label">Low Priority</div></div>
<div class="stat-card"><div class="stat-icon purple"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="4" width="20" height="16" rx="2"/><path d="M22 7l-10 7L2 7"/></svg></div><div class="stat-value" id="stat-contacted">0</div><div class="stat-label">Contacted</div></div>
<div class="stat-card"><div class="stat-icon cyan"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 11.08V12a10 10 0 11-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg></div><div class="stat-value" id="stat-converted">0</div><div class="stat-label">Converted</div></div>
</div>
<!-- Charts -->
<div class="charts-grid">
<div class="card">
<div class="card-header"><div class="card-title">Score Distribution</div></div>
<div class="chart-container"><canvas id="chart-score"></canvas></div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">By Service Category</div></div>
<div class="chart-container"><canvas id="chart-service"></canvas></div>
</div>
</div>
<!-- Top leads -->
<div class="card">
<div class="card-header">
<div class="card-title">Top Opportunity Leads</div>
<button class="btn btn-sm btn-secondary" onclick="App.goTo('leads')">View All</button>
</div>
<div class="table-wrapper">
<table>
<thead><tr>
<th>Business</th><th>Score</th><th>Status</th><th>Opportunity</th><th>Phone</th><th>Action</th>
</tr></thead>
<tbody id="top-leads-body"></tbody>
</table>
</div>
</div>
</section>
<section class="page-section" id="page-generate">
<div class="page-header">
<div>
<h2>Generate Leads</h2>
<p>Configure and run the lead collection pipeline</p>
</div>
</div>
<div class="card" style="max-width: 700px;">
<div class="generate-grid">
<div class="form-group">
<label><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z"/><circle cx="12" cy="10" r="3"/></svg> State</label>
<select class="select" id="gen-state" onchange="App.updateCities()">
<option value="">-- Select State --</option>
<optgroup label="North India">
<option value="Delhi">Delhi</option>
<option value="Uttar Pradesh">Uttar Pradesh</option>
<option value="Haryana">Haryana</option>
<option value="Punjab">Punjab</option>
<option value="Rajasthan">Rajasthan</option>
<option value="Madhya Pradesh">Madhya Pradesh</option>
<option value="Uttarakhand">Uttarakhand</option>
<option value="Himachal Pradesh">Himachal Pradesh</option>
<option value="Jammu &amp; Kashmir">Jammu &amp; Kashmir</option>
<option value="Chandigarh">Chandigarh</option>
</optgroup>
<optgroup label="West India">
<option value="Maharashtra" selected>Maharashtra</option>
<option value="Gujarat">Gujarat</option>
<option value="Goa">Goa</option>
</optgroup>
<optgroup label="South India">
<option value="Karnataka">Karnataka</option>
<option value="Tamil Nadu">Tamil Nadu</option>
<option value="Kerala">Kerala</option>
<option value="Telangana">Telangana</option>
<option value="Andhra Pradesh">Andhra Pradesh</option>
</optgroup>
<optgroup label="East India">
<option value="West Bengal">West Bengal</option>
<option value="Bihar">Bihar</option>
<option value="Odisha">Odisha</option>
<option value="Jharkhand">Jharkhand</option>
<option value="Assam">Assam</option>
</optgroup>
</select>
</div>
<div class="form-group">
<label><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 21h18"/><path d="M5 21V7l8-4v18"/><path d="M19 21V11l-6-4"/><path d="M9 9v.01"/><path d="M9 12v.01"/><path d="M9 15v.01"/><path d="M9 18v.01"/></svg> City</label>
<select class="select" id="gen-city">
<option value="Mumbai">Mumbai</option>
<option value="Pune">Pune</option>
<option value="Nagpur">Nagpur</option>
<option value="Nashik">Nashik</option>
<option value="Thane">Thane</option>
<option value="Aurangabad">Aurangabad</option>
</select>
</div>
<div class="form-group">
<label><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 7V5a4 4 0 00-8 0v2"/></svg> Business Category</label>
<select class="select" id="gen-service">
<option value="all">All Categories</option>
<optgroup label="IT &amp; Technology">
<option value="web">Web Development</option>
<option value="app">App Development</option>
<option value="ai">AI &amp; Automation</option>
<option value="it_services">IT Services &amp; Consulting</option>
<option value="software">Software Companies</option>
</optgroup>
<optgroup label="Healthcare">
<option value="hospitals">Hospitals &amp; Clinics</option>
<option value="pharmacy">Pharmacy &amp; Medical Stores</option>
<option value="diagnostic">Diagnostic Labs</option>
<option value="dental">Dental Clinics</option>
<option value="ayurveda">Ayurveda &amp; Wellness</option>
</optgroup>
<optgroup label="Education">
<option value="schools">Schools &amp; Colleges</option>
<option value="coaching">Coaching Institutes</option>
<option value="training">Training Centers</option>
</optgroup>
<optgroup label="Food &amp; Hospitality">
<option value="restaurants">Restaurants &amp; Cafes</option>
<option value="hotels">Hotels &amp; Resorts</option>
<option value="catering">Catering Services</option>
</optgroup>
<optgroup label="Retail &amp; Services">
<option value="fashion">Fashion &amp; Clothing</option>
<option value="jewellery">Jewellery Stores</option>
<option value="electronics">Electronics &amp; Appliances</option>
<option value="furniture">Furniture &amp; Home Decor</option>
<option value="grocery">Grocery &amp; Supermarkets</option>
</optgroup>
<optgroup label="Professional Services">
<option value="legal">Legal &amp; Law Firms</option>
<option value="ca_finance">CA &amp; Financial Services</option>
<option value="real_estate">Real Estate &amp; Construction</option>
<option value="interior">Interior Design</option>
<option value="event_mgmt">Event Management</option>
</optgroup>
<optgroup label="Manufacturing &amp; Trade">
<option value="manufacturing">Manufacturing Units</option>
<option value="export_import">Export &amp; Import</option>
<option value="automobile">Automobile &amp; Spare Parts</option>
<option value="textiles">Textiles &amp; Garments</option>
</optgroup>
<optgroup label="Beauty &amp; Lifestyle">
<option value="salon">Salon &amp; Spa</option>
<option value="gym">Gym &amp; Fitness</option>
<option value="photography">Photography &amp; Videography</option>
</optgroup>
</select>
</div>
<div class="form-group">
<label><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 16V8a2 2 0 00-1-1.73l-7-4a2 2 0 00-2 0l-7 4A2 2 0 003 8v8a2 2 0 001 1.73l7 4a2 2 0 002 0l7-4A2 2 0 0021 16z"/><polyline points="3.27 6.96 12 12.01 20.73 6.96"/><line x1="12" y1="22.08" x2="12" y2="12"/></svg> Data Source</label>
<select class="select" id="gen-source">
<option value="all">All Sources</option>
<option value="googlemaps">Google Maps</option>
<option value="justdial">JustDial</option>
<option value="indiamart">IndiaMART</option>
<option value="sulekha">Sulekha</option>
</select>
</div>
<div class="form-group">
<label><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="4" y1="9" x2="20" y2="9"/><line x1="4" y1="15" x2="20" y2="15"/><line x1="10" y1="3" x2="8" y2="21"/><line x1="16" y1="3" x2="14" y2="21"/></svg> Lead Limit</label>
<input class="input" id="gen-limit" type="number" value="50" min="5" max="500">
</div>
</div>
<div style="border-top: 1px solid var(--border-color); padding-top: 16px; margin-top: 8px;">
<div class="toggle-row">
<label><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 3h6l1 7-4 2-4-2 1-7z"/><path d="M6 21c0-3 2-4 6-4s6 1 6 4"/><circle cx="12" cy="12" r="1"/></svg> Demo Mode (sample data)</label>
<label class="toggle"><input type="checkbox" id="gen-demo"><span class="toggle-slider"></span></label>
</div>
<div class="toggle-row">
<label><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="2" y1="12" x2="22" y2="12"/><path d="M12 2a15.3 15.3 0 014 10 15.3 15.3 0 01-4 10 15.3 15.3 0 01-4-10 15.3 15.3 0 014-10z"/></svg> Website Analysis (slower, more data)</label>
<label class="toggle"><input type="checkbox" id="gen-analyse"><span class="toggle-slider"></span></label>
</div>
</div>
<div style="margin-top: 20px; display: flex; gap: 10px; flex-wrap: wrap;">
<button class="btn btn-primary" id="btn-generate" onclick="App.startGeneration()">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg> Start Lead Generation
</button>
<button class="btn btn-danger" onclick="App.cancelPipeline()" title="Force-cancel any stuck pipeline">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><line x1="15" y1="9" x2="9" y2="15"/><line x1="9" y1="9" x2="15" y2="15"/></svg> Cancel Pipeline
</button>
</div>
</div>
</section>
<!-- ─── LEADS PAGE ─── -->
<section class="page-section" id="page-leads">
<div class="page-header">
<div>
<h2>All Leads</h2>
<p id="leads-subtitle">Manage your business leads</p>
</div>
<div class="header-actions">
<button class="btn btn-sm btn-danger" onclick="App.clearAllLeads()" title="Delete all leads from database">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"/><path d="M19 6v14a2 2 0 01-2 2H7a2 2 0 01-2-2V6m3 0V4a2 2 0 012-2h4a2 2 0 012 2v2"/></svg> Clear All
</button>
<button class="btn btn-sm btn-secondary" onclick="App.exportLeads('csv')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg> CSV</button>
<button class="btn btn-sm btn-secondary" onclick="App.exportLeads('json')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg> JSON</button>
<button class="btn btn-sm btn-primary" onclick="App.exportLeads('pdf')"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg> PDF</button>
</div>
</div>
<!-- Bulk actions -->
<div class="bulk-bar" id="bulk-bar">
<span class="bulk-count" id="bulk-count">0</span> selected
<button class="btn btn-xs btn-secondary" onclick="App.bulkStatus('Contacted')">Mark Contacted</button>
<button class="btn btn-xs btn-secondary" onclick="App.bulkStatus('Converted')">Mark Converted</button>
<button class="btn btn-xs btn-danger" onclick="App.bulkStatus('Rejected')">Reject</button>
<button class="btn btn-xs btn-secondary" onclick="App.clearSelection()" style="margin-left:auto;">Clear</button>
</div>
<!-- Toolbar -->
<div class="toolbar">
<div class="search-box">
<span class="icon"><svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg></span>
<input class="input" id="search-input" placeholder="Search by name, email, phone, address..." oninput="App.debounceSearch()">
</div>
<div class="filter-chips" id="score-chips">
<button class="chip active" data-score="ALL" onclick="App.filterScore(this)">All</button>
<button class="chip" data-score="HIGH" onclick="App.filterScore(this)"><span class="dot dot-high"></span> High</button>
<button class="chip" data-score="MEDIUM" onclick="App.filterScore(this)"><span class="dot dot-medium"></span> Medium</button>
<button class="chip" data-score="LOW" onclick="App.filterScore(this)"><span class="dot dot-low"></span> Low</button>
</div>
<select class="select" id="filter-service" onchange="App.loadLeads()" style="min-width:160px;">
<option value="all">All Categories</option>
<optgroup label="IT &amp; Technology">
<option value="web">Web Dev</option>
<option value="app">App Dev</option>
<option value="ai">AI</option>
<option value="it_services">IT Services</option>
<option value="software">Software</option>
</optgroup>
<optgroup label="Healthcare">
<option value="hospitals">Hospitals</option>
<option value="pharmacy">Pharmacy</option>
<option value="diagnostic">Diagnostic</option>
<option value="dental">Dental</option>
<option value="ayurveda">Ayurveda</option>
</optgroup>
<optgroup label="Education">
<option value="schools">Schools</option>
<option value="coaching">Coaching</option>
<option value="training">Training</option>
</optgroup>
<optgroup label="Food &amp; Hospitality">
<option value="restaurants">Restaurants</option>
<option value="hotels">Hotels</option>
<option value="catering">Catering</option>
</optgroup>
<optgroup label="Retail">
<option value="fashion">Fashion</option>
<option value="jewellery">Jewellery</option>
<option value="electronics">Electronics</option>
<option value="furniture">Furniture</option>
<option value="grocery">Grocery</option>
</optgroup>
<optgroup label="Professional">
<option value="legal">Legal</option>
<option value="ca_finance">CA &amp; Finance</option>
<option value="real_estate">Real Estate</option>
<option value="interior">Interior</option>
<option value="event_mgmt">Events</option>
</optgroup>
<optgroup label="Manufacturing">
<option value="manufacturing">Manufacturing</option>
<option value="export_import">Export/Import</option>
<option value="automobile">Automobile</option>
<option value="textiles">Textiles</option>
</optgroup>
<optgroup label="Lifestyle">
<option value="salon">Salon &amp; Spa</option>
<option value="gym">Gym</option>
<option value="photography">Photography</option>
</optgroup>
</select>
<select class="select" id="filter-status" onchange="App.loadLeads()" style="min-width:140px;">
<option value="all">All Status</option>
<option value="New">New</option>
<option value="Contacted">Contacted</option>
<option value="Converted">Converted</option>
<option value="Rejected">Rejected</option>
</select>
</div>
<!-- Table -->
<div class="table-wrapper">
<table>
<thead><tr>
<th class="col-checkbox"><input type="checkbox" class="row-check" id="check-all" onchange="App.toggleAll(this)"></th>
<th onclick="App.sortBy('business_name')">Business</th>
<th onclick="App.sortBy('score_points')">Score</th>
<th onclick="App.sortBy('status')">Status</th>
<th class="col-pitch">Opportunity</th>
<th class="col-phone">Phone</th>
<th class="col-email">Email</th>
<th class="col-source">Source</th>
<th class="col-staleness" onclick="App.sortBy('scraped_at')">Scraped</th>
</tr></thead>
<tbody id="leads-body"></tbody>
</table>
</div>
<!-- Pagination -->
<div class="pagination">
<div class="pagination-info" id="pagination-info">Showing 0 leads</div>
<div class="pagination-controls" id="pagination-controls"></div>
</div>
</section>
<!-- ─── EXPORTS PAGE ─── -->
<section class="page-section" id="page-exports">
<div class="page-header">
<div><h2>Export Leads</h2><p>Download your leads in multiple formats</p></div>
</div>
<div class="export-grid">
<div class="export-card" onclick="App.exportLeads('pdf')">
<div class="export-icon"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/></svg></div>
<h3>PDF Report</h3>
<p>Branded report with QR codes, charts, and opportunity analysis</p>
</div>
<div class="export-card" onclick="App.exportLeads('csv')">
<div class="export-icon"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><path d="M14 2H6a2 2 0 00-2 2v16a2 2 0 002 2h12a2 2 0 002-2V8z"/><polyline points="14 2 14 8 20 8"/><line x1="16" y1="13" x2="8" y2="13"/><line x1="16" y1="17" x2="8" y2="17"/></svg></div>
<h3>CSV Spreadsheet</h3>
<p>Full data export for Google Sheets or Excel</p>
</div>
<div class="export-card" onclick="App.exportLeads('json')">
<div class="export-icon"><svg width="28" height="28" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"><polyline points="16 18 22 12 16 6"/><polyline points="8 6 2 12 8 18"/></svg></div>
<h3>JSON Data</h3>
<p>Structured data for CRM integration</p>
</div>
</div>
<div class="card">
<div class="card-header"><div class="card-title">Export History</div></div>
<div class="table-wrapper">
<table>
<thead><tr><th>File</th><th>Type</th><th>Size</th><th>Date</th><th>Action</th></tr></thead>
<tbody id="exports-body"></tbody>
</table>
</div>
</div>
</section>
</main>
</div>
<!-- ═══ LEAD DETAIL MODAL ═══ -->
<div class="modal-overlay" id="lead-modal">
<div class="modal">
<div class="modal-header">
<h3 id="modal-title">Lead Details</h3>
<button class="modal-close" onclick="App.closeModal()">&times;</button>
</div>
<div class="modal-body" id="modal-body"></div>
<div class="modal-footer">
<button class="btn btn-secondary" onclick="App.closeModal()">Close</button>
<button class="btn btn-primary" id="modal-save-notes" onclick="App.saveNotes()">Save Notes</button>
</div>
</div>
</div>
<!-- ═══ PROGRESS OVERLAY ═══ -->
<div class="progress-overlay" id="progress-overlay">
<div class="progress-card">
<div class="progress-spinner"></div>
<div class="progress-text" id="progress-text">Starting pipeline...</div>
<div class="progress-sub" id="progress-sub">Please wait</div>
<div class="progress-bar-container">
<div class="progress-bar-fill" id="progress-bar"></div>
</div>
</div>
</div>
<!-- ═══ TOAST CONTAINER ═══ -->
<div class="toast-container" id="toast-container"></div>
<script src="/app.js"></script>
</body>
</html>