Spaces:
Sleeping
Sleeping
| <html lang="en" data-theme="dark"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <meta name="description" content="WebScraper Platform — Professional web scraping with visual configuration, exports, and scheduling."> | |
| <title>{% block title %}WebScraper Platform{% endblock %}</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=Inter:wght@300;400;500;600;700;800&display=swap" rel="stylesheet"> | |
| <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"> | |
| {% block extra_head %}{% endblock %} | |
| </head> | |
| <body> | |
| <!-- Navigation --> | |
| <nav class="navbar" id="main-nav"> | |
| <div class="nav-container"> | |
| <a href="{{ url_for('main.index') }}" class="nav-brand"> | |
| <span class="brand-icon">🕷️</span> | |
| <span class="brand-text">WebScraper<span class="brand-accent">.pro</span></span> | |
| </a> | |
| <div class="nav-links" id="nav-links"> | |
| <a href="{{ url_for('main.index') }}" class="nav-link {% if request.endpoint == 'main.index' %}active{% endif %}"> | |
| <svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"/><polyline points="9 22 9 12 15 12 15 22"/></svg> | |
| Dashboard | |
| </a> | |
| <a href="{{ url_for('jobs.list_view') }}" class="nav-link {% if request.endpoint and request.endpoint.startswith('jobs.') and request.endpoint != 'jobs.new_job' %}active{% endif %}"> | |
| <svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="7" width="20" height="14" rx="2" ry="2"/><path d="M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16"/></svg> | |
| Jobs | |
| </a> | |
| <a href="{{ url_for('jobs.new_job') }}" class="nav-link btn-nav-primary {% if request.endpoint == 'jobs.new_job' %}active{% endif %}"> | |
| <svg class="nav-icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><line x1="12" y1="8" x2="12" y2="16"/><line x1="8" y1="12" x2="16" y2="12"/></svg> | |
| New Scrape | |
| </a> | |
| </div> | |
| <button class="nav-toggle" id="nav-toggle" aria-label="Toggle navigation"> | |
| <span></span><span></span><span></span> | |
| </button> | |
| </div> | |
| </nav> | |
| <!-- Flash Messages --> | |
| {% with messages = get_flashed_messages(with_categories=true) %} | |
| {% if messages %} | |
| <div class="toast-container" id="toast-container"> | |
| {% for category, message in messages %} | |
| <div class="toast toast-{{ category }}" data-auto-dismiss="5000"> | |
| <div class="toast-icon"> | |
| {% if category == 'success' %}✓{% elif category == 'danger' or category == 'error' %}✕{% elif category == 'warning' %}⚠{% else %}ℹ{% endif %} | |
| </div> | |
| <div class="toast-body">{{ message }}</div> | |
| <button class="toast-close" onclick="this.parentElement.remove()">×</button> | |
| </div> | |
| {% endfor %} | |
| </div> | |
| {% endif %} | |
| {% endwith %} | |
| <!-- Main Content --> | |
| <main class="main-content"> | |
| <div class="container"> | |
| {% block content %}{% endblock %} | |
| </div> | |
| </main> | |
| <!-- Footer --> | |
| <footer class="footer"> | |
| <div class="container footer-inner"> | |
| <p class="footer-text">© 2026 WebScraper<span class="brand-accent">.pro</span> — Built with Flask & BeautifulSoup</p> | |
| <div class="footer-links"> | |
| <a href="{{ url_for('main.health') }}" class="footer-link">Health</a> | |
| <a href="{{ url_for('main.metrics') }}" class="footer-link">Metrics</a> | |
| </div> | |
| </div> | |
| </footer> | |
| <script src="{{ url_for('static', filename='js/app.js') }}"></script> | |
| {% block extra_scripts %}{% endblock %} | |
| </body> | |
| </html> | |