Spaces:
Running
Running
File size: 11,472 Bytes
ed178f8 c977f11 ed178f8 937d49b 20241c3 2d9b70d 2f08b47 af47599 20241c3 af47599 a032d1d af47599 c3ef8ca af47599 16a0507 35e5e52 ca810fd 35108b4 af47599 ca810fd 8893fd2 937d49b 8893fd2 ca810fd af47599 0cbbe05 ed178f8 51555f5 e225fc9 c879790 8c689b4 0f92239 2f08b47 35108b4 36bac29 10471d0 6d20503 2f08b47 10471d0 cc9ca36 8c689b4 cc9ca36 2f08b47 5311d88 b618b4b 35108b4 b618b4b 17c1289 7328622 b618b4b cea5720 e616c5c cea5720 7328622 2f08b47 2622cc2 823221d 17c1289 7328622 51555f5 2f08b47 c879790 e5cbdf2 0c53b7c e5cbdf2 51555f5 2f08b47 33a9141 937d49b d5db878 2f08b47 b27959f 41eeebf b27959f 33a9141 41eeebf 33a9141 41eeebf 33a9141 ed178f8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | <!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>{% block title %}QuantVAT - Crypto Volume Analysis Tool{% endblock %}</title>
<meta name="description" content="{% block description %}Quantitative Crypto Volume Analysis Tool for cross-market Spot/Futures analysis, tracking & automated data-driven reporting.{% endblock %}">
<meta name="keywords" content="{% block keywords %}crypto, volume analysis, spot, cryptoquant, volume anomaly, futures, trading tool, VTMR, open interest, coinalyze, heisbuba{% endblock %}">
<meta name="author" content="Buba">
<meta name="robots" content="index, follow">
<meta property="og:title" content="{% block og_title %}QuantVAT - Professional Volume Analysis Tool{% endblock %}">
<meta property="og:description" content="{% block og_description %}Track Spot & Futures volume like a pro. Detect whale movements and track VTMR data.{% endblock %}">
<meta property="og:url" content="https://quantvat.hf.space{{ request.path }}">
<meta property="og:type" content="website">
<meta property="og:site_name" content="QuantVAT">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@heisbuba">
<meta name="twitter:creator" content="@heisbuba">
<meta name="twitter:title" content="{% block twitter_title %}{{ self.og_title() }}{% endblock %}">
<meta name="twitter:description" content="{% block twitter_description %}{{ self.og_description() }}{% endblock %}">
<link rel="icon" type="image/svg+xml" href="{{ url_for('static', filename='logo.svg') }}">
<link rel="apple-touch-icon" href="{{ url_for('static', filename='icons/icon-512.png') }}">
<link rel="manifest" href="/manifest.json">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="theme-color" content="#151a1e">
<script>
try { if (localStorage.getItem('qv-theme') === 'light') document.documentElement.setAttribute('data-theme', 'light'); } catch (e) {}
</script>
<script src="{{ url_for('static', filename='js/theme.js') }}" defer></script>
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(reg => console.log('QuantVAT: Service Worker Active'))
.catch(err => console.error('PWA Registration Error', err));
});
}
</script>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "QuantVAT",
"operatingSystem": "Web",
"applicationCategory": "FinanceApplication",
"description": "Quantitative Crypto Volume Analysis Tool for cross-market Spot/Futures analysis.",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "USD"
},
"author": {
"@type": "Person",
"name": "Buba",
"url": "https://x.com/heisbuba"
}
}
</script>
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&family=Inter:wght@400;500;600;800&display=swap" rel="stylesheet">
<link rel="stylesheet" href="{{ url_for('static', filename='css/shared_tokens.css') }}">
<link rel="stylesheet" href="{{ url_for('static', filename='css/base.css') }}">
{% block extra_css %}{% endblock %}
</head>
<body>
<div class="header">
<h1>
<a href="{{ url_for('main.home') if session.get('user_id') else url_for('main.index') }}"
style="display: flex; align-items: center; gap: 0; text-decoration: none;">
<svg class="force-dark" width="28" height="28" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg"
style="margin-bottom: 2px; margin-right: -2px; flex-shrink: 0; forced-color-adjust: none;">
<rect width="512" height="512" rx="120" fill="var(--bg-dark)"/>
<path d="M380 380L430 430" stroke="var(--text-main)" stroke-width="32" stroke-linecap="round"/>
<circle cx="256" cy="256" r="160" stroke="var(--text-main)" stroke-width="32"/>
<rect x="190" y="270" width="30" height="60" rx="4" fill="var(--accent-green)"/>
<rect x="241" y="230" width="30" height="100" rx="4" fill="var(--accent-green)"/>
<rect x="292" y="190" width="30" height="140" rx="4" fill="var(--accent-green)"/>
</svg>
<span style="font-weight: 800; font-size: 1.4rem; letter-spacing: -1px; color: var(--text-main); line-height: 1;">
uant<span style="color: var(--accent-green);">VAT</span>
</span>
</a>
</h1>
<div style="display: flex; align-items: center; gap: 5px;">
<button type="button" id="theme-toggle" class="icon-btn theme-toggle" aria-pressed="false" aria-label="Switch to light theme" title="Switch to light theme">
<svg class="icon-sun" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="5"></circle><line x1="12" y1="1" x2="12" y2="3"></line><line x1="12" y1="21" x2="12" y2="23"></line><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line><line x1="1" y1="12" x2="3" y2="12"></line><line x1="21" y1="12" x2="23" y2="12"></line><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line></svg>
<svg class="icon-moon" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"></path></svg>
</button>
<a href="{{ url_for('main.help_page') }}" class="icon-btn" title="Help">
<svg width="20" height="20" 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"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><line x1="12" y1="17" x2="12.01" y2="17"></line></svg>
</a>
{% if session.get('user_id') %}
{% if request.endpoint != 'main.setup' %}
<a href="{{ url_for('main.settings') }}" class="icon-btn" title="Settings">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<circle cx="12" cy="12" r="3"/>
<path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1-2.83 2.83l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-4 0v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06-.06a2 2 0 0 1-2.83-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1 0-4h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 2.83-2.83l.06-.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 4 0v.09a1.65 1.65 0 0 0 1 1.51h.09a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 2.83l-.06-.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1Z"/>
</svg>
</a>
{% endif %}
<a href="{{ url_for('auth.logout') }}" class="icon-btn logout-btn" title="Logout">
<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="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4"></path><polyline points="16 17 21 12 16 7"></polyline><line x1="21" y1="12" x2="9" y2="12"></line></svg>
</a>
{% endif %}
</div>
</div>
<main>
{% block content %}{% endblock %}
<div class="back-nav-container">
{%- if session.get('user_id') and request.endpoint not in ['main.home', 'main.setup', 'auth.login', 'auth.register', 'auth.reset_password', 'main.help_page'] -%}
<a href="{{ url_for('main.home') }}" class="btn btn-links back-nav-btn">β BACK TO DASHBOARD</a>
{%- elif request.endpoint == 'main.help_page' -%}
{%- if session.get('user_id') -%}
{%- if is_setup_complete -%}
<a href="{{ url_for('main.home') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO DASHBOARD</a>
{%- else -%}
<a href="{{ url_for('main.setup') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO SETUP WIZARD</a>
{%- endif -%}
{%- else -%}
{%- if request.referrer and 'register' in request.referrer -%}
<a href="{{ url_for('auth.register') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO REGISTER</a>
{%- elif request.referrer and 'reset-password' in request.referrer -%}
<a href="{{ url_for('auth.reset_password') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO RESET PASSWORD</a>
{%- else -%}
<a href="{{ url_for('auth.login') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO LOGIN</a>
{%- endif -%}
{%- endif -%}
{%- elif request.endpoint == 'main.privacy_policy' -%}
{%- if session.get('user_id') -%}
{%- if is_setup_complete -%}
<a href="{{ url_for('main.home') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO DASHBOARD</a>
{%- else -%}
<a href="{{ url_for('main.setup') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO SETUP WIZARD</a>
{%- endif -%}
{%- else -%}
{%- if request.referrer and 'register' in request.referrer -%}
<a href="{{ url_for('auth.register') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO REGISTER</a>
{%- elif request.referrer and 'reset-password' in request.referrer -%}
<a href="{{ url_for('auth.reset_password') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO RESET PASSWORD</a>
{%- else -%}
<a href="{{ url_for('auth.login') }}" class="help-btn help-nav-btn back-nav-btn">β BACK TO LOGIN</a>
{%- endif -%}
{%- endif -%}
{%- endif -%}
</div>
</main>
<footer class="footer">
<p>
© 2026
<a href="{{ url_for('main.index') }}" title="Quantitative Crypto Volume Analysis Tool">QuantVAT</a>.
Created by <a href="https://x.com/heisbuba" title="X @heisbuba" target="_blank">Buba</a> with curiosity.
</p>
</footer>
{% if request.endpoint in ['auth.login', 'auth.register', 'main.settings'] %}
<script>
function toggleFieldVisibility(inputId, btn) {
const input = document.getElementById(inputId);
const iconEye = btn.querySelector('.icon-eye');
const iconEyeOff = btn.querySelector('.icon-eye-off');
if (input.type === "password") {
input.type = "text";
iconEye.style.display = "none";
iconEyeOff.style.display = "block";
} else {
input.type = "password";
iconEye.style.display = "block";
iconEyeOff.style.display = "none";
}
}
</script>
{% endif %}
</body>
</html> |