Spaces:
Sleeping
Sleeping
Upload 9 files
Browse files- UI2/about.html +116 -0
- UI2/calculator.html +1450 -0
- UI2/calculator.js +481 -0
- UI2/chatbot.html +1166 -0
- UI2/index.html +120 -0
- UI2/java.js +197 -0
- UI2/report.html +1017 -0
- UI2/report.js +731 -0
- UI2/style.css +3749 -0
UI2/about.html
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
| 6 |
+
<title>About - Injury Prediction System</title>
|
| 7 |
+
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600&family=Space+Grotesk:wght@400;500;600&display=swap" rel="stylesheet"/>
|
| 8 |
+
<link rel="stylesheet" href="style.css"/>
|
| 9 |
+
</head>
|
| 10 |
+
<body>
|
| 11 |
+
<header>
|
| 12 |
+
<div class="navbar">
|
| 13 |
+
<div class="nav-logo">IPS</div>
|
| 14 |
+
<div class="hamburger" aria-label="Toggle navigation">
|
| 15 |
+
<span></span>
|
| 16 |
+
<span></span>
|
| 17 |
+
<span></span>
|
| 18 |
+
</div>
|
| 19 |
+
<ul class="nav-menu">
|
| 20 |
+
<li><a href="index.html">Home</a></li>
|
| 21 |
+
<li><a href="index.html#features">Features</a></li>
|
| 22 |
+
<li><a href="calculator.html">Calculator</a></li>
|
| 23 |
+
<li><a href="about.html" class="active">About</a></li>
|
| 24 |
+
<li><a href="chatbot.html">Chatbot</a></li>
|
| 25 |
+
<li><a href="index.html#faq">FAQ</a></li>
|
| 26 |
+
</ul>
|
| 27 |
+
<button id="dark-mode-toggle" aria-label="Toggle dark/light mode">🌙</button>
|
| 28 |
+
</div>
|
| 29 |
+
</header>
|
| 30 |
+
<section class="section about">
|
| 31 |
+
<div class="about-hero">
|
| 32 |
+
<h1 class="about-title">Revolutionizing Injury Prevention</h1>
|
| 33 |
+
<p class="about-subtitle">Advanced AI-driven analytics for optimal athletic performance</p>
|
| 34 |
+
</div>
|
| 35 |
+
<div class="container about-container">
|
| 36 |
+
<div class="about-grid">
|
| 37 |
+
<div class="about-card mission glassmorphism fade-in">
|
| 38 |
+
<div class="card-icon">
|
| 39 |
+
<svg width="40" height="40" viewBox="0 0 24 24" fill="currentColor">
|
| 40 |
+
<path d="M12 2L2 12h3v8h6v-6h2v6h6v-8h3L12 2z"/>
|
| 41 |
+
</svg>
|
| 42 |
+
</div>
|
| 43 |
+
<h2>Our Mission</h2>
|
| 44 |
+
<p>Empowering athletes and coaches with real-time insights through advanced AI technology, transforming how injuries are predicted and prevented in sports.</p>
|
| 45 |
+
</div>
|
| 46 |
+
<div class="about-card impact glassmorphism fade-in">
|
| 47 |
+
<div class="card-icon">
|
| 48 |
+
<svg width="40" height="40" viewBox="0 0 24 24" fill="currentColor">
|
| 49 |
+
<path d="M16 6l2.29 2.29-4.88 4.88-4-4L2 16.59 3.41 18l6-6 4 4 6.3-6.29L22 12V6h-6z"/>
|
| 50 |
+
</svg>
|
| 51 |
+
</div>
|
| 52 |
+
<h2>Our Impact</h2>
|
| 53 |
+
<p>With a 92% predictive accuracy rate, we're revolutionizing injury prevention in sports, helping athletes maintain peak performance while minimizing risk.</p>
|
| 54 |
+
</div>
|
| 55 |
+
<div class="about-card technology glassmorphism fade-in">
|
| 56 |
+
<div class="card-icon">
|
| 57 |
+
<svg width="40" height="40" viewBox="0 0 24 24" fill="currentColor">
|
| 58 |
+
<path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/>
|
| 59 |
+
</svg>
|
| 60 |
+
</div>
|
| 61 |
+
<h2>Our Technology</h2>
|
| 62 |
+
<p>Leveraging cutting-edge AI and machine learning algorithms to analyze biomechanical patterns, training loads, and historical data for precise risk assessment.</p>
|
| 63 |
+
</div>
|
| 64 |
+
</div>
|
| 65 |
+
<div class="about-features glassmorphism fade-in">
|
| 66 |
+
<h2>Key Capabilities</h2>
|
| 67 |
+
<div class="features-grid">
|
| 68 |
+
<div class="feature-item">
|
| 69 |
+
<h3>Real-Time Analysis</h3>
|
| 70 |
+
<p>Instant risk assessment and performance insights</p>
|
| 71 |
+
</div>
|
| 72 |
+
<div class="feature-item">
|
| 73 |
+
<h3>Predictive Analytics</h3>
|
| 74 |
+
<p>Advanced forecasting of potential injury risks</p>
|
| 75 |
+
</div>
|
| 76 |
+
<div class="feature-item">
|
| 77 |
+
<h3>Personalized Insights</h3>
|
| 78 |
+
<p>Tailored recommendations for each athlete</p>
|
| 79 |
+
</div>
|
| 80 |
+
<div class="feature-item">
|
| 81 |
+
<h3>Data Integration</h3>
|
| 82 |
+
<p>Seamless connection with existing systems</p>
|
| 83 |
+
</div>
|
| 84 |
+
</div>
|
| 85 |
+
</div>
|
| 86 |
+
<div class="about-stats glassmorphism fade-in">
|
| 87 |
+
<h2>Performance Metrics</h2>
|
| 88 |
+
<div class="stats-grid">
|
| 89 |
+
<div class="stat-item">
|
| 90 |
+
<span class="stat-number">92%</span>
|
| 91 |
+
<span class="stat-label">Prediction Accuracy</span>
|
| 92 |
+
</div>
|
| 93 |
+
<div class="stat-item">
|
| 94 |
+
<span class="stat-number">24/7</span>
|
| 95 |
+
<span class="stat-label">Real-time Monitoring</span>
|
| 96 |
+
</div>
|
| 97 |
+
<div class="stat-item">
|
| 98 |
+
<span class="stat-number">100+</span>
|
| 99 |
+
<span class="stat-label">Data Points Analyzed</span>
|
| 100 |
+
</div>
|
| 101 |
+
</div>
|
| 102 |
+
</div>
|
| 103 |
+
<div class="about-vision glassmorphism fade-in">
|
| 104 |
+
<h2>Our Vision</h2>
|
| 105 |
+
<p>We envision a future where sports injuries are not just treatable but preventable. Through continuous innovation and data-driven insights, we're creating safer training environments and enabling superior athletic achievement.</p>
|
| 106 |
+
</div>
|
| 107 |
+
</div>
|
| 108 |
+
</section>
|
| 109 |
+
<footer class="footer">
|
| 110 |
+
<div class="container">
|
| 111 |
+
<p>© 2025 Injury Prediction System. All rights reserved.</p>
|
| 112 |
+
</div>
|
| 113 |
+
</footer>
|
| 114 |
+
<script src="java.js"></script>
|
| 115 |
+
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9355e0c1dda0bcfd',t:'MTc0NTUwMDYxNi4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
|
| 116 |
+
</html>
|
UI2/calculator.html
ADDED
|
@@ -0,0 +1,1450 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<meta name="description" content="Injury Prediction System - AI-Driven Athlete Risk Assessment">
|
| 7 |
+
<title>Injury Prediction System - Advanced Calculator</title>
|
| 8 |
+
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;700&family=Roboto:wght@300;400;500&display=swap" rel="stylesheet">
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
| 10 |
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
|
| 11 |
+
<style>
|
| 12 |
+
/* CSS Variables */
|
| 13 |
+
:root {
|
| 14 |
+
--primary-color: #00d4ff;
|
| 15 |
+
--secondary-color: #ff00aa;
|
| 16 |
+
--accent-color: #7b00ff;
|
| 17 |
+
--error-color: #ff3366;
|
| 18 |
+
--success-color: #00ff99;
|
| 19 |
+
--dark-bg: #0c0e1a;
|
| 20 |
+
--card-bg: rgba(20, 25, 40, 0.6);
|
| 21 |
+
--holo-glow: rgba(0, 212, 255, 0.3);
|
| 22 |
+
--text-primary: #e6f0ff;
|
| 23 |
+
--text-secondary: #a0b0cc;
|
| 24 |
+
--card-shadow: 0 6px 25px rgba(0, 0, 0, 0.5), 0 0 15px var(--holo-glow);
|
| 25 |
+
--card-shadow-hover: 0 10px 35px rgba(0, 0, 0, 0.6), 0 0 20px var(--primary-color);
|
| 26 |
+
--transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
| 27 |
+
--border-radius-sm: 12px;
|
| 28 |
+
--border-radius-md: 16px;
|
| 29 |
+
--border-radius-lg: 24px;
|
| 30 |
+
--space-xs: 8px;
|
| 31 |
+
--space-sm: 12px;
|
| 32 |
+
--space-md: 16px;
|
| 33 |
+
--space-lg: 24px;
|
| 34 |
+
--space-xl: 32px;
|
| 35 |
+
--space-xxl: 48px;
|
| 36 |
+
}
|
| 37 |
+
|
| 38 |
+
/* Reset and Base Styles */
|
| 39 |
+
* {
|
| 40 |
+
margin: 0;
|
| 41 |
+
padding: 0;
|
| 42 |
+
box-sizing: border-box;
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
body {
|
| 46 |
+
font-family: 'Roboto', sans-serif;
|
| 47 |
+
background: linear-gradient(145deg, var(--dark-bg) 0%, #080b16 100%);
|
| 48 |
+
color: var(--text-primary);
|
| 49 |
+
line-height: 1.6;
|
| 50 |
+
min-height: 100vh;
|
| 51 |
+
overflow-x: hidden;
|
| 52 |
+
position: relative;
|
| 53 |
+
}
|
| 54 |
+
|
| 55 |
+
/* Particle Background */
|
| 56 |
+
#particles {
|
| 57 |
+
position: fixed;
|
| 58 |
+
top: 0;
|
| 59 |
+
left: 0;
|
| 60 |
+
width: 100%;
|
| 61 |
+
height: 100%;
|
| 62 |
+
z-index: -1;
|
| 63 |
+
pointer-events: none;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
h1, h2, h3, h4 {
|
| 67 |
+
font-family: 'Orbitron', sans-serif;
|
| 68 |
+
letter-spacing: 1.2px;
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
/* Container */
|
| 72 |
+
.container {
|
| 73 |
+
max-width: 1400px;
|
| 74 |
+
margin: 0 auto;
|
| 75 |
+
padding: var(--space-lg);
|
| 76 |
+
position: relative;
|
| 77 |
+
z-index: 1;
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
/* Header */
|
| 81 |
+
header {
|
| 82 |
+
text-align: center;
|
| 83 |
+
margin-bottom: var(--space-xl);
|
| 84 |
+
padding: var(--space-xl);
|
| 85 |
+
background: var(--card-bg);
|
| 86 |
+
border-radius: var(--border-radius-lg);
|
| 87 |
+
box-shadow: var(--card-shadow);
|
| 88 |
+
backdrop-filter: blur(12px);
|
| 89 |
+
position: relative;
|
| 90 |
+
border: 1px solid var(--holo-glow);
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
header::before {
|
| 94 |
+
content: '';
|
| 95 |
+
position: absolute;
|
| 96 |
+
top: 0;
|
| 97 |
+
left: 0;
|
| 98 |
+
width: 100%;
|
| 99 |
+
height: 5px;
|
| 100 |
+
background: linear-gradient(90deg, var(--primary-color), var(--secondary-color), var(--accent-color));
|
| 101 |
+
animation: pulse 4s infinite;
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
h1 {
|
| 105 |
+
font-size: 3.5rem;
|
| 106 |
+
color: var(--primary-color);
|
| 107 |
+
text-shadow: 0 0 20px var(--primary-color), 0 0 30px var(--secondary-color);
|
| 108 |
+
margin-bottom: var(--space-md);
|
| 109 |
+
animation: glow 2s ease-in-out infinite alternate;
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
header p {
|
| 113 |
+
font-size: 1.3rem;
|
| 114 |
+
color: var(--text-secondary);
|
| 115 |
+
letter-spacing: 0.6px;
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
h2 {
|
| 119 |
+
font-size: 2.2rem;
|
| 120 |
+
color: var(--primary-color);
|
| 121 |
+
margin-bottom: var(--space-lg);
|
| 122 |
+
position: relative;
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
h2::after {
|
| 126 |
+
content: '';
|
| 127 |
+
position: absolute;
|
| 128 |
+
bottom: -10px;
|
| 129 |
+
left: 0;
|
| 130 |
+
width: 80px;
|
| 131 |
+
height: 4px;
|
| 132 |
+
background: linear-gradient(90deg, var(--primary-color), transparent);
|
| 133 |
+
animation: slide 3s infinite;
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
h3 {
|
| 137 |
+
font-size: 1.6rem;
|
| 138 |
+
color: var(--text-primary);
|
| 139 |
+
margin-bottom: var(--space-md);
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
h4 {
|
| 143 |
+
font-size: 1.3rem;
|
| 144 |
+
color: var(--text-primary);
|
| 145 |
+
margin-bottom: var(--space-sm);
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
/* Progress Bar */
|
| 149 |
+
.progress-container {
|
| 150 |
+
margin-bottom: var(--space-lg);
|
| 151 |
+
background: var(--card-bg);
|
| 152 |
+
padding: var(--space-md);
|
| 153 |
+
border-radius: var(--border-radius-md);
|
| 154 |
+
box-shadow: var(--card-shadow);
|
| 155 |
+
backdrop-filter: blur(10px);
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
.progress-bar {
|
| 159 |
+
height: 8px;
|
| 160 |
+
background: rgba(255, 255, 255, 0.1);
|
| 161 |
+
border-radius: 4px;
|
| 162 |
+
overflow: hidden;
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
.progress-fill {
|
| 166 |
+
height: 100%;
|
| 167 |
+
background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
|
| 168 |
+
width: 0;
|
| 169 |
+
transition: width 0.5s ease;
|
| 170 |
+
}
|
| 171 |
+
|
| 172 |
+
.progress-text {
|
| 173 |
+
font-size: 1rem;
|
| 174 |
+
color: var(--text-secondary);
|
| 175 |
+
margin-bottom: var(--space-sm);
|
| 176 |
+
text-align: center;
|
| 177 |
+
}
|
| 178 |
+
|
| 179 |
+
/* Form Styles */
|
| 180 |
+
.form-section {
|
| 181 |
+
background: var(--card-bg);
|
| 182 |
+
padding: var(--space-lg);
|
| 183 |
+
border-radius: var(--border-radius-md);
|
| 184 |
+
margin-bottom: var(--space-lg);
|
| 185 |
+
box-shadow: var(--card-shadow);
|
| 186 |
+
backdrop-filter: blur(12px);
|
| 187 |
+
border: 1px solid var(--holo-glow);
|
| 188 |
+
transform: perspective(1000px) rotateX(0deg);
|
| 189 |
+
transition: var(--transition);
|
| 190 |
+
}
|
| 191 |
+
|
| 192 |
+
.form-section:hover {
|
| 193 |
+
transform: perspective(1000px) rotateX(2deg);
|
| 194 |
+
box-shadow: var(--card-shadow-hover);
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
.form-section-header {
|
| 198 |
+
cursor: pointer;
|
| 199 |
+
display: flex;
|
| 200 |
+
align-items: center;
|
| 201 |
+
justify-content: space-between;
|
| 202 |
+
padding: var(--space-md);
|
| 203 |
+
background: linear-gradient(45deg, rgba(0, 0, 0, 0.3), rgba(0, 212, 255, 0.1));
|
| 204 |
+
border-radius: var(--border-radius-sm);
|
| 205 |
+
margin-bottom: var(--space-md);
|
| 206 |
+
transition: var(--transition);
|
| 207 |
+
}
|
| 208 |
+
|
| 209 |
+
.form-section-header:hover {
|
| 210 |
+
background: linear-gradient(45deg, rgba(0, 212, 255, 0.2), rgba(255, 0, 170, 0.2));
|
| 211 |
+
}
|
| 212 |
+
|
| 213 |
+
.form-section-header h3 {
|
| 214 |
+
font-size: 1.4rem;
|
| 215 |
+
color: var(--primary-color);
|
| 216 |
+
text-shadow: 0 0 10px var(--holo-glow);
|
| 217 |
+
}
|
| 218 |
+
|
| 219 |
+
.form-section-header::after {
|
| 220 |
+
content: '▼';
|
| 221 |
+
color: var(--secondary-color);
|
| 222 |
+
font-size: 1.1rem;
|
| 223 |
+
transition: var(--transition);
|
| 224 |
+
}
|
| 225 |
+
|
| 226 |
+
.form-section.collapsed .form-section-header::after {
|
| 227 |
+
transform: rotate(180deg);
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
.form-section.collapsed .form-grid {
|
| 231 |
+
max-height: 0;
|
| 232 |
+
overflow: hidden;
|
| 233 |
+
padding: 0;
|
| 234 |
+
opacity: 0;
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
.form-grid {
|
| 238 |
+
display: grid;
|
| 239 |
+
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
|
| 240 |
+
gap: var(--space-lg);
|
| 241 |
+
padding: var(--space-md);
|
| 242 |
+
max-height: 2000px;
|
| 243 |
+
opacity: 1;
|
| 244 |
+
transition: max-height 0.6s ease, padding 0.3s ease, opacity 0.3s ease;
|
| 245 |
+
}
|
| 246 |
+
|
| 247 |
+
.form-group {
|
| 248 |
+
position: relative;
|
| 249 |
+
margin-bottom: var(--space-md);
|
| 250 |
+
}
|
| 251 |
+
|
| 252 |
+
label {
|
| 253 |
+
font-size: 1.1rem;
|
| 254 |
+
color: var(--text-secondary);
|
| 255 |
+
margin-bottom: var(--space-xs);
|
| 256 |
+
text-transform: uppercase;
|
| 257 |
+
letter-spacing: 1px;
|
| 258 |
+
transition: var(--transition);
|
| 259 |
+
display: inline-block;
|
| 260 |
+
position: relative;
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
input, select {
|
| 264 |
+
padding: 16px 18px;
|
| 265 |
+
border: 1px solid var(--holo-glow);
|
| 266 |
+
border-radius: var(--border-radius-sm);
|
| 267 |
+
background: rgba(255, 255, 255, 0.05);
|
| 268 |
+
color: var(--text-primary);
|
| 269 |
+
font-size: 1.1rem;
|
| 270 |
+
transition: var(--transition);
|
| 271 |
+
backdrop-filter: blur(8px);
|
| 272 |
+
width: 100%;
|
| 273 |
+
appearance: none;
|
| 274 |
+
}
|
| 275 |
+
|
| 276 |
+
input:focus, select:focus {
|
| 277 |
+
border-color: var(--primary-color);
|
| 278 |
+
box-shadow: 0 0 20px var(--holo-glow);
|
| 279 |
+
background: rgba(0, 212, 255, 0.15);
|
| 280 |
+
outline: none;
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
select {
|
| 284 |
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' fill='%2300d4ff' viewBox='0 0 16 16'%3E%3Cpath d='M7.247 11.14L2.451 5.658C1.885 5.013 2.345 4 3.204 4h9.592a1 1 0 0 1 .753 1.659l-4.796 5.48a1 1 0 0 1-1.506 0z'/%3E%3C/svg%3E");
|
| 285 |
+
background-repeat: no-repeat;
|
| 286 |
+
background-position: right 16px center;
|
| 287 |
+
padding-right: 36px;
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
select option {
|
| 291 |
+
background: #1c2526;
|
| 292 |
+
color: var(--text-primary);
|
| 293 |
+
}
|
| 294 |
+
|
| 295 |
+
input::placeholder {
|
| 296 |
+
color: rgba(255, 255, 255, 0.3);
|
| 297 |
+
transition: opacity 0.3s;
|
| 298 |
+
}
|
| 299 |
+
|
| 300 |
+
input:focus::placeholder {
|
| 301 |
+
opacity: 0;
|
| 302 |
+
}
|
| 303 |
+
|
| 304 |
+
input[type="range"] {
|
| 305 |
+
-webkit-appearance: none;
|
| 306 |
+
height: 8px;
|
| 307 |
+
background: rgba(255, 255, 255, 0.1);
|
| 308 |
+
border-radius: 4px;
|
| 309 |
+
outline: none;
|
| 310 |
+
padding: 0;
|
| 311 |
+
}
|
| 312 |
+
|
| 313 |
+
input[type="range"]::-webkit-slider-thumb {
|
| 314 |
+
-webkit-appearance: none;
|
| 315 |
+
width: 20px;
|
| 316 |
+
height: 20px;
|
| 317 |
+
background: var(--primary-color);
|
| 318 |
+
border-radius: 50%;
|
| 319 |
+
cursor: pointer;
|
| 320 |
+
box-shadow: 0 0 10px var(--holo-glow);
|
| 321 |
+
}
|
| 322 |
+
|
| 323 |
+
input[type="range"]::-moz-range-thumb {
|
| 324 |
+
width: 20px;
|
| 325 |
+
height: 20px;
|
| 326 |
+
background: var(--primary-color);
|
| 327 |
+
border-radius: 50%;
|
| 328 |
+
cursor: pointer;
|
| 329 |
+
box-shadow: 0 0 10px var(--holo-glow);
|
| 330 |
+
}
|
| 331 |
+
|
| 332 |
+
.slider-value {
|
| 333 |
+
display: block;
|
| 334 |
+
font-size: 1rem;
|
| 335 |
+
color: var(--text-primary);
|
| 336 |
+
margin-top: var(--space-xs);
|
| 337 |
+
text-align: center;
|
| 338 |
+
}
|
| 339 |
+
|
| 340 |
+
.form-group.error input,
|
| 341 |
+
.form-group.error select {
|
| 342 |
+
border-color: var(--error-color);
|
| 343 |
+
box-shadow: 0 0 15px rgba(255, 51, 102, 0.5);
|
| 344 |
+
animation: shake 0.4s;
|
| 345 |
+
}
|
| 346 |
+
|
| 347 |
+
.form-group.success input,
|
| 348 |
+
.form-group.success select {
|
| 349 |
+
border-color: var(--success-color);
|
| 350 |
+
box-shadow: 0 0 15px rgba(0, 255, 153, 0.4);
|
| 351 |
+
}
|
| 352 |
+
|
| 353 |
+
.validation-message {
|
| 354 |
+
font-size: 0.95rem;
|
| 355 |
+
position: absolute;
|
| 356 |
+
bottom: -24px;
|
| 357 |
+
left: 0;
|
| 358 |
+
transition: var(--transition);
|
| 359 |
+
font-family: 'Roboto', sans-serif;
|
| 360 |
+
}
|
| 361 |
+
|
| 362 |
+
.validation-message.error {
|
| 363 |
+
color: var(--error-color);
|
| 364 |
+
}
|
| 365 |
+
|
| 366 |
+
.validation-message.success {
|
| 367 |
+
color: var(--success-color);
|
| 368 |
+
}
|
| 369 |
+
|
| 370 |
+
/* Tooltip Styles */
|
| 371 |
+
.tooltip-icon {
|
| 372 |
+
position: relative;
|
| 373 |
+
display: inline-block;
|
| 374 |
+
margin-left: var(--space-xs);
|
| 375 |
+
color: var(--primary-color);
|
| 376 |
+
cursor: help;
|
| 377 |
+
width: 20px;
|
| 378 |
+
height: 20px;
|
| 379 |
+
text-align: center;
|
| 380 |
+
line-height: 20px;
|
| 381 |
+
border-radius: 50%;
|
| 382 |
+
background: var(--holo-glow);
|
| 383 |
+
transition: var(--transition);
|
| 384 |
+
font-size: 0.9rem;
|
| 385 |
+
vertical-align: middle;
|
| 386 |
+
}
|
| 387 |
+
|
| 388 |
+
.tooltip-icon::after {
|
| 389 |
+
content: '?';
|
| 390 |
+
font-weight: bold;
|
| 391 |
+
}
|
| 392 |
+
|
| 393 |
+
.tooltip-text {
|
| 394 |
+
visibility: hidden;
|
| 395 |
+
width: 200px;
|
| 396 |
+
background: var(--dark-bg);
|
| 397 |
+
color: var(--text-primary);
|
| 398 |
+
text-align: center;
|
| 399 |
+
padding: var(--space-sm);
|
| 400 |
+
border-radius: var(--border-radius-sm);
|
| 401 |
+
position: absolute;
|
| 402 |
+
z-index: 10;
|
| 403 |
+
top: calc(100% + 8px);
|
| 404 |
+
left: 50%;
|
| 405 |
+
transform: translateX(-50%);
|
| 406 |
+
font-size: 0.95rem;
|
| 407 |
+
opacity: 0;
|
| 408 |
+
transition: opacity 0.3s, visibility 0.3s;
|
| 409 |
+
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.5);
|
| 410 |
+
border: 1px solid var(--holo-glow);
|
| 411 |
+
font-family: 'Roboto', sans-serif;
|
| 412 |
+
}
|
| 413 |
+
|
| 414 |
+
.tooltip-text::after {
|
| 415 |
+
content: '';
|
| 416 |
+
position: absolute;
|
| 417 |
+
bottom: 100%;
|
| 418 |
+
left: 50%;
|
| 419 |
+
margin-left: -7px;
|
| 420 |
+
border-width: 7px;
|
| 421 |
+
border-style: solid;
|
| 422 |
+
border-color: var(--dark-bg) transparent transparent transparent;
|
| 423 |
+
}
|
| 424 |
+
|
| 425 |
+
.tooltip-icon:hover .tooltip-text,
|
| 426 |
+
.tooltip-icon.tooltip-active .tooltip-text {
|
| 427 |
+
visibility: visible;
|
| 428 |
+
opacity: 1;
|
| 429 |
+
}
|
| 430 |
+
|
| 431 |
+
@keyframes shake {
|
| 432 |
+
0%, 100% { transform: translateX(0); }
|
| 433 |
+
25% { transform: translateX(-5px); }
|
| 434 |
+
50% { transform: translateX(5px); }
|
| 435 |
+
75% { transform: translateX(-5px); }
|
| 436 |
+
}
|
| 437 |
+
|
| 438 |
+
/* Buttons */
|
| 439 |
+
.submit-button, .action-button, .learn-more-btn {
|
| 440 |
+
padding: 18px 36px;
|
| 441 |
+
background: linear-gradient(45deg, var(--primary-color), var(--secondary-color));
|
| 442 |
+
border: none;
|
| 443 |
+
border-radius: 50px;
|
| 444 |
+
color: var(--text-primary);
|
| 445 |
+
font-size: 1.3rem;
|
| 446 |
+
font-weight: 500;
|
| 447 |
+
cursor: pointer;
|
| 448 |
+
transition: var(--transition);
|
| 449 |
+
box-shadow: 0 6px 25px var(--holo-glow);
|
| 450 |
+
position: relative;
|
| 451 |
+
overflow: hidden;
|
| 452 |
+
font-family: 'Orbitron', sans-serif;
|
| 453 |
+
letter-spacing: 1.5px;
|
| 454 |
+
}
|
| 455 |
+
|
| 456 |
+
.submit-button::before, .action-button::before, .learn-more-btn::before {
|
| 457 |
+
content: '';
|
| 458 |
+
position: absolute;
|
| 459 |
+
top: 0;
|
| 460 |
+
left: 0;
|
| 461 |
+
width: 100%;
|
| 462 |
+
height: 100%;
|
| 463 |
+
background: linear-gradient(45deg, transparent, rgba(255, 255, 255, 0.4), transparent);
|
| 464 |
+
transform: translateX(-100%);
|
| 465 |
+
transition: transform 0.6s;
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
.submit-button:hover, .action-button:hover, .learn-more-btn:hover {
|
| 469 |
+
background: linear-gradient(45deg, var(--secondary-color), var(--accent-color));
|
| 470 |
+
transform: translateY(-5px);
|
| 471 |
+
box-shadow: 0 10px 30px var(--holo-glow);
|
| 472 |
+
}
|
| 473 |
+
|
| 474 |
+
.submit-button:hover::before, .action-button:hover::before, .learn-more-btn:hover::before {
|
| 475 |
+
transform: translateX(100%);
|
| 476 |
+
}
|
| 477 |
+
|
| 478 |
+
.submit-button:active, .action-button:active, .learn-more-btn:active {
|
| 479 |
+
transform: translateY(0);
|
| 480 |
+
}
|
| 481 |
+
|
| 482 |
+
.submit-button, .action-button {
|
| 483 |
+
display: block;
|
| 484 |
+
margin: var(--space-xl) auto;
|
| 485 |
+
min-width: 260px;
|
| 486 |
+
}
|
| 487 |
+
|
| 488 |
+
.learn-more-btn {
|
| 489 |
+
padding: 14px 28px;
|
| 490 |
+
font-size: 1.1rem;
|
| 491 |
+
}
|
| 492 |
+
|
| 493 |
+
/* Result Container */
|
| 494 |
+
.result-container {
|
| 495 |
+
margin-top: var(--space-xl);
|
| 496 |
+
padding: var(--space-xl);
|
| 497 |
+
background: var(--card-bg);
|
| 498 |
+
border-radius: var(--border-radius-lg);
|
| 499 |
+
box-shadow: var(--card-shadow);
|
| 500 |
+
backdrop-filter: blur(12px);
|
| 501 |
+
border: 1px solid var(--holo-glow);
|
| 502 |
+
opacity: 0;
|
| 503 |
+
transform: translateY(40px);
|
| 504 |
+
transition: opacity 0.7s, transform 0.7s;
|
| 505 |
+
}
|
| 506 |
+
|
| 507 |
+
.result-container.visible {
|
| 508 |
+
opacity: 1;
|
| 509 |
+
transform: translateY(0);
|
| 510 |
+
display: block;
|
| 511 |
+
}
|
| 512 |
+
|
| 513 |
+
/* Summary Card */
|
| 514 |
+
.summary-card {
|
| 515 |
+
display: flex;
|
| 516 |
+
flex-wrap: wrap;
|
| 517 |
+
gap: var(--space-lg);
|
| 518 |
+
align-items: center;
|
| 519 |
+
margin-bottom: var(--space-xl);
|
| 520 |
+
background: var(--card-bg);
|
| 521 |
+
padding: var(--space-lg);
|
| 522 |
+
border-radius: var(--border-radius-md);
|
| 523 |
+
box-shadow: var(--card-shadow);
|
| 524 |
+
transition: var(--transition);
|
| 525 |
+
backdrop-filter: blur(10px);
|
| 526 |
+
transform: perspective(1000px) rotateX(0deg);
|
| 527 |
+
}
|
| 528 |
+
|
| 529 |
+
.summary-card:hover {
|
| 530 |
+
box-shadow: var(--card-shadow-hover);
|
| 531 |
+
transform: perspective(1000px) rotateX(2deg);
|
| 532 |
+
}
|
| 533 |
+
|
| 534 |
+
.summary-card::before {
|
| 535 |
+
content: '';
|
| 536 |
+
position: absolute;
|
| 537 |
+
top: 0;
|
| 538 |
+
left: 0;
|
| 539 |
+
width: 100%;
|
| 540 |
+
height: 5px;
|
| 541 |
+
background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));
|
| 542 |
+
opacity: 0;
|
| 543 |
+
transition: opacity 0.4s;
|
| 544 |
+
}
|
| 545 |
+
|
| 546 |
+
.summary-card:hover::before {
|
| 547 |
+
opacity: 1;
|
| 548 |
+
}
|
| 549 |
+
|
| 550 |
+
.summary-item {
|
| 551 |
+
flex: 1;
|
| 552 |
+
min-width: 180px;
|
| 553 |
+
text-align: center;
|
| 554 |
+
}
|
| 555 |
+
|
| 556 |
+
.summary-label {
|
| 557 |
+
font-size: 1.1rem;
|
| 558 |
+
color: var(--text-secondary);
|
| 559 |
+
text-transform: uppercase;
|
| 560 |
+
letter-spacing: 0.8px;
|
| 561 |
+
margin-bottom: var(--space-xs);
|
| 562 |
+
}
|
| 563 |
+
|
| 564 |
+
.summary-value {
|
| 565 |
+
font-size: 1.5rem;
|
| 566 |
+
color: var(--primary-color);
|
| 567 |
+
font-weight: 700;
|
| 568 |
+
text-shadow: 0 0 10px var(--holo-glow);
|
| 569 |
+
}
|
| 570 |
+
|
| 571 |
+
/* Gauge Styles */
|
| 572 |
+
.summary-gauge {
|
| 573 |
+
position: relative;
|
| 574 |
+
margin: var(--space-md) auto;
|
| 575 |
+
}
|
| 576 |
+
|
| 577 |
+
.gauge-svg {
|
| 578 |
+
width: 180px;
|
| 579 |
+
height: 180px;
|
| 580 |
+
transform: rotate(-90deg);
|
| 581 |
+
filter: drop-shadow(0 0 12px var(--holo-glow));
|
| 582 |
+
}
|
| 583 |
+
|
| 584 |
+
.radial-gauge {
|
| 585 |
+
width: 140px;
|
| 586 |
+
height: 140px;
|
| 587 |
+
margin: var(--space-md) auto;
|
| 588 |
+
transform: rotate(-90deg);
|
| 589 |
+
}
|
| 590 |
+
|
| 591 |
+
.gauge-base {
|
| 592 |
+
fill: none;
|
| 593 |
+
stroke: rgba(255, 255, 255, 0.15);
|
| 594 |
+
stroke-width: 12;
|
| 595 |
+
}
|
| 596 |
+
|
| 597 |
+
.gauge-value {
|
| 598 |
+
fill: none;
|
| 599 |
+
stroke: url(#gaugeGradient);
|
| 600 |
+
stroke-width: 12;
|
| 601 |
+
stroke-linecap: round;
|
| 602 |
+
transition: stroke-dasharray 1.5s cubic-bezier(0.34, 1.56, 0.64, 1);
|
| 603 |
+
}
|
| 604 |
+
|
| 605 |
+
.gauge-text {
|
| 606 |
+
position: absolute;
|
| 607 |
+
top: 50%;
|
| 608 |
+
left: 50%;
|
| 609 |
+
transform: translate(-50%, -50%) rotate(90deg);
|
| 610 |
+
font-size: 2rem;
|
| 611 |
+
color: var(--text-primary);
|
| 612 |
+
font-weight: 700;
|
| 613 |
+
text-shadow: 0 0 15px var(--holo-glow);
|
| 614 |
+
font-family: 'Orbitron', sans-serif;
|
| 615 |
+
}
|
| 616 |
+
|
| 617 |
+
.gauge-text::after {
|
| 618 |
+
content: '%';
|
| 619 |
+
font-size: 1.2rem;
|
| 620 |
+
vertical-align: super;
|
| 621 |
+
margin-left: 4px;
|
| 622 |
+
}
|
| 623 |
+
|
| 624 |
+
/* Metrics Grid */
|
| 625 |
+
.metrics-grid {
|
| 626 |
+
display: grid;
|
| 627 |
+
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
|
| 628 |
+
gap: var(--space-lg);
|
| 629 |
+
margin-bottom: var(--space-xl);
|
| 630 |
+
}
|
| 631 |
+
|
| 632 |
+
.metric-card {
|
| 633 |
+
background: var(--card-bg);
|
| 634 |
+
padding: var(--space-lg);
|
| 635 |
+
border-radius: var(--border-radius-md);
|
| 636 |
+
box-shadow: var(--card-shadow);
|
| 637 |
+
text-align: center;
|
| 638 |
+
transition: var(--transition);
|
| 639 |
+
backdrop-filter: blur(12px);
|
| 640 |
+
border: 1px solid var(--holo-glow);
|
| 641 |
+
transform: perspective(1000px) rotateX(0deg);
|
| 642 |
+
}
|
| 643 |
+
|
| 644 |
+
.metric-card:hover {
|
| 645 |
+
transform: perspective(1000px) rotateX(2deg);
|
| 646 |
+
box-shadow: var(--card-shadow-hover);
|
| 647 |
+
}
|
| 648 |
+
|
| 649 |
+
.metric-card::before {
|
| 650 |
+
content: '';
|
| 651 |
+
position: absolute;
|
| 652 |
+
top: 0;
|
| 653 |
+
left: 0;
|
| 654 |
+
width: 100%;
|
| 655 |
+
height: 100%;
|
| 656 |
+
background: radial-gradient(circle at top left, var(--holo-glow), transparent 70%);
|
| 657 |
+
pointer-events: none;
|
| 658 |
+
opacity: 0.6;
|
| 659 |
+
}
|
| 660 |
+
|
| 661 |
+
.metric-value {
|
| 662 |
+
font-size: 1.4rem;
|
| 663 |
+
color: var(--primary-color);
|
| 664 |
+
margin-top: var(--space-sm);
|
| 665 |
+
font-weight: 500;
|
| 666 |
+
text-shadow: 0 0 8px var(--holo-glow);
|
| 667 |
+
}
|
| 668 |
+
|
| 669 |
+
.tooltip {
|
| 670 |
+
font-size: 0.95rem;
|
| 671 |
+
color: var(--text-secondary);
|
| 672 |
+
margin-top: var(--space-sm);
|
| 673 |
+
font-family: 'Roboto', sans-serif;
|
| 674 |
+
line-height: 1.5;
|
| 675 |
+
}
|
| 676 |
+
|
| 677 |
+
/* Recommendations */
|
| 678 |
+
.recommendations {
|
| 679 |
+
margin-top: var(--space-xl);
|
| 680 |
+
}
|
| 681 |
+
|
| 682 |
+
.recommendation-category {
|
| 683 |
+
margin-bottom: var(--space-lg);
|
| 684 |
+
}
|
| 685 |
+
|
| 686 |
+
.category-title {
|
| 687 |
+
font-size: 1.4rem;
|
| 688 |
+
color: var(--primary-color);
|
| 689 |
+
margin-bottom: var(--space-md);
|
| 690 |
+
cursor: pointer;
|
| 691 |
+
transition: var(--transition);
|
| 692 |
+
display: flex;
|
| 693 |
+
align-items: center;
|
| 694 |
+
font-family: 'Orbitron', sans-serif;
|
| 695 |
+
text-shadow: 0 0 10px var(--holo-glow);
|
| 696 |
+
}
|
| 697 |
+
|
| 698 |
+
.category-title::before {
|
| 699 |
+
content: '▶';
|
| 700 |
+
margin-right: var(--space-sm);
|
| 701 |
+
color: var(--secondary-color);
|
| 702 |
+
transition: transform 0.3s;
|
| 703 |
+
}
|
| 704 |
+
|
| 705 |
+
.category-title:hover {
|
| 706 |
+
color: var(--secondary-color);
|
| 707 |
+
}
|
| 708 |
+
|
| 709 |
+
.category-title.active::before {
|
| 710 |
+
transform: rotate(90deg);
|
| 711 |
+
}
|
| 712 |
+
|
| 713 |
+
.recommendation-list {
|
| 714 |
+
list-style: none;
|
| 715 |
+
padding: 0;
|
| 716 |
+
}
|
| 717 |
+
|
| 718 |
+
.recommendation-item {
|
| 719 |
+
background: var(--card-bg);
|
| 720 |
+
padding: var(--space-md);
|
| 721 |
+
border-radius: var(--border-radius-md);
|
| 722 |
+
margin-bottom: var(--space-md);
|
| 723 |
+
display: flex;
|
| 724 |
+
align-items: center;
|
| 725 |
+
gap: var(--space-md);
|
| 726 |
+
transition: var(--transition);
|
| 727 |
+
border-left: 6px solid var(--primary-color);
|
| 728 |
+
box-shadow: var(--card-shadow);
|
| 729 |
+
backdrop-filter: blur(10px);
|
| 730 |
+
transform: perspective(1000px) rotateX(0deg);
|
| 731 |
+
}
|
| 732 |
+
|
| 733 |
+
.recommendation-item:hover {
|
| 734 |
+
background: var(--holo-glow);
|
| 735 |
+
box-shadow: var(--card-shadow-hover);
|
| 736 |
+
transform: perspective(1000px) rotateX(1deg);
|
| 737 |
+
border-left-color: var(--secondary-color);
|
| 738 |
+
}
|
| 739 |
+
|
| 740 |
+
.recommendation-item.completed {
|
| 741 |
+
opacity: 0.7;
|
| 742 |
+
text-decoration: line-through;
|
| 743 |
+
border-left-color: var(--success-color);
|
| 744 |
+
}
|
| 745 |
+
|
| 746 |
+
.rec-checkbox {
|
| 747 |
+
width: 26px;
|
| 748 |
+
height: 26px;
|
| 749 |
+
accent-color: var(--primary-color);
|
| 750 |
+
cursor: pointer;
|
| 751 |
+
transition: var(--transition);
|
| 752 |
+
}
|
| 753 |
+
|
| 754 |
+
.rec-checkbox:hover {
|
| 755 |
+
transform: scale(1.2);
|
| 756 |
+
}
|
| 757 |
+
|
| 758 |
+
.priority-indicator {
|
| 759 |
+
font-size: 1.4rem;
|
| 760 |
+
color: var(--secondary-color);
|
| 761 |
+
min-width: 30px;
|
| 762 |
+
text-align: center;
|
| 763 |
+
font-weight: bold;
|
| 764 |
+
text-shadow: 0 0 8px var(--holo-glow);
|
| 765 |
+
}
|
| 766 |
+
|
| 767 |
+
.recommendation-summary {
|
| 768 |
+
flex: 1;
|
| 769 |
+
font-size: 1.2rem;
|
| 770 |
+
line-height: 1.5;
|
| 771 |
+
font-family: 'Roboto', sans-serif;
|
| 772 |
+
}
|
| 773 |
+
|
| 774 |
+
.recommendation-detail {
|
| 775 |
+
max-height: 0;
|
| 776 |
+
overflow: hidden;
|
| 777 |
+
font-size: 1rem;
|
| 778 |
+
color: var(--text-secondary);
|
| 779 |
+
margin-top: var(--space-sm);
|
| 780 |
+
padding: 0 var(--space-sm);
|
| 781 |
+
background: rgba(0, 0, 0, 0.4);
|
| 782 |
+
border-radius: var(--border-radius-sm);
|
| 783 |
+
transition: all 0.5s ease-out;
|
| 784 |
+
line-height: 1.6;
|
| 785 |
+
font-family: 'Roboto', sans-serif;
|
| 786 |
+
}
|
| 787 |
+
|
| 788 |
+
.recommendation-item.expandable:hover .recommendation-detail,
|
| 789 |
+
.recommendation-item.expandable .recommendation-detail[style*="block"] {
|
| 790 |
+
max-height: 300px;
|
| 791 |
+
padding: var(--space-sm);
|
| 792 |
+
}
|
| 793 |
+
|
| 794 |
+
/* Animations */
|
| 795 |
+
@keyframes pulse {
|
| 796 |
+
0%, 100% { opacity: 0.6; }
|
| 797 |
+
50% { opacity: 1; }
|
| 798 |
+
}
|
| 799 |
+
|
| 800 |
+
@keyframes glow {
|
| 801 |
+
0% { text-shadow: 0 0 20px var(--primary-color), 0 0 30px var(--secondary-color); }
|
| 802 |
+
100% { text-shadow: 0 0 30px var(--primary-color), 0 0 40px var(--secondary-color); }
|
| 803 |
+
}
|
| 804 |
+
|
| 805 |
+
@keyframes slide {
|
| 806 |
+
0% { transform: translateX(-100%); }
|
| 807 |
+
50% { transform: translateX(100%); }
|
| 808 |
+
100% { transform: translateX(-100%); }
|
| 809 |
+
}
|
| 810 |
+
|
| 811 |
+
@keyframes fadeInUp {
|
| 812 |
+
from { opacity: 0; transform: translateY(40px); }
|
| 813 |
+
to { opacity: 1; transform: translateY(0); }
|
| 814 |
+
}
|
| 815 |
+
|
| 816 |
+
.form-section, .metric-card, .summary-card, .recommendation-item {
|
| 817 |
+
animation: fadeInUp 0.7s ease forwards;
|
| 818 |
+
opacity: 0;
|
| 819 |
+
}
|
| 820 |
+
|
| 821 |
+
.form-section:nth-child(1) { animation-delay: 0.1s; }
|
| 822 |
+
.form-section:nth-child(2) { animation-delay: 0.2s; }
|
| 823 |
+
.form-section:nth-child(3) { animation-delay: 0.3s; }
|
| 824 |
+
.form-section:nth-child(4) { animation-delay: 0.4s; }
|
| 825 |
+
.form-section:nth-child(5) { animation-delay: 0.5s; }
|
| 826 |
+
|
| 827 |
+
/* Media Queries */
|
| 828 |
+
@media (max-width: 1024px) {
|
| 829 |
+
.form-grid {
|
| 830 |
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
| 831 |
+
}
|
| 832 |
+
|
| 833 |
+
.metrics-grid {
|
| 834 |
+
grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
|
| 835 |
+
}
|
| 836 |
+
}
|
| 837 |
+
|
| 838 |
+
@media (max-width: 768px) {
|
| 839 |
+
.form-grid, .metrics-grid {
|
| 840 |
+
grid-template-columns: 1fr;
|
| 841 |
+
}
|
| 842 |
+
|
| 843 |
+
.summary-card {
|
| 844 |
+
flex-direction: column;
|
| 845 |
+
align-items: center;
|
| 846 |
+
}
|
| 847 |
+
|
| 848 |
+
.summary-item {
|
| 849 |
+
min-width: 100%;
|
| 850 |
+
margin-bottom: var(--space-md);
|
| 851 |
+
}
|
| 852 |
+
|
| 853 |
+
.gauge-svg {
|
| 854 |
+
width: 160px;
|
| 855 |
+
height: 160px;
|
| 856 |
+
}
|
| 857 |
+
|
| 858 |
+
.radial-gauge {
|
| 859 |
+
width: 120px;
|
| 860 |
+
height: 120px;
|
| 861 |
+
}
|
| 862 |
+
|
| 863 |
+
.gauge-text {
|
| 864 |
+
font-size: 1.8rem;
|
| 865 |
+
}
|
| 866 |
+
|
| 867 |
+
.submit-button, .action-button {
|
| 868 |
+
width: 90%;
|
| 869 |
+
max-width: 340px;
|
| 870 |
+
}
|
| 871 |
+
|
| 872 |
+
h1 {
|
| 873 |
+
font-size: 2.8rem;
|
| 874 |
+
}
|
| 875 |
+
|
| 876 |
+
h2 {
|
| 877 |
+
font-size: 2rem;
|
| 878 |
+
}
|
| 879 |
+
|
| 880 |
+
.tooltip-text {
|
| 881 |
+
top: auto;
|
| 882 |
+
bottom: calc(100% + 8px);
|
| 883 |
+
}
|
| 884 |
+
|
| 885 |
+
.tooltip-text::after {
|
| 886 |
+
top: 100%;
|
| 887 |
+
border-color: transparent transparent var(--dark-bg) transparent;
|
| 888 |
+
}
|
| 889 |
+
}
|
| 890 |
+
|
| 891 |
+
@media (max-width: 480px) {
|
| 892 |
+
.container {
|
| 893 |
+
padding: var(--space-md);
|
| 894 |
+
}
|
| 895 |
+
|
| 896 |
+
h1 {
|
| 897 |
+
font-size: 2.2rem;
|
| 898 |
+
}
|
| 899 |
+
|
| 900 |
+
h2 {
|
| 901 |
+
font-size: 1.7rem;
|
| 902 |
+
}
|
| 903 |
+
|
| 904 |
+
.form-group {
|
| 905 |
+
margin-bottom: var(--space-sm);
|
| 906 |
+
}
|
| 907 |
+
|
| 908 |
+
input, select {
|
| 909 |
+
font-size: 1rem;
|
| 910 |
+
padding: 14px;
|
| 911 |
+
}
|
| 912 |
+
|
| 913 |
+
.tooltip-icon {
|
| 914 |
+
width: 18px;
|
| 915 |
+
height: 18px;
|
| 916 |
+
line-height: 18px;
|
| 917 |
+
font-size: 0.8rem;
|
| 918 |
+
}
|
| 919 |
+
|
| 920 |
+
.tooltip-text {
|
| 921 |
+
width: 160px;
|
| 922 |
+
font-size: 0.9rem;
|
| 923 |
+
}
|
| 924 |
+
|
| 925 |
+
.gauge-svg {
|
| 926 |
+
width: 140px;
|
| 927 |
+
height: 140px;
|
| 928 |
+
}
|
| 929 |
+
|
| 930 |
+
.radial-gauge {
|
| 931 |
+
width: 100px;
|
| 932 |
+
height: 100px;
|
| 933 |
+
}
|
| 934 |
+
|
| 935 |
+
.gauge-text {
|
| 936 |
+
font-size: 1.6rem;
|
| 937 |
+
}
|
| 938 |
+
|
| 939 |
+
.submit-button, .action-button {
|
| 940 |
+
font-size: 1.2rem;
|
| 941 |
+
padding: 16px 28px;
|
| 942 |
+
}
|
| 943 |
+
|
| 944 |
+
.metric-card {
|
| 945 |
+
padding: var(--space-md);
|
| 946 |
+
}
|
| 947 |
+
}
|
| 948 |
+
|
| 949 |
+
/* Print Styles */
|
| 950 |
+
@media print {
|
| 951 |
+
body {
|
| 952 |
+
background: white;
|
| 953 |
+
color: black;
|
| 954 |
+
}
|
| 955 |
+
|
| 956 |
+
.container {
|
| 957 |
+
padding: 15px;
|
| 958 |
+
}
|
| 959 |
+
|
| 960 |
+
#particles {
|
| 961 |
+
display: none;
|
| 962 |
+
}
|
| 963 |
+
|
| 964 |
+
header, .result-container, .summary-card, .metric-card, .recommendation-item, .form-section, .progress-container {
|
| 965 |
+
background: white;
|
| 966 |
+
box-shadow: none;
|
| 967 |
+
border: 1px solid #bbb;
|
| 968 |
+
page-break-inside: avoid;
|
| 969 |
+
}
|
| 970 |
+
|
| 971 |
+
h1, h2, h3, h4 {
|
| 972 |
+
color: #111;
|
| 973 |
+
text-shadow: none;
|
| 974 |
+
}
|
| 975 |
+
|
| 976 |
+
.summary-value, .metric-value {
|
| 977 |
+
color: #00b8a9;
|
| 978 |
+
}
|
| 979 |
+
|
| 980 |
+
.gauge-svg, .radial-gauge {
|
| 981 |
+
filter: none;
|
| 982 |
+
}
|
| 983 |
+
|
| 984 |
+
.gauge-value {
|
| 985 |
+
stroke: #00b8a9;
|
| 986 |
+
}
|
| 987 |
+
|
| 988 |
+
input, select {
|
| 989 |
+
border: 1px solid #111;
|
| 990 |
+
background: white;
|
| 991 |
+
color: black;
|
| 992 |
+
}
|
| 993 |
+
|
| 994 |
+
.submit-button, .action-button, .tooltip-icon {
|
| 995 |
+
display: none;
|
| 996 |
+
}
|
| 997 |
+
}
|
| 998 |
+
</style>
|
| 999 |
+
</head>
|
| 1000 |
+
<body>
|
| 1001 |
+
<canvas id="particles"></canvas>
|
| 1002 |
+
<div class="container">
|
| 1003 |
+
<header>
|
| 1004 |
+
<h1>Injury Prediction System</h1>
|
| 1005 |
+
<p>Next-gen AI-powered athlete risk assessment for optimal performance.</p>
|
| 1006 |
+
</header>
|
| 1007 |
+
<main>
|
| 1008 |
+
<form id="predictionForm" aria-live="polite">
|
| 1009 |
+
<!-- Progress Bar -->
|
| 1010 |
+
<div class="progress-container">
|
| 1011 |
+
<div class="progress-text">Form Completion: <span id="progress-percent">0%</span></div>
|
| 1012 |
+
<div class="progress-bar">
|
| 1013 |
+
<div class="progress-fill" id="progress-fill"></div>
|
| 1014 |
+
</div>
|
| 1015 |
+
</div>
|
| 1016 |
+
<!-- Personal Information -->
|
| 1017 |
+
<div class="form-section">
|
| 1018 |
+
<div class="form-section-header">
|
| 1019 |
+
<h3>Personal Information</h3>
|
| 1020 |
+
</div>
|
| 1021 |
+
<div class="form-grid">
|
| 1022 |
+
<div class="form-group">
|
| 1023 |
+
<label for="Age">Age<span class="tooltip-icon" data-tooltip="Enter the athlete's age in years (10-100)" id="Age-tooltip"></span></label>
|
| 1024 |
+
<input type="number" id="Age" name="Age" min="10" max="100" required aria-describedby="Age-validation Age-tooltip">
|
| 1025 |
+
<span id="Age-validation" class="validation-message"></span>
|
| 1026 |
+
</div>
|
| 1027 |
+
<div class="form-group">
|
| 1028 |
+
<label for="Gender">Gender<span class="tooltip-icon" data-tooltip="Select the athlete's gender" id="Gender-tooltip"></span></label>
|
| 1029 |
+
<select id="Gender" name="Gender" required aria-describedby="Gender-validation Gender-tooltip">
|
| 1030 |
+
<option value="">Select</option>
|
| 1031 |
+
<option value="Male">Male</option>
|
| 1032 |
+
<option value="Female">Female</option>
|
| 1033 |
+
</select>
|
| 1034 |
+
<span id="Gender-validation" class="validation-message"></span>
|
| 1035 |
+
</div>
|
| 1036 |
+
<div class="form-group">
|
| 1037 |
+
<label for="Sport_Type">Sport Type<span class="tooltip-icon" data-tooltip="Choose the primary sport the athlete participates in" id="Sport_Type-tooltip"></span></label>
|
| 1038 |
+
<select id="Sport_Type" name="Sport_Type" required aria-describedby="Sport_Type-validation Sport_Type-tooltip">
|
| 1039 |
+
<option value="">Select</option>
|
| 1040 |
+
<option value="Football">Football</option>
|
| 1041 |
+
<option value="Basketball">Basketball</option>
|
| 1042 |
+
<option value="Swimming">Swimming</option>
|
| 1043 |
+
<option value="Running">Running</option>
|
| 1044 |
+
<option value="Tennis">Tennis</option>
|
| 1045 |
+
<option value="Volleyball">Volleyball</option>
|
| 1046 |
+
</select>
|
| 1047 |
+
<span id="Sport_Type-validation" class="validation-message"></span>
|
| 1048 |
+
</div>
|
| 1049 |
+
<div class="form-group">
|
| 1050 |
+
<label for="Experience_Level">Experience Level<span class="tooltip-icon" data-tooltip="Select the athlete's experience level in their sport" id="Experience_Level-tooltip"></span></label>
|
| 1051 |
+
<select id="Experience_Level" name="Experience_Level" required aria-describedby="Experience_Level-validation Experience_Level-tooltip">
|
| 1052 |
+
<option value="">Select</option>
|
| 1053 |
+
<option value="Beginner">Beginner</option>
|
| 1054 |
+
<option value="Intermediate">Intermediate</option>
|
| 1055 |
+
<option value="Advanced">Advanced</option>
|
| 1056 |
+
<option value="Professional">Professional</option>
|
| 1057 |
+
</select>
|
| 1058 |
+
<span id="Experience_Level-validation" class="validation-message"></span>
|
| 1059 |
+
</div>
|
| 1060 |
+
</div>
|
| 1061 |
+
</div>
|
| 1062 |
+
<!-- Training Metrics -->
|
| 1063 |
+
<div class="form-section">
|
| 1064 |
+
<div class="form-section-header">
|
| 1065 |
+
<h3>Training Metrics</h3>
|
| 1066 |
+
</div>
|
| 1067 |
+
<div class="form-grid">
|
| 1068 |
+
<div class="form-group">
|
| 1069 |
+
<label for="Total_Weekly_Training_Hours">Weekly Training Hours<span class="tooltip-icon" data-tooltip="Total hours spent training per week (0-50)" id="Total_Weekly_Training_Hours-tooltip"></span></label>
|
| 1070 |
+
<input type="number" id="Total_Weekly_Training_Hours" name="Total_Weekly_Training_Hours" min="0" max="50" step="0.5" required aria-describedby="Total_Weekly_Training_Hours-validation Total_Weekly_Training_Hours-tooltip">
|
| 1071 |
+
<span id="Total_Weekly_Training_Hours-validation" class="validation-message"></span>
|
| 1072 |
+
</div>
|
| 1073 |
+
<div class="form-group">
|
| 1074 |
+
<label for="High_Intensity_Training_Hours">High-Intensity Hours<span class="tooltip-icon" data-tooltip="Hours spent on high-intensity training per week (0-20)" id="High_Intensity_Training_Hours-tooltip"></span></label>
|
| 1075 |
+
<input type="number" id="High_Intensity_Training_Hours" name="High_Intensity_Training_Hours" min="0" max="20" step="0.5" required aria-describedby="High_Intensity_Training_Hours-validation High_Intensity_Training_Hours-tooltip">
|
| 1076 |
+
<span id="High_Intensity_Training_Hours-validation" class="validation-message"></span>
|
| 1077 |
+
</div>
|
| 1078 |
+
<div class="form-group">
|
| 1079 |
+
<label for="Training_Load_Score">Training Load Score (0-100)<span class="tooltip-icon" data-tooltip="Subjective score of training intensity (0-100)" id="Training_Load_Score-tooltip"></span></label>
|
| 1080 |
+
<input type="number" id="Training_Load_Score" name="Training_Load_Score" min="0" max="100" required aria-describedby="Training_Load_Score-validation Training_Load_Score-tooltip">
|
| 1081 |
+
<span id="Training_Load_Score-validation" class="validation-message"></span>
|
| 1082 |
+
</div>
|
| 1083 |
+
<div class="form-group">
|
| 1084 |
+
<label for="Strength_Training_Frequency">Strength Training (days/week)<span class="tooltip-icon" data-tooltip="Number of strength training sessions per week (0-7)" id="Strength_Training_Frequency-tooltip"></span></label>
|
| 1085 |
+
<input type="number" id="Strength_Training_Frequency" name="Strength_Training_Frequency" min="0" max="7" required aria-describedby="Strength_Training_Frequency-validation Strength_Training_Frequency-tooltip">
|
| 1086 |
+
<span id="Strength_Training_Frequency-validation" class="validation-message"></span>
|
| 1087 |
+
</div>
|
| 1088 |
+
</div>
|
| 1089 |
+
</div>
|
| 1090 |
+
<!-- Recovery Metrics -->
|
| 1091 |
+
<div class="form-section">
|
| 1092 |
+
<div class="form-section-header">
|
| 1093 |
+
<h3>Recovery Metrics</h3>
|
| 1094 |
+
</div>
|
| 1095 |
+
<div class="form-grid">
|
| 1096 |
+
<div class="form-group">
|
| 1097 |
+
<label for="Recovery_Time_Between_Sessions">Recovery Time (hrs)<span class="tooltip-icon" data-tooltip="Average recovery time between training sessions in hours (0-48)" id="Recovery_Time_Between_Sessions-tooltip"></span></label>
|
| 1098 |
+
<input type="number" id="Recovery_Time_Between_Sessions" name="Recovery_Time_Between_Sessions" min="0" max="48" step="0.5" required aria-describedby="Recovery_Time_Between_Sessions-validation Recovery_Time_Between_Sessions-tooltip">
|
| 1099 |
+
<span id="Recovery_Time_Between_Sessions-validation" class="validation-message"></span>
|
| 1100 |
+
</div>
|
| 1101 |
+
<div class="form-group">
|
| 1102 |
+
<label for="Fatigue_Level">Fatigue Level (0-10)<span class="tooltip-icon" data-tooltip="Subjective fatigue level (0 = none, 10 = extreme)" id="Fatigue_Level-tooltip"></span></label>
|
| 1103 |
+
<input type="range" id="Fatigue_Level" name="Fatigue_Level" min="0" max="10" value="0" required aria-describedby="Fatigue_Level-validation Fatigue_Level-tooltip">
|
| 1104 |
+
<span id="Fatigue_Level-value" class="slider-value">0</span>
|
| 1105 |
+
<span id="Fatigue_Level-validation" class="validation-message"></span>
|
| 1106 |
+
</div>
|
| 1107 |
+
</div>
|
| 1108 |
+
</div>
|
| 1109 |
+
<!-- Performance Metrics -->
|
| 1110 |
+
<div class="form-section">
|
| 1111 |
+
<div class="form-section-header">
|
| 1112 |
+
<h3>Performance Metrics</h3>
|
| 1113 |
+
</div>
|
| 1114 |
+
<div class="form-grid">
|
| 1115 |
+
<div class="form-group">
|
| 1116 |
+
<label for="Endurance_Score">Endurance Score (0-10)<span class="tooltip-icon" data-tooltip="Subjective endurance performance (0 = poor, 10 = excellent)" id="Endurance_Score-tooltip"></span></label>
|
| 1117 |
+
<input type="range" id="Endurance_Score" name="Endurance_Score" min="0" max="10" value="0" required aria-describedby="Endurance_Score-validation Endurance_Score-tooltip">
|
| 1118 |
+
<span id="Endurance_Score-value" class="slider-value">0</span>
|
| 1119 |
+
<span id="Endurance_Score-validation" class="validation-message"></span>
|
| 1120 |
+
</div>
|
| 1121 |
+
<div class="form-group">
|
| 1122 |
+
<label for="Sprint_Speed">Sprint Speed (m/s)<span class="tooltip-icon" data-tooltip="Average sprint speed in meters per second (0-20)" id="Sprint_Speed-tooltip"></span></label>
|
| 1123 |
+
<input type="number" id="Sprint_Speed" name="Sprint_Speed" min="0" max="20" step="0.1" required aria-describedby="Sprint_Speed-validation Sprint_Speed-tooltip">
|
| 1124 |
+
<span id="Sprint_Speed-validation" class="validation-message"></span>
|
| 1125 |
+
</div>
|
| 1126 |
+
<div class="form-group">
|
| 1127 |
+
<label for="Agility_Score">Agility Score (0-10)<span class="tooltip-icon" data-tooltip="Subjective agility performance (0 = poor, 10 = excellent)" id="Agility_Score-tooltip"></span></label>
|
| 1128 |
+
<input type="range" id="Agility_Score" name="Agility_Score" min="0" max="10" value="0" required aria-describedby="Agility_Score-validation Agility_Score-tooltip">
|
| 1129 |
+
<span id="Agility_Score-value" class="slider-value">0</span>
|
| 1130 |
+
<span id="Agility_Score-validation" class="validation-message"></span>
|
| 1131 |
+
</div>
|
| 1132 |
+
<div class="form-group">
|
| 1133 |
+
<label for="Flexibility_Score">Flexibility Score (0-10)<span class="tooltip-icon" data-tooltip="Subjective flexibility performance (0 = poor, 10 = excellent)" id="Flexibility_Score-tooltip"></span></label>
|
| 1134 |
+
<input type="range" id="Flexibility_Score" name="Flexibility_Score" min="0" max="10" value="0" required aria-describedby="Flexibility_Score-validation Flexibility_Score-tooltip">
|
| 1135 |
+
<span id="Flexibility_Score-value" class="slider-value">0</span>
|
| 1136 |
+
<span id="Flexibility_Score-validation" class="validation-message"></span>
|
| 1137 |
+
</div>
|
| 1138 |
+
</div>
|
| 1139 |
+
</div>
|
| 1140 |
+
<!-- Injury History -->
|
| 1141 |
+
<div class="form-section">
|
| 1142 |
+
<div class="form-section-header">
|
| 1143 |
+
<h3>Injury History</h3>
|
| 1144 |
+
</div>
|
| 1145 |
+
<div class="form-grid">
|
| 1146 |
+
<div class="form-group">
|
| 1147 |
+
<label for="Previous_Injury_Count">Previous Injuries<span class="tooltip-icon" data-tooltip="Number of previous injuries (0-10)" id="Previous_Injury_Count-tooltip"></span></label>
|
| 1148 |
+
<input type="number" id="Previous_Injury_Count" name="Previous_Injury_Count" min="0" max="10" required aria-describedby="Previous_Injury_Count-validation Previous_Injury_Count-tooltip">
|
| 1149 |
+
<span id="Previous_Injury_Count-validation" class="validation-message"></span>
|
| 1150 |
+
</div>
|
| 1151 |
+
<div class="form-group">
|
| 1152 |
+
<label for="Previous_Injury_Type">Previous Injury Type<span class="tooltip-icon" data-tooltip="Type of the most significant previous injury" id="Previous_Injury_Type-tooltip"></span></label>
|
| 1153 |
+
<select id="Previous_Injury_Type" name="Previous_Injury_Type" required aria-describedby="Previous_Injury_Type-validation Previous_Injury_Type-tooltip">
|
| 1154 |
+
<option value="">Select</option>
|
| 1155 |
+
<option value="None">None</option>
|
| 1156 |
+
<option value="Sprain">Sprain</option>
|
| 1157 |
+
<option value="Ligament Tear">Ligament Tear</option>
|
| 1158 |
+
<option value="Tendonitis">Tendonitis</option>
|
| 1159 |
+
<option value="Strain">Strain</option>
|
| 1160 |
+
<option value="Fracture">Fracture</option>
|
| 1161 |
+
</select>
|
| 1162 |
+
<span id="Previous_Injury_Type-validation" class="validation-message"></span>
|
| 1163 |
+
</div>
|
| 1164 |
+
</div>
|
| 1165 |
+
</div>
|
| 1166 |
+
<button type="submit" class="submit-button">Predict Injury Risk</button>
|
| 1167 |
+
</form>
|
| 1168 |
+
<div id="result-container" class="result-container">
|
| 1169 |
+
<h2>Risk Assessment Results</h2>
|
| 1170 |
+
<div class="summary-card">
|
| 1171 |
+
<div class="summary-item">
|
| 1172 |
+
<span class="summary-label">Risk Level</span>
|
| 1173 |
+
<span id="risk-level" class="summary-value"></span>
|
| 1174 |
+
</div>
|
| 1175 |
+
<div class="summary-item">
|
| 1176 |
+
<span class="summary-label">Likelihood</span>
|
| 1177 |
+
<span id="likelihood-percent" class="summary-value"></span>
|
| 1178 |
+
</div>
|
| 1179 |
+
<div class="summary-gauge">
|
| 1180 |
+
<svg class="gauge-svg" viewBox="0 0 120 120">
|
| 1181 |
+
<defs>
|
| 1182 |
+
<linearGradient id="gaugeGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
| 1183 |
+
<stop offset="0%" style="stop-color:#00ff99;stop-opacity:1" />
|
| 1184 |
+
<stop offset="50%" style="stop-color:#ffd700;stop-opacity:1" />
|
| 1185 |
+
<stop offset="100%" style="stop-color:#ff3366;stop-opacity:1" />
|
| 1186 |
+
</linearGradient>
|
| 1187 |
+
</defs>
|
| 1188 |
+
<circle class="gauge-base" r="54" cx="60" cy="60"></circle>
|
| 1189 |
+
<circle class="gauge-value" r="54" cx="60" cy="60"></circle>
|
| 1190 |
+
</svg>
|
| 1191 |
+
<span class="gauge-text"></span>
|
| 1192 |
+
</div>
|
| 1193 |
+
</div>
|
| 1194 |
+
<div class="metrics-grid">
|
| 1195 |
+
<div class="metric-card">
|
| 1196 |
+
<h4>Training Load</h4>
|
| 1197 |
+
<svg class="radial-gauge" viewBox="0 0 100 100">
|
| 1198 |
+
<defs>
|
| 1199 |
+
<linearGradient id="gaugeGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
| 1200 |
+
<stop offset="0%" style="stop-color:#00ff99;stop-opacity:1" />
|
| 1201 |
+
<stop offset="50%" style="stop-color:#ffd700;stop-opacity:1" />
|
| 1202 |
+
<stop offset="100%" style="stop-color:#ff3366;stop-opacity:1" />
|
| 1203 |
+
</linearGradient>
|
| 1204 |
+
</defs>
|
| 1205 |
+
<circle class="gauge-base" r="40" cx="50" cy="50"></circle>
|
| 1206 |
+
<circle id="training-load-gauge" class="gauge-value" r="40" cx="50" cy="50"></circle>
|
| 1207 |
+
</svg>
|
| 1208 |
+
<span id="training-load-text" class="metric-value"></span>
|
| 1209 |
+
<span id="training-load-tooltip" class="tooltip"></span>
|
| 1210 |
+
</div>
|
| 1211 |
+
<div class="metric-card">
|
| 1212 |
+
<h4>Recovery Status</h4>
|
| 1213 |
+
<svg class="radial-gauge" viewBox="0 0 100 100">
|
| 1214 |
+
<defs>
|
| 1215 |
+
<linearGradient id="gaugeGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
| 1216 |
+
<stop offset="0%" style="stop-color:#00ff99;stop-opacity:1" />
|
| 1217 |
+
<stop offset="50%" style="stop-color:#ffd700;stop-opacity:1" />
|
| 1218 |
+
<stop offset="100%" style="stop-color:#ff3366;stop-opacity:1" />
|
| 1219 |
+
</linearGradient>
|
| 1220 |
+
</defs>
|
| 1221 |
+
<circle class="gauge-base" r="40" cx="50" cy="50"></circle>
|
| 1222 |
+
<circle id="recovery-gauge" class="gauge-value" r="40" cx="50" cy="50"></circle>
|
| 1223 |
+
</svg>
|
| 1224 |
+
<span id="recovery-text" class="metric-value"></span>
|
| 1225 |
+
<span id="recovery-tooltip" class="tooltip"></span>
|
| 1226 |
+
</div>
|
| 1227 |
+
<div class="metric-card">
|
| 1228 |
+
<h4>Injury History</h4>
|
| 1229 |
+
<svg class="radial-gauge" viewBox="0 0 100 100">
|
| 1230 |
+
<defs>
|
| 1231 |
+
<linearGradient id="gaugeGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
| 1232 |
+
<stop offset="0%" style="stop-color:#00ff99;stop-opacity:1" />
|
| 1233 |
+
<stop offset="50%" style="stop-color:#ffd700;stop-opacity:1" />
|
| 1234 |
+
<stop offset="100%" style="stop-color:#ff3366;stop-opacity:1" />
|
| 1235 |
+
</linearGradient>
|
| 1236 |
+
</defs>
|
| 1237 |
+
<circle class="gauge-base" r="40" cx="50" cy="50"></circle>
|
| 1238 |
+
<circle id="injury-history-gauge" class="gauge-value" r="40" cx="50" cy="50"></circle>
|
| 1239 |
+
</svg>
|
| 1240 |
+
<span id="injury-history-text" class="metric-value"></span>
|
| 1241 |
+
<span id="injury-history-tooltip" class="tooltip"></span>
|
| 1242 |
+
</div>
|
| 1243 |
+
</div>
|
| 1244 |
+
<div class="recommendations">
|
| 1245 |
+
<h3>Personalized Recommendations</h3>
|
| 1246 |
+
<ul class="recommendation-list"></ul>
|
| 1247 |
+
</div>
|
| 1248 |
+
<button class="action-button" onclick="exportPDF()">Export Results as PDF</button>
|
| 1249 |
+
</div>
|
| 1250 |
+
</main>
|
| 1251 |
+
</div>
|
| 1252 |
+
<script>
|
| 1253 |
+
// Collapsible Form Sections
|
| 1254 |
+
document.querySelectorAll('.form-section-header').forEach(header => {
|
| 1255 |
+
header.addEventListener('click', () => {
|
| 1256 |
+
const section = header.parentElement;
|
| 1257 |
+
section.classList.toggle('collapsed');
|
| 1258 |
+
});
|
| 1259 |
+
});
|
| 1260 |
+
|
| 1261 |
+
// Progress Bar Logic
|
| 1262 |
+
const form = document.getElementById('predictionForm');
|
| 1263 |
+
const progressFill = document.getElementById('progress-fill');
|
| 1264 |
+
const progressPercent = document.getElementById('progress-percent');
|
| 1265 |
+
const inputs = form.querySelectorAll('input, select');
|
| 1266 |
+
const totalFields = inputs.length;
|
| 1267 |
+
|
| 1268 |
+
function updateProgress() {
|
| 1269 |
+
let filledFields = 0;
|
| 1270 |
+
inputs.forEach(input => {
|
| 1271 |
+
if (input.value !== '' && (!input.required || input.checkValidity())) {
|
| 1272 |
+
filledFields++;
|
| 1273 |
+
}
|
| 1274 |
+
});
|
| 1275 |
+
const percentage = Math.round((filledFields / totalFields) * 100);
|
| 1276 |
+
progressFill.style.width = `${percentage}%`;
|
| 1277 |
+
progressPercent.textContent = `${percentage}%`;
|
| 1278 |
+
}
|
| 1279 |
+
|
| 1280 |
+
inputs.forEach(input => {
|
| 1281 |
+
input.addEventListener('input', updateProgress);
|
| 1282 |
+
input.addEventListener('change', updateProgress);
|
| 1283 |
+
});
|
| 1284 |
+
|
| 1285 |
+
// Slider Value Display
|
| 1286 |
+
const sliders = form.querySelectorAll('input[type="range"]');
|
| 1287 |
+
sliders.forEach(slider => {
|
| 1288 |
+
const valueSpan = document.getElementById(`${slider.id}-value`);
|
| 1289 |
+
valueSpan.textContent = slider.value;
|
| 1290 |
+
slider.addEventListener('input', () => {
|
| 1291 |
+
valueSpan.textContent = slider.value;
|
| 1292 |
+
});
|
| 1293 |
+
});
|
| 1294 |
+
|
| 1295 |
+
// Tooltip Functionality
|
| 1296 |
+
document.querySelectorAll('.tooltip-icon').forEach(icon => {
|
| 1297 |
+
// Create tooltip text element
|
| 1298 |
+
const tooltipText = document.createElement('span');
|
| 1299 |
+
tooltipText.classList.add('tooltip-text');
|
| 1300 |
+
tooltipText.textContent = icon.getAttribute('data-tooltip');
|
| 1301 |
+
icon.appendChild(tooltipText);
|
| 1302 |
+
|
| 1303 |
+
// Show tooltip on hover
|
| 1304 |
+
icon.addEventListener('mouseenter', () => {
|
| 1305 |
+
tooltipText.style.visibility = 'visible';
|
| 1306 |
+
tooltipText.style.opacity = '1';
|
| 1307 |
+
});
|
| 1308 |
+
icon.addEventListener('mouseleave', () => {
|
| 1309 |
+
tooltipText.style.visibility = 'hidden';
|
| 1310 |
+
tooltipText.style.opacity = '0';
|
| 1311 |
+
});
|
| 1312 |
+
});
|
| 1313 |
+
|
| 1314 |
+
// Particle Background
|
| 1315 |
+
const canvas = document.getElementById('particles');
|
| 1316 |
+
const ctx = canvas.getContext('2d');
|
| 1317 |
+
canvas.width = window.innerWidth;
|
| 1318 |
+
canvas.height = window.innerHeight;
|
| 1319 |
+
|
| 1320 |
+
const particlesArray = [];
|
| 1321 |
+
const numberOfParticles = 100;
|
| 1322 |
+
|
| 1323 |
+
class Particle {
|
| 1324 |
+
constructor() {
|
| 1325 |
+
this.x = Math.random() * canvas.width;
|
| 1326 |
+
this.y = Math.random() * canvas.height;
|
| 1327 |
+
this.size = Math.random() * 2 + 1;
|
| 1328 |
+
this.speedX = Math.random() * 0.5 - 0.25;
|
| 1329 |
+
this.speedY = Math.random() * 0.5 - 0.25;
|
| 1330 |
+
}
|
| 1331 |
+
|
| 1332 |
+
update() {
|
| 1333 |
+
this.x += this.speedX;
|
| 1334 |
+
this.y += this.speedY;
|
| 1335 |
+
if (this.x < 0 || this.x > canvas.width) this.speedX *= -1;
|
| 1336 |
+
if (this.y < 0 || this.y > canvas.height) this.speedY *= -1;
|
| 1337 |
+
}
|
| 1338 |
+
|
| 1339 |
+
draw() {
|
| 1340 |
+
ctx.fillStyle = 'rgba(0, 212, 255, 0.3)';
|
| 1341 |
+
ctx.beginPath();
|
| 1342 |
+
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
| 1343 |
+
ctx.fill();
|
| 1344 |
+
}
|
| 1345 |
+
}
|
| 1346 |
+
|
| 1347 |
+
function initParticles() {
|
| 1348 |
+
for (let i = 0; i < numberOfParticles; i++) {
|
| 1349 |
+
particlesArray.push(new Particle());
|
| 1350 |
+
}
|
| 1351 |
+
}
|
| 1352 |
+
|
| 1353 |
+
function animateParticles() {
|
| 1354 |
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
| 1355 |
+
particlesArray.forEach(particle => {
|
| 1356 |
+
particle.update();
|
| 1357 |
+
particle.draw();
|
| 1358 |
+
});
|
| 1359 |
+
requestAnimationFrame(animateParticles);
|
| 1360 |
+
}
|
| 1361 |
+
|
| 1362 |
+
initParticles();
|
| 1363 |
+
animateParticles();
|
| 1364 |
+
|
| 1365 |
+
window.addEventListener('resize', () => {
|
| 1366 |
+
canvas.width = window.innerWidth;
|
| 1367 |
+
canvas.height = window.innerHeight;
|
| 1368 |
+
});
|
| 1369 |
+
|
| 1370 |
+
// PDF Export Function
|
| 1371 |
+
function exportPDF() {
|
| 1372 |
+
const { jsPDF } = window.jspdf;
|
| 1373 |
+
const doc = new jsPDF({
|
| 1374 |
+
orientation: 'portrait',
|
| 1375 |
+
unit: 'mm',
|
| 1376 |
+
format: 'a4'
|
| 1377 |
+
});
|
| 1378 |
+
|
| 1379 |
+
// Styling
|
| 1380 |
+
const primaryColor = '#00d4ff';
|
| 1381 |
+
const secondaryColor = '#ff00aa';
|
| 1382 |
+
doc.setFont('Helvetica', 'bold');
|
| 1383 |
+
|
| 1384 |
+
// Header
|
| 1385 |
+
doc.setFillColor(primaryColor);
|
| 1386 |
+
doc.rect(0, 0, 210, 20, 'F');
|
| 1387 |
+
doc.setTextColor('#ffffff');
|
| 1388 |
+
doc.setFontSize(20);
|
| 1389 |
+
doc.text('Injury Prediction System Report', 105, 12, { align: 'center' });
|
| 1390 |
+
|
| 1391 |
+
// Summary
|
| 1392 |
+
doc.setTextColor('#000000');
|
| 1393 |
+
doc.setFontSize(16);
|
| 1394 |
+
doc.text('Risk Assessment Summary', 20, 30);
|
| 1395 |
+
doc.setDrawColor(primaryColor);
|
| 1396 |
+
doc.setLineWidth(0.5);
|
| 1397 |
+
doc.line(20, 32, 190, 32);
|
| 1398 |
+
|
| 1399 |
+
doc.setFontSize(12);
|
| 1400 |
+
doc.setFont('Helvetica', 'normal');
|
| 1401 |
+
const riskLevel = document.getElementById('risk-level').textContent || 'N/A';
|
| 1402 |
+
const likelihood = document.getElementById('likelihood-percent').textContent || 'N/A';
|
| 1403 |
+
const gaugeText = document.querySelector('.gauge-text').textContent || '0%';
|
| 1404 |
+
doc.text(`Risk Level: ${riskLevel}`, 20, 40);
|
| 1405 |
+
doc.text(`Likelihood: ${likelihood}`, 20, 48);
|
| 1406 |
+
doc.text(`Risk Score: ${gaugeText}`, 20, 56);
|
| 1407 |
+
|
| 1408 |
+
// Metrics
|
| 1409 |
+
doc.setFontSize(16);
|
| 1410 |
+
doc.text('Key Metrics', 20, 70);
|
| 1411 |
+
doc.line(20, 72, 190, 72);
|
| 1412 |
+
doc.setFontSize(12);
|
| 1413 |
+
const trainingLoad = document.getElementById('training-load-text').textContent || 'N/A';
|
| 1414 |
+
const recovery = document.getElementById('recovery-text').textContent || 'N/A';
|
| 1415 |
+
const injuryHistory = document.getElementById('injury-history-text').textContent || 'N/A';
|
| 1416 |
+
doc.text(`Training Load: ${trainingLoad}`, 20, 80);
|
| 1417 |
+
doc.text(`Recovery Status: ${recovery}`, 20, 88);
|
| 1418 |
+
doc.text(`Injury History: ${injuryHistory}`, 20, 96);
|
| 1419 |
+
|
| 1420 |
+
// Recommendations
|
| 1421 |
+
doc.setFontSize(16);
|
| 1422 |
+
doc.text('Recommendations', 20, 110);
|
| 1423 |
+
doc.line(20, 112, 190, 112);
|
| 1424 |
+
doc.setFontSize(12);
|
| 1425 |
+
const recommendations = document.querySelectorAll('.recommendation-item');
|
| 1426 |
+
let y = 120;
|
| 1427 |
+
recommendations.forEach((rec, index) => {
|
| 1428 |
+
const summary = rec.querySelector('.recommendation-summary')?.textContent || 'N/A';
|
| 1429 |
+
doc.text(`${index + 1}. ${summary}`, 20, y);
|
| 1430 |
+
y += 8;
|
| 1431 |
+
if (y > 270) {
|
| 1432 |
+
doc.addPage();
|
| 1433 |
+
y = 20;
|
| 1434 |
+
}
|
| 1435 |
+
});
|
| 1436 |
+
|
| 1437 |
+
// Footer
|
| 1438 |
+
doc.setFillColor(secondaryColor);
|
| 1439 |
+
doc.rect(0, 280, 210, 17, 'F');
|
| 1440 |
+
doc.setTextColor('#ffffff');
|
| 1441 |
+
doc.setFontSize(10);
|
| 1442 |
+
doc.text('Generated by Injury Prediction System', 105, 290, { align: 'center' });
|
| 1443 |
+
|
| 1444 |
+
// Save PDF
|
| 1445 |
+
doc.save('Injury_Prediction_Report.pdf');
|
| 1446 |
+
}
|
| 1447 |
+
</script>
|
| 1448 |
+
<script src="calculator.js"></script>
|
| 1449 |
+
</body>
|
| 1450 |
+
</html>
|
UI2/calculator.js
ADDED
|
@@ -0,0 +1,481 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 2 |
+
const form = document.getElementById("predictionForm");
|
| 3 |
+
const resultContainer = document.getElementById("result-container");
|
| 4 |
+
|
| 5 |
+
if (resultContainer) {
|
| 6 |
+
resultContainer.style.display = 'none';
|
| 7 |
+
}
|
| 8 |
+
|
| 9 |
+
// Validation helper
|
| 10 |
+
const validateField = (input) => {
|
| 11 |
+
const value = input.value.trim();
|
| 12 |
+
const min = parseFloat(input.min);
|
| 13 |
+
const max = parseFloat(input.max);
|
| 14 |
+
if (!value) return false;
|
| 15 |
+
if (input.type === 'number') {
|
| 16 |
+
const numValue = parseFloat(value);
|
| 17 |
+
return !isNaN(numValue) && numValue >= min && numValue <= max;
|
| 18 |
+
}
|
| 19 |
+
return true;
|
| 20 |
+
};
|
| 21 |
+
|
| 22 |
+
// Add validation feedback
|
| 23 |
+
const addValidationFeedback = (input) => {
|
| 24 |
+
const validateInput = () => {
|
| 25 |
+
const formGroup = input.closest('.form-group');
|
| 26 |
+
const value = input.value.trim();
|
| 27 |
+
const isValid = value !== '' && validateField(input);
|
| 28 |
+
|
| 29 |
+
formGroup.classList.remove('error', 'success');
|
| 30 |
+
formGroup.classList.add(isValid ? 'success' : 'error');
|
| 31 |
+
|
| 32 |
+
const existingMessage = formGroup.querySelector('.validation-message');
|
| 33 |
+
if (existingMessage) existingMessage.remove();
|
| 34 |
+
|
| 35 |
+
const message = document.createElement('div');
|
| 36 |
+
message.className = `validation-message ${isValid ? 'success' : 'error'}`;
|
| 37 |
+
message.textContent = value === '' ? 'This field is required' :
|
| 38 |
+
(isValid ? 'Valid input' : 'Please check the value');
|
| 39 |
+
formGroup.appendChild(message);
|
| 40 |
+
|
| 41 |
+
return isValid;
|
| 42 |
+
};
|
| 43 |
+
|
| 44 |
+
input.addEventListener('input', validateInput);
|
| 45 |
+
input.addEventListener('blur', validateInput);
|
| 46 |
+
};
|
| 47 |
+
|
| 48 |
+
document.querySelectorAll('input, select').forEach(addValidationFeedback);
|
| 49 |
+
|
| 50 |
+
// Animate counter
|
| 51 |
+
function animateCounter(element, target) {
|
| 52 |
+
let start = 0;
|
| 53 |
+
const duration = 1000;
|
| 54 |
+
const stepTime = Math.abs(Math.floor(duration / target));
|
| 55 |
+
const timer = setInterval(() => {
|
| 56 |
+
start++;
|
| 57 |
+
element.textContent = start + '%';
|
| 58 |
+
if (start >= target) clearInterval(timer);
|
| 59 |
+
}, stepTime);
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
// Update gauge SVG
|
| 63 |
+
function updateGauge(elementId, percent, textId, tooltipId, tooltipMessages) {
|
| 64 |
+
const gauge = document.querySelector(elementId);
|
| 65 |
+
const text = document.querySelector(textId);
|
| 66 |
+
const tooltip = document.querySelector(tooltipId);
|
| 67 |
+
const radius = elementId.includes('radial') ? 40 : 54;
|
| 68 |
+
const circumference = 2 * Math.PI * radius;
|
| 69 |
+
const offset = circumference - (percent / 100) * circumference;
|
| 70 |
+
gauge.style.strokeDasharray = `${circumference} ${circumference}`;
|
| 71 |
+
gauge.style.strokeDashoffset = offset;
|
| 72 |
+
if (text) text.textContent = `${Math.round(percent)}%`;
|
| 73 |
+
|
| 74 |
+
if (tooltip && tooltipMessages) {
|
| 75 |
+
if (percent >= 75) {
|
| 76 |
+
tooltip.textContent = tooltipMessages.high;
|
| 77 |
+
} else if (percent >= 50) {
|
| 78 |
+
tooltip.textContent = tooltipMessages.medium;
|
| 79 |
+
} else {
|
| 80 |
+
tooltip.textContent = tooltipMessages.low;
|
| 81 |
+
}
|
| 82 |
+
}
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
// Mapping of recommendation keywords to professional resources
|
| 86 |
+
const resourceLinks = {
|
| 87 |
+
'training': {
|
| 88 |
+
url: 'https://www.acsm.org/docs/default-source/files-for-resource-library/acsms-guidelines-for-exercise-testing-and-prescription-(10th-ed.).pdf',
|
| 89 |
+
source: 'American College of Sports Medicine'
|
| 90 |
+
},
|
| 91 |
+
'intensity': {
|
| 92 |
+
url: 'https://www.mayoclinic.org/healthy-lifestyle/fitness/in-depth/exercise-intensity/art-20046887',
|
| 93 |
+
source: 'Mayo Clinic'
|
| 94 |
+
},
|
| 95 |
+
'recovery': {
|
| 96 |
+
url: 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5592286/',
|
| 97 |
+
source: 'PubMed - Sports Medicine Journal'
|
| 98 |
+
},
|
| 99 |
+
'rest': {
|
| 100 |
+
url: 'https://www.sleepfoundation.org/physical-activity/athletic-performance-and-sleep',
|
| 101 |
+
source: 'Sleep Foundation'
|
| 102 |
+
},
|
| 103 |
+
'injury': {
|
| 104 |
+
url: 'https://orthoinfo.aaos.org/en/diseases--conditions/sports-injuries/',
|
| 105 |
+
source: 'American Academy of Orthopaedic Surgeons'
|
| 106 |
+
},
|
| 107 |
+
'prevention': {
|
| 108 |
+
url: 'https://www.nata.org/professional-interests/safe-sports-environments/injury-prevention',
|
| 109 |
+
source: 'National Athletic Trainers\' Association'
|
| 110 |
+
}
|
| 111 |
+
};
|
| 112 |
+
|
| 113 |
+
// Enhanced recommendation processing
|
| 114 |
+
function enhanceRecommendations(recommendations, factorData, featureImportance) {
|
| 115 |
+
const categories = {
|
| 116 |
+
'Training Adjustments': [],
|
| 117 |
+
'Recovery Strategies': [],
|
| 118 |
+
'Injury Prevention': []
|
| 119 |
+
};
|
| 120 |
+
|
| 121 |
+
recommendations.forEach((rec, index) => {
|
| 122 |
+
let category = 'Injury Prevention';
|
| 123 |
+
if (rec.toLowerCase().includes('training') || rec.toLowerCase().includes('intensity')) {
|
| 124 |
+
category = 'Training Adjustments';
|
| 125 |
+
} else if (rec.toLowerCase().includes('recovery') || rec.toLowerCase().includes('rest')) {
|
| 126 |
+
category = 'Recovery Strategies';
|
| 127 |
+
}
|
| 128 |
+
|
| 129 |
+
const priority = calculatePriority(rec, factorData, featureImportance);
|
| 130 |
+
|
| 131 |
+
// Find the most relevant resource link
|
| 132 |
+
let resource = { url: 'https://www.healthline.com/health/sports-injuries', source: 'Healthline' };
|
| 133 |
+
for (const [keyword, link] of Object.entries(resourceLinks)) {
|
| 134 |
+
if (rec.toLowerCase().includes(keyword)) {
|
| 135 |
+
resource = link;
|
| 136 |
+
break;
|
| 137 |
+
}
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
categories[category].push({
|
| 141 |
+
id: `rec-${index}`,
|
| 142 |
+
text: rec,
|
| 143 |
+
priority: priority,
|
| 144 |
+
details: generateDetails(rec, factorData),
|
| 145 |
+
completed: false,
|
| 146 |
+
resourceUrl: resource.url,
|
| 147 |
+
resourceSource: resource.source
|
| 148 |
+
});
|
| 149 |
+
});
|
| 150 |
+
|
| 151 |
+
Object.keys(categories).forEach(category => {
|
| 152 |
+
categories[category].sort((a, b) => b.priority - a.priority);
|
| 153 |
+
});
|
| 154 |
+
|
| 155 |
+
return categories;
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
function calculatePriority(recommendation, factorData, featureImportance) {
|
| 159 |
+
let priority = 0.5;
|
| 160 |
+
const keywords = {
|
| 161 |
+
'Training_Load_Score': ['training', 'intensity'],
|
| 162 |
+
'Fatigue_Level': ['fatigue', 'rest'],
|
| 163 |
+
'Recovery_Time_Between_Sessions': ['recovery', 'rest'],
|
| 164 |
+
'Previous_Injury_Count': ['injury', 'prevention']
|
| 165 |
+
};
|
| 166 |
+
|
| 167 |
+
Object.keys(keywords).forEach(key => {
|
| 168 |
+
if (keywords[key].some(kw => recommendation.toLowerCase().includes(kw))) {
|
| 169 |
+
const impact = (factorData[key] || 0) * (featureImportance[key] || 0);
|
| 170 |
+
priority = Math.max(priority, impact);
|
| 171 |
+
}
|
| 172 |
+
});
|
| 173 |
+
|
| 174 |
+
return Math.min(1, Math.max(0, priority));
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
function generateDetails(recommendation, factorData) {
|
| 178 |
+
if (recommendation.toLowerCase().includes('training') && factorData.High_Intensity_Training_Hours > 10) {
|
| 179 |
+
return `Reduce high-intensity sessions by 1-2 hours/week to lower training load.`;
|
| 180 |
+
} else if (recommendation.toLowerCase().includes('recovery') && factorData.Recovery_Time_Between_Sessions < 12) {
|
| 181 |
+
return `Increase rest periods to at least 12 hours between sessions.`;
|
| 182 |
+
} else if (recommendation.toLowerCase().includes('injury') && factorData.Previous_Injury_Count > 2) {
|
| 183 |
+
return `Consult a physiotherapist to address recurring injury risks.`;
|
| 184 |
+
}
|
| 185 |
+
return `Follow this recommendation consistently for optimal results.`;
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
+
function loadCompletedRecommendations() {
|
| 189 |
+
const stored = localStorage.getItem('completedRecommendations');
|
| 190 |
+
return stored ? JSON.parse(stored) : {};
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
function saveCompletedRecommendations(completed) {
|
| 194 |
+
localStorage.setItem('completedRecommendations', JSON.stringify(completed));
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
if (form) {
|
| 198 |
+
form.addEventListener("submit", async (e) => {
|
| 199 |
+
e.preventDefault();
|
| 200 |
+
|
| 201 |
+
document.querySelectorAll('.validation-message').forEach(msg => msg.remove());
|
| 202 |
+
document.querySelectorAll('.form-group').forEach(group => group.classList.remove('error'));
|
| 203 |
+
|
| 204 |
+
const inputs = form.querySelectorAll('input, select');
|
| 205 |
+
let isValid = true;
|
| 206 |
+
|
| 207 |
+
inputs.forEach(input => {
|
| 208 |
+
const value = input.value.trim();
|
| 209 |
+
const formGroup = input.closest('.form-group');
|
| 210 |
+
|
| 211 |
+
if (value === '') {
|
| 212 |
+
isValid = false;
|
| 213 |
+
formGroup.classList.add('error');
|
| 214 |
+
const message = document.createElement('div');
|
| 215 |
+
message.className = 'validation-message error';
|
| 216 |
+
message.innerHTML = `<strong>Required:</strong> Please fill out this field`;
|
| 217 |
+
formGroup.appendChild(message);
|
| 218 |
+
|
| 219 |
+
input.classList.add('shake');
|
| 220 |
+
setTimeout(() => input.classList.remove('shake'), 500);
|
| 221 |
+
|
| 222 |
+
input.style.borderColor = '#ef4444';
|
| 223 |
+
input.style.boxShadow = '0 0 10px rgba(239, 68, 68, 0.3)';
|
| 224 |
+
}
|
| 225 |
+
});
|
| 226 |
+
|
| 227 |
+
if (!isValid) {
|
| 228 |
+
const firstError = form.querySelector('.form-group.error');
|
| 229 |
+
if (firstError) {
|
| 230 |
+
firstError.scrollIntoView({ behavior: 'smooth', block: 'center' });
|
| 231 |
+
}
|
| 232 |
+
return;
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
const rawData = Object.fromEntries(new FormData(form).entries());
|
| 236 |
+
const formData = new FormData(form);
|
| 237 |
+
const data = Object.fromEntries(formData.entries());
|
| 238 |
+
|
| 239 |
+
const genderMap = { "Male": 0, "Female": 1 };
|
| 240 |
+
const experienceMap = {
|
| 241 |
+
"Beginner": 0,
|
| 242 |
+
"Intermediate": 1,
|
| 243 |
+
"Advanced": 2,
|
| 244 |
+
"Professional": 3
|
| 245 |
+
};
|
| 246 |
+
const injuryTypeMap = {
|
| 247 |
+
"None": 0,
|
| 248 |
+
"Sprain": 1,
|
| 249 |
+
"Ligament Tear": 2,
|
| 250 |
+
"Tendonitis": 3,
|
| 251 |
+
"Strain": 4,
|
| 252 |
+
"Fracture": 5
|
| 253 |
+
};
|
| 254 |
+
const sportTypeMap = {
|
| 255 |
+
"Football": 0,
|
| 256 |
+
"Basketball": 1,
|
| 257 |
+
"Swimming": 2,
|
| 258 |
+
"Running": 3,
|
| 259 |
+
"Tennis": 4,
|
| 260 |
+
"Volleyball": 5
|
| 261 |
+
};
|
| 262 |
+
|
| 263 |
+
data.Gender = genderMap[data.Gender] ?? 0;
|
| 264 |
+
data.Experience_Level = experienceMap[data.Experience_Level] ?? 0;
|
| 265 |
+
data.Previous_Injury_Type = injuryTypeMap[data.Previous_Injury_Type] ?? 0;
|
| 266 |
+
data.Sport_Type = sportTypeMap[data.Sport_Type] ?? 0;
|
| 267 |
+
|
| 268 |
+
Object.keys(data).forEach(key => {
|
| 269 |
+
data[key] = isNaN(data[key]) ? 0 : parseFloat(data[key]);
|
| 270 |
+
});
|
| 271 |
+
|
| 272 |
+
const outlierWarnings = [];
|
| 273 |
+
if (data.Age < 18 && data.Total_Weekly_Training_Hours > 40) {
|
| 274 |
+
outlierWarnings.push('Unusual training hours for age under 18. Consider reducing to prevent burnout.');
|
| 275 |
+
}
|
| 276 |
+
if (data.Sprint_Speed > 10 && data.Age > 50) {
|
| 277 |
+
outlierWarnings.push('Sprint speed seems high for age over 50. Please verify this value.');
|
| 278 |
+
}
|
| 279 |
+
if (data.Fatigue_Level > 8 && data.Recovery_Time_Between_Sessions < 12) {
|
| 280 |
+
outlierWarnings.push('High fatigue with low recovery time may skew results. Consider adjusting inputs.');
|
| 281 |
+
}
|
| 282 |
+
if (outlierWarnings.length > 0) {
|
| 283 |
+
const warningDiv = document.createElement('div');
|
| 284 |
+
warningDiv.style.color = '#facc15';
|
| 285 |
+
warningDiv.style.marginBottom = '20px';
|
| 286 |
+
warningDiv.innerHTML = `<strong>Warning:</strong><ul>${outlierWarnings.map(w => `<li>${w}</li>`).join('')}</ul>`;
|
| 287 |
+
form.appendChild(warningDiv);
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
try {
|
| 291 |
+
console.log('Sending prediction request to server:', data);
|
| 292 |
+
const response = await fetch("http://127.0.0.1:8000/predict", {
|
| 293 |
+
method: "POST",
|
| 294 |
+
headers: { "Content-Type": "application/json" },
|
| 295 |
+
body: JSON.stringify(data),
|
| 296 |
+
});
|
| 297 |
+
if (!response.ok) throw new Error("Prediction failed");
|
| 298 |
+
|
| 299 |
+
const result = await response.json();
|
| 300 |
+
console.log('Received prediction result:', result);
|
| 301 |
+
|
| 302 |
+
const {
|
| 303 |
+
predicted_risk_level,
|
| 304 |
+
injury_likelihood_percent,
|
| 305 |
+
model_class_probability,
|
| 306 |
+
recommendations,
|
| 307 |
+
feature_importance
|
| 308 |
+
} = result;
|
| 309 |
+
|
| 310 |
+
if (!predicted_risk_level || typeof injury_likelihood_percent !== 'number' || !Array.isArray(recommendations)) {
|
| 311 |
+
throw new Error("Invalid API response format");
|
| 312 |
+
}
|
| 313 |
+
|
| 314 |
+
const trainingLoad = Math.min(100, Math.max(0, (parseFloat(data.Training_Load_Score) / 100) * 100));
|
| 315 |
+
const recoveryStatus = Math.min(100, Math.max(0, (parseFloat(data.Recovery_Time_Between_Sessions) / 48) * 100));
|
| 316 |
+
const injuryImpact = Math.min(100, Math.max(0, (parseFloat(data.Previous_Injury_Count) / 10) * 100));
|
| 317 |
+
const recoveryPerTraining = data.Total_Weekly_Training_Hours > 0
|
| 318 |
+
? Math.min(100, Math.max(0, (parseFloat(data.Recovery_Time_Between_Sessions) / parseFloat(data.Total_Weekly_Training_Hours)) * 100))
|
| 319 |
+
: 0;
|
| 320 |
+
const totalWeeklyHours = Math.min(100, Math.max(0, (parseFloat(data.Total_Weekly_Training_Hours) / 50) * 100));
|
| 321 |
+
const fatigueLevel = Math.min(100, Math.max(0, (parseFloat(data.Fatigue_Level) / 10) * 100));
|
| 322 |
+
const highIntensityHours = Math.min(100, Math.max(0, (parseFloat(data.High_Intensity_Training_Hours) / 20) * 100));
|
| 323 |
+
const experienceLevel = Math.min(100, Math.max(0, (data.Experience_Level / 3) * 100));
|
| 324 |
+
|
| 325 |
+
const defaultFeatureImportance = {
|
| 326 |
+
Training_Load_Score: 0.22,
|
| 327 |
+
Recovery_Per_Training: 0.18,
|
| 328 |
+
Total_Weekly_Training_Hours: 0.16,
|
| 329 |
+
Fatigue_Level: 0.14,
|
| 330 |
+
Recovery_Time_Between_Sessions: 0.12,
|
| 331 |
+
High_Intensity_Training_Hours: 0.10
|
| 332 |
+
};
|
| 333 |
+
const finalFeatureImportance = feature_importance || defaultFeatureImportance;
|
| 334 |
+
|
| 335 |
+
const enhancedRecommendations = enhanceRecommendations(recommendations, {
|
| 336 |
+
Training_Load_Score: trainingLoad,
|
| 337 |
+
Recovery_Per_Training: recoveryPerTraining,
|
| 338 |
+
Total_Weekly_Training_Hours: totalWeeklyHours,
|
| 339 |
+
Fatigue_Level: fatigueLevel,
|
| 340 |
+
Recovery_Time_Between_Sessions: recoveryStatus,
|
| 341 |
+
High_Intensity_Training_Hours: highIntensityHours,
|
| 342 |
+
Previous_Injury_Count: injuryImpact
|
| 343 |
+
}, finalFeatureImportance);
|
| 344 |
+
|
| 345 |
+
const fullReportData = {
|
| 346 |
+
predicted_risk_level,
|
| 347 |
+
injury_likelihood_percent,
|
| 348 |
+
model_class_probability,
|
| 349 |
+
recommendations: enhancedRecommendations,
|
| 350 |
+
feature_importance: finalFeatureImportance,
|
| 351 |
+
factorData: {
|
| 352 |
+
Training_Load_Score: trainingLoad,
|
| 353 |
+
Recovery_Per_Training: recoveryPerTraining,
|
| 354 |
+
Total_Weekly_Training_Hours: totalWeeklyHours,
|
| 355 |
+
Fatigue_Level: fatigueLevel,
|
| 356 |
+
Recovery_Time_Between_Sessions: recoveryStatus,
|
| 357 |
+
High_Intensity_Training_Hours: highIntensityHours,
|
| 358 |
+
Experience_Level: experienceLevel,
|
| 359 |
+
Intensity_Ratio: data.High_Intensity_Training_Hours > 0
|
| 360 |
+
? Math.min(100, Math.max(0, (parseFloat(data.High_Intensity_Training_Hours) / parseFloat(data.Total_Weekly_Training_Hours)) * 100))
|
| 361 |
+
: 0,
|
| 362 |
+
Endurance_Score: Math.min(100, Math.max(0, (parseFloat(data.Endurance_Score) / 10) * 100)),
|
| 363 |
+
Sprint_Speed: Math.min(100, Math.max(0, (parseFloat(data.Sprint_Speed) / 20) * 100)),
|
| 364 |
+
Agility_Score: Math.min(100, Math.max(0, (parseFloat(data.Agility_Score) / 10) * 100)),
|
| 365 |
+
Flexibility_Score: Math.min(100, Math.max(0, (parseFloat(data.Flexibility_Score) / 10) * 100)),
|
| 366 |
+
Age: Math.min(100, Math.max(0, (parseFloat(data.Age) / 80) * 100)),
|
| 367 |
+
Strength_Training_Frequency: Math.min(100, Math.max(0, (parseFloat(data.Strength_Training_Frequency) / 7) * 100)),
|
| 368 |
+
Sport_Type: Math.min(100, Math.max(0, data.Sport_Type * 20)),
|
| 369 |
+
Gender: data.Gender * 100,
|
| 370 |
+
Previous_Injury_Count: injuryImpact,
|
| 371 |
+
Previous_Injury_Type: Math.min(100, Math.max(0, data.Previous_Injury_Type * 20))
|
| 372 |
+
},
|
| 373 |
+
profile: {
|
| 374 |
+
age: rawData.Age,
|
| 375 |
+
gender: rawData.Gender,
|
| 376 |
+
sport: rawData.Sport_Type
|
| 377 |
+
},
|
| 378 |
+
timestamp: new Date().toISOString(),
|
| 379 |
+
version: '1.1.0'
|
| 380 |
+
};
|
| 381 |
+
|
| 382 |
+
console.log('Storing prediction data in localStorage:', fullReportData);
|
| 383 |
+
localStorage.setItem('predictionData', JSON.stringify(fullReportData));
|
| 384 |
+
|
| 385 |
+
document.getElementById('risk-level').textContent = predicted_risk_level;
|
| 386 |
+
document.getElementById('likelihood-percent').textContent = `${Math.round(injury_likelihood_percent)}%`;
|
| 387 |
+
updateGauge('.summary-gauge .gauge-value', injury_likelihood_percent, '.summary-gauge .gauge-text', null, null);
|
| 388 |
+
|
| 389 |
+
updateGauge('#training-load-gauge', trainingLoad, '#training-load-text', '#training-load-tooltip', {
|
| 390 |
+
high: 'High training load may significantly increase injury risk.',
|
| 391 |
+
medium: 'Moderate training load; monitor closely.',
|
| 392 |
+
low: 'Low training load; risk appears minimal.'
|
| 393 |
+
});
|
| 394 |
+
updateGauge('#recovery-gauge', recoveryStatus, '#recovery-text', '#recovery-tooltip', {
|
| 395 |
+
high: 'Excellent recovery time; low risk from this factor.',
|
| 396 |
+
medium: 'Moderate recovery; consider increasing rest.',
|
| 397 |
+
low: 'Insufficient recovery may elevate injury risk.'
|
| 398 |
+
});
|
| 399 |
+
updateGauge('#injury-history-gauge', injuryImpact, '#injury-history-text', '#injury-history-tooltip', {
|
| 400 |
+
high: 'Significant injury history; high risk of recurrence.',
|
| 401 |
+
medium: 'Moderate injury history; take preventive measures.',
|
| 402 |
+
low: 'Minimal injury history; low risk from this factor.'
|
| 403 |
+
});
|
| 404 |
+
|
| 405 |
+
const recommendationListEl = document.querySelector('.recommendation-list');
|
| 406 |
+
const completedRecs = loadCompletedRecommendations();
|
| 407 |
+
recommendationListEl.innerHTML = Object.keys(enhancedRecommendations).map(category => `
|
| 408 |
+
<div class="recommendation-category">
|
| 409 |
+
<h5 class="category-title">${category}</h5>
|
| 410 |
+
${enhancedRecommendations[category].map(rec => `
|
| 411 |
+
<li class="recommendation-item expandable ${completedRecs[rec.id] ? 'completed' : ''}">
|
| 412 |
+
<input type="checkbox" class="rec-checkbox" data-id="${rec.id}" ${completedRecs[rec.id] ? 'checked' : ''}>
|
| 413 |
+
<span class="priority-indicator" style="color: ${rec.priority > 0.7 ? '#ef4444' : rec.priority > 0.4 ? '#facc15' : '#22c55e'}">
|
| 414 |
+
${rec.priority > 0.7 ? '🛑' : rec.priority > 0.4 ? '⚠️' : '✅'}
|
| 415 |
+
</span>
|
| 416 |
+
<span class="recommendation-summary">${rec.text}</span>
|
| 417 |
+
<span class="tooltip-icon">ℹ️
|
| 418 |
+
<span class="tooltip-text">${rec.details}</span>
|
| 419 |
+
</span>
|
| 420 |
+
<div class="recommendation-detail">${rec.details}</div>
|
| 421 |
+
<button class="learn-more-btn" data-url="${rec.resourceUrl}" title="Source: ${rec.resourceSource}">Learn More</button>
|
| 422 |
+
</li>
|
| 423 |
+
`).join('')}
|
| 424 |
+
</div>
|
| 425 |
+
`).join('');
|
| 426 |
+
|
| 427 |
+
document.querySelectorAll('.rec-checkbox').forEach(checkbox => {
|
| 428 |
+
checkbox.addEventListener('change', () => {
|
| 429 |
+
const recId = checkbox.dataset.id;
|
| 430 |
+
const completedRecs = loadCompletedRecommendations();
|
| 431 |
+
completedRecs[recId] = checkbox.checked;
|
| 432 |
+
saveCompletedRecommendations(completedRecs);
|
| 433 |
+
checkbox.closest('.recommendation-item').classList.toggle('completed', checkbox.checked);
|
| 434 |
+
});
|
| 435 |
+
});
|
| 436 |
+
|
| 437 |
+
document.querySelectorAll('.recommendation-item.expandable').forEach(item => {
|
| 438 |
+
item.addEventListener('click', (e) => {
|
| 439 |
+
if (e.target.classList.contains('rec-checkbox') || e.target.classList.contains('learn-more-btn')) return;
|
| 440 |
+
const detail = item.querySelector('.recommendation-detail');
|
| 441 |
+
if (detail.style.display === "none" || detail.style.display === "") {
|
| 442 |
+
detail.style.display = "block";
|
| 443 |
+
detail.style.maxHeight = detail.scrollHeight + "px";
|
| 444 |
+
} else {
|
| 445 |
+
detail.style.display = "none";
|
| 446 |
+
detail.style.maxHeight = "0";
|
| 447 |
+
}
|
| 448 |
+
});
|
| 449 |
+
});
|
| 450 |
+
|
| 451 |
+
document.querySelectorAll('.learn-more-btn').forEach(btn => {
|
| 452 |
+
btn.addEventListener('click', () => {
|
| 453 |
+
const url = btn.dataset.url;
|
| 454 |
+
window.open(url, '_blank');
|
| 455 |
+
});
|
| 456 |
+
});
|
| 457 |
+
|
| 458 |
+
resultContainer.style.display = 'block';
|
| 459 |
+
resultContainer.classList.remove("hidden");
|
| 460 |
+
setTimeout(() => {
|
| 461 |
+
resultContainer.classList.add("visible");
|
| 462 |
+
}, 100);
|
| 463 |
+
resultContainer.scrollIntoView({ behavior: "smooth" });
|
| 464 |
+
|
| 465 |
+
const reportActions = document.createElement('div');
|
| 466 |
+
reportActions.className = 'report-actions';
|
| 467 |
+
reportActions.innerHTML = `
|
| 468 |
+
<button onclick="window.location.href='report.html'" class="action-button">
|
| 469 |
+
View Detailed Analysis
|
| 470 |
+
</button>
|
| 471 |
+
`;
|
| 472 |
+
resultContainer.appendChild(reportActions);
|
| 473 |
+
} catch (err) {
|
| 474 |
+
console.error('Prediction error:', err.message);
|
| 475 |
+
const resultOutput = document.createElement('div');
|
| 476 |
+
resultOutput.innerHTML = `<p style="color: red;">Error: ${err.message}. Please ensure the prediction server is running and try again.</p>`;
|
| 477 |
+
form.appendChild(resultOutput);
|
| 478 |
+
}
|
| 479 |
+
});
|
| 480 |
+
}
|
| 481 |
+
});
|
UI2/chatbot.html
ADDED
|
@@ -0,0 +1,1166 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>AthleteGuard AI</title>
|
| 7 |
+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Outfit:wght@300;400;500;600&display=swap" rel="stylesheet" />
|
| 8 |
+
</head>
|
| 9 |
+
<body class="nebula">
|
| 10 |
+
<!-- Loader -->
|
| 11 |
+
<div class="loader-wrapper">
|
| 12 |
+
<div class="loader">
|
| 13 |
+
<div class="space-robot-loader">
|
| 14 |
+
<div class="robot-core"></div>
|
| 15 |
+
<div class="robot-panel panel-1"></div>
|
| 16 |
+
<div class="robot-panel panel-2"></div>
|
| 17 |
+
<div class="robot-eye"></div>
|
| 18 |
+
<div class="shockwave"></div>
|
| 19 |
+
<div class="pulse-ring"></div>
|
| 20 |
+
</div>
|
| 21 |
+
<div class="progress-bar">
|
| 22 |
+
<div class="progress-arc"></div>
|
| 23 |
+
</div>
|
| 24 |
+
<span>Initializing AI...</span>
|
| 25 |
+
</div>
|
| 26 |
+
</div>
|
| 27 |
+
|
| 28 |
+
<!-- Header -->
|
| 29 |
+
<header>
|
| 30 |
+
<div class="navbar">
|
| 31 |
+
<div class="nav-logo">
|
| 32 |
+
<svg class="space-robot-logo" viewBox="0 0 40 40" aria-label=".team
|
| 33 |
+
Space Robot Logo">
|
| 34 |
+
<circle cx="20" cy="20" r="15" fill="url(#robotGradient)" />
|
| 35 |
+
<circle cx="15" cy="15" r="4" fill="#f0f0ff" />
|
| 36 |
+
<path d="M10 20 L8 18 M30 20 L32 18" stroke="#c0c0c0" stroke-width="1" />
|
| 37 |
+
<circle cx="20" cy="20" r="18" fill="none" stroke="#c0c0c0" stroke-width="0.5" opacity="0.5" />
|
| 38 |
+
<defs>
|
| 39 |
+
<radialGradient id="robotGradient" cx="0.5" cy="0.5" r="0.5">
|
| 40 |
+
<stop offset="0%" stop-color="#c0c0c0" />
|
| 41 |
+
<stop offset="100%" stop-color="#3c2f5f" />
|
| 42 |
+
</radialGradient>
|
| 43 |
+
</defs>
|
| 44 |
+
</svg>
|
| 45 |
+
</div>
|
| 46 |
+
<div class="hamburger" aria-label="Toggle navigation">
|
| 47 |
+
<span></span>
|
| 48 |
+
<span></span>
|
| 49 |
+
<span></span>
|
| 50 |
+
</div>
|
| 51 |
+
<ul class="nav-menu">
|
| 52 |
+
<li><a href="index.html">Home</a></li>
|
| 53 |
+
<li><a href="index.html#features">Features</a></li>
|
| 54 |
+
<li><a href="calculator.html">Calculator</a></li>
|
| 55 |
+
<li><a href="about.html">About</a></li>
|
| 56 |
+
<li><a href="chatbot.html" class="active">Chatbot</a></li>
|
| 57 |
+
<li><a href="index.html#faq">FAQ</a></li>
|
| 58 |
+
</ul>
|
| 59 |
+
<select id="theme-toggle" aria-label="Select theme">
|
| 60 |
+
<option value="nebula">Nebula</option>
|
| 61 |
+
<option value="starlight">Starlight</option>
|
| 62 |
+
<option value="void">Void</option>
|
| 63 |
+
</select>
|
| 64 |
+
</div>
|
| 65 |
+
</header>
|
| 66 |
+
|
| 67 |
+
<!-- Chatbot Section -->
|
| 68 |
+
<section class="section chatbot-section">
|
| 69 |
+
<canvas id="starfield-canvas"></canvas>
|
| 70 |
+
<div class="container">
|
| 71 |
+
<h1 class="header">AthleteGuard AI</h1>
|
| 72 |
+
<p class="description">Your intelligent assistant for training and injury prevention.</p>
|
| 73 |
+
<div class="chatbot-container glassmorphism" id="chatbotContainer">
|
| 74 |
+
<div class="chat-header">
|
| 75 |
+
<div class="space-robot"></div>
|
| 76 |
+
<span>AthleteGuard AI</span>
|
| 77 |
+
</div>
|
| 78 |
+
<div class="chat-body" id="chat-output"></div>
|
| 79 |
+
<div class="chat-input-wrapper">
|
| 80 |
+
<input type="text" id="user-input" placeholder="Ask about training, nutrition, or injuries..." aria-label="Chat input" />
|
| 81 |
+
<button id="sendButton" aria-label="Send message">➤</button>
|
| 82 |
+
</div>
|
| 83 |
+
</div>
|
| 84 |
+
</div>
|
| 85 |
+
</section>
|
| 86 |
+
|
| 87 |
+
<!-- Footer -->
|
| 88 |
+
<footer class="footer">
|
| 89 |
+
<div class="container">
|
| 90 |
+
<p>© 2025 AthleteGuard AI. All rights reserved.</p>
|
| 91 |
+
</div>
|
| 92 |
+
</footer>
|
| 93 |
+
|
| 94 |
+
<!-- Embedded CSS -->
|
| 95 |
+
<style>
|
| 96 |
+
* {
|
| 97 |
+
margin: 0;
|
| 98 |
+
padding: 0;
|
| 99 |
+
box-sizing: border-box;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
body {
|
| 103 |
+
font-family: 'Outfit', sans-serif;
|
| 104 |
+
background: linear-gradient(135deg, #0a0a23 0%, #1a1a3d 100%);
|
| 105 |
+
color: #f0f0ff;
|
| 106 |
+
line-height: 1.6;
|
| 107 |
+
overflow-x: hidden;
|
| 108 |
+
visibility: visible;
|
| 109 |
+
}
|
| 110 |
+
|
| 111 |
+
/* Loader */
|
| 112 |
+
.loader-wrapper {
|
| 113 |
+
position: fixed;
|
| 114 |
+
top: 0;
|
| 115 |
+
left: 0;
|
| 116 |
+
width: 100%;
|
| 117 |
+
height: 100%;
|
| 118 |
+
background: #0a0a23;
|
| 119 |
+
display: flex;
|
| 120 |
+
align-items: center;
|
| 121 |
+
justify-content: center;
|
| 122 |
+
z-index: 1000;
|
| 123 |
+
transition: opacity 0.5s ease;
|
| 124 |
+
}
|
| 125 |
+
|
| 126 |
+
.loader {
|
| 127 |
+
display: flex;
|
| 128 |
+
flex-direction: column;
|
| 129 |
+
align-items: center;
|
| 130 |
+
gap: 15px;
|
| 131 |
+
}
|
| 132 |
+
|
| 133 |
+
.space-robot-loader {
|
| 134 |
+
width: 80px;
|
| 135 |
+
height: 80px;
|
| 136 |
+
position: relative;
|
| 137 |
+
animation: loaderAssemble 3s linear forwards;
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
.robot-core {
|
| 141 |
+
width: 50px;
|
| 142 |
+
height: 50px;
|
| 143 |
+
background: radial-gradient(circle, #c0c0c0 50%, #3c2f5f 100%);
|
| 144 |
+
border-radius: 50%;
|
| 145 |
+
position: absolute;
|
| 146 |
+
top: 15px;
|
| 147 |
+
left: 15px;
|
| 148 |
+
opacity: 0;
|
| 149 |
+
animation: coreFade 1s ease forwards;
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
.robot-panel {
|
| 153 |
+
width: 20px;
|
| 154 |
+
height: 20px;
|
| 155 |
+
background: #c0c0c0;
|
| 156 |
+
position: absolute;
|
| 157 |
+
opacity: 0;
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
.panel-1 {
|
| 161 |
+
top: 10px;
|
| 162 |
+
left: 10px;
|
| 163 |
+
transform: rotate(45deg);
|
| 164 |
+
animation: panelSlide 1s ease 1s forwards;
|
| 165 |
+
}
|
| 166 |
+
|
| 167 |
+
.panel-2 {
|
| 168 |
+
bottom: 10px;
|
| 169 |
+
right: 10px;
|
| 170 |
+
transform: rotate(-45deg);
|
| 171 |
+
animation: panelSlide 1s ease 1.5s forwards;
|
| 172 |
+
}
|
| 173 |
+
|
| 174 |
+
.robot-eye {
|
| 175 |
+
width: 12px;
|
| 176 |
+
height: 12px;
|
| 177 |
+
background: #f0f0ff;
|
| 178 |
+
border-radius: 50%;
|
| 179 |
+
position: absolute;
|
| 180 |
+
top: 25px;
|
| 181 |
+
left: 25px;
|
| 182 |
+
opacity: 0;
|
| 183 |
+
animation: eyeGlow 0.5s ease 2s forwards;
|
| 184 |
+
}
|
| 185 |
+
|
| 186 |
+
.shockwave {
|
| 187 |
+
width: 100px;
|
| 188 |
+
height: 100px;
|
| 189 |
+
border: 2px solid #c0c0c0;
|
| 190 |
+
border-radius: 50%;
|
| 191 |
+
position: absolute;
|
| 192 |
+
top: -10px;
|
| 193 |
+
left: -10px;
|
| 194 |
+
opacity: 0;
|
| 195 |
+
animation: shockwaveExpand 0.8s ease 2.5s infinite;
|
| 196 |
+
}
|
| 197 |
+
|
| 198 |
+
.pulse-ring {
|
| 199 |
+
width: 120px;
|
| 200 |
+
height: 120px;
|
| 201 |
+
border: 3px solid rgba(192, 192, 192, 0.3);
|
| 202 |
+
border-radius: 50%;
|
| 203 |
+
position: absolute;
|
| 204 |
+
top: -20px;
|
| 205 |
+
left: -20px;
|
| 206 |
+
opacity: 0;
|
| 207 |
+
animation: pulseRing 1.5s ease 3s infinite;
|
| 208 |
+
}
|
| 209 |
+
|
| 210 |
+
@keyframes loaderAssemble {
|
| 211 |
+
0% { transform: scale(0.5) rotate(0deg); }
|
| 212 |
+
100% { transform: scale(1) rotate(360deg); }
|
| 213 |
+
}
|
| 214 |
+
|
| 215 |
+
@keyframes coreFade {
|
| 216 |
+
0% { opacity: 0; transform: scale(0.5); }
|
| 217 |
+
100% { opacity: 1; transform: scale(1); }
|
| 218 |
+
}
|
| 219 |
+
|
| 220 |
+
@keyframes panelSlide {
|
| 221 |
+
0% { opacity: 0; transform: translateX(-20px) rotate(45deg); }
|
| 222 |
+
100% { opacity: 1; transform: translateX(0) rotate(45deg); }
|
| 223 |
+
}
|
| 224 |
+
|
| 225 |
+
@keyframes eyeGlow {
|
| 226 |
+
0% { opacity: 0; transform: scale(0.5); }
|
| 227 |
+
100% { opacity: 1; transform: scale(1); }
|
| 228 |
+
}
|
| 229 |
+
|
| 230 |
+
@keyframes shockwaveExpand {
|
| 231 |
+
0% { opacity: 0.5; transform: scale(0.8); }
|
| 232 |
+
100% { opacity: 0; transform: scale(1.8); }
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
@keyframes pulseRing {
|
| 236 |
+
0% { opacity: 0.3; transform: scale(0.7); }
|
| 237 |
+
50% { opacity: 0.6; transform: scale(1.2); }
|
| 238 |
+
100% { opacity: 0; transform: scale(1.5); }
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
.progress-bar {
|
| 242 |
+
width: 120px;
|
| 243 |
+
height: 12px;
|
| 244 |
+
background: rgba(255, 255, 255, 0.1);
|
| 245 |
+
border-radius: 6px;
|
| 246 |
+
overflow: hidden;
|
| 247 |
+
position: relative;
|
| 248 |
+
}
|
| 249 |
+
|
| 250 |
+
.progress-arc {
|
| 251 |
+
width: 0;
|
| 252 |
+
height: 100%;
|
| 253 |
+
background: linear-gradient(45deg, #3c2f5f, #c0c0c0);
|
| 254 |
+
animation: progressFill 3.5s ease-in-out forwards;
|
| 255 |
+
}
|
| 256 |
+
|
| 257 |
+
@keyframes progressFill {
|
| 258 |
+
0% { width: 0; }
|
| 259 |
+
100% { width: 100%; }
|
| 260 |
+
}
|
| 261 |
+
|
| 262 |
+
.loader span {
|
| 263 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 264 |
+
font-size: 18px;
|
| 265 |
+
color: #f0f0ff;
|
| 266 |
+
letter-spacing: 1px;
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
+
.loader-wrapper.fade-out {
|
| 270 |
+
opacity: 0;
|
| 271 |
+
pointer-events: none;
|
| 272 |
+
}
|
| 273 |
+
|
| 274 |
+
/* Header */
|
| 275 |
+
.navbar {
|
| 276 |
+
display: flex;
|
| 277 |
+
justify-content: space-between;
|
| 278 |
+
align-items: center;
|
| 279 |
+
padding: 15px 30px;
|
| 280 |
+
background: rgba(255, 255, 255, 0.05);
|
| 281 |
+
backdrop-filter: blur(4px);
|
| 282 |
+
position: fixed;
|
| 283 |
+
width: 100%;
|
| 284 |
+
z-index: 100;
|
| 285 |
+
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
.nav-logo {
|
| 289 |
+
display: flex;
|
| 290 |
+
align-items: center;
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
.space-robot-logo {
|
| 294 |
+
width: 30px;
|
| 295 |
+
height: 30px;
|
| 296 |
+
transition: transform 0.3s ease;
|
| 297 |
+
}
|
| 298 |
+
|
| 299 |
+
.space-robot-logo:hover {
|
| 300 |
+
transform: rotate(15deg) scale(1.1);
|
| 301 |
+
}
|
| 302 |
+
|
| 303 |
+
.nav-menu {
|
| 304 |
+
display: flex;
|
| 305 |
+
list-style: none;
|
| 306 |
+
}
|
| 307 |
+
|
| 308 |
+
.nav-menu li {
|
| 309 |
+
margin-left: 20px;
|
| 310 |
+
}
|
| 311 |
+
|
| 312 |
+
.nav-menu a {
|
| 313 |
+
color: #f0f0ff;
|
| 314 |
+
text-decoration: none;
|
| 315 |
+
font-weight: 500;
|
| 316 |
+
transition: color 0.3s ease;
|
| 317 |
+
}
|
| 318 |
+
|
| 319 |
+
.nav-menu a:hover,
|
| 320 |
+
.nav-menu a.active {
|
| 321 |
+
color: #c0c0c0;
|
| 322 |
+
}
|
| 323 |
+
|
| 324 |
+
.hamburger {
|
| 325 |
+
display: none;
|
| 326 |
+
cursor: pointer;
|
| 327 |
+
background: none;
|
| 328 |
+
border: none;
|
| 329 |
+
flex-direction: column;
|
| 330 |
+
gap: 4px;
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
.hamburger span {
|
| 334 |
+
width: 20px;
|
| 335 |
+
height: 2px;
|
| 336 |
+
background: #f0f0ff;
|
| 337 |
+
transition: all 0.3s ease;
|
| 338 |
+
}
|
| 339 |
+
|
| 340 |
+
#theme-toggle {
|
| 341 |
+
background: rgba(255, 255, 255, 0.15);
|
| 342 |
+
border: 1px solid rgba(255, 255, 255, 0.3);
|
| 343 |
+
color: #f0f0ff;
|
| 344 |
+
padding: 8px;
|
| 345 |
+
border-radius: 8px;
|
| 346 |
+
font-size: 14px;
|
| 347 |
+
cursor: pointer;
|
| 348 |
+
transition: background 0.3s ease, color 0.3s ease;
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
#theme-toggle option {
|
| 352 |
+
background: #1a1a3d;
|
| 353 |
+
color: #f0f0ff;
|
| 354 |
+
}
|
| 355 |
+
|
| 356 |
+
#theme-toggle:hover {
|
| 357 |
+
background: rgba(255, 255, 255, 0.25);
|
| 358 |
+
}
|
| 359 |
+
|
| 360 |
+
/* Chatbot Section */
|
| 361 |
+
.chatbot-section {
|
| 362 |
+
min-height: 100vh;
|
| 363 |
+
display: flex !important;
|
| 364 |
+
align-items: center;
|
| 365 |
+
justify-content: center;
|
| 366 |
+
text-align: center;
|
| 367 |
+
padding: 60px 20px;
|
| 368 |
+
position: relative;
|
| 369 |
+
visibility: visible;
|
| 370 |
+
}
|
| 371 |
+
|
| 372 |
+
#starfield-canvas {
|
| 373 |
+
position: absolute;
|
| 374 |
+
top: 0;
|
| 375 |
+
left: 0;
|
| 376 |
+
width: 100%;
|
| 377 |
+
height: 100%;
|
| 378 |
+
z-index: 1;
|
| 379 |
+
opacity: 0.85;
|
| 380 |
+
}
|
| 381 |
+
|
| 382 |
+
.container {
|
| 383 |
+
position: relative;
|
| 384 |
+
z-index: 2;
|
| 385 |
+
max-width: 1000px;
|
| 386 |
+
margin: 0 auto;
|
| 387 |
+
visibility: visible;
|
| 388 |
+
}
|
| 389 |
+
|
| 390 |
+
.header {
|
| 391 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 392 |
+
font-size: 40px;
|
| 393 |
+
font-weight: 600;
|
| 394 |
+
margin-bottom: 15px;
|
| 395 |
+
color: #f0f0ff;
|
| 396 |
+
text-shadow: 0 0 5px rgba(192, 192, 192, 0.5);
|
| 397 |
+
}
|
| 398 |
+
|
| 399 |
+
.description {
|
| 400 |
+
font-size: 18px;
|
| 401 |
+
margin-bottom: 30px;
|
| 402 |
+
color: #c0c0c0;
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
/* Chatbot Container */
|
| 406 |
+
.chatbot-container {
|
| 407 |
+
width: 80vw;
|
| 408 |
+
height: 70vh;
|
| 409 |
+
max-width: 900px;
|
| 410 |
+
max-height: 600px;
|
| 411 |
+
background: rgba(255, 255, 255, 0.05);
|
| 412 |
+
backdrop-filter: blur(4px);
|
| 413 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 414 |
+
border-radius: 15px;
|
| 415 |
+
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
|
| 416 |
+
display: flex;
|
| 417 |
+
flex-direction: column;
|
| 418 |
+
transition: box-shadow 0.3s ease;
|
| 419 |
+
}
|
| 420 |
+
|
| 421 |
+
.chatbot-container:hover {
|
| 422 |
+
box-shadow: 0 4px 20px rgba(192, 192, 192, 0.3);
|
| 423 |
+
}
|
| 424 |
+
|
| 425 |
+
.chat-header {
|
| 426 |
+
padding: 15px;
|
| 427 |
+
background: linear-gradient(90deg, #3c2f5f, #1a1a3d);
|
| 428 |
+
color: #f0f0ff;
|
| 429 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 430 |
+
font-size: 20px;
|
| 431 |
+
font-weight: 600;
|
| 432 |
+
border-radius: 15px 15px 0 0;
|
| 433 |
+
display: flex;
|
| 434 |
+
align-items: center;
|
| 435 |
+
}
|
| 436 |
+
|
| 437 |
+
.space-robot {
|
| 438 |
+
width: 24px;
|
| 439 |
+
height: 24px;
|
| 440 |
+
background: radial-gradient(circle, #c0c0c0 40%, #3c2f5f 100%);
|
| 441 |
+
border-radius: 50%;
|
| 442 |
+
position: relative;
|
| 443 |
+
animation: float 2s ease-in-out infinite;
|
| 444 |
+
margin-right: 10px;
|
| 445 |
+
}
|
| 446 |
+
|
| 447 |
+
.space-robot::after {
|
| 448 |
+
content: '';
|
| 449 |
+
position: absolute;
|
| 450 |
+
width: 6px;
|
| 451 |
+
height: 6px;
|
| 452 |
+
background: #f0f0ff;
|
| 453 |
+
border-radius: 50%;
|
| 454 |
+
top: 9px;
|
| 455 |
+
left: 9px;
|
| 456 |
+
}
|
| 457 |
+
|
| 458 |
+
.space-robot.sending {
|
| 459 |
+
animation: spin 0.5s linear;
|
| 460 |
+
}
|
| 461 |
+
|
| 462 |
+
@keyframes float {
|
| 463 |
+
0% { transform: translateY(0); }
|
| 464 |
+
50% { transform: translateY(-5px); }
|
| 465 |
+
100% { transform: translateY(0); }
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
@keyframes spin {
|
| 469 |
+
0% { transform: rotate(0deg); }
|
| 470 |
+
100% { transform: rotate(360deg); }
|
| 471 |
+
}
|
| 472 |
+
|
| 473 |
+
#chat-output {
|
| 474 |
+
flex: 1;
|
| 475 |
+
padding: 20px;
|
| 476 |
+
overflow-y: auto;
|
| 477 |
+
background: rgba(0, 0, 0, 0.3);
|
| 478 |
+
visibility: visible;
|
| 479 |
+
min-height: 200px;
|
| 480 |
+
display: block;
|
| 481 |
+
text-align: left;
|
| 482 |
+
}
|
| 483 |
+
|
| 484 |
+
#chat-output p {
|
| 485 |
+
margin-bottom: 15px;
|
| 486 |
+
font-size: 15px;
|
| 487 |
+
line-height: 1.5;
|
| 488 |
+
opacity: 1;
|
| 489 |
+
position: relative;
|
| 490 |
+
display: block;
|
| 491 |
+
visibility: visible;
|
| 492 |
+
}
|
| 493 |
+
|
| 494 |
+
#chat-output p:nth-child(odd) {
|
| 495 |
+
color: #c0c0c0;
|
| 496 |
+
background: rgba(192, 192, 192, 0.1);
|
| 497 |
+
padding: 10px 15px;
|
| 498 |
+
border-radius: 12px 12px 0 12px;
|
| 499 |
+
max-width: 70%;
|
| 500 |
+
margin-left: auto;
|
| 501 |
+
text-align: right;
|
| 502 |
+
}
|
| 503 |
+
|
| 504 |
+
#chat-output p:nth-child(even) {
|
| 505 |
+
color: #f0f0ff;
|
| 506 |
+
background: rgba(255, 255, 255, 0.05);
|
| 507 |
+
padding: 10px 15px;
|
| 508 |
+
border-radius: 12px 12px 12px 0;
|
| 509 |
+
max-width: 70%;
|
| 510 |
+
}
|
| 511 |
+
|
| 512 |
+
.chat-input-wrapper {
|
| 513 |
+
display: flex;
|
| 514 |
+
padding: 15px;
|
| 515 |
+
background: rgba(255, 255, 255, 0.05);
|
| 516 |
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
| 517 |
+
border-radius: 0 0 15px 15px;
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
#user-input {
|
| 521 |
+
flex: 1;
|
| 522 |
+
padding: 12px;
|
| 523 |
+
background: transparent;
|
| 524 |
+
border: 1px solid rgba(255, 255, 255, 0.2);
|
| 525 |
+
border-radius: 8px;
|
| 526 |
+
color: #f0f0ff;
|
| 527 |
+
font-size: 15px;
|
| 528 |
+
outline: none;
|
| 529 |
+
transition: border-color 0.3s ease, box-shadow 0.3s ease;
|
| 530 |
+
}
|
| 531 |
+
|
| 532 |
+
#user-input:focus {
|
| 533 |
+
border-color: #c0c0c0;
|
| 534 |
+
box-shadow: 0 0 5px rgba(192, 192, 192, 0.5);
|
| 535 |
+
}
|
| 536 |
+
|
| 537 |
+
#user-input::placeholder {
|
| 538 |
+
color: rgba(255, 255, 255, 0.4);
|
| 539 |
+
}
|
| 540 |
+
|
| 541 |
+
#sendButton {
|
| 542 |
+
background: linear-gradient(45deg, #3c2f5f, #c0c0c0);
|
| 543 |
+
color: #0a0a23;
|
| 544 |
+
border: none;
|
| 545 |
+
border-radius: 8px;
|
| 546 |
+
padding: 12px 15px;
|
| 547 |
+
margin-left: 10px;
|
| 548 |
+
cursor: pointer;
|
| 549 |
+
font-size: 16px;
|
| 550 |
+
transition: transform 0.2s ease;
|
| 551 |
+
pointer-events: auto;
|
| 552 |
+
}
|
| 553 |
+
|
| 554 |
+
#sendButton:hover {
|
| 555 |
+
transform: scale(1.05);
|
| 556 |
+
}
|
| 557 |
+
|
| 558 |
+
/* Glassmorphism */
|
| 559 |
+
.glassmorphism {
|
| 560 |
+
background: rgba(255, 255, 255, 0.05);
|
| 561 |
+
backdrop-filter: blur(4px);
|
| 562 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 563 |
+
}
|
| 564 |
+
|
| 565 |
+
/* Footer */
|
| 566 |
+
.footer {
|
| 567 |
+
padding: 15px;
|
| 568 |
+
text-align: center;
|
| 569 |
+
background: rgba(255, 255, 255, 0.05);
|
| 570 |
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
| 571 |
+
color: #c0c0c0;
|
| 572 |
+
}
|
| 573 |
+
|
| 574 |
+
/* Theme Styles */
|
| 575 |
+
body.starlight {
|
| 576 |
+
background: linear-gradient(135deg, #d9d9e6 0%, #f0f0f5 100%);
|
| 577 |
+
color: #1a1a3d;
|
| 578 |
+
}
|
| 579 |
+
|
| 580 |
+
body.starlight .navbar,
|
| 581 |
+
body.starlight .chatbot-container,
|
| 582 |
+
body.starlight .footer {
|
| 583 |
+
background: rgba(0, 0, 0, 0.05);
|
| 584 |
+
border-color: rgba(0, 0, 0, 0.1);
|
| 585 |
+
}
|
| 586 |
+
|
| 587 |
+
body.starlight .header {
|
| 588 |
+
color: #3c2f5f;
|
| 589 |
+
text-shadow: none;
|
| 590 |
+
}
|
| 591 |
+
|
| 592 |
+
body.starlight .nav-menu a {
|
| 593 |
+
color: #1a1a3d;
|
| 594 |
+
}
|
| 595 |
+
|
| 596 |
+
body.starlight .nav-menu a:hover,
|
| 597 |
+
body.starlight .nav-menu a.active,
|
| 598 |
+
body.starlight #chat-output p:nth-child(odd) {
|
| 599 |
+
color: #3c2f5f;
|
| 600 |
+
}
|
| 601 |
+
|
| 602 |
+
body.starlight .chat-header,
|
| 603 |
+
body.starlight #sendButton {
|
| 604 |
+
background: linear-gradient(45deg, #3c2f5f, #c0c0c0);
|
| 605 |
+
color: #f0f0ff;
|
| 606 |
+
}
|
| 607 |
+
|
| 608 |
+
body.starlight .space-robot {
|
| 609 |
+
background: radial-gradient(circle, #c0c0c0 40%, #3c2f5f 100%);
|
| 610 |
+
}
|
| 611 |
+
|
| 612 |
+
body.starlight #user-input {
|
| 613 |
+
color: #1a1a3d;
|
| 614 |
+
border-color: rgba(0, 0, 0, 0.2);
|
| 615 |
+
}
|
| 616 |
+
|
| 617 |
+
body.starlight #user-input:focus {
|
| 618 |
+
border-color: #3c2f5f;
|
| 619 |
+
box-shadow: 0 0 5px rgba(60, 47, 95, 0.5);
|
| 620 |
+
}
|
| 621 |
+
|
| 622 |
+
body.starlight #user-input::placeholder {
|
| 623 |
+
color: rgba(0, 0, 0, 0.4);
|
| 624 |
+
}
|
| 625 |
+
|
| 626 |
+
body.starlight .footer {
|
| 627 |
+
color: #3c2f5f;
|
| 628 |
+
}
|
| 629 |
+
|
| 630 |
+
body.starlight #theme-toggle {
|
| 631 |
+
background: rgba(0, 0, 0, 0.15);
|
| 632 |
+
color: #3c2f5f;
|
| 633 |
+
}
|
| 634 |
+
|
| 635 |
+
body.starlight #theme-toggle option {
|
| 636 |
+
background: #f0f0f5;
|
| 637 |
+
color: #1a1a3d;
|
| 638 |
+
}
|
| 639 |
+
|
| 640 |
+
body.void {
|
| 641 |
+
background: linear-gradient(135deg, #000014 0%, #0a0a23 100%);
|
| 642 |
+
}
|
| 643 |
+
|
| 644 |
+
body.void .header {
|
| 645 |
+
color: #c0c0c0;
|
| 646 |
+
text-shadow: 0 0 5px rgba(192, 192, 192, 0.7);
|
| 647 |
+
}
|
| 648 |
+
|
| 649 |
+
body.void .nav-menu a:hover,
|
| 650 |
+
body.void .nav-menu a.active,
|
| 651 |
+
body.void #chat-output p:nth-child(odd) {
|
| 652 |
+
color: #c0c0c0;
|
| 653 |
+
}
|
| 654 |
+
|
| 655 |
+
body.void .chat-header,
|
| 656 |
+
body.void #sendButton {
|
| 657 |
+
background: linear-gradient(45deg, #0a0a23, #c0c0c0);
|
| 658 |
+
}
|
| 659 |
+
|
| 660 |
+
body.void #user-input:focus {
|
| 661 |
+
border-color: #c0c0c0;
|
| 662 |
+
box-shadow: 0 0 5px rgba(192, 192, 192, 0.7);
|
| 663 |
+
}
|
| 664 |
+
|
| 665 |
+
body.void #theme-toggle {
|
| 666 |
+
background: rgba(255, 255, 255, 0.15);
|
| 667 |
+
color: #f0f0ff;
|
| 668 |
+
}
|
| 669 |
+
|
| 670 |
+
body.void #theme-toggle option {
|
| 671 |
+
background: #0a0a23;
|
| 672 |
+
color: #f0f0ff;
|
| 673 |
+
}
|
| 674 |
+
|
| 675 |
+
/* Responsive Design */
|
| 676 |
+
@media (max-width: 768px) {
|
| 677 |
+
.nav-menu {
|
| 678 |
+
display: none;
|
| 679 |
+
position: absolute;
|
| 680 |
+
top: 70px;
|
| 681 |
+
left: 0;
|
| 682 |
+
width: 100%;
|
| 683 |
+
background: rgba(255, 255, 255, 0.05);
|
| 684 |
+
backdrop-filter: blur(4px);
|
| 685 |
+
flex-direction: column;
|
| 686 |
+
padding: 15px;
|
| 687 |
+
}
|
| 688 |
+
|
| 689 |
+
.nav-menu.active {
|
| 690 |
+
display: flex;
|
| 691 |
+
}
|
| 692 |
+
|
| 693 |
+
.hamburger {
|
| 694 |
+
display: flex;
|
| 695 |
+
}
|
| 696 |
+
|
| 697 |
+
.header {
|
| 698 |
+
font-size: 32px;
|
| 699 |
+
}
|
| 700 |
+
|
| 701 |
+
.chatbot-container {
|
| 702 |
+
width: 90vw;
|
| 703 |
+
height: 65vh;
|
| 704 |
+
max-height: 550px;
|
| 705 |
+
}
|
| 706 |
+
|
| 707 |
+
.space-robot-logo {
|
| 708 |
+
width: 24px;
|
| 709 |
+
height: 24px;
|
| 710 |
+
}
|
| 711 |
+
}
|
| 712 |
+
</style>
|
| 713 |
+
|
| 714 |
+
<!-- Embedded JavaScript -->
|
| 715 |
+
<script>
|
| 716 |
+
console.log('Script loaded');
|
| 717 |
+
|
| 718 |
+
try {
|
| 719 |
+
/* Utility Functions */
|
| 720 |
+
const utils = {
|
| 721 |
+
sanitizeInput(input) {
|
| 722 |
+
console.log('Sanitizing input:', input);
|
| 723 |
+
return input.replace(/</g, '<').replace(/>/g, '>');
|
| 724 |
+
},
|
| 725 |
+
debounce(func, wait) {
|
| 726 |
+
let timeout;
|
| 727 |
+
return function (...args) {
|
| 728 |
+
clearTimeout(timeout);
|
| 729 |
+
timeout = setTimeout(() => func.apply(this, args), wait);
|
| 730 |
+
};
|
| 731 |
+
},
|
| 732 |
+
formatTimestamp() {
|
| 733 |
+
const now = new Date();
|
| 734 |
+
return now.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
|
| 735 |
+
},
|
| 736 |
+
displayError(message) {
|
| 737 |
+
const chatOutput = document.getElementById('chat-output');
|
| 738 |
+
if (chatOutput) {
|
| 739 |
+
const errorMsg = document.createElement('p');
|
| 740 |
+
errorMsg.innerHTML = `<strong>AthleteGuard AI:</strong> Client error: ${utils.sanitizeInput(message)}. Please refresh and try again. <small>(${utils.formatTimestamp()})</small>`;
|
| 741 |
+
chatOutput.appendChild(errorMsg);
|
| 742 |
+
chatOutput.scrollTo({ top: chatOutput.scrollHeight, behavior: 'smooth' });
|
| 743 |
+
console.log('Displayed client error in chat');
|
| 744 |
+
}
|
| 745 |
+
},
|
| 746 |
+
};
|
| 747 |
+
|
| 748 |
+
/* Loader Fade-out */
|
| 749 |
+
function hideLoader() {
|
| 750 |
+
try {
|
| 751 |
+
console.log('Attempting to hide loader');
|
| 752 |
+
const loader = document.querySelector('.loader-wrapper');
|
| 753 |
+
if (!loader) {
|
| 754 |
+
console.error('Loader not found');
|
| 755 |
+
return;
|
| 756 |
+
}
|
| 757 |
+
loader.classList.add('fade-out');
|
| 758 |
+
console.log('Added fade-out class to loader');
|
| 759 |
+
setTimeout(() => {
|
| 760 |
+
loader.style.display = 'none';
|
| 761 |
+
console.log('Loader hidden');
|
| 762 |
+
document.body.style.visibility = 'visible';
|
| 763 |
+
const chatbotSection = document.querySelector('.chatbot-section');
|
| 764 |
+
if (chatbotSection) {
|
| 765 |
+
chatbotSection.style.display = 'flex';
|
| 766 |
+
console.log('Chatbot section set to visible');
|
| 767 |
+
}
|
| 768 |
+
}, 500);
|
| 769 |
+
} catch (error) {
|
| 770 |
+
console.error('Loader hide error:', error);
|
| 771 |
+
utils.displayError(error.message);
|
| 772 |
+
}
|
| 773 |
+
}
|
| 774 |
+
|
| 775 |
+
/* Nebula Starfield Background */
|
| 776 |
+
function setupStarfield() {
|
| 777 |
+
try {
|
| 778 |
+
console.log('Initializing starfield');
|
| 779 |
+
const canvas = document.getElementById('starfield-canvas');
|
| 780 |
+
if (!canvas) {
|
| 781 |
+
console.error('Starfield canvas not found');
|
| 782 |
+
return;
|
| 783 |
+
}
|
| 784 |
+
const ctx = canvas.getContext('2d');
|
| 785 |
+
if (!ctx) {
|
| 786 |
+
console.error('Canvas context not available');
|
| 787 |
+
return;
|
| 788 |
+
}
|
| 789 |
+
|
| 790 |
+
function setCanvasSize() {
|
| 791 |
+
const dpr = window.devicePixelRatio || 1;
|
| 792 |
+
canvas.width = window.innerWidth * dpr;
|
| 793 |
+
canvas.height = window.innerHeight * dpr;
|
| 794 |
+
ctx.scale(dpr, dpr);
|
| 795 |
+
}
|
| 796 |
+
setCanvasSize();
|
| 797 |
+
|
| 798 |
+
let starsArray = [];
|
| 799 |
+
let shootingStars = [];
|
| 800 |
+
let nebulae = [];
|
| 801 |
+
const numberOfStars = 150;
|
| 802 |
+
const numberOfShootingStars = 2;
|
| 803 |
+
const numberOfNebulae = 3;
|
| 804 |
+
|
| 805 |
+
class Star {
|
| 806 |
+
constructor(x, y, size, speed, color, layer) {
|
| 807 |
+
this.x = x;
|
| 808 |
+
this.y = y;
|
| 809 |
+
this.size = size;
|
| 810 |
+
this.speed = speed;
|
| 811 |
+
this.color = color;
|
| 812 |
+
this.layer = layer;
|
| 813 |
+
this.opacity = Math.random() * 0.5 + 0.5;
|
| 814 |
+
}
|
| 815 |
+
update() {
|
| 816 |
+
this.x -= this.speed * this.layer;
|
| 817 |
+
if (this.x < 0) this.x = canvas.width / (window.devicePixelRatio || 1);
|
| 818 |
+
this.opacity = Math.sin(Date.now() * 0.001 + this.x) * 0.3 + 0.5;
|
| 819 |
+
}
|
| 820 |
+
draw() {
|
| 821 |
+
ctx.globalAlpha = this.opacity;
|
| 822 |
+
ctx.fillStyle = this.color;
|
| 823 |
+
ctx.beginPath();
|
| 824 |
+
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
| 825 |
+
ctx.fill();
|
| 826 |
+
ctx.globalAlpha = 1;
|
| 827 |
+
}
|
| 828 |
+
}
|
| 829 |
+
|
| 830 |
+
class ShootingStar {
|
| 831 |
+
constructor() {
|
| 832 |
+
this.x = canvas.width / (window.devicePixelRatio || 1);
|
| 833 |
+
this.y = Math.random() * (canvas.height / (window.devicePixelRatio || 1));
|
| 834 |
+
this.speedX = -(Math.random() * 5 + 5);
|
| 835 |
+
this.speedY = Math.random() * 2 - 1;
|
| 836 |
+
this.length = Math.random() * 50 + 20;
|
| 837 |
+
this.opacity = 1;
|
| 838 |
+
}
|
| 839 |
+
update() {
|
| 840 |
+
this.x += this.speedX;
|
| 841 |
+
this.y += this.speedY;
|
| 842 |
+
this.opacity -= 0.02;
|
| 843 |
+
if (this.opacity <= 0) {
|
| 844 |
+
this.x = canvas.width / (window.devicePixelRatio || 1);
|
| 845 |
+
this.y = Math.random() * (canvas.height / (window.devicePixelRatio || 1));
|
| 846 |
+
this.speedX = -(Math.random() * 5 + 5);
|
| 847 |
+
this.speedY = Math.random() * 2 - 1;
|
| 848 |
+
this.length = Math.random() * 50 + 20;
|
| 849 |
+
this.opacity = 1;
|
| 850 |
+
}
|
| 851 |
+
}
|
| 852 |
+
draw() {
|
| 853 |
+
ctx.globalAlpha = this.opacity;
|
| 854 |
+
ctx.strokeStyle = '#f0f0ff';
|
| 855 |
+
ctx.lineWidth = 2;
|
| 856 |
+
ctx.beginPath();
|
| 857 |
+
ctx.moveTo(this.x, this.y);
|
| 858 |
+
ctx.lineTo(this.x + this.length * this.speedX / 10, this.y + this.length * this.speedY / 10);
|
| 859 |
+
ctx.stroke();
|
| 860 |
+
ctx.globalAlpha = 1;
|
| 861 |
+
}
|
| 862 |
+
}
|
| 863 |
+
|
| 864 |
+
class Nebula {
|
| 865 |
+
constructor(x, y, size, color) {
|
| 866 |
+
this.x = x;
|
| 867 |
+
this.y = y;
|
| 868 |
+
this.size = size;
|
| 869 |
+
this.color = color;
|
| 870 |
+
this.opacity = Math.random() * 0.2 + 0.1;
|
| 871 |
+
}
|
| 872 |
+
update() {
|
| 873 |
+
this.opacity = Math.sin(Date.now() * 0.0005 + this.x) * 0.1 + 0.2;
|
| 874 |
+
}
|
| 875 |
+
draw() {
|
| 876 |
+
ctx.globalAlpha = this.opacity;
|
| 877 |
+
ctx.fillStyle = this.color;
|
| 878 |
+
ctx.beginPath();
|
| 879 |
+
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
| 880 |
+
ctx.filter = 'blur(20px)';
|
| 881 |
+
ctx.fill();
|
| 882 |
+
ctx.filter = 'none';
|
| 883 |
+
ctx.globalAlpha = 1;
|
| 884 |
+
}
|
| 885 |
+
}
|
| 886 |
+
|
| 887 |
+
function initStarfield() {
|
| 888 |
+
starsArray = [];
|
| 889 |
+
shootingStars = [];
|
| 890 |
+
nebulae = [];
|
| 891 |
+
const colors = ['#f0f0ff', '#c0c0c0', '#3c2f5f'];
|
| 892 |
+
const nebulaColors = ['rgba(60, 47, 95, 0.5)', 'rgba(26, 26, 61, 0.5)'];
|
| 893 |
+
for (let i = 0; i < numberOfStars; i++) {
|
| 894 |
+
const x = Math.random() * canvas.width / (window.devicePixelRatio || 1);
|
| 895 |
+
const y = Math.random() * canvas.height / (window.devicePixelRatio || 1);
|
| 896 |
+
const size = Math.random() * (i % 2 === 0 ? 1 : 2);
|
| 897 |
+
const speed = Math.random() * 0.5 + 0.1;
|
| 898 |
+
const color = colors[Math.floor(Math.random() * colors.length)];
|
| 899 |
+
const layer = Math.random() * 0.5 + 0.5;
|
| 900 |
+
starsArray.push(new Star(x, y, size, speed, color, layer));
|
| 901 |
+
}
|
| 902 |
+
for (let i = 0; i < numberOfShootingStars; i++) {
|
| 903 |
+
shootingStars.push(new ShootingStar());
|
| 904 |
+
}
|
| 905 |
+
for (let i = 0; i < numberOfNebulae; i++) {
|
| 906 |
+
const x = Math.random() * canvas.width / (window.devicePixelRatio || 1);
|
| 907 |
+
const y = Math.random() * canvas.height / (window.devicePixelRatio || 1);
|
| 908 |
+
const size = Math.random() * 100 + 50;
|
| 909 |
+
const color = nebulaColors[Math.floor(Math.random() * nebulaColors.length)];
|
| 910 |
+
nebulae.push(new Nebula(x, y, size, color));
|
| 911 |
+
}
|
| 912 |
+
}
|
| 913 |
+
|
| 914 |
+
function animateStarfield() {
|
| 915 |
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
| 916 |
+
nebulae.forEach(nebula => {
|
| 917 |
+
nebula.update();
|
| 918 |
+
nebula.draw();
|
| 919 |
+
});
|
| 920 |
+
starsArray.forEach(star => {
|
| 921 |
+
star.update();
|
| 922 |
+
star.draw();
|
| 923 |
+
});
|
| 924 |
+
shootingStars.forEach(star => {
|
| 925 |
+
star.update();
|
| 926 |
+
star.draw();
|
| 927 |
+
});
|
| 928 |
+
requestAnimationFrame(animateStarfield);
|
| 929 |
+
}
|
| 930 |
+
|
| 931 |
+
initStarfield();
|
| 932 |
+
animateStarfield();
|
| 933 |
+
|
| 934 |
+
window.addEventListener('resize', utils.debounce(() => {
|
| 935 |
+
setCanvasSize();
|
| 936 |
+
initStarfield();
|
| 937 |
+
}, 200));
|
| 938 |
+
} catch (error) {
|
| 939 |
+
console.error('Starfield setup error:', error);
|
| 940 |
+
utils.displayError(error.message);
|
| 941 |
+
}
|
| 942 |
+
}
|
| 943 |
+
|
| 944 |
+
/* Chatbot Setup */
|
| 945 |
+
function setupChatbot() {
|
| 946 |
+
try {
|
| 947 |
+
const chatOutput = document.getElementById('chat-output');
|
| 948 |
+
const userInput = document.getElementById('user-input');
|
| 949 |
+
const sendButton = document.getElementById('sendButton');
|
| 950 |
+
|
| 951 |
+
console.log('Checking DOM elements:', { chatOutput, userInput, sendButton });
|
| 952 |
+
if (!chatOutput || !userInput || !sendButton) {
|
| 953 |
+
console.error('Missing DOM elements:', { chatOutput, userInput, sendButton });
|
| 954 |
+
utils.displayError('Chatbot initialization failed: Missing DOM elements');
|
| 955 |
+
return false;
|
| 956 |
+
}
|
| 957 |
+
|
| 958 |
+
userInput.focus();
|
| 959 |
+
console.log('User input focused');
|
| 960 |
+
|
| 961 |
+
let isProcessing = false;
|
| 962 |
+
const processedMessages = new Set();
|
| 963 |
+
|
| 964 |
+
function clearInput() {
|
| 965 |
+
console.log('Clearing input');
|
| 966 |
+
userInput.value = '';
|
| 967 |
+
userInput.focus();
|
| 968 |
+
userInput.dispatchEvent(new Event('input'));
|
| 969 |
+
setTimeout(() => {
|
| 970 |
+
if (userInput.value !== '') {
|
| 971 |
+
console.warn('Fallback: Forcing input clear');
|
| 972 |
+
userInput.value = '';
|
| 973 |
+
}
|
| 974 |
+
}, 100);
|
| 975 |
+
}
|
| 976 |
+
|
| 977 |
+
const sendMessage = async (message, eventType, messageId) => {
|
| 978 |
+
console.log(`Processing message [${messageId}] (via ${eventType}):`, message);
|
| 979 |
+
if (isProcessing || processedMessages.has(messageId)) {
|
| 980 |
+
console.log(`Skipping duplicate message [${messageId}]: isProcessing=${isProcessing}`);
|
| 981 |
+
return;
|
| 982 |
+
}
|
| 983 |
+
processedMessages.add(messageId);
|
| 984 |
+
isProcessing = true;
|
| 985 |
+
|
| 986 |
+
const input = message.trim();
|
| 987 |
+
console.log('Validating message:', input);
|
| 988 |
+
if (!input || typeof input !== 'string' || input.length === 0) {
|
| 989 |
+
console.warn(`Invalid input [${messageId}], skipping request`);
|
| 990 |
+
isProcessing = false;
|
| 991 |
+
processedMessages.delete(messageId);
|
| 992 |
+
return;
|
| 993 |
+
}
|
| 994 |
+
|
| 995 |
+
try {
|
| 996 |
+
userInput.disabled = true;
|
| 997 |
+
sendButton.disabled = true;
|
| 998 |
+
const spaceRobot = document.querySelector('.space-robot');
|
| 999 |
+
if (spaceRobot) spaceRobot.classList.add('sending');
|
| 1000 |
+
|
| 1001 |
+
clearInput();
|
| 1002 |
+
|
| 1003 |
+
const chatOutput = document.getElementById('chat-output');
|
| 1004 |
+
if (!chatOutput) {
|
| 1005 |
+
throw new Error(`chat-output not found during sendMessage [${messageId}]`);
|
| 1006 |
+
}
|
| 1007 |
+
|
| 1008 |
+
const userMsg = document.createElement('p');
|
| 1009 |
+
userMsg.innerHTML = `<strong>You:</strong> ${utils.sanitizeInput(input)} <small>(${utils.formatTimestamp()})</small>`;
|
| 1010 |
+
console.log(`Appending user message [${messageId}] to chat-output`);
|
| 1011 |
+
chatOutput.appendChild(userMsg);
|
| 1012 |
+
chatOutput.scrollTo({ top: chatOutput.scrollHeight, behavior: 'smooth' });
|
| 1013 |
+
|
| 1014 |
+
const payload = { message: input };
|
| 1015 |
+
console.log(`Fetch initiated [${messageId}]:`, payload);
|
| 1016 |
+
const response = await fetch('http://127.0.0.1:8000/chat', {
|
| 1017 |
+
method: 'POST',
|
| 1018 |
+
headers: { 'Content-Type': 'application/json' },
|
| 1019 |
+
body: JSON.stringify(payload),
|
| 1020 |
+
signal: AbortSignal.timeout(5000),
|
| 1021 |
+
});
|
| 1022 |
+
console.log(`Fetch completed [${messageId}]:`, { status: response.status, ok: response.ok });
|
| 1023 |
+
|
| 1024 |
+
if (!response.ok) {
|
| 1025 |
+
throw new Error(`HTTP error: ${response.status}`);
|
| 1026 |
+
}
|
| 1027 |
+
|
| 1028 |
+
const data = await response.json();
|
| 1029 |
+
console.log(`Response data [${messageId}]:`, data);
|
| 1030 |
+
|
| 1031 |
+
if (data.error) {
|
| 1032 |
+
throw new Error(data.error);
|
| 1033 |
+
}
|
| 1034 |
+
|
| 1035 |
+
if (!data.response) {
|
| 1036 |
+
throw new Error('No response field in data');
|
| 1037 |
+
}
|
| 1038 |
+
|
| 1039 |
+
const botMsg = document.createElement('p');
|
| 1040 |
+
botMsg.innerHTML = `<div class="space-robot"></div><strong>AthleteGuard AI:</strong> ${utils.sanitizeInput(data.response)} <small>(${utils.formatTimestamp()})</small>`;
|
| 1041 |
+
console.log(`Appending bot message [${messageId}] to chat-output`);
|
| 1042 |
+
chatOutput.appendChild(botMsg);
|
| 1043 |
+
chatOutput.scrollTo({ top: chatOutput.scrollHeight, behavior: 'smooth' });
|
| 1044 |
+
|
| 1045 |
+
if (spaceRobot) spaceRobot.classList.remove('sending');
|
| 1046 |
+
} catch (error) {
|
| 1047 |
+
console.error(`Chat error [${messageId}]:`, error.message);
|
| 1048 |
+
const chatOutput = document.getElementById('chat-output');
|
| 1049 |
+
if (chatOutput) {
|
| 1050 |
+
const errorMsg = document.createElement('p');
|
| 1051 |
+
errorMsg.innerHTML = `<div class="space-robot"></div><strong>AthleteGuard AI:</strong> Error: ${utils.sanitizeInput(error.message)}. Please try again. <small>(${utils.formatTimestamp()})</small>`;
|
| 1052 |
+
console.log(`Appending error message [${messageId}] to chat-output`);
|
| 1053 |
+
chatOutput.appendChild(errorMsg);
|
| 1054 |
+
chatOutput.scrollTo({ top: chatOutput.scrollHeight, behavior: 'smooth' });
|
| 1055 |
+
}
|
| 1056 |
+
clearInput();
|
| 1057 |
+
} finally {
|
| 1058 |
+
userInput.disabled = false;
|
| 1059 |
+
sendButton.disabled = false;
|
| 1060 |
+
clearInput();
|
| 1061 |
+
setTimeout(() => {
|
| 1062 |
+
isProcessing = false;
|
| 1063 |
+
console.log(`Reset isProcessing [${messageId}]`);
|
| 1064 |
+
}, 500);
|
| 1065 |
+
}
|
| 1066 |
+
};
|
| 1067 |
+
|
| 1068 |
+
console.log('Removing old listeners');
|
| 1069 |
+
const oldKeypress = userInput.__keypressHandler;
|
| 1070 |
+
const oldClick = sendButton.__clickHandler;
|
| 1071 |
+
if (oldKeypress) userInput.removeEventListener('keypress', oldKeypress);
|
| 1072 |
+
if (oldClick) sendButton.removeEventListener('click', oldClick);
|
| 1073 |
+
|
| 1074 |
+
const handleKeypress = (e) => {
|
| 1075 |
+
console.log('Keypress event:', e.key);
|
| 1076 |
+
if (e.key === 'Enter') {
|
| 1077 |
+
e.preventDefault();
|
| 1078 |
+
e.stopPropagation();
|
| 1079 |
+
const messageId = Date.now() + '-keypress';
|
| 1080 |
+
console.log(`Enter key pressed, sending message [${messageId}]`);
|
| 1081 |
+
sendMessage(userInput.value, 'keypress', messageId);
|
| 1082 |
+
}
|
| 1083 |
+
};
|
| 1084 |
+
|
| 1085 |
+
const handleClick = (e) => {
|
| 1086 |
+
e.preventDefault();
|
| 1087 |
+
e.stopPropagation();
|
| 1088 |
+
const messageId = Date.now() + '-click';
|
| 1089 |
+
console.log(`Send button clicked, sending message [${messageId}]`);
|
| 1090 |
+
sendMessage(userInput.value, 'click', messageId);
|
| 1091 |
+
};
|
| 1092 |
+
|
| 1093 |
+
userInput.__keypressHandler = handleKeypress;
|
| 1094 |
+
sendButton.__clickHandler = handleClick;
|
| 1095 |
+
|
| 1096 |
+
console.log('Attaching new listeners');
|
| 1097 |
+
userInput.addEventListener('keypress', handleKeypress);
|
| 1098 |
+
sendButton.addEventListener('click', handleClick);
|
| 1099 |
+
|
| 1100 |
+
console.log('Event listeners attached');
|
| 1101 |
+
return true;
|
| 1102 |
+
} catch (error) {
|
| 1103 |
+
console.error('Chatbot setup error:', error);
|
| 1104 |
+
utils.displayError(error.message);
|
| 1105 |
+
return false;
|
| 1106 |
+
}
|
| 1107 |
+
}
|
| 1108 |
+
|
| 1109 |
+
/* Initial Setup */
|
| 1110 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 1111 |
+
console.log('DOM content loaded');
|
| 1112 |
+
try {
|
| 1113 |
+
setTimeout(hideLoader, 3500);
|
| 1114 |
+
setTimeout(() => {
|
| 1115 |
+
const loader = document.querySelector('.loader-wrapper');
|
| 1116 |
+
if (loader && loader.style.display !== 'none') {
|
| 1117 |
+
console.warn('Fallback: Forcing loader hide');
|
| 1118 |
+
loader.style.display = 'none';
|
| 1119 |
+
document.body.style.visibility = 'visible';
|
| 1120 |
+
const chatbotSection = document.querySelector('.chatbot-section');
|
| 1121 |
+
if (chatbotSection) chatbotSection.style.display = 'flex';
|
| 1122 |
+
}
|
| 1123 |
+
}, 4500);
|
| 1124 |
+
|
| 1125 |
+
setupStarfield();
|
| 1126 |
+
|
| 1127 |
+
const hamburger = document.querySelector('.hamburger');
|
| 1128 |
+
const navMenu = document.querySelector('.nav-menu');
|
| 1129 |
+
if (hamburger && navMenu) {
|
| 1130 |
+
hamburger.addEventListener('click', () => {
|
| 1131 |
+
navMenu.classList.toggle('active');
|
| 1132 |
+
hamburger.classList.toggle('active');
|
| 1133 |
+
console.log('Hamburger menu toggled');
|
| 1134 |
+
});
|
| 1135 |
+
}
|
| 1136 |
+
|
| 1137 |
+
const themeToggle = document.getElementById('theme-toggle');
|
| 1138 |
+
if (themeToggle) {
|
| 1139 |
+
themeToggle.addEventListener('change', () => {
|
| 1140 |
+
document.body.className = themeToggle.value;
|
| 1141 |
+
console.log('Theme changed to:', themeToggle.value);
|
| 1142 |
+
});
|
| 1143 |
+
}
|
| 1144 |
+
|
| 1145 |
+
if (!setupChatbot()) {
|
| 1146 |
+
console.warn('Chatbot setup failed, retrying in 500ms');
|
| 1147 |
+
setTimeout(setupChatbot, 500);
|
| 1148 |
+
}
|
| 1149 |
+
} catch (error) {
|
| 1150 |
+
console.error('DOMContentLoaded error:', error);
|
| 1151 |
+
utils.displayError(error.message);
|
| 1152 |
+
}
|
| 1153 |
+
});
|
| 1154 |
+
|
| 1155 |
+
/* Fallback Setup */
|
| 1156 |
+
setTimeout(() => {
|
| 1157 |
+
console.log('Running fallback chatbot setup');
|
| 1158 |
+
setupChatbot();
|
| 1159 |
+
}, 1000);
|
| 1160 |
+
} catch (error) {
|
| 1161 |
+
console.error('Global script error:', error);
|
| 1162 |
+
utils.displayError(error.message);
|
| 1163 |
+
}
|
| 1164 |
+
</script>
|
| 1165 |
+
</body>
|
| 1166 |
+
</html>
|
UI2/index.html
ADDED
|
@@ -0,0 +1,120 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
| 6 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 7 |
+
<title>Injury Prediction System - Futuristic</title>
|
| 8 |
+
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=Outfit:wght@300;400;500;600&family=Orbitron:wght@400;500;600;700&display=swap" rel="stylesheet" />
|
| 9 |
+
<link rel="stylesheet" href="style.css" />
|
| 10 |
+
</head>
|
| 11 |
+
<body>
|
| 12 |
+
<div class="loader-wrapper">
|
| 13 |
+
<div class="loader"></div>
|
| 14 |
+
</div>
|
| 15 |
+
<header>
|
| 16 |
+
<nav class="navbar">
|
| 17 |
+
<div class="nav-logo">IPS</div>
|
| 18 |
+
<button class="hamburger" aria-label="Toggle navigation">
|
| 19 |
+
<span></span>
|
| 20 |
+
<span></span>
|
| 21 |
+
<span></span>
|
| 22 |
+
</button>
|
| 23 |
+
<ul class="nav-menu">
|
| 24 |
+
<li><a href="#features">Features</a></li>
|
| 25 |
+
<li><a href="calculator.html">Calculator</a></li>
|
| 26 |
+
<li><a href="about.html">About</a></li>
|
| 27 |
+
<li><a href="chatbot.html">Chatbot</a></li>
|
| 28 |
+
<li><a href="#faq">FAQ</a></li>
|
| 29 |
+
</ul>
|
| 30 |
+
</nav>
|
| 31 |
+
</header>
|
| 32 |
+
<section class="hero">
|
| 33 |
+
<canvas id="particle-canvas"></canvas>
|
| 34 |
+
<div class="hero-overlay"></div>
|
| 35 |
+
<div class="hero-content">
|
| 36 |
+
<h1 class="header">Injury Prediction System</h1>
|
| 37 |
+
<p class="description">
|
| 38 |
+
<span class="highlight-text">Transforming athletic performance</span> through advanced predictive analytics and injury prevention intelligence.
|
| 39 |
+
</p>
|
| 40 |
+
<p class="description">
|
| 41 |
+
<span class="highlight-text">Empowering elite athletes</span> with AI-driven insights and precision-engineered recommendations.
|
| 42 |
+
</p>
|
| 43 |
+
<button class="cta-button" onclick="window.location.href='calculator.html'" aria-label="Predict & Prevent Injuries">
|
| 44 |
+
<svg class="icon" width="16" height="16" viewBox="0 0 16 16" fill="currentColor">
|
| 45 |
+
<path d="M4 2.5v11l9-5.5-9-5.5z" />
|
| 46 |
+
</svg>
|
| 47 |
+
Elevate Your Game
|
| 48 |
+
</button>
|
| 49 |
+
</div>
|
| 50 |
+
</section>
|
| 51 |
+
<section id="features" class="section features">
|
| 52 |
+
<div class="container">
|
| 53 |
+
<h2>Our Features</h2>
|
| 54 |
+
<p>State‑of‑the‑art tools designed to keep athletes performing at their best.</p>
|
| 55 |
+
<div class="features-list">
|
| 56 |
+
<div class="feature-item">
|
| 57 |
+
<div class="feature-icon">
|
| 58 |
+
<svg width="50" height="50" viewBox="0 0 64 64" fill="currentColor">
|
| 59 |
+
<rect x="10" y="30" width="8" height="24" />
|
| 60 |
+
<rect x="26" y="20" width="8" height="34" />
|
| 61 |
+
<rect x="42" y="10" width="8" height="44" />
|
| 62 |
+
</svg>
|
| 63 |
+
</div>
|
| 64 |
+
<h3>Data Analysis</h3>
|
| 65 |
+
<p>Leverage machine learning to uncover trends and risk factors.</p>
|
| 66 |
+
</div>
|
| 67 |
+
<div class="feature-item">
|
| 68 |
+
<div class="feature-icon">
|
| 69 |
+
<svg width="50" height="50" viewBox="0 0 64 64" fill="currentColor">
|
| 70 |
+
<path d="M32 4l24 12v14c0 16-12 30-24 34C20 60 8 46 8 30V16L32 4z" />
|
| 71 |
+
</svg>
|
| 72 |
+
</div>
|
| 73 |
+
<h3>Risk Assessment</h3>
|
| 74 |
+
<p>Real‑time monitoring to predict and prevent potential injuries.</p>
|
| 75 |
+
</div>
|
| 76 |
+
<div class="feature-item">
|
| 77 |
+
<div class="feature-icon">
|
| 78 |
+
<svg width="50" height="50" viewBox="0 0 64 64" fill="currentColor">
|
| 79 |
+
<circle cx="32" cy="20" r="12" />
|
| 80 |
+
<path d="M16 52c0-8.8 7.2-16 16-16s16 7.2 16 16" />
|
| 81 |
+
</svg>
|
| 82 |
+
</div>
|
| 83 |
+
<h3>Personalized Insights</h3>
|
| 84 |
+
<p>Tailored recommendations based on individual performance metrics.</p>
|
| 85 |
+
</div>
|
| 86 |
+
</div>
|
| 87 |
+
</div>
|
| 88 |
+
</section>
|
| 89 |
+
<section id="faq" class="section faq">
|
| 90 |
+
<div class="container">
|
| 91 |
+
<h2>Frequently Asked Questions</h2>
|
| 92 |
+
<p>Common questions about our Injury Prediction System</p>
|
| 93 |
+
<div class="faq-accordion">
|
| 94 |
+
<div class="faq-item">
|
| 95 |
+
<div class="faq-question" tabindex="0">
|
| 96 |
+
How accurate is the injury prediction?<span class="faq-icon">+</span>
|
| 97 |
+
</div>
|
| 98 |
+
<div class="faq-answer">
|
| 99 |
+
<p>Our system achieves over 92% accuracy using biomechanical and historical data combined with machine learning.</p>
|
| 100 |
+
</div>
|
| 101 |
+
</div>
|
| 102 |
+
<div class="faq-item">
|
| 103 |
+
<div class="faq-question" tabindex="0">
|
| 104 |
+
Can this replace medical professionals?<span class="faq-icon">+</span>
|
| 105 |
+
</div>
|
| 106 |
+
<div class="faq-answer">
|
| 107 |
+
<p>No, it complements professional insights by providing proactive data‑driven recommendations.</p>
|
| 108 |
+
</div>
|
| 109 |
+
</div>
|
| 110 |
+
</div>
|
| 111 |
+
</div>
|
| 112 |
+
</section>
|
| 113 |
+
<footer class="footer">
|
| 114 |
+
<div class="container">
|
| 115 |
+
<p>© 2025 Injury Prediction System. All rights reserved.</p>
|
| 116 |
+
</div>
|
| 117 |
+
</footer>
|
| 118 |
+
<script src="java.js"></script>
|
| 119 |
+
<script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'9355e0c2680a677f',t:'MTc0NTUwMDYxNi4wMDAwMDA='};var a=document.createElement('script');a.nonce='';a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&&(document.onreadystatechange=e,c())}}}})();</script></body>
|
| 120 |
+
</html>
|
UI2/java.js
ADDED
|
@@ -0,0 +1,197 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* java.js – Enhanced UI Scripts with Futuristic Design, FAQ Toggle,
|
| 2 |
+
Hamburger & Dark Mode Toggles */
|
| 3 |
+
|
| 4 |
+
/* Utility Functions */
|
| 5 |
+
const utils = {
|
| 6 |
+
sanitizeInput(input) {
|
| 7 |
+
const div = document.createElement('div');
|
| 8 |
+
div.textContent = input;
|
| 9 |
+
return div.innerHTML;
|
| 10 |
+
},
|
| 11 |
+
debounce(func, wait) {
|
| 12 |
+
let timeout;
|
| 13 |
+
return function(...args) {
|
| 14 |
+
clearTimeout(timeout);
|
| 15 |
+
timeout = setTimeout(() => func.apply(this, args), wait);
|
| 16 |
+
};
|
| 17 |
+
},
|
| 18 |
+
};
|
| 19 |
+
|
| 20 |
+
/* Particle Background with Interactive Connections and Mouse Attraction */
|
| 21 |
+
window.addEventListener('load', () => {
|
| 22 |
+
const canvas = document.getElementById('particle-canvas');
|
| 23 |
+
if (canvas) {
|
| 24 |
+
const ctx = canvas.getContext('2d');
|
| 25 |
+
|
| 26 |
+
// Set canvas size and account for high DPI displays
|
| 27 |
+
function setCanvasSize() {
|
| 28 |
+
const dpr = window.devicePixelRatio || 1;
|
| 29 |
+
canvas.width = window.innerWidth * dpr;
|
| 30 |
+
canvas.height = window.innerHeight * dpr;
|
| 31 |
+
ctx.scale(dpr, dpr);
|
| 32 |
+
}
|
| 33 |
+
setCanvasSize();
|
| 34 |
+
|
| 35 |
+
let particlesArray = [];
|
| 36 |
+
const numberOfParticles = 100;
|
| 37 |
+
const maxDistance = 120;
|
| 38 |
+
const mouse = { x: null, y: null, radius: 150 };
|
| 39 |
+
|
| 40 |
+
window.addEventListener('mousemove', (e) => {
|
| 41 |
+
mouse.x = e.x;
|
| 42 |
+
mouse.y = e.y;
|
| 43 |
+
});
|
| 44 |
+
|
| 45 |
+
window.addEventListener('mouseout', () => {
|
| 46 |
+
mouse.x = null;
|
| 47 |
+
mouse.y = null;
|
| 48 |
+
});
|
| 49 |
+
|
| 50 |
+
class Particle {
|
| 51 |
+
constructor(x, y, size, speedX, speedY) {
|
| 52 |
+
this.x = x;
|
| 53 |
+
this.y = y;
|
| 54 |
+
this.size = size;
|
| 55 |
+
this.speedX = speedX;
|
| 56 |
+
this.speedY = speedY;
|
| 57 |
+
}
|
| 58 |
+
update() {
|
| 59 |
+
this.x += this.speedX;
|
| 60 |
+
this.y += this.speedY;
|
| 61 |
+
// Bounce off edges (accounting for scaling)
|
| 62 |
+
if (this.x < 0 || this.x > canvas.width / (window.devicePixelRatio || 1)) this.speedX *= -1;
|
| 63 |
+
if (this.y < 0 || this.y > canvas.height / (window.devicePixelRatio || 1)) this.speedY *= -1;
|
| 64 |
+
|
| 65 |
+
// Mouse interaction for futuristic attraction/repulsion effect
|
| 66 |
+
if (mouse.x && mouse.y) {
|
| 67 |
+
const dx = mouse.x - this.x;
|
| 68 |
+
const dy = mouse.y - this.y;
|
| 69 |
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
| 70 |
+
if (distance < mouse.radius) {
|
| 71 |
+
const force = (mouse.radius - distance) / mouse.radius;
|
| 72 |
+
this.x -= (dx / distance) * force * 2;
|
| 73 |
+
this.y -= (dy / distance) * force * 2;
|
| 74 |
+
}
|
| 75 |
+
}
|
| 76 |
+
}
|
| 77 |
+
draw() {
|
| 78 |
+
ctx.fillStyle = 'rgba(0, 229, 255, 0.8)';
|
| 79 |
+
ctx.beginPath();
|
| 80 |
+
ctx.arc(this.x, this.y, this.size, 0, Math.PI * 2);
|
| 81 |
+
ctx.fill();
|
| 82 |
+
}
|
| 83 |
+
}
|
| 84 |
+
|
| 85 |
+
function initParticles() {
|
| 86 |
+
particlesArray = [];
|
| 87 |
+
for (let i = 0; i < numberOfParticles; i++) {
|
| 88 |
+
const size = Math.random() * 2 + 1;
|
| 89 |
+
const x = Math.random() * canvas.width / (window.devicePixelRatio || 1);
|
| 90 |
+
const y = Math.random() * canvas.height / (window.devicePixelRatio || 1);
|
| 91 |
+
const speedX = (Math.random() - 0.5) * 1;
|
| 92 |
+
const speedY = (Math.random() - 0.5) * 1;
|
| 93 |
+
particlesArray.push(new Particle(x, y, size, speedX, speedY));
|
| 94 |
+
}
|
| 95 |
+
}
|
| 96 |
+
|
| 97 |
+
function connectParticles() {
|
| 98 |
+
for (let a = 0; a < particlesArray.length; a++) {
|
| 99 |
+
for (let b = a + 1; b < particlesArray.length; b++) {
|
| 100 |
+
const dx = particlesArray[a].x - particlesArray[b].x;
|
| 101 |
+
const dy = particlesArray[a].y - particlesArray[b].y;
|
| 102 |
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
| 103 |
+
if (distance < maxDistance) {
|
| 104 |
+
ctx.strokeStyle = `rgba(0,229,255,${1 - distance / maxDistance})`;
|
| 105 |
+
ctx.lineWidth = 1;
|
| 106 |
+
ctx.beginPath();
|
| 107 |
+
ctx.moveTo(particlesArray[a].x, particlesArray[a].y);
|
| 108 |
+
ctx.lineTo(particlesArray[b].x, particlesArray[b].y);
|
| 109 |
+
ctx.stroke();
|
| 110 |
+
}
|
| 111 |
+
}
|
| 112 |
+
}
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
function animateParticles() {
|
| 116 |
+
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
| 117 |
+
particlesArray.forEach(particle => {
|
| 118 |
+
particle.update();
|
| 119 |
+
particle.draw();
|
| 120 |
+
});
|
| 121 |
+
connectParticles();
|
| 122 |
+
requestAnimationFrame(animateParticles);
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
initParticles();
|
| 126 |
+
animateParticles();
|
| 127 |
+
|
| 128 |
+
window.addEventListener('resize', utils.debounce(() => {
|
| 129 |
+
setCanvasSize();
|
| 130 |
+
initParticles();
|
| 131 |
+
}, 200));
|
| 132 |
+
}
|
| 133 |
+
});
|
| 134 |
+
|
| 135 |
+
/* DOM Ready Events for FAQ Toggle, Hamburger & Dark Mode Toggle */
|
| 136 |
+
window.addEventListener('load', () => {
|
| 137 |
+
const loader = document.querySelector('.loader-wrapper');
|
| 138 |
+
if (loader) {
|
| 139 |
+
loader.classList.add('fade-out');
|
| 140 |
+
setTimeout(() => {
|
| 141 |
+
loader.style.display = 'none';
|
| 142 |
+
}, 500);
|
| 143 |
+
}
|
| 144 |
+
});
|
| 145 |
+
|
| 146 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 147 |
+
// Hamburger Menu Toggle
|
| 148 |
+
const hamburger = document.querySelector(".hamburger");
|
| 149 |
+
const navMenu = document.querySelector(".nav-menu");
|
| 150 |
+
if (hamburger && navMenu) {
|
| 151 |
+
hamburger.addEventListener("click", () => {
|
| 152 |
+
navMenu.classList.toggle("active");
|
| 153 |
+
});
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
// Scroll to Top
|
| 157 |
+
const scrollTop = document.createElement('div');
|
| 158 |
+
scrollTop.className = 'scroll-top';
|
| 159 |
+
scrollTop.innerHTML = '↑';
|
| 160 |
+
document.body.appendChild(scrollTop);
|
| 161 |
+
|
| 162 |
+
window.addEventListener('scroll', () => {
|
| 163 |
+
if (window.pageYOffset > 500) {
|
| 164 |
+
scrollTop.classList.add('visible');
|
| 165 |
+
} else {
|
| 166 |
+
scrollTop.classList.remove('visible');
|
| 167 |
+
}
|
| 168 |
+
});
|
| 169 |
+
|
| 170 |
+
scrollTop.addEventListener('click', () => {
|
| 171 |
+
window.scrollTo({
|
| 172 |
+
top: 0,
|
| 173 |
+
behavior: 'smooth'
|
| 174 |
+
});
|
| 175 |
+
});
|
| 176 |
+
|
| 177 |
+
// Dark Mode Toggle
|
| 178 |
+
const darkModeToggle = document.getElementById('dark-mode-toggle');
|
| 179 |
+
if (darkModeToggle) {
|
| 180 |
+
darkModeToggle.addEventListener('click', () => {
|
| 181 |
+
document.body.classList.toggle('light-mode');
|
| 182 |
+
});
|
| 183 |
+
}
|
| 184 |
+
|
| 185 |
+
// FAQ Toggle Setup
|
| 186 |
+
const faqQuestions = document.querySelectorAll('.faq-question');
|
| 187 |
+
faqQuestions.forEach(question => {
|
| 188 |
+
question.addEventListener('click', () => {
|
| 189 |
+
question.parentElement.classList.toggle('active');
|
| 190 |
+
});
|
| 191 |
+
question.addEventListener('keypress', (e) => {
|
| 192 |
+
if (e.key === 'Enter') {
|
| 193 |
+
question.parentElement.classList.toggle('active');
|
| 194 |
+
}
|
| 195 |
+
});
|
| 196 |
+
});
|
| 197 |
+
});
|
UI2/report.html
ADDED
|
@@ -0,0 +1,1017 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<meta name="description" content="Injury Prediction System - Advanced Athletic Performance Analysis">
|
| 7 |
+
<title>Injury Prediction System - Report</title>
|
| 8 |
+
<link href="https://fonts.googleapis.com/css2?family=Orbitron:wght@400;500;700&family=Roboto:wght@300;400;500&display=swap" rel="stylesheet">
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
| 10 |
+
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
|
| 11 |
+
<style>
|
| 12 |
+
/* CSS Reset and Global Variables */
|
| 13 |
+
:root {
|
| 14 |
+
--primary-color: #00e5ff;
|
| 15 |
+
--primary-hover: #0097fb;
|
| 16 |
+
--dark-bg: #0d1b2a;
|
| 17 |
+
--darker-bg: #0a1522;
|
| 18 |
+
--card-bg: rgba(255, 255, 255, 0.05);
|
| 19 |
+
--card-hover: rgba(0, 229, 255, 0.1);
|
| 20 |
+
--border-glow: rgba(0, 229, 255, 0.2);
|
| 21 |
+
--text-primary: #fff;
|
| 22 |
+
--text-secondary: #ccc;
|
| 23 |
+
--card-shadow: 0 4px 20px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(255, 255, 255, 0.05);
|
| 24 |
+
--card-shadow-hover: 0 8px 25px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(0, 229, 255, 0.2);
|
| 25 |
+
--transition-normal: all 0.3s ease;
|
| 26 |
+
--border-radius-sm: 8px;
|
| 27 |
+
--border-radius-md: 10px;
|
| 28 |
+
--border-radius-lg: 15px;
|
| 29 |
+
--space-xs: 5px;
|
| 30 |
+
--space-sm: 10px;
|
| 31 |
+
--space-md: 15px;
|
| 32 |
+
--space-lg: 20px;
|
| 33 |
+
--space-xl: 25px;
|
| 34 |
+
--space-xxl: 40px;
|
| 35 |
+
}
|
| 36 |
+
|
| 37 |
+
* {
|
| 38 |
+
margin: 0;
|
| 39 |
+
padding: 0;
|
| 40 |
+
box-sizing: border-box;
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
/* Base Styles */
|
| 44 |
+
body {
|
| 45 |
+
font-family: 'Roboto', sans-serif;
|
| 46 |
+
background: linear-gradient(135deg, var(--dark-bg) 0%, var(--darker-bg) 100%);
|
| 47 |
+
color: var(--text-primary);
|
| 48 |
+
line-height: 1.6;
|
| 49 |
+
min-height: 100vh;
|
| 50 |
+
overflow-x: hidden;
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
h1, h2, h3, h4, h5, h6 {
|
| 54 |
+
font-family: 'Orbitron', sans-serif;
|
| 55 |
+
letter-spacing: 0.5px;
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
/* Layout Containers */
|
| 59 |
+
.container {
|
| 60 |
+
max-width: 1400px;
|
| 61 |
+
margin: 0 auto;
|
| 62 |
+
padding: var(--space-lg);
|
| 63 |
+
width: 100%;
|
| 64 |
+
}
|
| 65 |
+
|
| 66 |
+
.dashboard-container {
|
| 67 |
+
padding: var(--space-xxl) var(--space-lg);
|
| 68 |
+
}
|
| 69 |
+
|
| 70 |
+
/* Header Styles */
|
| 71 |
+
header {
|
| 72 |
+
text-align: center;
|
| 73 |
+
margin-bottom: var(--space-xxl);
|
| 74 |
+
padding: var(--space-xl) var(--space-lg);
|
| 75 |
+
border-bottom: 1px solid rgba(0, 229, 255, 0.2);
|
| 76 |
+
position: relative;
|
| 77 |
+
}
|
| 78 |
+
|
| 79 |
+
header::before {
|
| 80 |
+
content: '';
|
| 81 |
+
position: absolute;
|
| 82 |
+
bottom: -2px;
|
| 83 |
+
left: 50%;
|
| 84 |
+
width: 100px;
|
| 85 |
+
height: 3px;
|
| 86 |
+
background: linear-gradient(90deg, transparent, var(--primary-color), transparent);
|
| 87 |
+
transform: translateX(-50%);
|
| 88 |
+
}
|
| 89 |
+
|
| 90 |
+
h1 {
|
| 91 |
+
font-size: 2.8rem;
|
| 92 |
+
color: var(--primary-color);
|
| 93 |
+
text-shadow: 0 0 10px rgba(0, 229, 255, 0.5), 0 0 20px rgba(0, 229, 255, 0.3);
|
| 94 |
+
letter-spacing: 2px;
|
| 95 |
+
margin-bottom: var(--space-md);
|
| 96 |
+
font-weight: 700;
|
| 97 |
+
}
|
| 98 |
+
|
| 99 |
+
h3 {
|
| 100 |
+
color: var(--text-primary);
|
| 101 |
+
font-size: 1.4rem;
|
| 102 |
+
margin-bottom: var(--space-md);
|
| 103 |
+
letter-spacing: 0.8px;
|
| 104 |
+
position: relative;
|
| 105 |
+
display: inline-block;
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
h3::after {
|
| 109 |
+
content: '';
|
| 110 |
+
position: absolute;
|
| 111 |
+
bottom: -5px;
|
| 112 |
+
left: 0;
|
| 113 |
+
width: 100%;
|
| 114 |
+
height: 2px;
|
| 115 |
+
background: linear-gradient(90deg, var(--primary-color), transparent);
|
| 116 |
+
}
|
| 117 |
+
|
| 118 |
+
h5 {
|
| 119 |
+
color: var(--text-primary);
|
| 120 |
+
margin-bottom: var(--space-sm);
|
| 121 |
+
font-weight: 500;
|
| 122 |
+
}
|
| 123 |
+
|
| 124 |
+
.report-meta {
|
| 125 |
+
font-size: 0.95rem;
|
| 126 |
+
color: var(--text-secondary);
|
| 127 |
+
margin-top: var(--space-lg);
|
| 128 |
+
display: flex;
|
| 129 |
+
justify-content: center;
|
| 130 |
+
flex-wrap: wrap;
|
| 131 |
+
gap: var(--space-md);
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
.report-meta span {
|
| 135 |
+
padding: var(--space-xs) var(--space-md);
|
| 136 |
+
background: rgba(0, 229, 255, 0.1);
|
| 137 |
+
border-radius: var(--border-radius-sm);
|
| 138 |
+
backdrop-filter: blur(5px);
|
| 139 |
+
transition: var(--transition-normal);
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
.report-meta span:hover {
|
| 143 |
+
background: rgba(0, 229, 255, 0.2);
|
| 144 |
+
transform: translateY(-2px);
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
/* Dashboard Grid Layout */
|
| 148 |
+
.dashboard-grid {
|
| 149 |
+
display: grid;
|
| 150 |
+
grid-template-columns: repeat(12, 1fr);
|
| 151 |
+
gap: var(--space-xl);
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
/* Card Sizing Classes */
|
| 155 |
+
.card-col-3 {
|
| 156 |
+
grid-column: span 3;
|
| 157 |
+
}
|
| 158 |
+
|
| 159 |
+
.card-col-4 {
|
| 160 |
+
grid-column: span 4;
|
| 161 |
+
}
|
| 162 |
+
|
| 163 |
+
.card-col-6 {
|
| 164 |
+
grid-column: span 6;
|
| 165 |
+
}
|
| 166 |
+
|
| 167 |
+
.card-col-8 {
|
| 168 |
+
grid-column: span 8;
|
| 169 |
+
}
|
| 170 |
+
|
| 171 |
+
.card-col-12 {
|
| 172 |
+
grid-column: span 12;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
/* Cards */
|
| 176 |
+
.card {
|
| 177 |
+
background: var(--card-bg);
|
| 178 |
+
padding: var(--space-xl);
|
| 179 |
+
border-radius: var(--border-radius-lg);
|
| 180 |
+
box-shadow: var(--card-shadow);
|
| 181 |
+
transition: var(--transition-normal);
|
| 182 |
+
position: relative;
|
| 183 |
+
overflow: hidden;
|
| 184 |
+
height: 100%;
|
| 185 |
+
backdrop-filter: blur(10px);
|
| 186 |
+
border: 1px solid rgba(255, 255, 255, 0.05);
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
.card:hover {
|
| 190 |
+
transform: translateY(-5px);
|
| 191 |
+
box-shadow: var(--card-shadow-hover);
|
| 192 |
+
}
|
| 193 |
+
|
| 194 |
+
.card::before {
|
| 195 |
+
content: '';
|
| 196 |
+
position: absolute;
|
| 197 |
+
top: 0;
|
| 198 |
+
left: 0;
|
| 199 |
+
width: 100%;
|
| 200 |
+
height: 100%;
|
| 201 |
+
background: radial-gradient(circle at top right, rgba(0, 229, 255, 0.05), transparent 70%);
|
| 202 |
+
pointer-events: none;
|
| 203 |
+
}
|
| 204 |
+
|
| 205 |
+
.card::after {
|
| 206 |
+
content: '';
|
| 207 |
+
position: absolute;
|
| 208 |
+
top: 0;
|
| 209 |
+
left: 0;
|
| 210 |
+
width: 100%;
|
| 211 |
+
height: 3px;
|
| 212 |
+
background: linear-gradient(90deg, transparent, var(--primary-color), transparent);
|
| 213 |
+
opacity: 0;
|
| 214 |
+
transition: opacity 0.3s;
|
| 215 |
+
}
|
| 216 |
+
|
| 217 |
+
.card:hover::after {
|
| 218 |
+
opacity: 1;
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
/* Risk Summary Styles */
|
| 222 |
+
.risk-summary .gauge-container {
|
| 223 |
+
position: relative;
|
| 224 |
+
margin: var(--space-xl) auto;
|
| 225 |
+
width: 180px;
|
| 226 |
+
height: 180px;
|
| 227 |
+
}
|
| 228 |
+
|
| 229 |
+
.risk-metrics {
|
| 230 |
+
display: flex;
|
| 231 |
+
flex-wrap: wrap;
|
| 232 |
+
gap: var(--space-lg);
|
| 233 |
+
justify-content: space-around;
|
| 234 |
+
margin-top: var(--space-xl);
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
.metric-item {
|
| 238 |
+
flex: 1;
|
| 239 |
+
min-width: 120px;
|
| 240 |
+
text-align: center;
|
| 241 |
+
padding: var(--space-sm) var(--space-md);
|
| 242 |
+
background: rgba(0, 229, 255, 0.05);
|
| 243 |
+
border-radius: var(--border-radius-sm);
|
| 244 |
+
transition: transform 0.2s, background 0.2s;
|
| 245 |
+
border: 1px solid rgba(255, 255, 255, 0.05);
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
.metric-item:hover {
|
| 249 |
+
transform: translateY(-3px);
|
| 250 |
+
background: rgba(0, 229, 255, 0.1);
|
| 251 |
+
border-color: rgba(0, 229, 255, 0.2);
|
| 252 |
+
}
|
| 253 |
+
|
| 254 |
+
.metric-label {
|
| 255 |
+
font-size: 0.9rem;
|
| 256 |
+
color: var(--text-secondary);
|
| 257 |
+
display: block;
|
| 258 |
+
margin-bottom: var(--space-xs);
|
| 259 |
+
text-transform: uppercase;
|
| 260 |
+
letter-spacing: 0.5px;
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
.metric-value {
|
| 264 |
+
font-size: 1.3rem;
|
| 265 |
+
color: var(--primary-color);
|
| 266 |
+
font-weight: 700;
|
| 267 |
+
text-shadow: 0 0 5px rgba(0, 229, 255, 0.3);
|
| 268 |
+
}
|
| 269 |
+
|
| 270 |
+
/* Gauge Styles */
|
| 271 |
+
.gauge-svg {
|
| 272 |
+
width: 180px;
|
| 273 |
+
height: 180px;
|
| 274 |
+
position: relative;
|
| 275 |
+
filter: drop-shadow(0 0 8px rgba(0, 229, 255, 0.5));
|
| 276 |
+
transform: rotate(-90deg);
|
| 277 |
+
}
|
| 278 |
+
|
| 279 |
+
.gauge-base {
|
| 280 |
+
fill: none;
|
| 281 |
+
stroke: rgba(255, 255, 255, 0.1);
|
| 282 |
+
stroke-width: 12;
|
| 283 |
+
r: 54;
|
| 284 |
+
cx: 60;
|
| 285 |
+
cy: 60;
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
.gauge-value {
|
| 289 |
+
fill: none;
|
| 290 |
+
stroke: url(#gaugeGradient);
|
| 291 |
+
stroke-width: 12;
|
| 292 |
+
stroke-linecap: round;
|
| 293 |
+
r: 54;
|
| 294 |
+
cx: 60;
|
| 295 |
+
cy: 60;
|
| 296 |
+
transition: stroke-dasharray 1.5s cubic-bezier(0.34, 1.56, 0.64, 1);
|
| 297 |
+
}
|
| 298 |
+
|
| 299 |
+
.gauge-text {
|
| 300 |
+
position: absolute;
|
| 301 |
+
top: 50%;
|
| 302 |
+
left: 50%;
|
| 303 |
+
transform: translate(-50%, -50%) rotate(90deg);
|
| 304 |
+
font-size: 1.8rem;
|
| 305 |
+
color: var(--text-primary);
|
| 306 |
+
font-weight: 700;
|
| 307 |
+
text-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
|
| 308 |
+
font-family: 'Orbitron', sans-serif;
|
| 309 |
+
}
|
| 310 |
+
|
| 311 |
+
.gauge-text::after {
|
| 312 |
+
content: '%';
|
| 313 |
+
font-size: 0.9rem;
|
| 314 |
+
vertical-align: super;
|
| 315 |
+
margin-left: 2px;
|
| 316 |
+
}
|
| 317 |
+
|
| 318 |
+
/* Stats and Insights */
|
| 319 |
+
.stats-grid {
|
| 320 |
+
display: grid;
|
| 321 |
+
gap: var(--space-md);
|
| 322 |
+
}
|
| 323 |
+
|
| 324 |
+
.stat-item {
|
| 325 |
+
display: flex;
|
| 326 |
+
justify-content: space-between;
|
| 327 |
+
align-items: center;
|
| 328 |
+
padding: var(--space-sm) var(--space-md);
|
| 329 |
+
border-radius: var(--border-radius-sm);
|
| 330 |
+
background: rgba(255, 255, 255, 0.05);
|
| 331 |
+
transition: var(--transition-normal);
|
| 332 |
+
border-left: 3px solid transparent;
|
| 333 |
+
}
|
| 334 |
+
|
| 335 |
+
.stat-item:hover {
|
| 336 |
+
background: rgba(0, 229, 255, 0.1);
|
| 337 |
+
border-left-color: var(--primary-color);
|
| 338 |
+
transform: translateX(3px);
|
| 339 |
+
}
|
| 340 |
+
|
| 341 |
+
.stat-label {
|
| 342 |
+
font-size: 0.95rem;
|
| 343 |
+
color: var(--text-secondary);
|
| 344 |
+
}
|
| 345 |
+
|
| 346 |
+
.stat-value {
|
| 347 |
+
font-size: 1.05rem;
|
| 348 |
+
color: var(--primary-color);
|
| 349 |
+
font-weight: 500;
|
| 350 |
+
letter-spacing: 0.5px;
|
| 351 |
+
}
|
| 352 |
+
|
| 353 |
+
.insights-list {
|
| 354 |
+
list-style: none;
|
| 355 |
+
padding: 0;
|
| 356 |
+
}
|
| 357 |
+
|
| 358 |
+
.insights-list li {
|
| 359 |
+
margin-bottom: var(--space-md);
|
| 360 |
+
font-size: 0.95rem;
|
| 361 |
+
padding: var(--space-md);
|
| 362 |
+
background: rgba(255, 255, 255, 0.05);
|
| 363 |
+
border-radius: var(--border-radius-sm);
|
| 364 |
+
border-left: 3px solid var(--primary-color);
|
| 365 |
+
transition: var(--transition-normal);
|
| 366 |
+
position: relative;
|
| 367 |
+
overflow: hidden;
|
| 368 |
+
}
|
| 369 |
+
|
| 370 |
+
.insights-list li::before {
|
| 371 |
+
content: '';
|
| 372 |
+
position: absolute;
|
| 373 |
+
top: 0;
|
| 374 |
+
left: 0;
|
| 375 |
+
width: 3px;
|
| 376 |
+
height: 100%;
|
| 377 |
+
background: var(--primary-color);
|
| 378 |
+
transition: var(--transition-normal);
|
| 379 |
+
}
|
| 380 |
+
|
| 381 |
+
.insights-list li:hover {
|
| 382 |
+
background: rgba(0, 229, 255, 0.1);
|
| 383 |
+
transform: translateX(5px);
|
| 384 |
+
}
|
| 385 |
+
|
| 386 |
+
.insights-list li:hover::before {
|
| 387 |
+
width: 5px;
|
| 388 |
+
}
|
| 389 |
+
|
| 390 |
+
/* Recommendations */
|
| 391 |
+
.recommendation-category {
|
| 392 |
+
margin-bottom: var(--space-xl);
|
| 393 |
+
}
|
| 394 |
+
|
| 395 |
+
.category-title {
|
| 396 |
+
font-size: 1.2rem;
|
| 397 |
+
color: var(--primary-color);
|
| 398 |
+
margin-bottom: var(--space-md);
|
| 399 |
+
cursor: pointer;
|
| 400 |
+
transition: var(--transition-normal);
|
| 401 |
+
display: flex;
|
| 402 |
+
align-items: center;
|
| 403 |
+
font-family: 'Orbitron', sans-serif;
|
| 404 |
+
}
|
| 405 |
+
|
| 406 |
+
.category-title::before {
|
| 407 |
+
content: '▸';
|
| 408 |
+
margin-right: var(--space-sm);
|
| 409 |
+
transition: transform 0.3s;
|
| 410 |
+
}
|
| 411 |
+
|
| 412 |
+
.category-title:hover {
|
| 413 |
+
color: var(--primary-hover);
|
| 414 |
+
}
|
| 415 |
+
|
| 416 |
+
.category-title.active::before {
|
| 417 |
+
transform: rotate(90deg);
|
| 418 |
+
}
|
| 419 |
+
|
| 420 |
+
.recommendations-list {
|
| 421 |
+
list-style: none;
|
| 422 |
+
padding: 0;
|
| 423 |
+
}
|
| 424 |
+
|
| 425 |
+
.recommendation-item {
|
| 426 |
+
background: rgba(0, 229, 255, 0.08);
|
| 427 |
+
padding: var(--space-md);
|
| 428 |
+
border-radius: var(--border-radius-md);
|
| 429 |
+
margin-bottom: var(--space-md);
|
| 430 |
+
display: flex;
|
| 431 |
+
align-items: center;
|
| 432 |
+
gap: var(--space-md);
|
| 433 |
+
cursor: pointer;
|
| 434 |
+
transition: var(--transition-normal);
|
| 435 |
+
border-left: 4px solid transparent;
|
| 436 |
+
position: relative;
|
| 437 |
+
overflow: hidden;
|
| 438 |
+
}
|
| 439 |
+
|
| 440 |
+
.recommendation-item::before {
|
| 441 |
+
content: '';
|
| 442 |
+
position: absolute;
|
| 443 |
+
top: 0;
|
| 444 |
+
right: 0;
|
| 445 |
+
bottom: 0;
|
| 446 |
+
width: 30px;
|
| 447 |
+
background: linear-gradient(to right, transparent, rgba(0, 229, 255, 0.1));
|
| 448 |
+
opacity: 0;
|
| 449 |
+
transition: var(--transition-normal);
|
| 450 |
+
}
|
| 451 |
+
|
| 452 |
+
.recommendation-item:hover {
|
| 453 |
+
background: rgba(0, 229, 255, 0.15);
|
| 454 |
+
box-shadow: 0 0 15px rgba(0, 229, 255, 0.2);
|
| 455 |
+
border-left-color: var(--primary-color);
|
| 456 |
+
transform: translateY(-2px);
|
| 457 |
+
}
|
| 458 |
+
|
| 459 |
+
.recommendation-item:hover::before {
|
| 460 |
+
opacity: 1;
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
.recommendation-item.completed {
|
| 464 |
+
opacity: 0.7;
|
| 465 |
+
text-decoration: line-through;
|
| 466 |
+
background: rgba(255, 255, 255, 0.05);
|
| 467 |
+
}
|
| 468 |
+
|
| 469 |
+
.rec-checkbox {
|
| 470 |
+
width: 22px;
|
| 471 |
+
height: 22px;
|
| 472 |
+
accent-color: var(--primary-color);
|
| 473 |
+
cursor: pointer;
|
| 474 |
+
transition: var(--transition-normal);
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
.rec-checkbox:hover {
|
| 478 |
+
transform: scale(1.1);
|
| 479 |
+
}
|
| 480 |
+
|
| 481 |
+
.priority-indicator {
|
| 482 |
+
font-size: 1.2rem;
|
| 483 |
+
color: var(--primary-color);
|
| 484 |
+
min-width: 24px;
|
| 485 |
+
text-align: center;
|
| 486 |
+
font-weight: bold;
|
| 487 |
+
}
|
| 488 |
+
|
| 489 |
+
.recommendation-text {
|
| 490 |
+
flex: 1;
|
| 491 |
+
font-size: 1rem;
|
| 492 |
+
line-height: 1.4;
|
| 493 |
+
}
|
| 494 |
+
|
| 495 |
+
.recommendation-detail {
|
| 496 |
+
display: none;
|
| 497 |
+
max-height: 0;
|
| 498 |
+
overflow: hidden;
|
| 499 |
+
font-size: 0.9rem;
|
| 500 |
+
color: var(--text-secondary);
|
| 501 |
+
margin-top: var(--space-sm);
|
| 502 |
+
padding: var(--space-sm);
|
| 503 |
+
background: rgba(0, 0, 0, 0.2);
|
| 504 |
+
border-radius: var(--border-radius-sm);
|
| 505 |
+
transition: all 0.3s ease-out;
|
| 506 |
+
line-height: 1.6;
|
| 507 |
+
}
|
| 508 |
+
|
| 509 |
+
.recommendation-item.expandable .recommendation-detail {
|
| 510 |
+
display: block;
|
| 511 |
+
max-height: 0;
|
| 512 |
+
}
|
| 513 |
+
|
| 514 |
+
.recommendation-item.expandable:hover .recommendation-detail,
|
| 515 |
+
.recommendation-item.expandable.expanded .recommendation-detail {
|
| 516 |
+
max-height: 200px;
|
| 517 |
+
padding: var(--space-sm);
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
/* Tooltips */
|
| 521 |
+
.tooltip-icon {
|
| 522 |
+
position: relative;
|
| 523 |
+
color: var(--primary-color);
|
| 524 |
+
cursor: help;
|
| 525 |
+
display: inline-block;
|
| 526 |
+
width: 22px;
|
| 527 |
+
height: 22px;
|
| 528 |
+
text-align: center;
|
| 529 |
+
line-height: 22px;
|
| 530 |
+
border-radius: 50%;
|
| 531 |
+
background: rgba(0, 229, 255, 0.1);
|
| 532 |
+
transition: var(--transition-normal);
|
| 533 |
+
margin-left: var(--space-xs);
|
| 534 |
+
}
|
| 535 |
+
|
| 536 |
+
.tooltip-icon:hover {
|
| 537 |
+
background: rgba(0, 229, 255, 0.2);
|
| 538 |
+
transform: scale(1.1);
|
| 539 |
+
}
|
| 540 |
+
|
| 541 |
+
.tooltip-icon::after {
|
| 542 |
+
content: 'i';
|
| 543 |
+
font-style: italic;
|
| 544 |
+
font-weight: bold;
|
| 545 |
+
}
|
| 546 |
+
|
| 547 |
+
.tooltip-text {
|
| 548 |
+
visibility: hidden;
|
| 549 |
+
width: 220px;
|
| 550 |
+
background: #222;
|
| 551 |
+
color: #fff;
|
| 552 |
+
text-align: center;
|
| 553 |
+
padding: var(--space-sm) var(--space-md);
|
| 554 |
+
border-radius: var(--border-radius-sm);
|
| 555 |
+
position: absolute;
|
| 556 |
+
z-index: 10;
|
| 557 |
+
bottom: 125%;
|
| 558 |
+
left: 50%;
|
| 559 |
+
transform: translateX(-50%);
|
| 560 |
+
font-size: 0.9rem;
|
| 561 |
+
opacity: 0;
|
| 562 |
+
transition: opacity 0.3s, visibility 0.3s;
|
| 563 |
+
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3);
|
| 564 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 565 |
+
line-height: 1.5;
|
| 566 |
+
}
|
| 567 |
+
|
| 568 |
+
.tooltip-text::after {
|
| 569 |
+
content: '';
|
| 570 |
+
position: absolute;
|
| 571 |
+
top: 100%;
|
| 572 |
+
left: 50%;
|
| 573 |
+
margin-left: -5px;
|
| 574 |
+
border-width: 5px;
|
| 575 |
+
border-style: solid;
|
| 576 |
+
border-color: #222 transparent transparent transparent;
|
| 577 |
+
}
|
| 578 |
+
|
| 579 |
+
.tooltip-icon:hover .tooltip-text {
|
| 580 |
+
visibility: visible;
|
| 581 |
+
opacity: 1;
|
| 582 |
+
}
|
| 583 |
+
|
| 584 |
+
/* Buttons */
|
| 585 |
+
.learn-more-btn {
|
| 586 |
+
font-size: 0.9rem;
|
| 587 |
+
padding: var(--space-sm) var(--space-md);
|
| 588 |
+
background: var(--primary-color);
|
| 589 |
+
border: none;
|
| 590 |
+
border-radius: var(--border-radius-sm);
|
| 591 |
+
color: var(--darker-bg);
|
| 592 |
+
font-weight: bold;
|
| 593 |
+
cursor: pointer;
|
| 594 |
+
transition: var(--transition-normal);
|
| 595 |
+
display: inline-block;
|
| 596 |
+
margin-top: var(--space-sm);
|
| 597 |
+
}
|
| 598 |
+
|
| 599 |
+
.learn-more-btn:hover {
|
| 600 |
+
background: var(--primary-hover);
|
| 601 |
+
transform: translateY(-2px);
|
| 602 |
+
box-shadow: 0 3px 10px rgba(0, 151, 251, 0.3);
|
| 603 |
+
}
|
| 604 |
+
|
| 605 |
+
/* Chart Styles */
|
| 606 |
+
.chart-card {
|
| 607 |
+
padding-bottom: var(--space-xl);
|
| 608 |
+
min-height: 400px;
|
| 609 |
+
display: flex;
|
| 610 |
+
flex-direction: column;
|
| 611 |
+
}
|
| 612 |
+
|
| 613 |
+
.chart-container {
|
| 614 |
+
flex: 1;
|
| 615 |
+
position: relative;
|
| 616 |
+
width: 100%;
|
| 617 |
+
height: 100%;
|
| 618 |
+
min-height: 300px;
|
| 619 |
+
display: flex;
|
| 620 |
+
justify-content: center;
|
| 621 |
+
align-items: center;
|
| 622 |
+
margin-top: var(--space-lg);
|
| 623 |
+
}
|
| 624 |
+
|
| 625 |
+
.chart-card canvas {
|
| 626 |
+
max-width: 100%;
|
| 627 |
+
height: auto !important;
|
| 628 |
+
}
|
| 629 |
+
|
| 630 |
+
/* Report Actions */
|
| 631 |
+
.report-actions {
|
| 632 |
+
text-align: center;
|
| 633 |
+
margin-top: var(--space-xxl);
|
| 634 |
+
padding: var(--space-xl);
|
| 635 |
+
background: rgba(255, 255, 255, 0.05);
|
| 636 |
+
border-radius: var(--border-radius-md);
|
| 637 |
+
backdrop-filter: blur(10px);
|
| 638 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 639 |
+
}
|
| 640 |
+
|
| 641 |
+
.action-button {
|
| 642 |
+
padding: 14px 28px;
|
| 643 |
+
background: linear-gradient(45deg, var(--primary-color), var(--primary-hover));
|
| 644 |
+
border: none;
|
| 645 |
+
border-radius: 30px;
|
| 646 |
+
color: #fff;
|
| 647 |
+
font-size: 1.1rem;
|
| 648 |
+
font-weight: 500;
|
| 649 |
+
letter-spacing: 1px;
|
| 650 |
+
cursor: pointer;
|
| 651 |
+
margin: 0 var(--space-md);
|
| 652 |
+
transition: var(--transition-normal);
|
| 653 |
+
box-shadow: 0 4px 15px rgba(0, 229, 255, 0.3);
|
| 654 |
+
position: relative;
|
| 655 |
+
overflow: hidden;
|
| 656 |
+
}
|
| 657 |
+
|
| 658 |
+
.action-button::before {
|
| 659 |
+
content: '';
|
| 660 |
+
position: absolute;
|
| 661 |
+
top: 0;
|
| 662 |
+
left: 0;
|
| 663 |
+
width: 100%;
|
| 664 |
+
height: 100%;
|
| 665 |
+
background: linear-gradient(45deg, transparent, rgba(255, 255, 255, 0.2), transparent);
|
| 666 |
+
transform: translateX(-100%);
|
| 667 |
+
transition: transform 0.6s;
|
| 668 |
+
}
|
| 669 |
+
|
| 670 |
+
.action-button:hover {
|
| 671 |
+
background: linear-gradient(45deg, var(--primary-hover), var(--primary-color));
|
| 672 |
+
transform: translateY(-3px);
|
| 673 |
+
box-shadow: 0 6px 20px rgba(0, 151, 251, 0.4);
|
| 674 |
+
}
|
| 675 |
+
|
| 676 |
+
.action-button:hover::before {
|
| 677 |
+
transform: translateX(100%);
|
| 678 |
+
}
|
| 679 |
+
|
| 680 |
+
.action-button:active {
|
| 681 |
+
transform: translateY(1px);
|
| 682 |
+
}
|
| 683 |
+
|
| 684 |
+
/* Animation for loading elements */
|
| 685 |
+
@keyframes fadeIn {
|
| 686 |
+
from { opacity: 0; transform: translateY(20px); }
|
| 687 |
+
to { opacity: 1; transform: translateY(0); }
|
| 688 |
+
}
|
| 689 |
+
|
| 690 |
+
.card {
|
| 691 |
+
animation: fadeIn 0.5s ease forwards;
|
| 692 |
+
opacity: 0;
|
| 693 |
+
}
|
| 694 |
+
|
| 695 |
+
.card:nth-child(1) { animation-delay: 0.1s; }
|
| 696 |
+
.card:nth-child(2) { animation-delay: 0.15s; }
|
| 697 |
+
.card:nth-child(3) { animation-delay: 0.2s; }
|
| 698 |
+
.card:nth-child(4) { animation-delay: 0.25s; }
|
| 699 |
+
.card:nth-child(5) { animation-delay: 0.3s; }
|
| 700 |
+
.card:nth-child(6) { animation-delay: 0.35s; }
|
| 701 |
+
.card:nth-child(7) { animation-delay: 0.4s; }
|
| 702 |
+
.card:nth-child(8) { animation-delay: 0.45s; }
|
| 703 |
+
.card:nth-child(9) { animation-delay: 0.5s; }
|
| 704 |
+
.card:nth-child(10) { animation-delay: 0.55s; }
|
| 705 |
+
.card:nth-child(11) { animation-delay: 0.6s; }
|
| 706 |
+
.card:nth-child(12) { animation-delay: 0.65s; }
|
| 707 |
+
.card:nth-child(13) { animation-delay: 0.7s; }
|
| 708 |
+
.card:nth-child(14) { animation-delay: 0.75s; }
|
| 709 |
+
.card:nth-child(15) { animation-delay: 0.8s; }
|
| 710 |
+
|
| 711 |
+
/* Media Queries */
|
| 712 |
+
@media (max-width: 1400px) {
|
| 713 |
+
.card-col-3, .card-col-4 {
|
| 714 |
+
grid-column: span 6;
|
| 715 |
+
}
|
| 716 |
+
|
| 717 |
+
.card-col-8 {
|
| 718 |
+
grid-column: span 12;
|
| 719 |
+
}
|
| 720 |
+
}
|
| 721 |
+
|
| 722 |
+
@media (max-width: 1100px) {
|
| 723 |
+
.card-col-6 {
|
| 724 |
+
grid-column: span 12;
|
| 725 |
+
}
|
| 726 |
+
}
|
| 727 |
+
|
| 728 |
+
@media (max-width: 768px) {
|
| 729 |
+
.card-col-3, .card-col-4, .card-col-6, .card-col-8, .card-col-12 {
|
| 730 |
+
grid-column: span 12;
|
| 731 |
+
}
|
| 732 |
+
|
| 733 |
+
.risk-metrics {
|
| 734 |
+
flex-direction: column;
|
| 735 |
+
}
|
| 736 |
+
|
| 737 |
+
.metric-item {
|
| 738 |
+
margin: var(--space-xs) 0;
|
| 739 |
+
}
|
| 740 |
+
|
| 741 |
+
h1 {
|
| 742 |
+
font-size: 2.2rem;
|
| 743 |
+
}
|
| 744 |
+
|
| 745 |
+
.action-button {
|
| 746 |
+
margin: var(--space-sm);
|
| 747 |
+
width: 80%;
|
| 748 |
+
max-width: 300px;
|
| 749 |
+
}
|
| 750 |
+
|
| 751 |
+
.gauge-svg {
|
| 752 |
+
width: 140px;
|
| 753 |
+
height: 140px;
|
| 754 |
+
}
|
| 755 |
+
|
| 756 |
+
.gauge-container {
|
| 757 |
+
width: 140px;
|
| 758 |
+
height: 140px;
|
| 759 |
+
}
|
| 760 |
+
|
| 761 |
+
.gauge-base, .gauge-value {
|
| 762 |
+
r: 46;
|
| 763 |
+
cx: 60;
|
| 764 |
+
cy: 60;
|
| 765 |
+
}
|
| 766 |
+
|
| 767 |
+
.gauge-text {
|
| 768 |
+
font-size: 1.5rem;
|
| 769 |
+
}
|
| 770 |
+
|
| 771 |
+
.recommendation-item {
|
| 772 |
+
flex-wrap: wrap;
|
| 773 |
+
}
|
| 774 |
+
|
| 775 |
+
.report-meta span {
|
| 776 |
+
margin: var(--space-xs);
|
| 777 |
+
}
|
| 778 |
+
|
| 779 |
+
.chart-container {
|
| 780 |
+
min-height: 250px;
|
| 781 |
+
}
|
| 782 |
+
}
|
| 783 |
+
|
| 784 |
+
@media (max-width: 480px) {
|
| 785 |
+
.card {
|
| 786 |
+
padding: var(--space-md);
|
| 787 |
+
}
|
| 788 |
+
|
| 789 |
+
h1 {
|
| 790 |
+
font-size: 1.8rem;
|
| 791 |
+
}
|
| 792 |
+
|
| 793 |
+
h3 {
|
| 794 |
+
font-size: 1.2rem;
|
| 795 |
+
}
|
| 796 |
+
|
| 797 |
+
.metric-item {
|
| 798 |
+
min-width: 100%;
|
| 799 |
+
}
|
| 800 |
+
|
| 801 |
+
.chart-container {
|
| 802 |
+
min-height: 200px;
|
| 803 |
+
}
|
| 804 |
+
|
| 805 |
+
.gauge-svg {
|
| 806 |
+
width: 120px;
|
| 807 |
+
height: 120px;
|
| 808 |
+
}
|
| 809 |
+
|
| 810 |
+
.gauge-container {
|
| 811 |
+
width: 120px;
|
| 812 |
+
height: 120px;
|
| 813 |
+
}
|
| 814 |
+
|
| 815 |
+
.gauge-base, .gauge-value {
|
| 816 |
+
r: 40;
|
| 817 |
+
cx: 60;
|
| 818 |
+
cy: 60;
|
| 819 |
+
}
|
| 820 |
+
|
| 821 |
+
.gauge-text {
|
| 822 |
+
font-size: 1.3rem;
|
| 823 |
+
}
|
| 824 |
+
|
| 825 |
+
.action-button {
|
| 826 |
+
font-size: 1rem;
|
| 827 |
+
padding: 12px 24px;
|
| 828 |
+
}
|
| 829 |
+
}
|
| 830 |
+
|
| 831 |
+
/* Print styles */
|
| 832 |
+
@media print {
|
| 833 |
+
body {
|
| 834 |
+
background: white;
|
| 835 |
+
color: black;
|
| 836 |
+
}
|
| 837 |
+
|
| 838 |
+
.card {
|
| 839 |
+
break-inside: avoid;
|
| 840 |
+
background: white;
|
| 841 |
+
box-shadow: none;
|
| 842 |
+
border: 1px solid #ddd;
|
| 843 |
+
page-break-inside: avoid;
|
| 844 |
+
}
|
| 845 |
+
|
| 846 |
+
.report-actions {
|
| 847 |
+
display: none;
|
| 848 |
+
}
|
| 849 |
+
|
| 850 |
+
h1, h3 {
|
| 851 |
+
color: #333;
|
| 852 |
+
text-shadow: none;
|
| 853 |
+
}
|
| 854 |
+
|
| 855 |
+
.metric-value, .stat-value {
|
| 856 |
+
color: #0097fb;
|
| 857 |
+
}
|
| 858 |
+
|
| 859 |
+
.chart-card {
|
| 860 |
+
page-break-inside: avoid;
|
| 861 |
+
}
|
| 862 |
+
|
| 863 |
+
.gauge-svg {
|
| 864 |
+
filter: none;
|
| 865 |
+
}
|
| 866 |
+
|
| 867 |
+
.gauge-value {
|
| 868 |
+
stroke: #0097fb;
|
| 869 |
+
}
|
| 870 |
+
}
|
| 871 |
+
</style>
|
| 872 |
+
</head>
|
| 873 |
+
<body>
|
| 874 |
+
<div class="container dashboard-container">
|
| 875 |
+
<header>
|
| 876 |
+
<h1>Injury Prediction Report</h1>
|
| 877 |
+
<div class="report-meta">
|
| 878 |
+
<span id="reportDate">Loading...</span>
|
| 879 |
+
<span id="reportId">Loading...</span>
|
| 880 |
+
</div>
|
| 881 |
+
</header>
|
| 882 |
+
<main>
|
| 883 |
+
<div class="dashboard-grid">
|
| 884 |
+
<!-- Risk Summary -->
|
| 885 |
+
<div class="card risk-summary card-col-4">
|
| 886 |
+
<h3>Risk Summary</h3>
|
| 887 |
+
<div class="gauge-container">
|
| 888 |
+
<svg class="gauge-svg" viewBox="0 0 120 120">
|
| 889 |
+
<defs>
|
| 890 |
+
<linearGradient id="gaugeGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
| 891 |
+
<stop offset="0%" style="stop-color:#22c55e;stop-opacity:1" />
|
| 892 |
+
<stop offset="50%" style="stop-color:#facc15;stop-opacity:1" />
|
| 893 |
+
<stop offset="100%" style="stop-color:#ef4444;stop-opacity:1" />
|
| 894 |
+
</linearGradient>
|
| 895 |
+
</defs>
|
| 896 |
+
<circle class="gauge-base" r="54" cx="60" cy="60"></circle>
|
| 897 |
+
<circle class="gauge-value" r="54" cx="60" cy="60"></circle>
|
| 898 |
+
</svg>
|
| 899 |
+
<span class="gauge-text">0</span>
|
| 900 |
+
</div>
|
| 901 |
+
<div class="risk-metrics">
|
| 902 |
+
<div class="metric-item">
|
| 903 |
+
<span class="metric-label">Risk Level</span>
|
| 904 |
+
<span id="riskLevel" class="metric-value">Unknown</span>
|
| 905 |
+
</div>
|
| 906 |
+
<div class="metric-item">
|
| 907 |
+
<span class="metric-label">Likelihood</span>
|
| 908 |
+
<span id="likelihoodPercent" class="metric-value">0%</span>
|
| 909 |
+
</div>
|
| 910 |
+
<div class="metric-item">
|
| 911 |
+
<span class="metric-label">Confidence</span>
|
| 912 |
+
<span id="confidencePercent" class="metric-value">0%</span>
|
| 913 |
+
</div>
|
| 914 |
+
</div>
|
| 915 |
+
</div>
|
| 916 |
+
<!-- Profile Card -->
|
| 917 |
+
<div class="card profile-card card-col-4">
|
| 918 |
+
<h3>Profile</h3>
|
| 919 |
+
<div id="profileCard" class="stats-grid"></div>
|
| 920 |
+
</div>
|
| 921 |
+
<!-- Summary Card -->
|
| 922 |
+
<div class="card summary-card card-col-4">
|
| 923 |
+
<h3>Summary</h3>
|
| 924 |
+
<div id="summaryCard" class="stats-grid"></div>
|
| 925 |
+
</div>
|
| 926 |
+
<!-- AI Smart Insights -->
|
| 927 |
+
<div class="card insights-card card-col-6">
|
| 928 |
+
<h3>AI Smart Insights</h3>
|
| 929 |
+
<ul id="insightsList" class="insights-list"></ul>
|
| 930 |
+
</div>
|
| 931 |
+
<!-- Risk Contribution Breakdown -->
|
| 932 |
+
<div class="card chart-card card-col-6">
|
| 933 |
+
<h3>Risk Contribution Breakdown</h3>
|
| 934 |
+
<div class="chart-container">
|
| 935 |
+
<canvas id="trendAnalysisChart"></canvas>
|
| 936 |
+
</div>
|
| 937 |
+
</div>
|
| 938 |
+
<!-- Factor Impact -->
|
| 939 |
+
<div class="card chart-card card-col-6">
|
| 940 |
+
<h3>Factor Impact</h3>
|
| 941 |
+
<div class="chart-container">
|
| 942 |
+
<canvas id="factorImpactChart"></canvas>
|
| 943 |
+
</div>
|
| 944 |
+
</div>
|
| 945 |
+
<!-- Feature Impact on Risk -->
|
| 946 |
+
<div class="card chart-card card-col-6">
|
| 947 |
+
<h3>Feature Impact on Risk</h3>
|
| 948 |
+
<div class="chart-container">
|
| 949 |
+
<canvas id="featureImportanceChart"></canvas>
|
| 950 |
+
</div>
|
| 951 |
+
</div>
|
| 952 |
+
<!-- Feature Importance -->
|
| 953 |
+
<div class="card chart-card card-col-6">
|
| 954 |
+
<h3>Feature Importance</h3>
|
| 955 |
+
<div class="chart-container">
|
| 956 |
+
<canvas id="riskBreakdownChart"></canvas>
|
| 957 |
+
</div>
|
| 958 |
+
</div>
|
| 959 |
+
<!-- Risk Severity Distribution -->
|
| 960 |
+
<div class="card chart-card card-col-4">
|
| 961 |
+
<h3>Risk Severity Distribution</h3>
|
| 962 |
+
<div class="chart-container">
|
| 963 |
+
<canvas id="riskDonutChart"></canvas>
|
| 964 |
+
</div>
|
| 965 |
+
</div>
|
| 966 |
+
<!-- Top Contributors -->
|
| 967 |
+
<div class="card chart-card card-col-8">
|
| 968 |
+
<h3>Top Contributors</h3>
|
| 969 |
+
<div class="chart-container">
|
| 970 |
+
<canvas id="riskHorizontalBar"></canvas>
|
| 971 |
+
</div>
|
| 972 |
+
</div>
|
| 973 |
+
<!-- Model Confidence -->
|
| 974 |
+
<div class="card chart-card card-col-4">
|
| 975 |
+
<h3>Model Confidence</h3>
|
| 976 |
+
<div class="chart-container">
|
| 977 |
+
<canvas id="confidenceGaugeChart"></canvas>
|
| 978 |
+
</div>
|
| 979 |
+
</div>
|
| 980 |
+
<!-- Training vs Recovery -->
|
| 981 |
+
<div class="card chart-card card-col-4">
|
| 982 |
+
<h3>Training vs Recovery</h3>
|
| 983 |
+
<div class="chart-container">
|
| 984 |
+
<canvas id="trainingRecoveryChart"></canvas>
|
| 985 |
+
</div>
|
| 986 |
+
</div>
|
| 987 |
+
<!-- Performance Stability -->
|
| 988 |
+
<div class="card chart-card card-col-4">
|
| 989 |
+
<h3>Performance Stability</h3>
|
| 990 |
+
<div class="chart-container">
|
| 991 |
+
<canvas id="performanceScoreChart"></canvas>
|
| 992 |
+
</div>
|
| 993 |
+
</div>
|
| 994 |
+
<!-- Fatigue Risk -->
|
| 995 |
+
<div class="card chart-card card-col-4">
|
| 996 |
+
<h3>Fatigue Risk</h3>
|
| 997 |
+
<div class="chart-container">
|
| 998 |
+
<canvas id="fatigueMeterChart"></canvas>
|
| 999 |
+
</div>
|
| 1000 |
+
</div>
|
| 1001 |
+
<!-- Personalized Recommendations -->
|
| 1002 |
+
<div class="card recommendations-card card-col-12">
|
| 1003 |
+
<h3>Personalized Recommendations</h3>
|
| 1004 |
+
<div id="recommendationsList" class="recommendations-list"></div>
|
| 1005 |
+
</div>
|
| 1006 |
+
</div>
|
| 1007 |
+
<!-- Report Actions -->
|
| 1008 |
+
<div class="report-actions">
|
| 1009 |
+
<button class="action-button" id="downloadPDF">Download PDF</button>
|
| 1010 |
+
<button class="action-button" id="printReport">Print Report</button>
|
| 1011 |
+
</div>
|
| 1012 |
+
</main>
|
| 1013 |
+
</div>
|
| 1014 |
+
|
| 1015 |
+
<script src="report.js"></script>
|
| 1016 |
+
</body>
|
| 1017 |
+
</html>
|
UI2/report.js
ADDED
|
@@ -0,0 +1,731 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
document.addEventListener('DOMContentLoaded', () => {
|
| 2 |
+
console.log('report.js loaded at:', new Date().toISOString());
|
| 3 |
+
|
| 4 |
+
const isDataFresh = (timestamp) => {
|
| 5 |
+
if (!timestamp) return false;
|
| 6 |
+
const dataTime = new Date(timestamp);
|
| 7 |
+
const currentTime = new Date();
|
| 8 |
+
const diffInMinutes = (currentTime - dataTime) / (1000 * 60);
|
| 9 |
+
return diffInMinutes <= 60;
|
| 10 |
+
};
|
| 11 |
+
|
| 12 |
+
function loadCompletedRecommendations() {
|
| 13 |
+
const stored = localStorage.getItem('completedRecommendations');
|
| 14 |
+
return stored ? JSON.parse(stored) : {};
|
| 15 |
+
}
|
| 16 |
+
|
| 17 |
+
function saveCompletedRecommendations(completed) {
|
| 18 |
+
localStorage.setItem('completedRecommendations', JSON.stringify(completed));
|
| 19 |
+
}
|
| 20 |
+
|
| 21 |
+
let data;
|
| 22 |
+
try {
|
| 23 |
+
console.log('Attempting to retrieve predictionData from localStorage...');
|
| 24 |
+
const predictionData = JSON.parse(localStorage.getItem('predictionData'));
|
| 25 |
+
console.log('Retrieved predictionData:', predictionData);
|
| 26 |
+
|
| 27 |
+
if (!predictionData) {
|
| 28 |
+
throw new Error('No prediction data found in localStorage');
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
if (predictionData.timestamp && !isDataFresh(predictionData.timestamp)) {
|
| 32 |
+
throw new Error('Prediction data is outdated. Please recalculate.');
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
data = predictionData;
|
| 36 |
+
|
| 37 |
+
if (data.factorData) {
|
| 38 |
+
Object.keys(data.factorData).forEach(key => {
|
| 39 |
+
data.factorData[key] = Math.min(100, Math.max(0, parseFloat(data.factorData[key]) || 0));
|
| 40 |
+
});
|
| 41 |
+
} else {
|
| 42 |
+
data.factorData = {};
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
data.injury_likelihood_percent = parseFloat(data.injury_likelihood_percent) || 0;
|
| 46 |
+
data.model_class_probability = parseFloat(data.model_class_probability) || 0;
|
| 47 |
+
data.predicted_risk_level = data.predicted_risk_level || 'Unknown';
|
| 48 |
+
data.recommendations = data.recommendations || { 'Injury Prevention': [] };
|
| 49 |
+
data.profile = data.profile || { age: 'N/A', gender: 'N/A', sport: 'N/A' };
|
| 50 |
+
data.feature_importance = data.feature_importance || {
|
| 51 |
+
Training_Load_Score: 0.22,
|
| 52 |
+
Recovery_Per_Training: 0.18,
|
| 53 |
+
Total_Weekly_Training_Hours: 0.16,
|
| 54 |
+
Fatigue_Level: 0.14,
|
| 55 |
+
Recovery_Time_Between_Sessions: 0.12,
|
| 56 |
+
High_Intensity_Training_Hours: 0.10,
|
| 57 |
+
Intensity_Ratio: 0.08,
|
| 58 |
+
Endurance_Score: 0.06,
|
| 59 |
+
Sprint_Speed: 0.05,
|
| 60 |
+
Agility_Score: 0.04,
|
| 61 |
+
Flexibility_Score: 0.03,
|
| 62 |
+
Age: 0.03,
|
| 63 |
+
Strength_Training_Frequency: 0.02,
|
| 64 |
+
Sport_Type: 0.02,
|
| 65 |
+
Gender: 0.01,
|
| 66 |
+
Previous_Injury_Count: 0.01,
|
| 67 |
+
Previous_Injury_Type: 0.01
|
| 68 |
+
};
|
| 69 |
+
data.timestamp = data.timestamp || new Date().toISOString();
|
| 70 |
+
data.version = data.version || '1.0.0';
|
| 71 |
+
|
| 72 |
+
console.log('Validated and normalized data:', data);
|
| 73 |
+
} catch (error) {
|
| 74 |
+
console.error('Error loading prediction data:', error.message);
|
| 75 |
+
data = {
|
| 76 |
+
predicted_risk_level: 'Unknown',
|
| 77 |
+
injury_likelihood_percent: 0,
|
| 78 |
+
model_class_probability: 0,
|
| 79 |
+
recommendations: { 'Injury Prevention': [{ id: 'rec-0', text: 'Please complete the assessment form to generate a report.', priority: 0.5, details: '', completed: false }] },
|
| 80 |
+
factorData: {
|
| 81 |
+
Training_Load_Score: 0,
|
| 82 |
+
Recovery_Per_Training: 0,
|
| 83 |
+
Total_Weekly_Training_Hours: 0,
|
| 84 |
+
Fatigue_Level: 0,
|
| 85 |
+
Recovery_Time_Between_Sessions: 0,
|
| 86 |
+
High_Intensity_Training_Hours: 0,
|
| 87 |
+
Experience_Level: 0,
|
| 88 |
+
Intensity_Ratio: 0,
|
| 89 |
+
Endurance_Score: 0,
|
| 90 |
+
Sprint_Speed: 0,
|
| 91 |
+
Agility_Score: 0,
|
| 92 |
+
Flexibility_Score: 0,
|
| 93 |
+
Age: 0,
|
| 94 |
+
Strength_Training_Frequency: 0,
|
| 95 |
+
Sport_Type: 0,
|
| 96 |
+
Gender: 0,
|
| 97 |
+
Previous_Injury_Count: 0,
|
| 98 |
+
Previous_Injury_Type: 0
|
| 99 |
+
},
|
| 100 |
+
profile: { age: 'N/A', gender: 'N/A', sport: 'N/A' },
|
| 101 |
+
feature_importance: {
|
| 102 |
+
Training_Load_Score: 0.22,
|
| 103 |
+
Recovery_Per_Training: 0.18,
|
| 104 |
+
Total_Weekly_Training_Hours: 0.16,
|
| 105 |
+
Fatigue_Level: 0.14,
|
| 106 |
+
Recovery_Time_Between_Sessions: 0.12,
|
| 107 |
+
High_Intensity_Training_Hours: 0.10,
|
| 108 |
+
Intensity_Ratio: 0.08,
|
| 109 |
+
Endurance_Score: 0.06,
|
| 110 |
+
Sprint_Speed: 0.05,
|
| 111 |
+
Agility_Score: 0.04,
|
| 112 |
+
Flexibility_Score: 0.03,
|
| 113 |
+
Age: 0.03,
|
| 114 |
+
Strength_Training_Frequency: 0.02,
|
| 115 |
+
Sport_Type: 0.02,
|
| 116 |
+
Gender: 0.01,
|
| 117 |
+
Previous_Injury_Count: 0.01,
|
| 118 |
+
Previous_Injury_Type: 0.01
|
| 119 |
+
},
|
| 120 |
+
timestamp: new Date().toISOString(),
|
| 121 |
+
version: '1.1.0'
|
| 122 |
+
};
|
| 123 |
+
|
| 124 |
+
const dashboardContainer = document.querySelector('.dashboard-container');
|
| 125 |
+
if (dashboardContainer) {
|
| 126 |
+
const warningDiv = document.createElement('div');
|
| 127 |
+
warningDiv.style.color = '#ef4444';
|
| 128 |
+
warningDiv.style.marginBottom = '20px';
|
| 129 |
+
warningDiv.style.textAlign = 'center';
|
| 130 |
+
warningDiv.innerHTML = `⚠️ ${error.message} <br><a href="calculator.html" style="color: #00e5ff;">Return to Calculator</a>`;
|
| 131 |
+
dashboardContainer.prepend(warningDiv);
|
| 132 |
+
console.log('Appended warning message to dashboard-container');
|
| 133 |
+
} else {
|
| 134 |
+
console.error('Dashboard container not found in the DOM');
|
| 135 |
+
}
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
const reportDateEl = document.getElementById('reportDate');
|
| 139 |
+
if (reportDateEl) {
|
| 140 |
+
reportDateEl.textContent = new Date().toLocaleDateString('en-US', {
|
| 141 |
+
weekday: 'long', year: 'numeric', month: 'long', day: 'numeric'
|
| 142 |
+
});
|
| 143 |
+
} else {
|
| 144 |
+
console.error('Element #reportDate not found');
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
const reportIdEl = document.getElementById('reportId');
|
| 148 |
+
if (reportIdEl) {
|
| 149 |
+
reportIdEl.textContent = 'Report ID: ' + Math.random().toString(36).slice(2, 9).toUpperCase();
|
| 150 |
+
} else {
|
| 151 |
+
console.error('Element #reportId not found');
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
const riskLevelEl = document.getElementById('riskLevel');
|
| 155 |
+
if (riskLevelEl) {
|
| 156 |
+
riskLevelEl.textContent = data.predicted_risk_level;
|
| 157 |
+
} else {
|
| 158 |
+
console.error('Element #riskLevel not found');
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
const likelihoodPercentEl = document.getElementById('likelihoodPercent');
|
| 162 |
+
if (likelihoodPercentEl) {
|
| 163 |
+
likelihoodPercentEl.textContent = `${data.injury_likelihood_percent.toFixed(1)}%`;
|
| 164 |
+
} else {
|
| 165 |
+
console.error('Element #likelihoodPercent not found');
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
const confidencePercentEl = document.getElementById('confidencePercent');
|
| 169 |
+
if (confidencePercentEl) {
|
| 170 |
+
confidencePercentEl.textContent = `${data.model_class_probability.toFixed(1)}%`;
|
| 171 |
+
} else {
|
| 172 |
+
console.error('Element #confidencePercent not found');
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
const percent = Math.min(Math.max(data.injury_likelihood_percent, 0), 100);
|
| 176 |
+
const gauge = document.querySelector('.gauge-value');
|
| 177 |
+
const gaugeText = document.querySelector('.gauge-text');
|
| 178 |
+
if (gauge && gaugeText) {
|
| 179 |
+
const radius = 54;
|
| 180 |
+
const circumference = 2 * Math.PI * radius;
|
| 181 |
+
const offset = circumference - (percent / 100) * circumference;
|
| 182 |
+
|
| 183 |
+
gauge.style.transition = 'stroke-dashoffset 1s ease-in-out';
|
| 184 |
+
gauge.style.strokeDasharray = `${circumference} ${circumference}`;
|
| 185 |
+
gauge.style.strokeDashoffset = offset;
|
| 186 |
+
|
| 187 |
+
const getRiskColor = (value) => {
|
| 188 |
+
if (value > 70) return '#ef4444';
|
| 189 |
+
if (value > 40) return '#facc15';
|
| 190 |
+
return '#22c55e';
|
| 191 |
+
};
|
| 192 |
+
|
| 193 |
+
gauge.style.stroke = getRiskColor(percent);
|
| 194 |
+
gaugeText.textContent = `${percent.toFixed(1)}%`;
|
| 195 |
+
} else {
|
| 196 |
+
console.error('Gauge elements (.gauge-value or .gauge-text) not found');
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
const profileCardEl = document.getElementById('profileCard');
|
| 200 |
+
if (profileCardEl) {
|
| 201 |
+
const profile = data.profile;
|
| 202 |
+
profileCardEl.innerHTML = `
|
| 203 |
+
<div class="stat-item"><span class="stat-label">Age</span><span class="stat-value">${profile.age}</span></div>
|
| 204 |
+
<div class="stat-item"><span class="stat-label">Gender</span><span class="stat-value">${profile.gender}</span></div>
|
| 205 |
+
<div class="stat-item"><span class="stat-label">Sport</span><span class="stat-value">${profile.sport}</span></div>
|
| 206 |
+
`;
|
| 207 |
+
} else {
|
| 208 |
+
console.error('Element #profileCard not found');
|
| 209 |
+
}
|
| 210 |
+
|
| 211 |
+
const summaryCardEl = document.getElementById('summaryCard');
|
| 212 |
+
if (summaryCardEl) {
|
| 213 |
+
const riskSummary = data.predicted_risk_level.toLowerCase();
|
| 214 |
+
const summaryInsight = riskSummary === 'high' ? 'Immediate action required to reduce risk.' :
|
| 215 |
+
riskSummary === 'medium' ? 'Monitor and adjust training.' :
|
| 216 |
+
riskSummary === 'low' ? 'Maintain current regimen.' : 'Complete assessment for insights.';
|
| 217 |
+
summaryCardEl.innerHTML = `
|
| 218 |
+
<div class="stat-item"><span class="stat-label">Risk Overview</span><span class="stat-value">${data.predicted_risk_level}</span></div>
|
| 219 |
+
<div class="stat-item"><span class="stat-label">Key Insight</span><span class="stat-value">${summaryInsight}</span></div>
|
| 220 |
+
<div class="stat-item"><span class="stat-label">Data Confidence</span><span class="stat-value">${data.model_class_probability >= 90 ? 'High' : data.model_class_probability >= 70 ? 'Moderate' : 'Low'}</span></div>
|
| 221 |
+
`;
|
| 222 |
+
} else {
|
| 223 |
+
console.error('Element #summaryCard not found');
|
| 224 |
+
}
|
| 225 |
+
|
| 226 |
+
const insightsListEl = document.getElementById('insightsList');
|
| 227 |
+
if (insightsListEl) {
|
| 228 |
+
const topFactors = [
|
| 229 |
+
{ key: 'Training_Load_Score', value: data.factorData.Training_Load_Score || 0, importance: data.feature_importance.Training_Load_Score || 0 },
|
| 230 |
+
{ key: 'Recovery_Per_Training', value: data.factorData.Recovery_Per_Training || 0, importance: data.feature_importance.Recovery_Per_Training || 0 },
|
| 231 |
+
{ key: 'Total_Weekly_Training_Hours', value: data.factorData.Total_Weekly_Training_Hours || 0, importance: data.feature_importance.Total_Weekly_Training_Hours || 0 },
|
| 232 |
+
{ key: 'Fatigue_Level', value: data.factorData.Fatigue_Level || 0, importance: data.feature_importance.Fatigue_Level || 0 }
|
| 233 |
+
];
|
| 234 |
+
insightsListEl.innerHTML = topFactors.map(f => {
|
| 235 |
+
const impact = (f.value * f.importance).toFixed(1);
|
| 236 |
+
const status = f.value > 70 ? '⚠️ High' : f.value > 40 ? '🟡 Moderate' : '✅ Low';
|
| 237 |
+
return `<li><strong>${f.key.replace(/_/g, ' ')}</strong>: <span style="color:#00e5ff;">${f.value.toFixed(1)}%</span> (${status}, Impact: ${impact}%)</li>`;
|
| 238 |
+
}).join('');
|
| 239 |
+
} else {
|
| 240 |
+
console.error('Element #insightsList not found');
|
| 241 |
+
}
|
| 242 |
+
|
| 243 |
+
const recommendationsListEl = document.getElementById('recommendationsList');
|
| 244 |
+
if (recommendationsListEl) {
|
| 245 |
+
const completedRecs = loadCompletedRecommendations();
|
| 246 |
+
recommendationsListEl.innerHTML = Object.keys(data.recommendations).map(category => `
|
| 247 |
+
<div class="recommendation-category">
|
| 248 |
+
<h5 class="category-title">${category}</h5>
|
| 249 |
+
${data.recommendations[category].map(rec => `
|
| 250 |
+
<div class="recommendation-item expandable ${completedRecs[rec.id] ? 'completed' : ''}">
|
| 251 |
+
<input type="checkbox" class="rec-checkbox" data-id="${rec.id}" ${completedRecs[rec.id] ? 'checked' : ''}>
|
| 252 |
+
<span class="priority-indicator" style="color: ${rec.priority > 0.7 ? '#ef4444' : rec.priority > 0.4 ? '#facc15' : '#22c55e'}">
|
| 253 |
+
${rec.priority > 0.7 ? '🛑' : rec.priority > 0.4 ? '⚠️' : '✅'}
|
| 254 |
+
</span>
|
| 255 |
+
<span class="recommendation-text">${rec.text}</span>
|
| 256 |
+
<span class="tooltip-icon">ℹ️
|
| 257 |
+
<span class="tooltip-text">${rec.details}</span>
|
| 258 |
+
</span>
|
| 259 |
+
<div class="recommendation-detail">${rec.details}</div>
|
| 260 |
+
<button class="learn-more-btn" data-topic="${rec.text.toLowerCase().replace(/\s+/g, '-')}">Learn More</button>
|
| 261 |
+
</div>
|
| 262 |
+
`).join('')}
|
| 263 |
+
</div>
|
| 264 |
+
`).join('');
|
| 265 |
+
|
| 266 |
+
document.querySelectorAll('.rec-checkbox').forEach(checkbox => {
|
| 267 |
+
checkbox.addEventListener('change', () => {
|
| 268 |
+
const recId = checkbox.dataset.id;
|
| 269 |
+
const completedRecs = loadCompletedRecommendations();
|
| 270 |
+
completedRecs[recId] = checkbox.checked;
|
| 271 |
+
saveCompletedRecommendations(completedRecs);
|
| 272 |
+
checkbox.closest('.recommendation-item').classList.toggle('completed', checkbox.checked);
|
| 273 |
+
});
|
| 274 |
+
});
|
| 275 |
+
|
| 276 |
+
document.querySelectorAll('.recommendation-item.expandable').forEach(item => {
|
| 277 |
+
item.addEventListener('click', (e) => {
|
| 278 |
+
if (e.target.classList.contains('rec-checkbox') || e.target.classList.contains('learn-more-btn')) return;
|
| 279 |
+
const detail = item.querySelector('.recommendation-detail');
|
| 280 |
+
if (detail.style.display === "none" || detail.style.display === "") {
|
| 281 |
+
detail.style.display = "block";
|
| 282 |
+
detail.style.maxHeight = detail.scrollHeight + "px";
|
| 283 |
+
} else {
|
| 284 |
+
detail.style.display = "none";
|
| 285 |
+
detail.style.maxHeight = "0";
|
| 286 |
+
}
|
| 287 |
+
});
|
| 288 |
+
});
|
| 289 |
+
|
| 290 |
+
document.querySelectorAll('.learn-more-btn').forEach(btn => {
|
| 291 |
+
btn.addEventListener('click', () => {
|
| 292 |
+
const topic = btn.dataset.topic;
|
| 293 |
+
window.open(`https://www.healthline.com/search?q=${encodeURIComponent(topic)}`, '_blank');
|
| 294 |
+
});
|
| 295 |
+
});
|
| 296 |
+
} else {
|
| 297 |
+
console.error('Element #recommendationsList not found');
|
| 298 |
+
}
|
| 299 |
+
|
| 300 |
+
const chartDefaults = {
|
| 301 |
+
font: { family: 'Orbitron', size: 12 },
|
| 302 |
+
color: '#fff'
|
| 303 |
+
};
|
| 304 |
+
Chart.defaults.font = chartDefaults.font;
|
| 305 |
+
Chart.defaults.color = chartDefaults.color;
|
| 306 |
+
|
| 307 |
+
const makeChart = (id, config) => {
|
| 308 |
+
const ctx = document.getElementById(id);
|
| 309 |
+
if (!ctx) {
|
| 310 |
+
console.error(`Chart element #${id} not found`);
|
| 311 |
+
return null;
|
| 312 |
+
}
|
| 313 |
+
return new Chart(ctx, config);
|
| 314 |
+
};
|
| 315 |
+
|
| 316 |
+
const topFeatureKeys = [
|
| 317 |
+
'Training_Load_Score',
|
| 318 |
+
'Recovery_Per_Training',
|
| 319 |
+
'Total_Weekly_Training_Hours',
|
| 320 |
+
'Fatigue_Level',
|
| 321 |
+
'Recovery_Time_Between_Sessions',
|
| 322 |
+
'High_Intensity_Training_Hours',
|
| 323 |
+
'Previous_Injury_Count'
|
| 324 |
+
];
|
| 325 |
+
|
| 326 |
+
const contributions = topFeatureKeys.map(key => ({
|
| 327 |
+
key,
|
| 328 |
+
value: ((data.factorData[key] || 0) * (data.feature_importance[key] || 0))
|
| 329 |
+
}));
|
| 330 |
+
|
| 331 |
+
const totalRawContribution = contributions.reduce((sum, c) => sum + c.value, 0);
|
| 332 |
+
const scalingFactor = totalRawContribution > 0 ? data.injury_likelihood_percent / totalRawContribution : 0;
|
| 333 |
+
const scaledContributions = contributions.map(c => ({
|
| 334 |
+
key: c.key,
|
| 335 |
+
value: c.value * scalingFactor
|
| 336 |
+
}));
|
| 337 |
+
|
| 338 |
+
const datasets = scaledContributions.map((c, index) => ({
|
| 339 |
+
label: c.key.replace(/_/g, ' '),
|
| 340 |
+
data: [c.value],
|
| 341 |
+
backgroundColor: ['#ef4444', '#facc15', '#22c55e', '#3b82f6', '#a855f7', '#f97316', '#10b981'][index % 7],
|
| 342 |
+
borderWidth: 0
|
| 343 |
+
}));
|
| 344 |
+
|
| 345 |
+
console.log('Risk Contribution Breakdown data:', scaledContributions);
|
| 346 |
+
|
| 347 |
+
makeChart('trendAnalysisChart', {
|
| 348 |
+
type: 'bar',
|
| 349 |
+
data: {
|
| 350 |
+
labels: ['Risk Contribution'],
|
| 351 |
+
datasets: datasets
|
| 352 |
+
},
|
| 353 |
+
options: {
|
| 354 |
+
indexAxis: 'x',
|
| 355 |
+
plugins: {
|
| 356 |
+
legend: { labels: { font: { size: 12 } } },
|
| 357 |
+
tooltip: {
|
| 358 |
+
backgroundColor: 'rgba(0, 0, 0, 0.8)',
|
| 359 |
+
callbacks: {
|
| 360 |
+
label: (ctx) => `${ctx.dataset.label}: ${ctx.raw.toFixed(1)}%`
|
| 361 |
+
}
|
| 362 |
+
},
|
| 363 |
+
title: {
|
| 364 |
+
display: true,
|
| 365 |
+
text: 'Risk Contribution Breakdown',
|
| 366 |
+
font: { size: 16 },
|
| 367 |
+
color: '#fff',
|
| 368 |
+
padding: { top: 10, bottom: 10 }
|
| 369 |
+
}
|
| 370 |
+
},
|
| 371 |
+
scales: {
|
| 372 |
+
x: {
|
| 373 |
+
stacked: true,
|
| 374 |
+
ticks: { font: { size: 12 } },
|
| 375 |
+
grid: { display: false }
|
| 376 |
+
},
|
| 377 |
+
y: {
|
| 378 |
+
stacked: true,
|
| 379 |
+
ticks: { font: { size: 12 } },
|
| 380 |
+
beginAtZero: true,
|
| 381 |
+
max: 100,
|
| 382 |
+
grid: { color: 'rgba(255, 255, 255, 0.1)' },
|
| 383 |
+
title: {
|
| 384 |
+
display: true,
|
| 385 |
+
text: 'Contribution to Risk (%)',
|
| 386 |
+
font: { size: 14 },
|
| 387 |
+
color: '#fff'
|
| 388 |
+
}
|
| 389 |
+
}
|
| 390 |
+
},
|
| 391 |
+
animation: { duration: 1500 }
|
| 392 |
+
}
|
| 393 |
+
});
|
| 394 |
+
|
| 395 |
+
makeChart('factorImpactChart', {
|
| 396 |
+
type: 'radar',
|
| 397 |
+
data: {
|
| 398 |
+
labels: topFeatureKeys.map(k => k.replace(/_/g, ' ')),
|
| 399 |
+
datasets: [{
|
| 400 |
+
label: 'Factor Impact',
|
| 401 |
+
data: topFeatureKeys.map(k => data.factorData[k] || 0),
|
| 402 |
+
backgroundColor: 'rgba(0, 229, 255, 0.3)',
|
| 403 |
+
borderColor: '#00e5ff',
|
| 404 |
+
pointBackgroundColor: '#00e5ff',
|
| 405 |
+
borderWidth: 2,
|
| 406 |
+
pointRadius: 6,
|
| 407 |
+
pointHoverRadius: 10
|
| 408 |
+
}]
|
| 409 |
+
},
|
| 410 |
+
options: {
|
| 411 |
+
responsive: true,
|
| 412 |
+
maintainAspectRatio: false,
|
| 413 |
+
layout: {
|
| 414 |
+
padding: {
|
| 415 |
+
top: 20,
|
| 416 |
+
bottom: 20,
|
| 417 |
+
left: 20,
|
| 418 |
+
right: 20
|
| 419 |
+
}
|
| 420 |
+
},
|
| 421 |
+
scales: {
|
| 422 |
+
r: {
|
| 423 |
+
angleLines: {
|
| 424 |
+
color: 'rgba(255, 255, 255, 0.2)',
|
| 425 |
+
lineWidth: 2
|
| 426 |
+
},
|
| 427 |
+
grid: {
|
| 428 |
+
color: 'rgba(255, 255, 255, 0.2)',
|
| 429 |
+
lineWidth: 2
|
| 430 |
+
},
|
| 431 |
+
ticks: {
|
| 432 |
+
backdropColor: 'transparent',
|
| 433 |
+
font: { size: 16 },
|
| 434 |
+
stepSize: 20,
|
| 435 |
+
padding: 10
|
| 436 |
+
},
|
| 437 |
+
suggestedMin: 0,
|
| 438 |
+
suggestedMax: 100,
|
| 439 |
+
pointLabels: {
|
| 440 |
+
font: { size: 18 },
|
| 441 |
+
padding: 20
|
| 442 |
+
},
|
| 443 |
+
startAngle: 0,
|
| 444 |
+
offset: false
|
| 445 |
+
}
|
| 446 |
+
},
|
| 447 |
+
plugins: {
|
| 448 |
+
legend: {
|
| 449 |
+
labels: {
|
| 450 |
+
font: { size: 16 }
|
| 451 |
+
},
|
| 452 |
+
position: 'top'
|
| 453 |
+
},
|
| 454 |
+
tooltip: {
|
| 455 |
+
backgroundColor: 'rgba(0, 0, 0, 0.8)',
|
| 456 |
+
titleFont: { size: 16 },
|
| 457 |
+
bodyFont: { size: 14 },
|
| 458 |
+
callbacks: {
|
| 459 |
+
label: (ctx) => `${ctx.label}: ${ctx.raw.toFixed(1)}% (Importance: ${(data.feature_importance[topFeatureKeys[ctx.dataIndex]] * 100).toFixed(1)}%)`
|
| 460 |
+
}
|
| 461 |
+
}
|
| 462 |
+
}
|
| 463 |
+
}
|
| 464 |
+
});
|
| 465 |
+
|
| 466 |
+
const featureImpact = topFeatureKeys.map(k => ((data.factorData[k] || 0) * (data.feature_importance[k] || 0)).toFixed(1));
|
| 467 |
+
makeChart('riskBreakdownChart', {
|
| 468 |
+
type: 'bar',
|
| 469 |
+
data: {
|
| 470 |
+
labels: topFeatureKeys.map(k => k.replace(/_/g, ' ')),
|
| 471 |
+
datasets: [{
|
| 472 |
+
label: 'Impact on Risk',
|
| 473 |
+
data: featureImpact,
|
| 474 |
+
backgroundColor: featureImpact.map(val => val > 15 ? '#ef4444' : val > 10 ? '#facc15' : '#22c55e'),
|
| 475 |
+
borderWidth: 0
|
| 476 |
+
}]
|
| 477 |
+
},
|
| 478 |
+
options: {
|
| 479 |
+
plugins: {
|
| 480 |
+
legend: { display: false },
|
| 481 |
+
tooltip: {
|
| 482 |
+
callbacks: {
|
| 483 |
+
label: (ctx) => `${ctx.label}: ${ctx.raw}%`
|
| 484 |
+
}
|
| 485 |
+
}
|
| 486 |
+
},
|
| 487 |
+
scales: {
|
| 488 |
+
x: { ticks: { font: { size: 10 } }, maxRotation: 45, minRotation: 45, grid: { display: false } },
|
| 489 |
+
y: { ticks: { font: { size: 12 } }, beginAtZero: true, max: 25, grid: { color: 'rgba(255,255,255,0.1)' } }
|
| 490 |
+
}
|
| 491 |
+
}
|
| 492 |
+
});
|
| 493 |
+
|
| 494 |
+
const allFeatureKeys = Object.keys(data.feature_importance);
|
| 495 |
+
makeChart('featureImportanceChart', {
|
| 496 |
+
type: 'bar',
|
| 497 |
+
data: {
|
| 498 |
+
labels: allFeatureKeys.map(k => k.replace(/_/g, ' ')),
|
| 499 |
+
datasets: [{
|
| 500 |
+
label: 'Feature Importance',
|
| 501 |
+
data: allFeatureKeys.map(k => data.feature_importance[k]),
|
| 502 |
+
backgroundColor: '#3b82f6',
|
| 503 |
+
borderWidth: 0
|
| 504 |
+
}]
|
| 505 |
+
},
|
| 506 |
+
options: {
|
| 507 |
+
indexAxis: 'y',
|
| 508 |
+
plugins: {
|
| 509 |
+
legend: { display: false },
|
| 510 |
+
tooltip: {
|
| 511 |
+
callbacks: {
|
| 512 |
+
label: (ctx) => `Importance: ${(ctx.raw * 100).toFixed(1)}%`
|
| 513 |
+
}
|
| 514 |
+
}
|
| 515 |
+
},
|
| 516 |
+
scales: {
|
| 517 |
+
x: { ticks: { font: { size: 12 } }, beginAtZero: true, max: 0.25, grid: { color: 'rgba(255,255,255,0.1)' } },
|
| 518 |
+
y: { ticks: { font: { size: 10 } }, grid: { display: false } }
|
| 519 |
+
}
|
| 520 |
+
}
|
| 521 |
+
});
|
| 522 |
+
|
| 523 |
+
const calculateRiskProbabilities = (likelihood, riskLevel) => {
|
| 524 |
+
let low = 0, medium = 0, high = 0;
|
| 525 |
+
const normalizedLikelihood = Math.min(100, Math.max(0, parseFloat(likelihood) || 0));
|
| 526 |
+
|
| 527 |
+
switch (riskLevel.toLowerCase()) {
|
| 528 |
+
case 'high':
|
| 529 |
+
high = Math.min(normalizedLikelihood, 70);
|
| 530 |
+
medium = Math.max(0, normalizedLikelihood - high);
|
| 531 |
+
low = Math.max(0, 100 - high - medium);
|
| 532 |
+
break;
|
| 533 |
+
case 'medium':
|
| 534 |
+
medium = Math.min(normalizedLikelihood, 60);
|
| 535 |
+
low = Math.max(0, 100 - normalizedLikelihood);
|
| 536 |
+
high = Math.max(0, normalizedLikelihood - medium);
|
| 537 |
+
break;
|
| 538 |
+
case 'low':
|
| 539 |
+
default:
|
| 540 |
+
low = Math.min(100 - normalizedLikelihood, 80);
|
| 541 |
+
medium = Math.max(0, normalizedLikelihood);
|
| 542 |
+
high = 0;
|
| 543 |
+
break;
|
| 544 |
+
}
|
| 545 |
+
|
| 546 |
+
const total = low + medium + high;
|
| 547 |
+
if (total !== 100) {
|
| 548 |
+
const adjustment = 100 - total;
|
| 549 |
+
if (high > 0) high += adjustment;
|
| 550 |
+
else if (medium > 0) medium += adjustment;
|
| 551 |
+
else low += adjustment;
|
| 552 |
+
}
|
| 553 |
+
|
| 554 |
+
return { Low: low, Medium: medium, High: high };
|
| 555 |
+
};
|
| 556 |
+
|
| 557 |
+
const probabilities = calculateRiskProbabilities(data.injury_likelihood_percent, data.predicted_risk_level);
|
| 558 |
+
console.log('Risk Severity Probabilities:', probabilities);
|
| 559 |
+
|
| 560 |
+
makeChart('riskDonutChart', {
|
| 561 |
+
type: 'doughnut',
|
| 562 |
+
data: {
|
| 563 |
+
labels: ['Low', 'Medium', 'High'],
|
| 564 |
+
datasets: [{
|
| 565 |
+
data: [probabilities.Low, probabilities.Medium, probabilities.High],
|
| 566 |
+
backgroundColor: ['#22c55e', '#facc15', '#ef4444'],
|
| 567 |
+
borderWidth: 0
|
| 568 |
+
}]
|
| 569 |
+
},
|
| 570 |
+
options: {
|
| 571 |
+
cutout: '65%',
|
| 572 |
+
plugins: {
|
| 573 |
+
legend: { labels: { font: { size: 12 } } },
|
| 574 |
+
tooltip: {
|
| 575 |
+
backgroundColor: 'rgba(0, 0, 0, 0.8)',
|
| 576 |
+
callbacks: {
|
| 577 |
+
label: (ctx) => `${ctx.label}: ${ctx.raw.toFixed(1)}%`
|
| 578 |
+
}
|
| 579 |
+
},
|
| 580 |
+
title: {
|
| 581 |
+
display: true,
|
| 582 |
+
text: 'Risk Severity Distribution',
|
| 583 |
+
font: { size: 16 },
|
| 584 |
+
color: '#fff',
|
| 585 |
+
padding: { top: 10, bottom: 10 }
|
| 586 |
+
}
|
| 587 |
+
},
|
| 588 |
+
animation: { duration: 1500 }
|
| 589 |
+
}
|
| 590 |
+
});
|
| 591 |
+
|
| 592 |
+
makeChart('riskHorizontalBar', {
|
| 593 |
+
type: 'bar',
|
| 594 |
+
data: {
|
| 595 |
+
labels: topFeatureKeys.map(k => k.replace(/_/g, ' ')),
|
| 596 |
+
datasets: [{
|
| 597 |
+
data: topFeatureKeys.map(k => data.factorData[k] || 0),
|
| 598 |
+
backgroundColor: topFeatureKeys.map(k => (data.factorData[k] || 0) > 70 ? '#ef4444' : (data.factorData[k] || 0) > 40 ? '#facc15' : '#22c55e'),
|
| 599 |
+
borderWidth: 0
|
| 600 |
+
}]
|
| 601 |
+
},
|
| 602 |
+
options: {
|
| 603 |
+
indexAxis: 'y',
|
| 604 |
+
plugins: {
|
| 605 |
+
legend: { display: false },
|
| 606 |
+
tooltip: {
|
| 607 |
+
callbacks: {
|
| 608 |
+
label: (ctx) => `${ctx.label}: ${ctx.raw.toFixed(1)}%`
|
| 609 |
+
}
|
| 610 |
+
}
|
| 611 |
+
},
|
| 612 |
+
scales: {
|
| 613 |
+
x: { ticks: { font: { size: 12 } }, beginAtZero: true, max: 100, grid: { color: 'rgba(255,255,255,0.1)' } },
|
| 614 |
+
y: { ticks: { font: { size: 12 } }, grid: { display: false } }
|
| 615 |
+
}
|
| 616 |
+
}
|
| 617 |
+
});
|
| 618 |
+
|
| 619 |
+
const confidenceVal = data.model_class_probability;
|
| 620 |
+
makeChart('confidenceGaugeChart', {
|
| 621 |
+
type: 'doughnut',
|
| 622 |
+
data: {
|
| 623 |
+
datasets: [{
|
| 624 |
+
data: [confidenceVal, 100 - confidenceVal],
|
| 625 |
+
backgroundColor: [confidenceVal >= 90 ? '#22c55e' : confidenceVal >= 70 ? '#facc15' : '#ef4444', 'rgba(255,255,255,0.05)'],
|
| 626 |
+
borderWidth: 0
|
| 627 |
+
}]
|
| 628 |
+
},
|
| 629 |
+
options: {
|
| 630 |
+
rotation: -90,
|
| 631 |
+
circumference: 180,
|
| 632 |
+
cutout: '70%',
|
| 633 |
+
plugins: {
|
| 634 |
+
legend: { display: false },
|
| 635 |
+
tooltip: {
|
| 636 |
+
callbacks: {
|
| 637 |
+
label: (ctx) => `Confidence: ${ctx.raw.toFixed(1)}%`
|
| 638 |
+
}
|
| 639 |
+
}
|
| 640 |
+
}
|
| 641 |
+
}
|
| 642 |
+
});
|
| 643 |
+
|
| 644 |
+
makeChart('trainingRecoveryChart', {
|
| 645 |
+
type: 'bar',
|
| 646 |
+
data: {
|
| 647 |
+
labels: ['Training Load', 'Recovery'],
|
| 648 |
+
datasets: [{
|
| 649 |
+
data: [data.factorData.Training_Load_Score || 0, data.factorData.Recovery_Per_Training || 0],
|
| 650 |
+
backgroundColor: [(data.factorData.Training_Load_Score || 0) > 70 ? '#ef4444' : '#00e5ff', (data.factorData.Recovery_Per_Training || 0) < 40 ? '#ef4444' : '#10b981'],
|
| 651 |
+
borderWidth: 0
|
| 652 |
+
}]
|
| 653 |
+
},
|
| 654 |
+
options: {
|
| 655 |
+
plugins: {
|
| 656 |
+
legend: { display: false },
|
| 657 |
+
tooltip: {
|
| 658 |
+
callbacks: {
|
| 659 |
+
label: (ctx) => `${ctx.label}: ${ctx.raw.toFixed(1)}%`
|
| 660 |
+
}
|
| 661 |
+
}
|
| 662 |
+
},
|
| 663 |
+
scales: {
|
| 664 |
+
x: { ticks: { font: { size: 12 } } },
|
| 665 |
+
y: { ticks: { font: { size: 12 } }, beginAtZero: true, max: 100, grid: { color: 'rgba(255,255,255,0.1)' } }
|
| 666 |
+
}
|
| 667 |
+
}
|
| 668 |
+
});
|
| 669 |
+
|
| 670 |
+
makeChart('performanceScoreChart', {
|
| 671 |
+
type: 'doughnut',
|
| 672 |
+
data: {
|
| 673 |
+
datasets: [{
|
| 674 |
+
data: [data.factorData.Experience_Level || 0, 100 - (data.factorData.Experience_Level || 0)],
|
| 675 |
+
backgroundColor: [(data.factorData.Experience_Level || 0) > 70 ? '#22c55e' : '#facc15', 'rgba(255,255,255,0.05)'],
|
| 676 |
+
borderWidth: 0
|
| 677 |
+
}]
|
| 678 |
+
},
|
| 679 |
+
options: {
|
| 680 |
+
cutout: '75%',
|
| 681 |
+
plugins: {
|
| 682 |
+
legend: { display: false },
|
| 683 |
+
tooltip: {
|
| 684 |
+
callbacks: {
|
| 685 |
+
label: (ctx) => `Stability: ${ctx.raw.toFixed(1)}%`
|
| 686 |
+
}
|
| 687 |
+
}
|
| 688 |
+
}
|
| 689 |
+
}
|
| 690 |
+
});
|
| 691 |
+
|
| 692 |
+
makeChart('fatigueMeterChart', {
|
| 693 |
+
type: 'doughnut',
|
| 694 |
+
data: {
|
| 695 |
+
datasets: [{
|
| 696 |
+
data: [data.factorData.Fatigue_Level || 0, 100 - (data.factorData.Fatigue_Level || 0)],
|
| 697 |
+
backgroundColor: [(data.factorData.Fatigue_Level || 0) > 70 ? '#ef4444' : (data.factorData.Fatigue_Level || 0) > 40 ? '#facc15' : '#22c55e', 'rgba(255,255,255,0.05)'],
|
| 698 |
+
borderWidth: 0
|
| 699 |
+
}]
|
| 700 |
+
},
|
| 701 |
+
options: {
|
| 702 |
+
rotation: -90,
|
| 703 |
+
circumference: 180,
|
| 704 |
+
cutout: '70%',
|
| 705 |
+
plugins: {
|
| 706 |
+
legend: { display: false },
|
| 707 |
+
tooltip: {
|
| 708 |
+
callbacks: {
|
| 709 |
+
label: (ctx) => `Fatigue Risk: ${ctx.raw.toFixed(1)}%`
|
| 710 |
+
}
|
| 711 |
+
}
|
| 712 |
+
}
|
| 713 |
+
}
|
| 714 |
+
});
|
| 715 |
+
|
| 716 |
+
const downloadPDFBtn = document.getElementById('downloadPDF');
|
| 717 |
+
if (downloadPDFBtn) {
|
| 718 |
+
downloadPDFBtn.addEventListener('click', () => window.print());
|
| 719 |
+
} else {
|
| 720 |
+
console.error('Element #downloadPDF not found');
|
| 721 |
+
}
|
| 722 |
+
|
| 723 |
+
const printReportBtn = document.getElementById('printReport');
|
| 724 |
+
if (printReportBtn) {
|
| 725 |
+
printReportBtn.addEventListener('click', () => window.print());
|
| 726 |
+
} else {
|
| 727 |
+
console.error('Element #printReport not found');
|
| 728 |
+
}
|
| 729 |
+
|
| 730 |
+
console.log('Dashboard rendering completed');
|
| 731 |
+
});
|
UI2/style.css
ADDED
|
@@ -0,0 +1,3749 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* Reset & Base Styles */
|
| 2 |
+
* {
|
| 3 |
+
margin: 0;
|
| 4 |
+
padding: 0;
|
| 5 |
+
box-sizing: border-box;
|
| 6 |
+
-webkit-font-smoothing: antialiased;
|
| 7 |
+
-moz-osx-font-smoothing: grayscale;
|
| 8 |
+
}
|
| 9 |
+
|
| 10 |
+
:root {
|
| 11 |
+
--primary: #6d28d9;
|
| 12 |
+
--primary-dark: #5b21b6;
|
| 13 |
+
--secondary: #8b5cf6;
|
| 14 |
+
--accent: #a78bfa;
|
| 15 |
+
--background: #0f172a;
|
| 16 |
+
--surface: #1e293b;
|
| 17 |
+
--text: #f8fafc;
|
| 18 |
+
--text-secondary: #e2e8f0;
|
| 19 |
+
--success: #10b981;
|
| 20 |
+
--warning: #f59e0b;
|
| 21 |
+
--error: #ef4444;
|
| 22 |
+
--glass: rgba(255, 255, 255, 0.07);
|
| 23 |
+
--glass-border: rgba(255, 255, 255, 0.15);
|
| 24 |
+
--glass-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
|
| 25 |
+
--premium-gradient: linear-gradient(135deg, #6d28d9, #4f46e5);
|
| 26 |
+
--premium-glow: 0 0 20px rgba(139, 92, 246, 0.3);
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
body {
|
| 30 |
+
background: linear-gradient(135deg, var(--background), #000033);
|
| 31 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
.glassmorphism {
|
| 35 |
+
background: var(--glass);
|
| 36 |
+
backdrop-filter: blur(10px);
|
| 37 |
+
border: 1px solid var(--glass-border);
|
| 38 |
+
box-shadow: var(--glass-shadow);
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
/* Progress Bar */
|
| 42 |
+
.progress-bar {
|
| 43 |
+
position: fixed;
|
| 44 |
+
top: 0;
|
| 45 |
+
left: 0;
|
| 46 |
+
width: 0;
|
| 47 |
+
height: 3px;
|
| 48 |
+
background: linear-gradient(to right, #00e5ff, #0097fb);
|
| 49 |
+
z-index: 1001;
|
| 50 |
+
transition: width 0.2s ease-out;
|
| 51 |
+
}
|
| 52 |
+
/* Loading Animation */
|
| 53 |
+
.loader-wrapper {
|
| 54 |
+
position: fixed;
|
| 55 |
+
top: 0;
|
| 56 |
+
left: 0;
|
| 57 |
+
width: 100%;
|
| 58 |
+
height: 100%;
|
| 59 |
+
background: linear-gradient(180deg, #050533, #000022);
|
| 60 |
+
display: flex;
|
| 61 |
+
justify-content: center;
|
| 62 |
+
align-items: center;
|
| 63 |
+
z-index: 9999;
|
| 64 |
+
transition: opacity 0.5s;
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
.loader-wrapper.fade-out {
|
| 68 |
+
opacity: 0;
|
| 69 |
+
}
|
| 70 |
+
|
| 71 |
+
.loader {
|
| 72 |
+
width: 60px;
|
| 73 |
+
height: 60px;
|
| 74 |
+
border: 3px solid rgba(0, 229, 255, 0.3);
|
| 75 |
+
border-radius: 50%;
|
| 76 |
+
border-top-color: #00e5ff;
|
| 77 |
+
animation: spin 1s ease-in-out infinite;
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
@keyframes spin {
|
| 81 |
+
to { transform: rotate(360deg); }
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
body {
|
| 85 |
+
font-family: 'Roboto', sans-serif;
|
| 86 |
+
background: linear-gradient(180deg, #050533, #000022);
|
| 87 |
+
color: #ddd;
|
| 88 |
+
line-height: 1.6;
|
| 89 |
+
overflow-x: hidden;
|
| 90 |
+
position: relative;
|
| 91 |
+
min-height: 100vh;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
/* Light Mode Overrides */
|
| 95 |
+
body.light-mode {
|
| 96 |
+
background: #f5f5f5;
|
| 97 |
+
color: #222;
|
| 98 |
+
}
|
| 99 |
+
body.light-mode header {
|
| 100 |
+
background: #fff;
|
| 101 |
+
border-bottom: 1px solid #ccc;
|
| 102 |
+
}
|
| 103 |
+
body.light-mode .nav-logo {
|
| 104 |
+
color: #222;
|
| 105 |
+
}
|
| 106 |
+
body.light-mode .nav-menu a {
|
| 107 |
+
color: #222;
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
/* Navigation Bar */
|
| 111 |
+
header {
|
| 112 |
+
position: sticky;
|
| 113 |
+
top: 0;
|
| 114 |
+
z-index: 1000;
|
| 115 |
+
background: rgba(0, 0, 0, 0.9);
|
| 116 |
+
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.5);
|
| 117 |
+
border-bottom: 1px solid rgba(0, 229, 255, 0.2);
|
| 118 |
+
}
|
| 119 |
+
.navbar {
|
| 120 |
+
display: flex;
|
| 121 |
+
justify-content: space-between;
|
| 122 |
+
align-items: center;
|
| 123 |
+
max-width: 1400px;
|
| 124 |
+
width: 100%;
|
| 125 |
+
margin: 0 auto;
|
| 126 |
+
padding: 1.2rem 2.5rem;
|
| 127 |
+
background: linear-gradient(to right, rgba(15, 23, 42, 0.98), rgba(30, 41, 59, 0.95));
|
| 128 |
+
backdrop-filter: blur(20px);
|
| 129 |
+
border-bottom: 1px solid var(--glass-border);
|
| 130 |
+
position: relative;
|
| 131 |
+
box-shadow: 0 4px 30px rgba(0, 0, 0, 0.4);
|
| 132 |
+
}
|
| 133 |
+
|
| 134 |
+
.navbar::after {
|
| 135 |
+
content: '';
|
| 136 |
+
position: absolute;
|
| 137 |
+
bottom: -1px;
|
| 138 |
+
left: 0;
|
| 139 |
+
right: 0;
|
| 140 |
+
height: 1px;
|
| 141 |
+
background: linear-gradient(90deg, transparent, var(--accent), transparent);
|
| 142 |
+
opacity: 0.5;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
.navbar::after {
|
| 146 |
+
content: '';
|
| 147 |
+
position: absolute;
|
| 148 |
+
bottom: 0;
|
| 149 |
+
left: 0;
|
| 150 |
+
width: 100%;
|
| 151 |
+
height: 1px;
|
| 152 |
+
background: linear-gradient(to right,
|
| 153 |
+
transparent,
|
| 154 |
+
var(--accent),
|
| 155 |
+
transparent
|
| 156 |
+
);
|
| 157 |
+
opacity: 0.3;
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
.nav-menu a {
|
| 161 |
+
position: relative;
|
| 162 |
+
padding: 0.5rem 1rem;
|
| 163 |
+
color: var(--text);
|
| 164 |
+
text-decoration: none;
|
| 165 |
+
font-weight: 500;
|
| 166 |
+
letter-spacing: 0.5px;
|
| 167 |
+
transition: all 0.3s ease;
|
| 168 |
+
background: linear-gradient(90deg,
|
| 169 |
+
transparent 0%,
|
| 170 |
+
transparent 50%,
|
| 171 |
+
rgba(0, 229, 255, 0.1) 50%,
|
| 172 |
+
transparent 100%
|
| 173 |
+
);
|
| 174 |
+
background-size: 200% 100%;
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
.nav-menu a:hover {
|
| 178 |
+
background-position: -100% 0;
|
| 179 |
+
color: #00e5ff;
|
| 180 |
+
text-shadow: 0 0 8px rgba(0, 229, 255, 0.5);
|
| 181 |
+
}
|
| 182 |
+
|
| 183 |
+
.nav-menu a::after {
|
| 184 |
+
content: '';
|
| 185 |
+
position: absolute;
|
| 186 |
+
bottom: -2px;
|
| 187 |
+
left: 0;
|
| 188 |
+
width: 100%;
|
| 189 |
+
height: 2px;
|
| 190 |
+
background: var(--accent);
|
| 191 |
+
transform: scaleX(0);
|
| 192 |
+
transition: transform 0.3s ease;
|
| 193 |
+
}
|
| 194 |
+
|
| 195 |
+
.nav-menu a:hover::after,
|
| 196 |
+
.nav-menu a.active::after {
|
| 197 |
+
transform: scaleX(1);
|
| 198 |
+
}
|
| 199 |
+
.nav-logo {
|
| 200 |
+
font-family: 'Orbitron', sans-serif;
|
| 201 |
+
font-size: 1.8em;
|
| 202 |
+
color: #00e5ff;
|
| 203 |
+
text-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
|
| 204 |
+
font-weight: 700;
|
| 205 |
+
letter-spacing: 1px;
|
| 206 |
+
}
|
| 207 |
+
.nav-menu {
|
| 208 |
+
list-style: none;
|
| 209 |
+
display: flex;
|
| 210 |
+
gap: 30px;
|
| 211 |
+
}
|
| 212 |
+
.nav-menu li {
|
| 213 |
+
margin: 0;
|
| 214 |
+
position: relative;
|
| 215 |
+
}
|
| 216 |
+
.nav-menu a {
|
| 217 |
+
color: #ddd;
|
| 218 |
+
text-decoration: none;
|
| 219 |
+
transition: all 0.3s;
|
| 220 |
+
font-size: 1.05rem;
|
| 221 |
+
font-weight: 500;
|
| 222 |
+
padding: 5px 10px;
|
| 223 |
+
letter-spacing: 0.5px;
|
| 224 |
+
}
|
| 225 |
+
.nav-menu a:hover {
|
| 226 |
+
color: #00e5ff;
|
| 227 |
+
}
|
| 228 |
+
.nav-menu a.active,
|
| 229 |
+
.nav-menu a:hover {
|
| 230 |
+
color: #00e5ff;
|
| 231 |
+
}
|
| 232 |
+
.nav-menu a::after {
|
| 233 |
+
content: '';
|
| 234 |
+
position: absolute;
|
| 235 |
+
width: 0;
|
| 236 |
+
height: 2px;
|
| 237 |
+
bottom: -5px;
|
| 238 |
+
left: 0;
|
| 239 |
+
background-color: #00e5ff;
|
| 240 |
+
transition: width 0.3s;
|
| 241 |
+
}
|
| 242 |
+
.nav-menu a:hover::after,
|
| 243 |
+
.nav-menu a.active::after {
|
| 244 |
+
width: 100%;
|
| 245 |
+
}
|
| 246 |
+
/* Hamburger Menu (Mobile) */
|
| 247 |
+
.hamburger {
|
| 248 |
+
display: none;
|
| 249 |
+
flex-direction: column;
|
| 250 |
+
cursor: pointer;
|
| 251 |
+
}
|
| 252 |
+
.hamburger span {
|
| 253 |
+
width: 25px;
|
| 254 |
+
height: 3px;
|
| 255 |
+
background: #ddd;
|
| 256 |
+
margin-bottom: 4px;
|
| 257 |
+
transition: all 0.3s;
|
| 258 |
+
}
|
| 259 |
+
|
| 260 |
+
/* Hero Section */
|
| 261 |
+
.hero {
|
| 262 |
+
position: relative;
|
| 263 |
+
min-height: 90vh;
|
| 264 |
+
display: flex;
|
| 265 |
+
align-items: center;
|
| 266 |
+
justify-content: center;
|
| 267 |
+
overflow: hidden;
|
| 268 |
+
padding: 40px 0;
|
| 269 |
+
}
|
| 270 |
+
#particle-canvas {
|
| 271 |
+
position: absolute;
|
| 272 |
+
top: 0;
|
| 273 |
+
left: 0;
|
| 274 |
+
width: 100%;
|
| 275 |
+
height: 100%;
|
| 276 |
+
z-index: 0;
|
| 277 |
+
}
|
| 278 |
+
.hero-overlay {
|
| 279 |
+
position: absolute;
|
| 280 |
+
top: 0;
|
| 281 |
+
left: 0;
|
| 282 |
+
right: 0;
|
| 283 |
+
bottom: 0;
|
| 284 |
+
background: rgba(0, 0, 0, 0.7);
|
| 285 |
+
z-index: 1;
|
| 286 |
+
}
|
| 287 |
+
.hero-content {
|
| 288 |
+
position: relative;
|
| 289 |
+
z-index: 2;
|
| 290 |
+
max-width: 1000px;
|
| 291 |
+
text-align: center;
|
| 292 |
+
padding: 5.5rem 3.5rem;
|
| 293 |
+
background: linear-gradient(165deg,
|
| 294 |
+
rgba(10, 15, 30, 0.7),
|
| 295 |
+
rgba(20, 25, 45, 0.4)
|
| 296 |
+
);
|
| 297 |
+
border: 1px solid rgba(255, 255, 255, 0.08);
|
| 298 |
+
box-shadow:
|
| 299 |
+
0 25px 60px rgba(0, 0, 0, 0.3),
|
| 300 |
+
0 0 35px rgba(255, 255, 255, 0.05);
|
| 301 |
+
backdrop-filter: blur(15px);
|
| 302 |
+
border-radius: 12px;
|
| 303 |
+
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
| 304 |
+
}
|
| 305 |
+
|
| 306 |
+
.hero-content:hover {
|
| 307 |
+
transform: perspective(1000px) rotateX(0deg) translateY(-10px);
|
| 308 |
+
box-shadow:
|
| 309 |
+
0 30px 60px rgba(0, 0, 0, 0.5),
|
| 310 |
+
0 0 50px rgba(0, 229, 255, 0.3),
|
| 311 |
+
inset 0 0 120px rgba(0, 229, 255, 0.15);
|
| 312 |
+
}
|
| 313 |
+
.header {
|
| 314 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 315 |
+
font-size: 3.8em;
|
| 316 |
+
margin-bottom: 35px;
|
| 317 |
+
color: #fff;
|
| 318 |
+
font-weight: 300;
|
| 319 |
+
letter-spacing: -0.5px;
|
| 320 |
+
line-height: 1.1;
|
| 321 |
+
text-shadow: 0 2px 15px rgba(255, 255, 255, 0.1);
|
| 322 |
+
}
|
| 323 |
+
@keyframes glitchNeon {
|
| 324 |
+
0% {
|
| 325 |
+
text-shadow: 0 0 5px #00e5ff, 0 0 10px #00e5ff, 2px 2px #ff5722;
|
| 326 |
+
}
|
| 327 |
+
20% {
|
| 328 |
+
text-shadow: 0 0 10px #00e5ff, 0 0 15px #00e5ff, -2px -2px #ff5722;
|
| 329 |
+
}
|
| 330 |
+
40% {
|
| 331 |
+
text-shadow: 0 0 5px #00e5ff, 0 0 10px #00e5ff, 2px -2px #ff5722;
|
| 332 |
+
}
|
| 333 |
+
60% {
|
| 334 |
+
text-shadow: 0 0 10px #00e5ff, 0 0 15px #00e5ff, -2px 2px #ff5722;
|
| 335 |
+
}
|
| 336 |
+
80% {
|
| 337 |
+
text-shadow: 0 0 5px #00e5ff, 0 0 10px #00e5ff, 2px 2px #ff5722;
|
| 338 |
+
}
|
| 339 |
+
100% {
|
| 340 |
+
text-shadow: 0 0 10px #00e5ff, 0 0 15px #00e5ff, -2px -2px #ff5722;
|
| 341 |
+
}
|
| 342 |
+
}
|
| 343 |
+
.description {
|
| 344 |
+
font-size: 1.3em;
|
| 345 |
+
margin-bottom: 15px;
|
| 346 |
+
color: #eee;
|
| 347 |
+
animation: fadeIn 1.5s ease-in-out;
|
| 348 |
+
line-height: 1.8;
|
| 349 |
+
max-width: 90%;
|
| 350 |
+
margin-left: auto;
|
| 351 |
+
margin-right: auto;
|
| 352 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 353 |
+
letter-spacing: 0.2px;
|
| 354 |
+
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
|
| 355 |
+
}
|
| 356 |
+
|
| 357 |
+
.highlight-text {
|
| 358 |
+
color: #00e5ff;
|
| 359 |
+
font-weight: 600;
|
| 360 |
+
position: relative;
|
| 361 |
+
display: inline-block;
|
| 362 |
+
padding: 0 5px;
|
| 363 |
+
background: linear-gradient(120deg, rgba(0, 229, 255, 0.1) 0%, rgba(0, 229, 255, 0.05) 100%);
|
| 364 |
+
border-radius: 4px;
|
| 365 |
+
text-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
|
| 366 |
+
}
|
| 367 |
+
@keyframes fadeIn {
|
| 368 |
+
from { opacity: 0; transform: translateY(20px); }
|
| 369 |
+
to { opacity: 1; transform: translateY(0); }
|
| 370 |
+
}
|
| 371 |
+
.cta-button {
|
| 372 |
+
position: relative;
|
| 373 |
+
overflow: hidden;
|
| 374 |
+
margin-top: 3rem;
|
| 375 |
+
padding: 1.4rem 3.5rem;
|
| 376 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 377 |
+
border: none;
|
| 378 |
+
border-radius: 12px;
|
| 379 |
+
color: #000;
|
| 380 |
+
font-weight: 600;
|
| 381 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 382 |
+
font-size: 1.1rem;
|
| 383 |
+
letter-spacing: 1.5px;
|
| 384 |
+
text-transform: uppercase;
|
| 385 |
+
cursor: pointer;
|
| 386 |
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
| 387 |
+
box-shadow:
|
| 388 |
+
0 10px 25px rgba(0, 229, 255, 0.4),
|
| 389 |
+
0 0 40px rgba(0, 229, 255, 0.2);
|
| 390 |
+
backdrop-filter: blur(10px);
|
| 391 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 392 |
+
}
|
| 393 |
+
|
| 394 |
+
.cta-button::before {
|
| 395 |
+
content: '';
|
| 396 |
+
position: absolute;
|
| 397 |
+
top: 0;
|
| 398 |
+
left: -100%;
|
| 399 |
+
width: 100%;
|
| 400 |
+
height: 100%;
|
| 401 |
+
background: linear-gradient(
|
| 402 |
+
90deg,
|
| 403 |
+
transparent,
|
| 404 |
+
rgba(255, 255, 255, 0.3),
|
| 405 |
+
transparent
|
| 406 |
+
);
|
| 407 |
+
transition: 0.5s;
|
| 408 |
+
animation: shimmer 3s infinite;
|
| 409 |
+
}
|
| 410 |
+
|
| 411 |
+
.cta-button:hover {
|
| 412 |
+
transform: translateY(-5px) scale(1.02);
|
| 413 |
+
box-shadow:
|
| 414 |
+
0 15px 30px rgba(0, 229, 255, 0.6),
|
| 415 |
+
0 0 60px rgba(0, 229, 255, 0.3);
|
| 416 |
+
background: linear-gradient(135deg, #00e5ff, #00b0ff);
|
| 417 |
+
letter-spacing: 2px;
|
| 418 |
+
}
|
| 419 |
+
|
| 420 |
+
.cta-button:active {
|
| 421 |
+
transform: translateY(-2px) scale(0.98);
|
| 422 |
+
box-shadow:
|
| 423 |
+
0 5px 15px rgba(0, 229, 255, 0.4);
|
| 424 |
+
}
|
| 425 |
+
|
| 426 |
+
.cta-button .icon {
|
| 427 |
+
margin-right: 10px;
|
| 428 |
+
transition: transform 0.3s ease;
|
| 429 |
+
}
|
| 430 |
+
|
| 431 |
+
.cta-button:hover .icon {
|
| 432 |
+
transform: rotate(360deg) scale(1.2);
|
| 433 |
+
}
|
| 434 |
+
|
| 435 |
+
@keyframes shimmer {
|
| 436 |
+
0% { left: -100%; }
|
| 437 |
+
50% { left: 100%; }
|
| 438 |
+
100% { left: 100%; }
|
| 439 |
+
}
|
| 440 |
+
|
| 441 |
+
/* Action buttons styling */
|
| 442 |
+
.action-button {
|
| 443 |
+
padding: 14px 28px;
|
| 444 |
+
border-radius: 12px;
|
| 445 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 446 |
+
font-size: 1em;
|
| 447 |
+
font-weight: 500;
|
| 448 |
+
cursor: pointer;
|
| 449 |
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
| 450 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 451 |
+
display: inline-flex;
|
| 452 |
+
align-items: center;
|
| 453 |
+
gap: 10px;
|
| 454 |
+
backdrop-filter: blur(10px);
|
| 455 |
+
}
|
| 456 |
+
|
| 457 |
+
.action-button.primary {
|
| 458 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 459 |
+
color: #000;
|
| 460 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.3);
|
| 461 |
+
}
|
| 462 |
+
|
| 463 |
+
.action-button.secondary {
|
| 464 |
+
background: rgba(0, 229, 255, 0.1);
|
| 465 |
+
color: #00e5ff;
|
| 466 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 467 |
+
}
|
| 468 |
+
|
| 469 |
+
.action-button.tertiary {
|
| 470 |
+
background: rgba(255, 255, 255, 0.05);
|
| 471 |
+
color: #fff;
|
| 472 |
+
}
|
| 473 |
+
|
| 474 |
+
.action-button:hover {
|
| 475 |
+
transform: translateY(-3px);
|
| 476 |
+
filter: brightness(1.1);
|
| 477 |
+
box-shadow: 0 8px 25px rgba(0, 229, 255, 0.4);
|
| 478 |
+
}
|
| 479 |
+
|
| 480 |
+
.action-button:active {
|
| 481 |
+
transform: translateY(-1px);
|
| 482 |
+
filter: brightness(0.95);
|
| 483 |
+
}
|
| 484 |
+
|
| 485 |
+
.action-button .action-icon {
|
| 486 |
+
font-size: 1.2em;
|
| 487 |
+
transition: transform 0.3s ease;
|
| 488 |
+
}
|
| 489 |
+
|
| 490 |
+
.action-button:hover .action-icon {
|
| 491 |
+
transform: scale(1.2) rotate(10deg);
|
| 492 |
+
}
|
| 493 |
+
|
| 494 |
+
.cta-button::before {
|
| 495 |
+
content: '';
|
| 496 |
+
position: absolute;
|
| 497 |
+
top: 0;
|
| 498 |
+
left: -100%;
|
| 499 |
+
width: 100%;
|
| 500 |
+
height: 100%;
|
| 501 |
+
background: linear-gradient(
|
| 502 |
+
90deg,
|
| 503 |
+
transparent,
|
| 504 |
+
rgba(255, 255, 255, 0.2),
|
| 505 |
+
transparent
|
| 506 |
+
);
|
| 507 |
+
transition: 0.5s;
|
| 508 |
+
}
|
| 509 |
+
|
| 510 |
+
.cta-button:hover::before {
|
| 511 |
+
left: 100%;
|
| 512 |
+
}
|
| 513 |
+
|
| 514 |
+
.cta-button:hover {
|
| 515 |
+
transform: translateY(-5px);
|
| 516 |
+
box-shadow:
|
| 517 |
+
0 15px 30px rgba(109, 40, 217, 0.5),
|
| 518 |
+
0 0 50px rgba(139, 92, 246, 0.3);
|
| 519 |
+
}
|
| 520 |
+
|
| 521 |
+
.cta-button:hover {
|
| 522 |
+
transform: translateY(-5px);
|
| 523 |
+
box-shadow:
|
| 524 |
+
0 15px 30px rgba(0, 229, 255, 0.4),
|
| 525 |
+
0 0 50px rgba(37, 99, 235, 0.3);
|
| 526 |
+
background: linear-gradient(135deg, #00e5ff, #2563eb);
|
| 527 |
+
}
|
| 528 |
+
|
| 529 |
+
.cta-button::before {
|
| 530 |
+
content: '';
|
| 531 |
+
position: absolute;
|
| 532 |
+
top: -2px;
|
| 533 |
+
left: -2px;
|
| 534 |
+
right: -2px;
|
| 535 |
+
bottom: -2px;
|
| 536 |
+
background: linear-gradient(270deg, #00e5ff, #2563eb, #00e5ff);
|
| 537 |
+
background-size: 400% 400%;
|
| 538 |
+
border-radius: 12px;
|
| 539 |
+
z-index: -1;
|
| 540 |
+
animation: borderAnimation 8s ease infinite;
|
| 541 |
+
}
|
| 542 |
+
|
| 543 |
+
@keyframes borderAnimation {
|
| 544 |
+
0% { background-position: 0% 50%; }
|
| 545 |
+
50% { background-position: 100% 50%; }
|
| 546 |
+
100% { background-position: 0% 50%; }
|
| 547 |
+
}
|
| 548 |
+
.cta-button:active {
|
| 549 |
+
transform: translateY(-2px);
|
| 550 |
+
box-shadow: 0 2px 10px rgba(0, 188, 212, 0.4);
|
| 551 |
+
}
|
| 552 |
+
.icon {
|
| 553 |
+
margin-right: 12px;
|
| 554 |
+
}
|
| 555 |
+
/* Ripple Effect for Button */
|
| 556 |
+
.cta-button span.ripple {
|
| 557 |
+
position: absolute;
|
| 558 |
+
border-radius: 50%;
|
| 559 |
+
transform: scale(0);
|
| 560 |
+
animation: rippleEffect 0.6s linear;
|
| 561 |
+
background: rgba(255, 255, 255, 0.6);
|
| 562 |
+
pointer-events: none;
|
| 563 |
+
}
|
| 564 |
+
@keyframes rippleEffect {
|
| 565 |
+
to {
|
| 566 |
+
transform: scale(4);
|
| 567 |
+
opacity: 0;
|
| 568 |
+
}
|
| 569 |
+
}
|
| 570 |
+
/* Scroll Indicator */
|
| 571 |
+
.scroll-indicator {
|
| 572 |
+
position: absolute;
|
| 573 |
+
bottom: 20px;
|
| 574 |
+
left: 50%;
|
| 575 |
+
transform: translateX(-50%);
|
| 576 |
+
z-index: 2;
|
| 577 |
+
}
|
| 578 |
+
.arrow {
|
| 579 |
+
display: block;
|
| 580 |
+
width: 24px;
|
| 581 |
+
height: 24px;
|
| 582 |
+
border-left: 2px solid #00e5ff;
|
| 583 |
+
border-bottom: 2px solid #00e5ff;
|
| 584 |
+
transform: rotate(-45deg);
|
| 585 |
+
animation: bounce 2s infinite;
|
| 586 |
+
}
|
| 587 |
+
@keyframes bounce {
|
| 588 |
+
0%, 20%, 50%, 80%, 100% { transform: translateX(-50%) translateY(0) rotate(-45deg); }
|
| 589 |
+
40% { transform: translateX(-50%) translateY(10px) rotate(-45deg); }
|
| 590 |
+
60% { transform: translateX(-50%) translateY(5px) rotate(-45deg); }
|
| 591 |
+
}
|
| 592 |
+
/* Sections General Styling */
|
| 593 |
+
.section {
|
| 594 |
+
padding: 80px 20px;
|
| 595 |
+
position: relative;
|
| 596 |
+
}
|
| 597 |
+
.section::before {
|
| 598 |
+
content: '';
|
| 599 |
+
position: absolute;
|
| 600 |
+
top: 0;
|
| 601 |
+
left: 0;
|
| 602 |
+
right: 0;
|
| 603 |
+
height: 1px;
|
| 604 |
+
background: linear-gradient(90deg, transparent, rgba(0, 229, 255, 0.3), transparent);
|
| 605 |
+
}
|
| 606 |
+
.container {
|
| 607 |
+
max-width: 1200px;
|
| 608 |
+
margin: 0 auto;
|
| 609 |
+
text-align: center;
|
| 610 |
+
}
|
| 611 |
+
.section h2 {
|
| 612 |
+
font-family: 'Orbitron', sans-serif;
|
| 613 |
+
font-size: 2.5em;
|
| 614 |
+
margin-bottom: 20px;
|
| 615 |
+
color: #fff;
|
| 616 |
+
position: relative;
|
| 617 |
+
display: inline-block;
|
| 618 |
+
padding-bottom: 15px;
|
| 619 |
+
}
|
| 620 |
+
.section h2::after {
|
| 621 |
+
content: '';
|
| 622 |
+
position: absolute;
|
| 623 |
+
bottom: 0;
|
| 624 |
+
left: 30%;
|
| 625 |
+
right: 30%;
|
| 626 |
+
height: 3px;
|
| 627 |
+
background: linear-gradient(90deg, transparent, #00e5ff, transparent);
|
| 628 |
+
}
|
| 629 |
+
.section p {
|
| 630 |
+
font-size: 1.2em;
|
| 631 |
+
line-height: 1.6;
|
| 632 |
+
margin: 0 auto 40px;
|
| 633 |
+
color: #bbb;
|
| 634 |
+
max-width: 800px;
|
| 635 |
+
}
|
| 636 |
+
/* Features Section */
|
| 637 |
+
.section.features {
|
| 638 |
+
background: linear-gradient(180deg, #0a0a1a, #1a1a1a);
|
| 639 |
+
}
|
| 640 |
+
.features-list {
|
| 641 |
+
display: flex;
|
| 642 |
+
justify-content: center;
|
| 643 |
+
flex-wrap: wrap;
|
| 644 |
+
gap: 30px;
|
| 645 |
+
margin-top: 50px;
|
| 646 |
+
}
|
| 647 |
+
.feature-item {
|
| 648 |
+
flex: 1 1 300px;
|
| 649 |
+
max-width: 350px;
|
| 650 |
+
text-align: center;
|
| 651 |
+
padding: 3rem 2.5rem;
|
| 652 |
+
border-radius: 6px;
|
| 653 |
+
background: rgba(255, 255, 255, 0.02);
|
| 654 |
+
border: 1px solid rgba(255, 255, 255, 0.05);
|
| 655 |
+
box-shadow: var(--glass-shadow);
|
| 656 |
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
| 657 |
+
position: relative;
|
| 658 |
+
overflow: hidden;
|
| 659 |
+
}
|
| 660 |
+
|
| 661 |
+
.feature-item::before {
|
| 662 |
+
content: '';
|
| 663 |
+
position: absolute;
|
| 664 |
+
top: 0;
|
| 665 |
+
left: 0;
|
| 666 |
+
width: 100%;
|
| 667 |
+
height: 100%;
|
| 668 |
+
background: linear-gradient(45deg, transparent, var(--accent), transparent);
|
| 669 |
+
opacity: 0;
|
| 670 |
+
transition: opacity 0.4s ease;
|
| 671 |
+
}
|
| 672 |
+
|
| 673 |
+
.feature-item:hover::before {
|
| 674 |
+
opacity: 0.1;
|
| 675 |
+
}
|
| 676 |
+
|
| 677 |
+
.feature-item:hover {
|
| 678 |
+
transform: translateY(-8px) scale(1.02);
|
| 679 |
+
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4),
|
| 680 |
+
0 0 20px rgba(0, 229, 255, 0.2);
|
| 681 |
+
border-color: var(--accent);
|
| 682 |
+
background: linear-gradient(145deg,
|
| 683 |
+
rgba(30, 30, 63, 0.7),
|
| 684 |
+
rgba(30, 30, 63, 0.3)
|
| 685 |
+
);
|
| 686 |
+
}
|
| 687 |
+
|
| 688 |
+
.feature-item:hover {
|
| 689 |
+
transform: translateY(-5px);
|
| 690 |
+
box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
|
| 691 |
+
border-color: var(--primary);
|
| 692 |
+
}
|
| 693 |
+
.feature-item:hover {
|
| 694 |
+
transform: translateY(-15px);
|
| 695 |
+
box-shadow: 0 15px 30px rgba(0, 0, 0, 0.4), 0 0 20px rgba(0, 229, 255, 0.2);
|
| 696 |
+
border-color: rgba(0, 229, 255, 0.3);
|
| 697 |
+
background: rgba(0, 20, 40, 0.4);
|
| 698 |
+
}
|
| 699 |
+
.feature-icon {
|
| 700 |
+
margin-bottom: 25px;
|
| 701 |
+
color: #00e5ff;
|
| 702 |
+
transition: all 0.5s ease;
|
| 703 |
+
font-size: 1.2em;
|
| 704 |
+
}
|
| 705 |
+
.feature-item:hover .feature-icon {
|
| 706 |
+
transform: rotate(360deg) scale(1.2);
|
| 707 |
+
color: #00e5ff;
|
| 708 |
+
filter: drop-shadow(0 0 10px rgba(0, 229, 255, 0.8));
|
| 709 |
+
}
|
| 710 |
+
.feature-item h3 {
|
| 711 |
+
font-family: 'Orbitron', sans-serif;
|
| 712 |
+
font-size: 1.6em;
|
| 713 |
+
margin-bottom: 15px;
|
| 714 |
+
color: #fff;
|
| 715 |
+
letter-spacing: 1px;
|
| 716 |
+
}
|
| 717 |
+
.feature-item p {
|
| 718 |
+
font-size: 1.05em;
|
| 719 |
+
color: #ccc;
|
| 720 |
+
line-height: 1.6;
|
| 721 |
+
margin-bottom: 0;
|
| 722 |
+
}
|
| 723 |
+
/* Testimonials Section */
|
| 724 |
+
.section.testimonials {
|
| 725 |
+
background: #0a0a1a;
|
| 726 |
+
padding: 60px 20px;
|
| 727 |
+
}
|
| 728 |
+
.testimonial-carousel {
|
| 729 |
+
position: relative;
|
| 730 |
+
max-width: 800px;
|
| 731 |
+
margin: 0 auto;
|
| 732 |
+
padding: 20px;
|
| 733 |
+
}
|
| 734 |
+
.testimonial-item {
|
| 735 |
+
display: none;
|
| 736 |
+
animation: fadeEffect 0.8s;
|
| 737 |
+
background: rgba(0, 0, 0, 0.4);
|
| 738 |
+
border-radius: 10px;
|
| 739 |
+
padding: 30px;
|
| 740 |
+
border: 1px solid #333;
|
| 741 |
+
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);
|
| 742 |
+
}
|
| 743 |
+
.testimonial-item.active {
|
| 744 |
+
display: flex;
|
| 745 |
+
flex-direction: column;
|
| 746 |
+
align-items: center;
|
| 747 |
+
text-align: center;
|
| 748 |
+
}
|
| 749 |
+
@keyframes fadeEffect {
|
| 750 |
+
from { opacity: 0.4; }
|
| 751 |
+
to { opacity: 1; }
|
| 752 |
+
}
|
| 753 |
+
.testimonial-avatar {
|
| 754 |
+
margin-bottom: 20px;
|
| 755 |
+
}
|
| 756 |
+
.avatar-placeholder {
|
| 757 |
+
width: 80px;
|
| 758 |
+
height: 80px;
|
| 759 |
+
border-radius: 50%;
|
| 760 |
+
background: linear-gradient(135deg, #00bcd4, #0097a7);
|
| 761 |
+
position: relative;
|
| 762 |
+
overflow: hidden;
|
| 763 |
+
}
|
| 764 |
+
.avatar-placeholder::before {
|
| 765 |
+
content: '';
|
| 766 |
+
position: absolute;
|
| 767 |
+
top: 20%;
|
| 768 |
+
left: 50%;
|
| 769 |
+
transform: translateX(-50%);
|
| 770 |
+
width: 40%;
|
| 771 |
+
height: 40%;
|
| 772 |
+
background: rgba(255, 255, 255, 0.2);
|
| 773 |
+
border-radius: 50%;
|
| 774 |
+
}
|
| 775 |
+
.testimonial-content p {
|
| 776 |
+
font-size: 1.1em;
|
| 777 |
+
line-height: 1.6;
|
| 778 |
+
margin-bottom: 20px;
|
| 779 |
+
color: #ddd;
|
| 780 |
+
font-style: italic;
|
| 781 |
+
}
|
| 782 |
+
.testimonial-content h4 {
|
| 783 |
+
font-family: 'Orbitron', sans-serif;
|
| 784 |
+
font-size: 1.2em;
|
| 785 |
+
margin-bottom: 5px;
|
| 786 |
+
color: #00e5ff;
|
| 787 |
+
}
|
| 788 |
+
.testimonial-content span {
|
| 789 |
+
font-size: 0.9em;
|
| 790 |
+
color: #aaa;
|
| 791 |
+
}
|
| 792 |
+
.testimonial-nav {
|
| 793 |
+
display: flex;
|
| 794 |
+
justify-content: center;
|
| 795 |
+
align-items: center;
|
| 796 |
+
margin-top: 30px;
|
| 797 |
+
}
|
| 798 |
+
.prev-btn, .next-btn {
|
| 799 |
+
background: none;
|
| 800 |
+
border: none;
|
| 801 |
+
color: #00e5ff;
|
| 802 |
+
font-size: 1.5em;
|
| 803 |
+
cursor: pointer;
|
| 804 |
+
margin: 0 15px;
|
| 805 |
+
transition: transform 0.3s;
|
| 806 |
+
}
|
| 807 |
+
.prev-btn:hover, .next-btn:hover {
|
| 808 |
+
transform: scale(1.2);
|
| 809 |
+
}
|
| 810 |
+
.indicator-dots {
|
| 811 |
+
display: flex;
|
| 812 |
+
justify-content: center;
|
| 813 |
+
}
|
| 814 |
+
.dot {
|
| 815 |
+
height: 12px;
|
| 816 |
+
width: 12px;
|
| 817 |
+
margin: 0 5px;
|
| 818 |
+
background-color: #555;
|
| 819 |
+
border-radius: 50%;
|
| 820 |
+
cursor: pointer;
|
| 821 |
+
transition: background-color 0.3s;
|
| 822 |
+
}
|
| 823 |
+
.dot.active {
|
| 824 |
+
background-color: #00e5ff;
|
| 825 |
+
}
|
| 826 |
+
/* Risk Calculator Section */
|
| 827 |
+
.section.calculator {
|
| 828 |
+
background: linear-gradient(135deg, #111, #0a192f);
|
| 829 |
+
padding: 60px 20px;
|
| 830 |
+
}
|
| 831 |
+
|
| 832 |
+
/* Progress Stepper */
|
| 833 |
+
.progress-stepper {
|
| 834 |
+
display: flex;
|
| 835 |
+
justify-content: space-between;
|
| 836 |
+
margin-bottom: 40px;
|
| 837 |
+
padding: 20px 40px;
|
| 838 |
+
position: relative;
|
| 839 |
+
}
|
| 840 |
+
|
| 841 |
+
.progress-stepper::before {
|
| 842 |
+
content: '';
|
| 843 |
+
position: absolute;
|
| 844 |
+
top: 50%;
|
| 845 |
+
left: 0;
|
| 846 |
+
right: 0;
|
| 847 |
+
height: 2px;
|
| 848 |
+
background: rgba(0, 229, 255, 0.2);
|
| 849 |
+
transform: translateY(-50%);
|
| 850 |
+
z-index: 1;
|
| 851 |
+
}
|
| 852 |
+
|
| 853 |
+
.step {
|
| 854 |
+
display: flex;
|
| 855 |
+
flex-direction: column;
|
| 856 |
+
align-items: center;
|
| 857 |
+
position: relative;
|
| 858 |
+
z-index: 2;
|
| 859 |
+
transition: all 0.3s ease;
|
| 860 |
+
}
|
| 861 |
+
|
| 862 |
+
.step-number {
|
| 863 |
+
width: 40px;
|
| 864 |
+
height: 40px;
|
| 865 |
+
border-radius: 50%;
|
| 866 |
+
background: rgba(0, 229, 255, 0.1);
|
| 867 |
+
border: 2px solid rgba(0, 229, 255, 0.3);
|
| 868 |
+
display: flex;
|
| 869 |
+
align-items: center;
|
| 870 |
+
justify-content: center;
|
| 871 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 872 |
+
font-weight: 600;
|
| 873 |
+
color: #fff;
|
| 874 |
+
margin-bottom: 10px;
|
| 875 |
+
transition: all 0.3s ease;
|
| 876 |
+
}
|
| 877 |
+
|
| 878 |
+
.step.active .step-number {
|
| 879 |
+
background: #00e5ff;
|
| 880 |
+
border-color: #00e5ff;
|
| 881 |
+
box-shadow: 0 0 20px rgba(0, 229, 255, 0.4);
|
| 882 |
+
}
|
| 883 |
+
|
| 884 |
+
.step-label {
|
| 885 |
+
font-size: 0.9em;
|
| 886 |
+
color: rgba(255, 255, 255, 0.7);
|
| 887 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 888 |
+
}
|
| 889 |
+
|
| 890 |
+
.step.active .step-label {
|
| 891 |
+
color: #00e5ff;
|
| 892 |
+
}
|
| 893 |
+
|
| 894 |
+
/* Premium Form Styles */
|
| 895 |
+
.form-group input,
|
| 896 |
+
.form-group select {
|
| 897 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.4), rgba(0, 10, 30, 0.6));
|
| 898 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 899 |
+
border-radius: 12px;
|
| 900 |
+
padding: 16px 20px;
|
| 901 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 902 |
+
color: var(--text);
|
| 903 |
+
font-size: 1.05em;
|
| 904 |
+
letter-spacing: 0.5px;
|
| 905 |
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
| 906 |
+
box-shadow:
|
| 907 |
+
inset 0 2px 4px rgba(0, 0, 0, 0.1),
|
| 908 |
+
0 0 10px rgba(0, 229, 255, 0.05);
|
| 909 |
+
}
|
| 910 |
+
|
| 911 |
+
.form-group input:hover,
|
| 912 |
+
.form-group select:hover {
|
| 913 |
+
border-color: rgba(0, 229, 255, 0.4);
|
| 914 |
+
box-shadow:
|
| 915 |
+
inset 0 2px 4px rgba(0, 0, 0, 0.1),
|
| 916 |
+
0 0 15px rgba(0, 229, 255, 0.1);
|
| 917 |
+
}
|
| 918 |
+
|
| 919 |
+
.form-group input:focus,
|
| 920 |
+
.form-group select:focus {
|
| 921 |
+
border-color: var(--accent);
|
| 922 |
+
outline: none;
|
| 923 |
+
background: linear-gradient(145deg, rgba(0, 30, 60, 0.4), rgba(0, 20, 50, 0.6));
|
| 924 |
+
box-shadow:
|
| 925 |
+
00 0 0 3px rgba(0, 229, 255, 0.1),
|
| 926 |
+
0 0 20px rgba(0, 229, 255, 0.2);
|
| 927 |
+
}
|
| 928 |
+
|
| 929 |
+
.form-group label {
|
| 930 |
+
font-weight: 500;
|
| 931 |
+
font-size: 1.1em;
|
| 932 |
+
color: var(--text);
|
| 933 |
+
margin-bottom: 12px;
|
| 934 |
+
display: flex;
|
| 935 |
+
align-items: center;
|
| 936 |
+
letter-spacing: 0.5px;
|
| 937 |
+
}
|
| 938 |
+
|
| 939 |
+
.form-group input:focus,
|
| 940 |
+
.form-group select:focus {
|
| 941 |
+
border-color: #00e5ff;
|
| 942 |
+
box-shadow: 0 0 15px rgba(0, 229, 255, 0.2);
|
| 943 |
+
background: rgba(0, 20, 40, 0.5);
|
| 944 |
+
}
|
| 945 |
+
|
| 946 |
+
.form-group label {
|
| 947 |
+
margin-bottom: 10px;
|
| 948 |
+
display: flex;
|
| 949 |
+
align-items: center;
|
| 950 |
+
font-weight: 500;
|
| 951 |
+
color: rgba(255, 255, 255, 0.9);
|
| 952 |
+
}
|
| 953 |
+
|
| 954 |
+
/* Validation Styles */
|
| 955 |
+
.form-group.error input,
|
| 956 |
+
.form-group.error select {
|
| 957 |
+
border-color: #ef4444 !important;
|
| 958 |
+
box-shadow: 0 0 15px rgba(239, 68, 68, 0.2) !important;
|
| 959 |
+
background: rgba(239, 68, 68, 0.05) !important;
|
| 960 |
+
animation: shake 0.5s;
|
| 961 |
+
}
|
| 962 |
+
|
| 963 |
+
.form-group.error label {
|
| 964 |
+
color: #ef4444;
|
| 965 |
+
}
|
| 966 |
+
|
| 967 |
+
.validation-message.error {
|
| 968 |
+
color: #ef4444;
|
| 969 |
+
font-size: 0.85em;
|
| 970 |
+
margin-top: 8px;
|
| 971 |
+
padding: 8px 12px;
|
| 972 |
+
background: rgba(239, 68, 68, 0.1);
|
| 973 |
+
border-radius: 6px;
|
| 974 |
+
display: flex;
|
| 975 |
+
align-items: center;
|
| 976 |
+
gap: 6px;
|
| 977 |
+
}
|
| 978 |
+
|
| 979 |
+
.validation-message.error strong {
|
| 980 |
+
font-weight: 600;
|
| 981 |
+
}
|
| 982 |
+
|
| 983 |
+
@keyframes shake {
|
| 984 |
+
0%, 100% { transform: translateX(0); }
|
| 985 |
+
25% { transform: translateX(-8px); }
|
| 986 |
+
75% { transform: translateX(8px); }
|
| 987 |
+
}
|
| 988 |
+
|
| 989 |
+
.form-group.success input {
|
| 990 |
+
border-color: #22c55e;
|
| 991 |
+
}
|
| 992 |
+
|
| 993 |
+
.validation-message {
|
| 994 |
+
font-size: 0.85em;
|
| 995 |
+
margin-top: 5px;
|
| 996 |
+
display: flex;
|
| 997 |
+
align-items: center;
|
| 998 |
+
gap: 5px;
|
| 999 |
+
}
|
| 1000 |
+
|
| 1001 |
+
.validation-message.error {
|
| 1002 |
+
color: #ef4444;
|
| 1003 |
+
}
|
| 1004 |
+
|
| 1005 |
+
.validation-message.success {
|
| 1006 |
+
color: #22c55e;
|
| 1007 |
+
}
|
| 1008 |
+
.calculator-container {
|
| 1009 |
+
max-width: 800px;
|
| 1010 |
+
margin: 0 auto;
|
| 1011 |
+
background: rgba(26, 26, 26, 0.7);
|
| 1012 |
+
border-radius: 10px;
|
| 1013 |
+
padding: 30px;
|
| 1014 |
+
border: 1px solid #333;
|
| 1015 |
+
box-shadow: 0 0 20px rgba(0, 229, 255, 0.2);
|
| 1016 |
+
}
|
| 1017 |
+
.assessment-form {
|
| 1018 |
+
margin-bottom: 30px;
|
| 1019 |
+
}
|
| 1020 |
+
.form-row {
|
| 1021 |
+
display: flex;
|
| 1022 |
+
justify-content: space-between;
|
| 1023 |
+
flex-wrap: wrap;
|
| 1024 |
+
margin-bottom: 20px;
|
| 1025 |
+
}
|
| 1026 |
+
.form-group {
|
| 1027 |
+
flex: 0 0 48%;
|
| 1028 |
+
margin-bottom: 15px;
|
| 1029 |
+
}
|
| 1030 |
+
.form-section-title {
|
| 1031 |
+
width: 100%;
|
| 1032 |
+
font-family: 'Orbitron', sans-serif;
|
| 1033 |
+
color: #00e5ff;
|
| 1034 |
+
margin: 20px 0 10px 0;
|
| 1035 |
+
font-size: 1.2em;
|
| 1036 |
+
border-bottom: 1px solid #333;
|
| 1037 |
+
padding-bottom: 5px;
|
| 1038 |
+
}
|
| 1039 |
+
.form-group label {
|
| 1040 |
+
display: block;
|
| 1041 |
+
margin-bottom: 8px;
|
| 1042 |
+
color: #ddd;
|
| 1043 |
+
font-family: 'Orbitron', sans-serif;
|
| 1044 |
+
}
|
| 1045 |
+
.form-group input,
|
| 1046 |
+
.form-group select {
|
| 1047 |
+
width: 100%;
|
| 1048 |
+
padding: 10px;
|
| 1049 |
+
border-radius: 5px;
|
| 1050 |
+
border: 1px solid #444;
|
| 1051 |
+
background: rgba(0, 0, 0, 0.3);
|
| 1052 |
+
color: #fff;
|
| 1053 |
+
font-size: 1em;
|
| 1054 |
+
}
|
| 1055 |
+
.form-group input:focus,
|
| 1056 |
+
.form-group select:focus {
|
| 1057 |
+
outline: none;
|
| 1058 |
+
border-color: #00e5ff;
|
| 1059 |
+
box-shadow: 0 0 5px rgba(0, 229, 255, 0.5);
|
| 1060 |
+
}
|
| 1061 |
+
.calculate-btn {
|
| 1062 |
+
width: 100%;
|
| 1063 |
+
margin-top: 25px;
|
| 1064 |
+
background: linear-gradient(135deg, #00bcd4, #0097a7);
|
| 1065 |
+
border: none;
|
| 1066 |
+
}
|
| 1067 |
+
.calculate-btn:hover {
|
| 1068 |
+
background: linear-gradient(135deg, #00e5ff, #00b0c7);
|
| 1069 |
+
}
|
| 1070 |
+
/* Premium Result Container Styles */
|
| 1071 |
+
.result-container {
|
| 1072 |
+
margin-top: 35px;
|
| 1073 |
+
padding: 30px;
|
| 1074 |
+
max-width: 680px;
|
| 1075 |
+
margin-left: auto;
|
| 1076 |
+
margin-right: auto;
|
| 1077 |
+
background: linear-gradient(165deg,
|
| 1078 |
+
rgba(0, 20, 40, 0.95),
|
| 1079 |
+
rgba(0, 10, 30, 0.98)
|
| 1080 |
+
);
|
| 1081 |
+
border-radius: 20px;
|
| 1082 |
+
border: 2px solid rgba(0, 229, 255, 0.35);
|
| 1083 |
+
box-shadow:
|
| 1084 |
+
0 20px 40px rgba(0, 0, 0, 0.6),
|
| 1085 |
+
0 0 80px rgba(0, 229, 255, 0.2),
|
| 1086 |
+
inset 0 0 60px rgba(0, 229, 255, 0.1);
|
| 1087 |
+
backdrop-filter: blur(20px);
|
| 1088 |
+
transition: all 0.7s cubic-bezier(0.4, 0, 0.2, 1);
|
| 1089 |
+
transform: translateY(20px) scale(0.95);
|
| 1090 |
+
opacity: 0;
|
| 1091 |
+
position: relative;
|
| 1092 |
+
overflow: hidden;
|
| 1093 |
+
display: grid;
|
| 1094 |
+
gap: 25px;
|
| 1095 |
+
grid-template-columns: 1fr;
|
| 1096 |
+
}
|
| 1097 |
+
|
| 1098 |
+
.result-container::before {
|
| 1099 |
+
content: '';
|
| 1100 |
+
position: absolute;
|
| 1101 |
+
top: 0;
|
| 1102 |
+
left: -100%;
|
| 1103 |
+
width: 200%;
|
| 1104 |
+
height: 100%;
|
| 1105 |
+
background: linear-gradient(
|
| 1106 |
+
90deg,
|
| 1107 |
+
transparent,
|
| 1108 |
+
rgba(0, 229, 255, 0.1),
|
| 1109 |
+
transparent
|
| 1110 |
+
);
|
| 1111 |
+
animation: shimmer 8s infinite linear;
|
| 1112 |
+
}
|
| 1113 |
+
|
| 1114 |
+
@keyframes shimmer {
|
| 1115 |
+
0% { transform: translateX(-100%); }
|
| 1116 |
+
100% { transform: translateX(100%); }
|
| 1117 |
+
}
|
| 1118 |
+
|
| 1119 |
+
.result-container.visible {
|
| 1120 |
+
transform: translateY(0) scale(1);
|
| 1121 |
+
opacity: 1;
|
| 1122 |
+
animation: resultAppear 1.2s cubic-bezier(0.4, 0, 0.2, 1);
|
| 1123 |
+
}
|
| 1124 |
+
|
| 1125 |
+
.result-container:hover {
|
| 1126 |
+
transform: translateY(-15px) scale(1.02);
|
| 1127 |
+
box-shadow:
|
| 1128 |
+
0 50px 100px rgba(0, 0, 0, 0.8),
|
| 1129 |
+
0 0 200px rgba(0, 229, 255, 0.35),
|
| 1130 |
+
inset 0 0 140px rgba(0, 229, 255, 0.25);
|
| 1131 |
+
border-color: rgba(0, 229, 255, 0.8);
|
| 1132 |
+
border-width: 2px;
|
| 1133 |
+
background: linear-gradient(165deg,
|
| 1134 |
+
rgba(0, 25, 50, 0.95),
|
| 1135 |
+
rgba(0, 15, 35, 0.98)
|
| 1136 |
+
);
|
| 1137 |
+
}
|
| 1138 |
+
|
| 1139 |
+
.result-container::after {
|
| 1140 |
+
content: '';
|
| 1141 |
+
position: absolute;
|
| 1142 |
+
inset: 0;
|
| 1143 |
+
background: radial-gradient(
|
| 1144 |
+
800px circle at var(--mouse-x, 50%) var(--mouse-y, 50%),
|
| 1145 |
+
rgba(0, 229, 255, 0.06),
|
| 1146 |
+
transparent 40%
|
| 1147 |
+
);
|
| 1148 |
+
opacity: 0;
|
| 1149 |
+
transition: opacity 0.3s;
|
| 1150 |
+
}
|
| 1151 |
+
|
| 1152 |
+
.result-container:hover::after {
|
| 1153 |
+
opacity: 1;
|
| 1154 |
+
}
|
| 1155 |
+
|
| 1156 |
+
.result-container.visible {
|
| 1157 |
+
transform: translateY(0) scale(1);
|
| 1158 |
+
opacity: 1;
|
| 1159 |
+
animation: resultAppear 0.8s cubic-bezier(0.4, 0, 0.2, 1),
|
| 1160 |
+
pulseGlow 3s infinite;
|
| 1161 |
+
}
|
| 1162 |
+
|
| 1163 |
+
@keyframes pulseGlow {
|
| 1164 |
+
0% { box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6), 0 0 80px rgba(0, 229, 255, 0.2); }
|
| 1165 |
+
50% { box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6), 0 0 100px rgba(0, 229, 255, 0.3); }
|
| 1166 |
+
100% { box-shadow: 0 20px 40px rgba(0, 0, 0, 0.6), 0 0 80px rgba(0, 229, 255, 0.2); }
|
| 1167 |
+
}
|
| 1168 |
+
|
| 1169 |
+
.result-container:hover::after {
|
| 1170 |
+
content: '';
|
| 1171 |
+
position: absolute;
|
| 1172 |
+
inset: 0;
|
| 1173 |
+
background: radial-gradient(
|
| 1174 |
+
circle at var(--x, 50%) var(--y, 50%),
|
| 1175 |
+
rgba(0, 229, 255, 0.1) 0%,
|
| 1176 |
+
transparent 50%
|
| 1177 |
+
);
|
| 1178 |
+
pointer-events: none;
|
| 1179 |
+
transition: opacity 0.3s;
|
| 1180 |
+
}
|
| 1181 |
+
|
| 1182 |
+
@keyframes resultAppear {
|
| 1183 |
+
0% {
|
| 1184 |
+
transform: translateY(40px) scale(0.95);
|
| 1185 |
+
opacity: 0;
|
| 1186 |
+
}
|
| 1187 |
+
100% {
|
| 1188 |
+
transform: translateY(0) scale(1);
|
| 1189 |
+
opacity: 1;
|
| 1190 |
+
}
|
| 1191 |
+
}
|
| 1192 |
+
|
| 1193 |
+
.result-container::before {
|
| 1194 |
+
content: '';
|
| 1195 |
+
position: absolute;
|
| 1196 |
+
top: -1px;
|
| 1197 |
+
left: -1px;
|
| 1198 |
+
right: -1px;
|
| 1199 |
+
bottom: -1px;
|
| 1200 |
+
background: linear-gradient(45deg,
|
| 1201 |
+
transparent,
|
| 1202 |
+
rgba(0, 229, 255, 0.1),
|
| 1203 |
+
transparent
|
| 1204 |
+
);
|
| 1205 |
+
border-radius: 24px;
|
| 1206 |
+
z-index: -1;
|
| 1207 |
+
animation: borderGlow 6s linear infinite;
|
| 1208 |
+
}
|
| 1209 |
+
|
| 1210 |
+
@keyframes borderGlow {
|
| 1211 |
+
0%, 100% { opacity: 0.5; }
|
| 1212 |
+
50% { opacity: 1; }
|
| 1213 |
+
}
|
| 1214 |
+
|
| 1215 |
+
.premium-badge {
|
| 1216 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 1217 |
+
padding: 6px 12px;
|
| 1218 |
+
border-radius: 20px;
|
| 1219 |
+
font-size: 0.9em;
|
| 1220 |
+
font-weight: 500;
|
| 1221 |
+
color: #000;
|
| 1222 |
+
box-shadow: 0 2px 10px rgba(0, 229, 255, 0.3);
|
| 1223 |
+
}
|
| 1224 |
+
|
| 1225 |
+
.update-badge {
|
| 1226 |
+
background: linear-gradient(135deg, #22c55e, #16a34a);
|
| 1227 |
+
padding: 4px 10px;
|
| 1228 |
+
border-radius: 12px;
|
| 1229 |
+
font-size: 0.8em;
|
| 1230 |
+
color: #fff;
|
| 1231 |
+
}
|
| 1232 |
+
|
| 1233 |
+
.chart-controls,
|
| 1234 |
+
.trend-period {
|
| 1235 |
+
display: flex;
|
| 1236 |
+
gap: 10px;
|
| 1237 |
+
margin-bottom: 15px;
|
| 1238 |
+
}
|
| 1239 |
+
|
| 1240 |
+
.chart-toggle,
|
| 1241 |
+
.period-toggle {
|
| 1242 |
+
background: rgba(0, 229, 255, 0.1);
|
| 1243 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 1244 |
+
padding: 8px 16px;
|
| 1245 |
+
border-radius: 20px;
|
| 1246 |
+
color: var(--text);
|
| 1247 |
+
cursor: pointer;
|
| 1248 |
+
transition: all 0.3s ease;
|
| 1249 |
+
}
|
| 1250 |
+
|
| 1251 |
+
.chart-toggle.active,
|
| 1252 |
+
.period-toggle.active {
|
| 1253 |
+
background: var(--accent);
|
| 1254 |
+
color: #000;
|
| 1255 |
+
box-shadow: 0 0 15px rgba(0, 229, 255, 0.3);
|
| 1256 |
+
}
|
| 1257 |
+
|
| 1258 |
+
.insights-grid {
|
| 1259 |
+
display: grid;
|
| 1260 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
| 1261 |
+
gap: 20px;
|
| 1262 |
+
margin-top: 20px;
|
| 1263 |
+
}
|
| 1264 |
+
|
| 1265 |
+
.insight-card {
|
| 1266 |
+
background: linear-gradient(145deg,
|
| 1267 |
+
rgba(0, 20, 40, 0.4),
|
| 1268 |
+
rgba(0, 10, 30, 0.6)
|
| 1269 |
+
);
|
| 1270 |
+
padding: 25px;
|
| 1271 |
+
border-radius: 16px;
|
| 1272 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 1273 |
+
transition: all 0.3s ease;
|
| 1274 |
+
}
|
| 1275 |
+
|
| 1276 |
+
.insight-card:hover {
|
| 1277 |
+
transform: translateY(-5px);
|
| 1278 |
+
box-shadow: 0 10px 20px rgba(0, 229, 255, 0.1);
|
| 1279 |
+
border-color: rgba(0, 229, 255, 0.3);
|
| 1280 |
+
}
|
| 1281 |
+
|
| 1282 |
+
.insight-icon {
|
| 1283 |
+
font-size: 2em;
|
| 1284 |
+
margin-bottom: 15px;
|
| 1285 |
+
}
|
| 1286 |
+
|
| 1287 |
+
.insight-card h5 {
|
| 1288 |
+
color: var(--accent);
|
| 1289 |
+
font-size: 1.2em;
|
| 1290 |
+
margin-bottom: 10px;
|
| 1291 |
+
}
|
| 1292 |
+
|
| 1293 |
+
.insight-card p {
|
| 1294 |
+
color: var(--text-secondary);
|
| 1295 |
+
font-size: 0.95em;
|
| 1296 |
+
line-height: 1.6;
|
| 1297 |
+
}
|
| 1298 |
+
|
| 1299 |
+
.result-container.visible {
|
| 1300 |
+
transform: translateY(0);
|
| 1301 |
+
opacity: 1;
|
| 1302 |
+
}
|
| 1303 |
+
|
| 1304 |
+
.result-container:hover {
|
| 1305 |
+
transform: translateY(-5px);
|
| 1306 |
+
box-shadow:
|
| 1307 |
+
0 25px 50px rgba(0, 0, 0, 0.5),
|
| 1308 |
+
0 0 120px rgba(0, 229, 255, 0.15),
|
| 1309 |
+
inset 0 0 80px rgba(0, 229, 255, 0.08);
|
| 1310 |
+
}
|
| 1311 |
+
|
| 1312 |
+
.result-dashboard {
|
| 1313 |
+
display: grid;
|
| 1314 |
+
grid-template-columns: repeat(2, 1fr);
|
| 1315 |
+
gap: 30px;
|
| 1316 |
+
animation: fadeInUp 0.8s ease-out;
|
| 1317 |
+
}
|
| 1318 |
+
|
| 1319 |
+
@keyframes fadeInUp {
|
| 1320 |
+
from {
|
| 1321 |
+
opacity: 0;
|
| 1322 |
+
transform: translateY(20px);
|
| 1323 |
+
}
|
| 1324 |
+
to {
|
| 1325 |
+
opacity: 1;
|
| 1326 |
+
transform: translateY(0);
|
| 1327 |
+
}
|
| 1328 |
+
}
|
| 1329 |
+
|
| 1330 |
+
.result-card {
|
| 1331 |
+
padding: 25px;
|
| 1332 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.6), rgba(0, 10, 30, 0.8));
|
| 1333 |
+
border-radius: 15px;
|
| 1334 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 1335 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
| 1336 |
+
}
|
| 1337 |
+
|
| 1338 |
+
.result-card::before {
|
| 1339 |
+
content: '';
|
| 1340 |
+
position: absolute;
|
| 1341 |
+
top: 0;
|
| 1342 |
+
left: 0;
|
| 1343 |
+
width: 100%;
|
| 1344 |
+
height: 2px;
|
| 1345 |
+
background: linear-gradient(90deg, transparent, rgba(0, 229, 255, 0.5), transparent);
|
| 1346 |
+
animation: shimmer 2s infinite;
|
| 1347 |
+
}
|
| 1348 |
+
|
| 1349 |
+
.result-card:hover {
|
| 1350 |
+
transform: translateY(-8px) scale(1.02);
|
| 1351 |
+
box-shadow:
|
| 1352 |
+
0 15px 30px rgba(0, 0, 0, 0.3),
|
| 1353 |
+
0 0 20px rgba(0, 229, 255, 0.2);
|
| 1354 |
+
border-color: rgba(0, 229, 255, 0.4);
|
| 1355 |
+
}
|
| 1356 |
+
|
| 1357 |
+
.stat-item {
|
| 1358 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.4), rgba(0, 10, 30, 0.6));
|
| 1359 |
+
border-radius: 12px;
|
| 1360 |
+
padding: 20px;
|
| 1361 |
+
text-align: center;
|
| 1362 |
+
transition: all 0.4s ease;
|
| 1363 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 1364 |
+
position: relative;
|
| 1365 |
+
overflow: hidden;
|
| 1366 |
+
}
|
| 1367 |
+
|
| 1368 |
+
.stat-item::after {
|
| 1369 |
+
content: '';
|
| 1370 |
+
position: absolute;
|
| 1371 |
+
top: -50%;
|
| 1372 |
+
left: -50%;
|
| 1373 |
+
width: 200%;
|
| 1374 |
+
height: 200%;
|
| 1375 |
+
background: radial-gradient(circle, rgba(0, 229, 255, 0.1) 0%, transparent 70%);
|
| 1376 |
+
opacity: 0;
|
| 1377 |
+
transition: opacity 0.4s ease;
|
| 1378 |
+
}
|
| 1379 |
+
|
| 1380 |
+
.stat-item:hover::after {
|
| 1381 |
+
opacity: 1;
|
| 1382 |
+
}
|
| 1383 |
+
|
| 1384 |
+
.stat-value {
|
| 1385 |
+
font-size: 2em;
|
| 1386 |
+
font-weight: 600;
|
| 1387 |
+
color: #00e5ff;
|
| 1388 |
+
text-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
|
| 1389 |
+
margin: 10px 0;
|
| 1390 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1391 |
+
}
|
| 1392 |
+
|
| 1393 |
+
.recommendations {
|
| 1394 |
+
grid-column: span 2;
|
| 1395 |
+
background: linear-gradient(165deg, rgba(0, 20, 40, 0.5), rgba(0, 10, 30, 0.7));
|
| 1396 |
+
border-radius: 15px;
|
| 1397 |
+
padding: 30px;
|
| 1398 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 1399 |
+
}
|
| 1400 |
+
|
| 1401 |
+
.recommendation-list li {
|
| 1402 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.4), rgba(0, 10, 30, 0.6));
|
| 1403 |
+
border-radius: 10px;
|
| 1404 |
+
padding: 15px 20px;
|
| 1405 |
+
margin: 10px 0;
|
| 1406 |
+
border-left: 3px solid #00e5ff;
|
| 1407 |
+
transition: all 0.3s ease;
|
| 1408 |
+
display: flex;
|
| 1409 |
+
align-items: center;
|
| 1410 |
+
gap: 15px;
|
| 1411 |
+
}
|
| 1412 |
+
|
| 1413 |
+
.recommendation-list li:hover {
|
| 1414 |
+
transform: translateX(10px);
|
| 1415 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.6), rgba(0, 10, 30, 0.8));
|
| 1416 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.1);
|
| 1417 |
+
}
|
| 1418 |
+
|
| 1419 |
+
.result-dashboard {
|
| 1420 |
+
display: flex;
|
| 1421 |
+
flex-direction: column;
|
| 1422 |
+
gap: 25px;
|
| 1423 |
+
}
|
| 1424 |
+
|
| 1425 |
+
.result-header {
|
| 1426 |
+
display: flex;
|
| 1427 |
+
justify-content: space-between;
|
| 1428 |
+
align-items: center;
|
| 1429 |
+
padding-bottom: 15px;
|
| 1430 |
+
border-bottom: 1px solid rgba(0, 229, 255, 0.2);
|
| 1431 |
+
}
|
| 1432 |
+
|
| 1433 |
+
.result-header h3 {
|
| 1434 |
+
font-family: 'Orbitron', sans-serif;
|
| 1435 |
+
color: #00e5ff;
|
| 1436 |
+
margin: 0;
|
| 1437 |
+
font-size: 1.5em;
|
| 1438 |
+
}
|
| 1439 |
+
|
| 1440 |
+
.timestamp {
|
| 1441 |
+
color: #888;
|
| 1442 |
+
font-size: 0.9em;
|
| 1443 |
+
}
|
| 1444 |
+
|
| 1445 |
+
.result-grid {
|
| 1446 |
+
display: grid;
|
| 1447 |
+
grid-template-columns: repeat(2, 1fr);
|
| 1448 |
+
gap: 20px;
|
| 1449 |
+
margin-top: 20px;
|
| 1450 |
+
}
|
| 1451 |
+
|
| 1452 |
+
.result-card {
|
| 1453 |
+
background: rgba(0, 20, 40, 0.3);
|
| 1454 |
+
border-radius: 12px;
|
| 1455 |
+
padding: 20px;
|
| 1456 |
+
border: 1px solid rgba(0, 229, 255, 0.1);
|
| 1457 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
| 1458 |
+
}
|
| 1459 |
+
|
| 1460 |
+
.result-card:hover {
|
| 1461 |
+
transform: translateY(-5px);
|
| 1462 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.2);
|
| 1463 |
+
}
|
| 1464 |
+
|
| 1465 |
+
.result-card h4 {
|
| 1466 |
+
color: #fff;
|
| 1467 |
+
margin: 0 0 15px 0;
|
| 1468 |
+
font-family: 'Orbitron', sans-serif;
|
| 1469 |
+
font-size: 1.1em;
|
| 1470 |
+
}
|
| 1471 |
+
|
| 1472 |
+
.primary-metrics {
|
| 1473 |
+
grid-column: span 2;
|
| 1474 |
+
background: linear-gradient(135deg, rgba(0, 20, 40, 0.4), rgba(0, 40, 80, 0.4));
|
| 1475 |
+
}
|
| 1476 |
+
|
| 1477 |
+
/* Gauge Styles */
|
| 1478 |
+
.gauge-container {
|
| 1479 |
+
width: 100%;
|
| 1480 |
+
max-width: 160px;
|
| 1481 |
+
margin: 20px auto;
|
| 1482 |
+
padding: 16px;
|
| 1483 |
+
background: linear-gradient(145deg,
|
| 1484 |
+
rgba(0, 15, 35, 0.4),
|
| 1485 |
+
rgba(0, 10, 25, 0.6)
|
| 1486 |
+
);
|
| 1487 |
+
border-radius: 50%;
|
| 1488 |
+
box-shadow:
|
| 1489 |
+
0 10px 25px rgba(0, 0, 0, 0.3),
|
| 1490 |
+
inset 0 0 30px rgba(0, 229, 255, 0.08);
|
| 1491 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 1492 |
+
transition: transform 0.3s ease;
|
| 1493 |
+
}
|
| 1494 |
+
|
| 1495 |
+
.gauge-container:hover {
|
| 1496 |
+
transform: scale(1.05);
|
| 1497 |
+
box-shadow:
|
| 1498 |
+
0 15px 35px rgba(0, 0, 0, 0.4),
|
| 1499 |
+
inset 0 0 40px rgba(0, 229, 255, 0.12);
|
| 1500 |
+
}
|
| 1501 |
+
|
| 1502 |
+
.gauge {
|
| 1503 |
+
width: 65%;
|
| 1504 |
+
height: auto;
|
| 1505 |
+
}
|
| 1506 |
+
|
| 1507 |
+
.gauge-background {
|
| 1508 |
+
fill: none;
|
| 1509 |
+
stroke: rgba(255, 255, 255, 0.1);
|
| 1510 |
+
stroke-width: 12;
|
| 1511 |
+
}
|
| 1512 |
+
|
| 1513 |
+
.gauge-value {
|
| 1514 |
+
fill: none;
|
| 1515 |
+
stroke: #00e5ff;
|
| 1516 |
+
stroke-width: 12;
|
| 1517 |
+
stroke-linecap: round;
|
| 1518 |
+
transform: rotate(-90deg);
|
| 1519 |
+
transform-origin: 60px 60px;
|
| 1520 |
+
transition: stroke-dasharray 0.8s ease;
|
| 1521 |
+
}
|
| 1522 |
+
|
| 1523 |
+
.gauge-text {
|
| 1524 |
+
font-family: 'Orbitron', sans-serif;
|
| 1525 |
+
font-size: 24px;
|
| 1526 |
+
fill: #fff;
|
| 1527 |
+
dominant-baseline: middle;
|
| 1528 |
+
}
|
| 1529 |
+
|
| 1530 |
+
.recommendations-grid {
|
| 1531 |
+
display: grid;
|
| 1532 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
| 1533 |
+
gap: 15px;
|
| 1534 |
+
margin-top: 15px;
|
| 1535 |
+
}
|
| 1536 |
+
|
| 1537 |
+
.recommendation-item {
|
| 1538 |
+
background: rgba(0, 229, 255, 0.1);
|
| 1539 |
+
padding: 15px;
|
| 1540 |
+
border-radius: 8px;
|
| 1541 |
+
border-left: 3px solid #00e5ff;
|
| 1542 |
+
transition: transform 0.3s ease;
|
| 1543 |
+
}
|
| 1544 |
+
|
| 1545 |
+
.recommendation-item:hover {
|
| 1546 |
+
transform: translateX(5px);
|
| 1547 |
+
}
|
| 1548 |
+
|
| 1549 |
+
@media (max-width: 768px) {
|
| 1550 |
+
.result-grid {
|
| 1551 |
+
grid-template-columns: 1fr;
|
| 1552 |
+
}
|
| 1553 |
+
|
| 1554 |
+
.primary-metrics {
|
| 1555 |
+
grid-column: span 1;
|
| 1556 |
+
}
|
| 1557 |
+
}
|
| 1558 |
+
|
| 1559 |
+
.result-container.hidden {
|
| 1560 |
+
display: none;
|
| 1561 |
+
}
|
| 1562 |
+
|
| 1563 |
+
.prediction-result {
|
| 1564 |
+
text-align: left;
|
| 1565 |
+
}
|
| 1566 |
+
|
| 1567 |
+
.risk-stats {
|
| 1568 |
+
display: flex;
|
| 1569 |
+
justify-content: space-between;
|
| 1570 |
+
margin: 25px 0;
|
| 1571 |
+
gap: 20px;
|
| 1572 |
+
}
|
| 1573 |
+
|
| 1574 |
+
.stat-item {
|
| 1575 |
+
flex: 1;
|
| 1576 |
+
padding: 15px;
|
| 1577 |
+
background: rgba(0, 0, 0, 0.3);
|
| 1578 |
+
border-radius: 10px;
|
| 1579 |
+
text-align: center;
|
| 1580 |
+
border: 1px solid rgba(0, 229, 255, 0.1);
|
| 1581 |
+
transition: transform 0.3s ease;
|
| 1582 |
+
}
|
| 1583 |
+
|
| 1584 |
+
.stat-item:hover {
|
| 1585 |
+
transform: translateY(-5px);
|
| 1586 |
+
}
|
| 1587 |
+
|
| 1588 |
+
.stat-item.low { border-color: #22c55e; }
|
| 1589 |
+
.stat-item.medium { border-color: #facc15; }
|
| 1590 |
+
.stat-item.high { border-color: #ef4444; }
|
| 1591 |
+
|
| 1592 |
+
.stat-label {
|
| 1593 |
+
display: block;
|
| 1594 |
+
font-size: 0.9em;
|
| 1595 |
+
color: #888;
|
| 1596 |
+
margin-bottom: 5px;
|
| 1597 |
+
}
|
| 1598 |
+
|
| 1599 |
+
.stat-value {
|
| 1600 |
+
display: block;
|
| 1601 |
+
font-size: 1.4em;
|
| 1602 |
+
color: #00e5ff;
|
| 1603 |
+
font-weight: bold;
|
| 1604 |
+
}
|
| 1605 |
+
|
| 1606 |
+
.risk-visualization {
|
| 1607 |
+
display: grid;
|
| 1608 |
+
grid-template-columns: repeat(2, 1fr);
|
| 1609 |
+
gap: 25px;
|
| 1610 |
+
margin: 30px 0;
|
| 1611 |
+
}
|
| 1612 |
+
|
| 1613 |
+
.chart-container {
|
| 1614 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.4), rgba(0, 10, 30, 0.6));
|
| 1615 |
+
padding: 25px;
|
| 1616 |
+
border-radius: 16px;
|
| 1617 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 1618 |
+
transition: all 0.4s ease;
|
| 1619 |
+
}
|
| 1620 |
+
|
| 1621 |
+
.chart-container:hover {
|
| 1622 |
+
transform: translateY(-5px);
|
| 1623 |
+
border-color: rgba(0, 229, 255, 0.3);
|
| 1624 |
+
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3);
|
| 1625 |
+
}
|
| 1626 |
+
|
| 1627 |
+
.chart-container h4 {
|
| 1628 |
+
color: #fff;
|
| 1629 |
+
margin-bottom: 20px;
|
| 1630 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1631 |
+
font-size: 1.2em;
|
| 1632 |
+
text-align: center;
|
| 1633 |
+
}
|
| 1634 |
+
|
| 1635 |
+
.recommendations-section {
|
| 1636 |
+
margin-top: 35px;
|
| 1637 |
+
padding: 25px;
|
| 1638 |
+
background: rgba(0, 20, 40, 0.4);
|
| 1639 |
+
border-radius: 12px;
|
| 1640 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 1641 |
+
}
|
| 1642 |
+
|
| 1643 |
+
.recommendations-section h4 {
|
| 1644 |
+
font-size: 1.3em;
|
| 1645 |
+
color: #fff;
|
| 1646 |
+
margin-bottom: 20px;
|
| 1647 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1648 |
+
letter-spacing: 0.5px;
|
| 1649 |
+
}
|
| 1650 |
+
|
| 1651 |
+
.recommendation-list {
|
| 1652 |
+
list-style: none;
|
| 1653 |
+
padding: 0;
|
| 1654 |
+
margin: 0;
|
| 1655 |
+
display: grid;
|
| 1656 |
+
gap: 15px;
|
| 1657 |
+
}
|
| 1658 |
+
|
| 1659 |
+
.recommendation-list li {
|
| 1660 |
+
padding: 16px 20px;
|
| 1661 |
+
background: linear-gradient(135deg,
|
| 1662 |
+
rgba(0, 229, 255, 0.08),
|
| 1663 |
+
rgba(0, 229, 255, 0.03)
|
| 1664 |
+
);
|
| 1665 |
+
border-radius: 10px;
|
| 1666 |
+
border-left: 2px solid #00e5ff;
|
| 1667 |
+
transition: all 0.3s ease;
|
| 1668 |
+
display: flex;
|
| 1669 |
+
align-items: flex-start;
|
| 1670 |
+
gap: 12px;
|
| 1671 |
+
}
|
| 1672 |
+
|
| 1673 |
+
.recommendation-list li:hover {
|
| 1674 |
+
transform: translateX(5px);
|
| 1675 |
+
background: rgba(0, 229, 255, 0.1);
|
| 1676 |
+
}
|
| 1677 |
+
|
| 1678 |
+
.recommendation-icon {
|
| 1679 |
+
font-size: 1.2em;
|
| 1680 |
+
color: #00e5ff;
|
| 1681 |
+
}
|
| 1682 |
+
|
| 1683 |
+
.recommendation-summary {
|
| 1684 |
+
font-size: 1em;
|
| 1685 |
+
color: #eee;
|
| 1686 |
+
line-height: 1.5;
|
| 1687 |
+
}
|
| 1688 |
+
|
| 1689 |
+
.recommendation-detail {
|
| 1690 |
+
font-size: 0.9em;
|
| 1691 |
+
color: #aaa;
|
| 1692 |
+
margin-top: 10px;
|
| 1693 |
+
padding-top: 10px;
|
| 1694 |
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
| 1695 |
+
}
|
| 1696 |
+
|
| 1697 |
+
.professional-recommendations {
|
| 1698 |
+
margin-top: 30px;
|
| 1699 |
+
padding: 20px;
|
| 1700 |
+
background: rgba(0, 20, 40, 0.4);
|
| 1701 |
+
border-radius: 10px;
|
| 1702 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 1703 |
+
}
|
| 1704 |
+
|
| 1705 |
+
.pro-recommendation-grid {
|
| 1706 |
+
display: grid;
|
| 1707 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
| 1708 |
+
gap: 20px;
|
| 1709 |
+
margin-top: 20px;
|
| 1710 |
+
}
|
| 1711 |
+
|
| 1712 |
+
.pro-recommendation-item {
|
| 1713 |
+
background: rgba(0, 229, 255, 0.05);
|
| 1714 |
+
padding: 20px;
|
| 1715 |
+
border-radius: 10px;
|
| 1716 |
+
text-align: center;
|
| 1717 |
+
transition: transform 0.3s ease;
|
| 1718 |
+
}
|
| 1719 |
+
|
| 1720 |
+
.pro-recommendation-item:hover {
|
| 1721 |
+
transform: translateY(-5px);
|
| 1722 |
+
}
|
| 1723 |
+
|
| 1724 |
+
.pro-icon {
|
| 1725 |
+
font-size: 2em;
|
| 1726 |
+
margin-bottom: 10px;
|
| 1727 |
+
display: block;
|
| 1728 |
+
}
|
| 1729 |
+
|
| 1730 |
+
.pro-recommendation-item h5 {
|
| 1731 |
+
color: #00e5ff;
|
| 1732 |
+
font-family: 'Orbitron', sans-serif;
|
| 1733 |
+
margin: 10px 0;
|
| 1734 |
+
font-size: 1.1em;
|
| 1735 |
+
}
|
| 1736 |
+
|
| 1737 |
+
.pro-recommendation-item p {
|
| 1738 |
+
color: #ddd;
|
| 1739 |
+
font-size: 0.9em;
|
| 1740 |
+
margin: 0;
|
| 1741 |
+
}
|
| 1742 |
+
|
| 1743 |
+
@keyframes fadeIn {
|
| 1744 |
+
from { opacity: 0; transform: translateY(10px); }
|
| 1745 |
+
to { opacity: 1; transform: translateY(0); }
|
| 1746 |
+
}
|
| 1747 |
+
.risk-meter {
|
| 1748 |
+
margin-bottom: 30px;
|
| 1749 |
+
}
|
| 1750 |
+
.risk-indicator {
|
| 1751 |
+
position: relative;
|
| 1752 |
+
height: 15px;
|
| 1753 |
+
background: linear-gradient(to right, #4CAF50, #FFC107, #F44336);
|
| 1754 |
+
border-radius: 10px;
|
| 1755 |
+
margin-bottom: 5px;
|
| 1756 |
+
}
|
| 1757 |
+
.indicator-marker {
|
| 1758 |
+
position: absolute;
|
| 1759 |
+
top: -10px;
|
| 1760 |
+
width: 20px;
|
| 1761 |
+
height: 35px;
|
| 1762 |
+
background: #fff;
|
| 1763 |
+
border-radius: 3px;
|
| 1764 |
+
transform: translateX(-50%);
|
| 1765 |
+
transition: left 0.5s ease-in-out;
|
| 1766 |
+
}
|
| 1767 |
+
.risk-labels {
|
| 1768 |
+
display: flex;
|
| 1769 |
+
justify-content: space-between;
|
| 1770 |
+
}
|
| 1771 |
+
.risk-labels span {
|
| 1772 |
+
font-size: 0.8em;
|
| 1773 |
+
color: #aaa;
|
| 1774 |
+
}
|
| 1775 |
+
.risk-summary {
|
| 1776 |
+
text-align: left;
|
| 1777 |
+
}
|
| 1778 |
+
.risk-summary h3 {
|
| 1779 |
+
font-family: 'Orbitron', sans-serif;
|
| 1780 |
+
color: #fff;
|
| 1781 |
+
margin-bottom: 15px;
|
| 1782 |
+
}
|
| 1783 |
+
.risk-summary p {
|
| 1784 |
+
margin-bottom: 20px;
|
| 1785 |
+
color: #ddd;
|
| 1786 |
+
}
|
| 1787 |
+
.recommendation-box {
|
| 1788 |
+
background: rgba(0, 0, 0, 0.3);
|
| 1789 |
+
border-radius: 5px;
|
| 1790 |
+
padding: 15px;
|
| 1791 |
+
border-left: 3px solid #00e5ff;
|
| 1792 |
+
}
|
| 1793 |
+
.recommendation-box h4 {
|
| 1794 |
+
font-family: 'Orbitron', sans-serif;
|
| 1795 |
+
color: #00e5ff;
|
| 1796 |
+
margin-bottom: 10px;
|
| 1797 |
+
}
|
| 1798 |
+
.recommendation-box ul {
|
| 1799 |
+
padding-left: 20px;
|
| 1800 |
+
color: #ccc;
|
| 1801 |
+
}
|
| 1802 |
+
.recommendation-box li {
|
| 1803 |
+
margin-bottom: 8px;
|
| 1804 |
+
}
|
| 1805 |
+
/* About Section */
|
| 1806 |
+
.section.about {
|
| 1807 |
+
background: linear-gradient(180deg, #0a0a1a, #000022);
|
| 1808 |
+
padding: 0 0 80px;
|
| 1809 |
+
}
|
| 1810 |
+
|
| 1811 |
+
.about-hero {
|
| 1812 |
+
background: linear-gradient(rgba(0,0,0,0.7), rgba(0,0,0,0.7)), url('https://images.unsplash.com/photo-1517836357463-d25dfeac3438?auto=format&fit=crop&w=1920&q=80');
|
| 1813 |
+
background-size: cover;
|
| 1814 |
+
background-position: center;
|
| 1815 |
+
padding: 120px 20px;
|
| 1816 |
+
text-align: center;
|
| 1817 |
+
margin-bottom: 60px;
|
| 1818 |
+
}
|
| 1819 |
+
|
| 1820 |
+
.about-title {
|
| 1821 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1822 |
+
font-size: 3.5em;
|
| 1823 |
+
color: #fff;
|
| 1824 |
+
margin-bottom: 20px;
|
| 1825 |
+
text-shadow: 0 2px 10px rgba(0,229,255,0.3);
|
| 1826 |
+
}
|
| 1827 |
+
|
| 1828 |
+
.about-subtitle {
|
| 1829 |
+
font-family: 'Outfit', sans-serif;
|
| 1830 |
+
font-size: 1.4em;
|
| 1831 |
+
color: #00e5ff;
|
| 1832 |
+
max-width: 600px;
|
| 1833 |
+
margin: 0 auto;
|
| 1834 |
+
}
|
| 1835 |
+
|
| 1836 |
+
.about-container {
|
| 1837 |
+
max-width: 1200px;
|
| 1838 |
+
margin: 0 auto;
|
| 1839 |
+
padding: 0 20px;
|
| 1840 |
+
}
|
| 1841 |
+
|
| 1842 |
+
.about-grid {
|
| 1843 |
+
display: grid;
|
| 1844 |
+
grid-template-columns: repeat(3, 1fr);
|
| 1845 |
+
gap: 30px;
|
| 1846 |
+
margin-bottom: 60px;
|
| 1847 |
+
}
|
| 1848 |
+
|
| 1849 |
+
.about-card {
|
| 1850 |
+
padding: 40px 30px;
|
| 1851 |
+
text-align: center;
|
| 1852 |
+
transition: transform 0.3s ease;
|
| 1853 |
+
}
|
| 1854 |
+
|
| 1855 |
+
.about-card:hover {
|
| 1856 |
+
transform: translateY(-10px);
|
| 1857 |
+
}
|
| 1858 |
+
|
| 1859 |
+
.card-icon {
|
| 1860 |
+
font-size: 2.5em;
|
| 1861 |
+
margin-bottom: 20px;
|
| 1862 |
+
}
|
| 1863 |
+
|
| 1864 |
+
.about-card h2 {
|
| 1865 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1866 |
+
font-size: 1.8em;
|
| 1867 |
+
color: #00e5ff;
|
| 1868 |
+
margin-bottom: 20px;
|
| 1869 |
+
}
|
| 1870 |
+
|
| 1871 |
+
.about-card p {
|
| 1872 |
+
font-family: 'Outfit', sans-serif;
|
| 1873 |
+
font-size: 1.1em;
|
| 1874 |
+
line-height: 1.6;
|
| 1875 |
+
color: #ddd;
|
| 1876 |
+
}
|
| 1877 |
+
|
| 1878 |
+
.about-features {
|
| 1879 |
+
padding: 50px 30px;
|
| 1880 |
+
margin-bottom: 60px;
|
| 1881 |
+
}
|
| 1882 |
+
|
| 1883 |
+
.about-features h2 {
|
| 1884 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1885 |
+
font-size: 2.2em;
|
| 1886 |
+
color: #00e5ff;
|
| 1887 |
+
margin-bottom: 40px;
|
| 1888 |
+
}
|
| 1889 |
+
|
| 1890 |
+
.features-grid {
|
| 1891 |
+
display: grid;
|
| 1892 |
+
grid-template-columns: repeat(4, 1fr);
|
| 1893 |
+
gap: 30px;
|
| 1894 |
+
}
|
| 1895 |
+
|
| 1896 |
+
.feature-item {
|
| 1897 |
+
text-align: center;
|
| 1898 |
+
}
|
| 1899 |
+
|
| 1900 |
+
.feature-item h3 {
|
| 1901 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1902 |
+
font-size: 1.3em;
|
| 1903 |
+
color: #fff;
|
| 1904 |
+
margin-bottom: 15px;
|
| 1905 |
+
}
|
| 1906 |
+
|
| 1907 |
+
.feature-item p {
|
| 1908 |
+
font-family: 'Outfit', sans-serif;
|
| 1909 |
+
font-size: 1em;
|
| 1910 |
+
color: #bbb;
|
| 1911 |
+
}
|
| 1912 |
+
|
| 1913 |
+
.about-stats {
|
| 1914 |
+
padding: 50px 30px;
|
| 1915 |
+
margin-bottom: 60px;
|
| 1916 |
+
}
|
| 1917 |
+
|
| 1918 |
+
.about-stats h2 {
|
| 1919 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1920 |
+
font-size: 2.2em;
|
| 1921 |
+
color: #00e5ff;
|
| 1922 |
+
margin-bottom: 40px;
|
| 1923 |
+
}
|
| 1924 |
+
|
| 1925 |
+
.stats-grid {
|
| 1926 |
+
display: grid;
|
| 1927 |
+
grid-template-columns: repeat(3, 1fr);
|
| 1928 |
+
gap: 30px;
|
| 1929 |
+
}
|
| 1930 |
+
|
| 1931 |
+
.stat-item {
|
| 1932 |
+
text-align: center;
|
| 1933 |
+
}
|
| 1934 |
+
|
| 1935 |
+
.stat-number {
|
| 1936 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1937 |
+
font-size: 2.5em;
|
| 1938 |
+
color: #00e5ff;
|
| 1939 |
+
display: block;
|
| 1940 |
+
margin-bottom: 10px;
|
| 1941 |
+
}
|
| 1942 |
+
|
| 1943 |
+
.stat-label {
|
| 1944 |
+
font-family: 'Outfit', sans-serif;
|
| 1945 |
+
font-size: 1.1em;
|
| 1946 |
+
color: #bbb;
|
| 1947 |
+
}
|
| 1948 |
+
|
| 1949 |
+
.about-vision {
|
| 1950 |
+
padding: 50px 30px;
|
| 1951 |
+
text-align: center;
|
| 1952 |
+
}
|
| 1953 |
+
|
| 1954 |
+
.about-vision h2 {
|
| 1955 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 1956 |
+
font-size: 2.2em;
|
| 1957 |
+
color: #00e5ff;
|
| 1958 |
+
margin-bottom: 30px;
|
| 1959 |
+
}
|
| 1960 |
+
|
| 1961 |
+
.about-vision p {
|
| 1962 |
+
font-family: 'Outfit', sans-serif;
|
| 1963 |
+
font-size: 1.2em;
|
| 1964 |
+
line-height: 1.8;
|
| 1965 |
+
color: #ddd;
|
| 1966 |
+
max-width: 800px;
|
| 1967 |
+
margin: 0 auto;
|
| 1968 |
+
}
|
| 1969 |
+
|
| 1970 |
+
@media (max-width: 992px) {
|
| 1971 |
+
.about-grid {
|
| 1972 |
+
grid-template-columns: repeat(2, 1fr);
|
| 1973 |
+
}
|
| 1974 |
+
|
| 1975 |
+
.features-grid {
|
| 1976 |
+
grid-template-columns: repeat(2, 1fr);
|
| 1977 |
+
}
|
| 1978 |
+
}
|
| 1979 |
+
|
| 1980 |
+
@media (max-width: 768px) {
|
| 1981 |
+
.about-hero {
|
| 1982 |
+
padding: 80px 20px;
|
| 1983 |
+
}
|
| 1984 |
+
|
| 1985 |
+
.about-title {
|
| 1986 |
+
font-size: 2.5em;
|
| 1987 |
+
}
|
| 1988 |
+
|
| 1989 |
+
.about-grid {
|
| 1990 |
+
grid-template-columns: 1fr;
|
| 1991 |
+
}
|
| 1992 |
+
|
| 1993 |
+
.features-grid {
|
| 1994 |
+
grid-template-columns: 1fr;
|
| 1995 |
+
}
|
| 1996 |
+
|
| 1997 |
+
.stats-grid {
|
| 1998 |
+
grid-template-columns: 1fr;
|
| 1999 |
+
}
|
| 2000 |
+
|
| 2001 |
+
.stat-item {
|
| 2002 |
+
margin-bottom: 30px;
|
| 2003 |
+
}
|
| 2004 |
+
}
|
| 2005 |
+
.section-title {
|
| 2006 |
+
font-family: 'Orbitron', sans-serif;
|
| 2007 |
+
font-size: 3em;
|
| 2008 |
+
color: #fff;
|
| 2009 |
+
margin-bottom: 30px;
|
| 2010 |
+
text-shadow: 0 2px 10px rgba(0, 229, 255, 0.3);
|
| 2011 |
+
}
|
| 2012 |
+
.section-description {
|
| 2013 |
+
font-size: 1.3em;
|
| 2014 |
+
color: #bbb;
|
| 2015 |
+
margin-bottom: 50px;
|
| 2016 |
+
max-width: 800px;
|
| 2017 |
+
margin-left: auto;
|
| 2018 |
+
margin-right: auto;
|
| 2019 |
+
line-height: 1.8;
|
| 2020 |
+
}
|
| 2021 |
+
.about-section {
|
| 2022 |
+
text-align: left;
|
| 2023 |
+
margin-bottom: 30px;
|
| 2024 |
+
padding: 30px;
|
| 2025 |
+
background: rgba(255, 255, 255, 0.05);
|
| 2026 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 2027 |
+
backdrop-filter: blur(10px);
|
| 2028 |
+
box-shadow: 0 4px 15px rgba(0, 229, 255, 0.1);
|
| 2029 |
+
border-radius: 10px;
|
| 2030 |
+
}
|
| 2031 |
+
.about-section h3 {
|
| 2032 |
+
font-family: 'Orbitron', sans-serif;
|
| 2033 |
+
font-size: 1.8em;
|
| 2034 |
+
color: #00e5ff;
|
| 2035 |
+
margin-bottom: 15px;
|
| 2036 |
+
border-bottom: 2px solid rgba(0, 229, 255, 0.3);
|
| 2037 |
+
padding-bottom: 5px;
|
| 2038 |
+
}
|
| 2039 |
+
.about-section p {
|
| 2040 |
+
font-size: 1.1em;
|
| 2041 |
+
color: #ddd;
|
| 2042 |
+
line-height: 1.7;
|
| 2043 |
+
margin-bottom: 15px;
|
| 2044 |
+
}
|
| 2045 |
+
.about-list {
|
| 2046 |
+
list-style-type: disc;
|
| 2047 |
+
margin-left: 20px;
|
| 2048 |
+
color: #ddd;
|
| 2049 |
+
font-size: 1.1em;
|
| 2050 |
+
margin-top: 10px;
|
| 2051 |
+
}
|
| 2052 |
+
|
| 2053 |
+
/* FAQ Section */
|
| 2054 |
+
.section.faq {
|
| 2055 |
+
background: linear-gradient(180deg, #080818, #0a0a1a);
|
| 2056 |
+
padding: 80px 20px;
|
| 2057 |
+
}
|
| 2058 |
+
.faq-accordion {
|
| 2059 |
+
max-width: 850px;
|
| 2060 |
+
margin: 30px auto 0;
|
| 2061 |
+
}
|
| 2062 |
+
.faq-item {
|
| 2063 |
+
margin-bottom: 20px;
|
| 2064 |
+
border: 1px solid #333;
|
| 2065 |
+
border-radius: 10px;
|
| 2066 |
+
overflow: hidden;
|
| 2067 |
+
background: rgba(0, 10, 30, 0.4);
|
| 2068 |
+
transition: all 0.4s ease;
|
| 2069 |
+
}
|
| 2070 |
+
.faq-item:hover {
|
| 2071 |
+
box-shadow: 0 0 20px rgba(0, 229, 255, 0.2);
|
| 2072 |
+
border-color: rgba(0, 229, 255, 0.2);
|
| 2073 |
+
}
|
| 2074 |
+
.faq-question {
|
| 2075 |
+
padding: 20px 25px;
|
| 2076 |
+
font-family: 'Orbitron', sans-serif;
|
| 2077 |
+
color: #fff;
|
| 2078 |
+
cursor: pointer;
|
| 2079 |
+
display: flex;
|
| 2080 |
+
justify-content: space-between;
|
| 2081 |
+
align-items: center;
|
| 2082 |
+
transition: all 0.3s ease;
|
| 2083 |
+
letter-spacing: 0.5px;
|
| 2084 |
+
font-size: 1.15em;
|
| 2085 |
+
}
|
| 2086 |
+
.faq-icon {
|
| 2087 |
+
color: #00e5ff;
|
| 2088 |
+
font-size: 1.5em;
|
| 2089 |
+
transition: all 0.3s ease;
|
| 2090 |
+
}
|
| 2091 |
+
.faq-item:hover .faq-question {
|
| 2092 |
+
color: #00e5ff;
|
| 2093 |
+
}
|
| 2094 |
+
.faq-answer {
|
| 2095 |
+
max-height: 0;
|
| 2096 |
+
overflow: hidden;
|
| 2097 |
+
transition: max-height 0.5s ease, padding 0.5s ease;
|
| 2098 |
+
background: rgba(0, 0, 0, 0.2);
|
| 2099 |
+
}
|
| 2100 |
+
.faq-item.active .faq-answer {
|
| 2101 |
+
max-height: 500px;
|
| 2102 |
+
padding: 5px 25px 25px;
|
| 2103 |
+
}
|
| 2104 |
+
.faq-item.active .faq-question {
|
| 2105 |
+
background: rgba(0, 229, 255, 0.1);
|
| 2106 |
+
border-bottom: 1px solid rgba(0, 229, 255, 0.1);
|
| 2107 |
+
}
|
| 2108 |
+
.faq-item.active .faq-icon {
|
| 2109 |
+
transform: rotate(180deg);
|
| 2110 |
+
}
|
| 2111 |
+
.faq-answer p {
|
| 2112 |
+
color: #ddd;
|
| 2113 |
+
margin: 0;
|
| 2114 |
+
text-align: left;
|
| 2115 |
+
line-height: 1.7;
|
| 2116 |
+
font-size: 1.05em;
|
| 2117 |
+
}
|
| 2118 |
+
|
| 2119 |
+
/* Footer */
|
| 2120 |
+
.footer {
|
| 2121 |
+
background: #080810;
|
| 2122 |
+
padding: 30px 20px;
|
| 2123 |
+
text-align: center;
|
| 2124 |
+
color: #999;
|
| 2125 |
+
font-size: 0.95em;
|
| 2126 |
+
position: relative;
|
| 2127 |
+
border-top: 1px solid rgba(0, 229, 255, 0.1);
|
| 2128 |
+
}
|
| 2129 |
+
.footer::before {
|
| 2130 |
+
content: '';
|
| 2131 |
+
position: absolute;
|
| 2132 |
+
top: 0;
|
| 2133 |
+
left: 0;
|
| 2134 |
+
right: 0;
|
| 2135 |
+
height: 1px;
|
| 2136 |
+
background: linear-gradient(90deg, transparent, rgba(0, 229, 255, 0.2), transparent);
|
| 2137 |
+
}
|
| 2138 |
+
.footer p {
|
| 2139 |
+
margin: 0;
|
| 2140 |
+
}
|
| 2141 |
+
.footer a {
|
| 2142 |
+
color: #00e5ff;
|
| 2143 |
+
text-decoration: none;
|
| 2144 |
+
transition: color 0.3s;
|
| 2145 |
+
}
|
| 2146 |
+
.footer a:hover {
|
| 2147 |
+
color: #fff;
|
| 2148 |
+
}
|
| 2149 |
+
|
| 2150 |
+
/* Scroll to Top Button */
|
| 2151 |
+
.scroll-top {
|
| 2152 |
+
position: fixed;
|
| 2153 |
+
bottom: 100px;
|
| 2154 |
+
right: 30px;
|
| 2155 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 2156 |
+
width: 45px;
|
| 2157 |
+
height: 45px;
|
| 2158 |
+
border-radius: 50%;
|
| 2159 |
+
display: none;
|
| 2160 |
+
justify-content: center;
|
| 2161 |
+
align-items: center;
|
| 2162 |
+
color: #fff;
|
| 2163 |
+
cursor: pointer;
|
| 2164 |
+
box-shadow: 0 2px 10px rgba(0, 229, 255, 0.3);
|
| 2165 |
+
transition: all 0.3s ease;
|
| 2166 |
+
z-index: 998;
|
| 2167 |
+
}
|
| 2168 |
+
|
| 2169 |
+
.scroll-top:hover {
|
| 2170 |
+
transform: translateY(-3px);
|
| 2171 |
+
box-shadow: 0 4px 15px rgba(0, 229, 255, 0.5);
|
| 2172 |
+
}
|
| 2173 |
+
|
| 2174 |
+
.scroll-top.visible {
|
| 2175 |
+
display: flex;
|
| 2176 |
+
animation: fadeIn 0.3s ease;
|
| 2177 |
+
}
|
| 2178 |
+
|
| 2179 |
+
/* Responsive Design */
|
| 2180 |
+
/* Large screens */
|
| 2181 |
+
@media (min-width: 1200px) {
|
| 2182 |
+
.navbar {
|
| 2183 |
+
padding: 15px 2%;
|
| 2184 |
+
}
|
| 2185 |
+
.container {
|
| 2186 |
+
width: 80%;
|
| 2187 |
+
}
|
| 2188 |
+
.hero-content {
|
| 2189 |
+
max-width: 900px;
|
| 2190 |
+
}
|
| 2191 |
+
}
|
| 2192 |
+
/* Medium screens */
|
| 2193 |
+
@media (max-width: 992px) {
|
| 2194 |
+
.section {
|
| 2195 |
+
padding: 60px 20px;
|
| 2196 |
+
}
|
| 2197 |
+
.hero-content {
|
| 2198 |
+
padding: 30px 15px;
|
| 2199 |
+
}
|
| 2200 |
+
.header {
|
| 2201 |
+
font-size: 2.8em;
|
| 2202 |
+
}
|
| 2203 |
+
}
|
| 2204 |
+
/* Small screens */
|
| 2205 |
+
@media (max-width: 768px) {
|
| 2206 |
+
.hero-content {
|
| 2207 |
+
padding: 25px 15px;
|
| 2208 |
+
}
|
| 2209 |
+
.header {
|
| 2210 |
+
font-size: 2.3em;
|
| 2211 |
+
}
|
| 2212 |
+
.description {
|
| 2213 |
+
font-size: 1.1em;
|
| 2214 |
+
}
|
| 2215 |
+
.cta-button {
|
| 2216 |
+
font-size: 1em;
|
| 2217 |
+
padding: 12px 25px;
|
| 2218 |
+
}
|
| 2219 |
+
.section h2 {
|
| 2220 |
+
font-size: 2em;
|
| 2221 |
+
}
|
| 2222 |
+
.features-list {
|
| 2223 |
+
flex-direction: column;
|
| 2224 |
+
align-items: center;
|
| 2225 |
+
}
|
| 2226 |
+
.feature-item {
|
| 2227 |
+
max-width: 100%;
|
| 2228 |
+
margin-bottom: 20px;
|
| 2229 |
+
}
|
| 2230 |
+
.faq-question {
|
| 2231 |
+
font-size: 1em;
|
| 2232 |
+
padding: 15px 20px;
|
| 2233 |
+
}
|
| 2234 |
+
.nav-menu {
|
| 2235 |
+
display: none;
|
| 2236 |
+
flex-direction: column;
|
| 2237 |
+
position: absolute;
|
| 2238 |
+
top: 70px;
|
| 2239 |
+
right: 0;
|
| 2240 |
+
background: rgba(0, 0, 20, 0.95);
|
| 2241 |
+
width: 100%;
|
| 2242 |
+
border-bottom: 1px solid rgba(0, 229, 255, 0.2);
|
| 2243 |
+
padding: 10px 0;
|
| 2244 |
+
margin-right: 0;
|
| 2245 |
+
box-shadow: 0 4px 10px rgba(0, 0, 0, 0.5);
|
| 2246 |
+
z-index: 1000;
|
| 2247 |
+
}
|
| 2248 |
+
.nav-menu li {
|
| 2249 |
+
margin: 10px 0;
|
| 2250 |
+
}
|
| 2251 |
+
.nav-menu.active {
|
| 2252 |
+
display: flex;
|
| 2253 |
+
}
|
| 2254 |
+
.hamburger {
|
| 2255 |
+
display: flex;
|
| 2256 |
+
z-index: 1001;
|
| 2257 |
+
}
|
| 2258 |
+
.hamburger span {
|
| 2259 |
+
width: 25px;
|
| 2260 |
+
height: 3px;
|
| 2261 |
+
background: #ddd;
|
| 2262 |
+
margin-bottom: 5px;
|
| 2263 |
+
transition: all 0.3s;
|
| 2264 |
+
}
|
| 2265 |
+
.form-group {
|
| 2266 |
+
flex: 0 0 100%;
|
| 2267 |
+
}
|
| 2268 |
+
}
|
| 2269 |
+
/* Extra small screens */
|
| 2270 |
+
@media (max-width: 480px) {
|
| 2271 |
+
.header {
|
| 2272 |
+
font-size: 2em;
|
| 2273 |
+
}
|
| 2274 |
+
.hero-content {
|
| 2275 |
+
padding: 20px 15px;
|
| 2276 |
+
}
|
| 2277 |
+
.cta-button {
|
| 2278 |
+
font-size: 0.9em;
|
| 2279 |
+
padding: 10px 20px;
|
| 2280 |
+
}
|
| 2281 |
+
.section {
|
| 2282 |
+
padding: 40px 15px;
|
| 2283 |
+
}
|
| 2284 |
+
.section h2 {
|
| 2285 |
+
font-size: 1.8em;
|
| 2286 |
+
}
|
| 2287 |
+
}
|
| 2288 |
+
|
| 2289 |
+
/* Chatbot Widget */
|
| 2290 |
+
#chatbot-widget {
|
| 2291 |
+
position: fixed;
|
| 2292 |
+
bottom: 80px;
|
| 2293 |
+
right: 30px;
|
| 2294 |
+
width: 380px;
|
| 2295 |
+
height: 65vh;
|
| 2296 |
+
max-height: 600px;
|
| 2297 |
+
background: linear-gradient(165deg, rgba(0, 20, 40, 0.95), rgba(0, 10, 30, 0.98));
|
| 2298 |
+
border: 1px solid rgba(0, 229, 255, 0.3);
|
| 2299 |
+
border-radius: 20px;
|
| 2300 |
+
box-shadow:
|
| 2301 |
+
0 10px 40px rgba(0, 229, 255, 0.2),
|
| 2302 |
+
0 20px 60px rgba(0, 0, 0, 0.5),
|
| 2303 |
+
inset 0 0 100px rgba(0, 229, 255, 0.05);
|
| 2304 |
+
display: flex;
|
| 2305 |
+
flex-direction: column;
|
| 2306 |
+
z-index: 9999;
|
| 2307 |
+
overflow: hidden;
|
| 2308 |
+
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
|
| 2309 |
+
backdrop-filter: blur(20px);
|
| 2310 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2311 |
+
transform-origin: bottom right;
|
| 2312 |
+
transform: scale(0);
|
| 2313 |
+
opacity: 0;
|
| 2314 |
+
}
|
| 2315 |
+
|
| 2316 |
+
#chatbot-widget.open {
|
| 2317 |
+
transform: scale(1);
|
| 2318 |
+
opacity: 1;
|
| 2319 |
+
}
|
| 2320 |
+
.chat-widget.closed {
|
| 2321 |
+
display: none;
|
| 2322 |
+
}
|
| 2323 |
+
#chat-toggle {
|
| 2324 |
+
position: fixed;
|
| 2325 |
+
bottom: 20px;
|
| 2326 |
+
right: 30px;
|
| 2327 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 2328 |
+
color: #000;
|
| 2329 |
+
border: none;
|
| 2330 |
+
border-radius: 50%;
|
| 2331 |
+
width: 60px;
|
| 2332 |
+
height: 60px;
|
| 2333 |
+
font-size: 1.6em;
|
| 2334 |
+
cursor: pointer;
|
| 2335 |
+
z-index: 9999;
|
| 2336 |
+
box-shadow: 0 4px 15px rgba(0,229,255,0.4);
|
| 2337 |
+
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
| 2338 |
+
display: flex;
|
| 2339 |
+
align-items: center;
|
| 2340 |
+
justify-content: center;
|
| 2341 |
+
}
|
| 2342 |
+
#chat-toggle:hover {
|
| 2343 |
+
transform: scale(1.1);
|
| 2344 |
+
box-shadow: 0 6px 20px rgba(0,229,255,0.6);
|
| 2345 |
+
}
|
| 2346 |
+
#chat-toggle.active {
|
| 2347 |
+
transform: rotate(45deg);
|
| 2348 |
+
}
|
| 2349 |
+
.chat-header {
|
| 2350 |
+
padding: 20px;
|
| 2351 |
+
background: linear-gradient(135deg, rgba(0, 229, 255, 0.15), rgba(0, 10, 30, 0.9));
|
| 2352 |
+
color: #fff;
|
| 2353 |
+
font-weight: 600;
|
| 2354 |
+
text-align: center;
|
| 2355 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2356 |
+
border-bottom: 1px solid rgba(0, 229, 255, 0.15);
|
| 2357 |
+
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
|
| 2358 |
+
letter-spacing: 1.5px;
|
| 2359 |
+
font-size: 1.2em;
|
| 2360 |
+
position: relative;
|
| 2361 |
+
overflow: hidden;
|
| 2362 |
+
}
|
| 2363 |
+
|
| 2364 |
+
.chat-header::after {
|
| 2365 |
+
content: '';
|
| 2366 |
+
position: absolute;
|
| 2367 |
+
bottom: 0;
|
| 2368 |
+
left: 0;
|
| 2369 |
+
width: 100%;
|
| 2370 |
+
height: 1px;
|
| 2371 |
+
background: linear-gradient(90deg, transparent, rgba(0, 229, 255, 0.5), transparent);
|
| 2372 |
+
}
|
| 2373 |
+
|
| 2374 |
+
.ai-icon {
|
| 2375 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 2376 |
+
padding: 4px 8px;
|
| 2377 |
+
border-radius: 8px;
|
| 2378 |
+
font-style: normal;
|
| 2379 |
+
font-weight: 600;
|
| 2380 |
+
font-size: 0.9em;
|
| 2381 |
+
margin-right: 10px;
|
| 2382 |
+
box-shadow: 0 2px 8px rgba(0, 229, 255, 0.3);
|
| 2383 |
+
}
|
| 2384 |
+
.chat-body {
|
| 2385 |
+
flex: 1;
|
| 2386 |
+
padding: 20px;
|
| 2387 |
+
overflow-y: auto;
|
| 2388 |
+
color: #eee;
|
| 2389 |
+
font-size: 0.95em;
|
| 2390 |
+
background: rgba(0,0,0,0.3);
|
| 2391 |
+
font-family: 'Roboto', sans-serif;
|
| 2392 |
+
scrollbar-width: thin;
|
| 2393 |
+
scrollbar-color: rgba(0, 229, 255, 0.5) rgba(0, 0, 0, 0.2);
|
| 2394 |
+
}
|
| 2395 |
+
.chat-body::-webkit-scrollbar {
|
| 2396 |
+
width: 6px;
|
| 2397 |
+
}
|
| 2398 |
+
.chat-body::-webkit-scrollbar-track {
|
| 2399 |
+
background: rgba(0, 0, 0, 0.2);
|
| 2400 |
+
}
|
| 2401 |
+
.chat-body::-webkit-scrollbar-thumb {
|
| 2402 |
+
background: rgba(0, 229, 255, 0.5);
|
| 2403 |
+
border-radius: 3px;
|
| 2404 |
+
}
|
| 2405 |
+
#chatInput {
|
| 2406 |
+
border: none;
|
| 2407 |
+
border-top: 1px solid rgba(0, 229, 255, 0.2);
|
| 2408 |
+
padding: 15px 20px;
|
| 2409 |
+
background: rgba(0, 10, 40, 0.95);
|
| 2410 |
+
color: #fff;
|
| 2411 |
+
font-size: 1em;
|
| 2412 |
+
font-family: 'Roboto', sans-serif;
|
| 2413 |
+
transition: all 0.3s ease;
|
| 2414 |
+
}
|
| 2415 |
+
#chatInput:focus {
|
| 2416 |
+
outline: none;
|
| 2417 |
+
background: rgba(0, 20, 50, 0.95);
|
| 2418 |
+
box-shadow: inset 0 1px 10px rgba(0, 229, 255, 0.1);
|
| 2419 |
+
}
|
| 2420 |
+
#chatInput:focus {
|
| 2421 |
+
outline: none;
|
| 2422 |
+
border-color: #00e5ff;
|
| 2423 |
+
}
|
| 2424 |
+
.chat-msg {
|
| 2425 |
+
margin-bottom: 20px;
|
| 2426 |
+
padding: 18px 22px;
|
| 2427 |
+
word-wrap: break-word;
|
| 2428 |
+
border-radius: 16px;
|
| 2429 |
+
max-width: 85%;
|
| 2430 |
+
position: relative;
|
| 2431 |
+
animation: fadeIn 0.3s ease;
|
| 2432 |
+
line-height: 1.6;
|
| 2433 |
+
font-size: 0.95em;
|
| 2434 |
+
backdrop-filter: blur(10px);
|
| 2435 |
+
box-shadow:
|
| 2436 |
+
0 4px 15px rgba(0, 0, 0, 0.2),
|
| 2437 |
+
0 0 20px rgba(0, 229, 255, 0.05);
|
| 2438 |
+
transition: all 0.3s ease;
|
| 2439 |
+
border: 1px solid rgba(0, 229, 255, 0.1);
|
| 2440 |
+
}
|
| 2441 |
+
|
| 2442 |
+
.chat-msg.user-msg {
|
| 2443 |
+
background: linear-gradient(135deg, rgba(0, 229, 255, 0.15), rgba(0, 229, 255, 0.05));
|
| 2444 |
+
margin-left: auto;
|
| 2445 |
+
border-bottom-right-radius: 4px;
|
| 2446 |
+
}
|
| 2447 |
+
|
| 2448 |
+
.chat-msg.bot-msg {
|
| 2449 |
+
background: linear-gradient(135deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.02));
|
| 2450 |
+
margin-right: auto;
|
| 2451 |
+
border-bottom-left-radius: 4px;
|
| 2452 |
+
}
|
| 2453 |
+
|
| 2454 |
+
#chatInput {
|
| 2455 |
+
border: none;
|
| 2456 |
+
border-top: 1px solid rgba(0, 229, 255, 0.15);
|
| 2457 |
+
padding: 18px 25px;
|
| 2458 |
+
background: rgba(0, 20, 50, 0.8);
|
| 2459 |
+
color: #fff;
|
| 2460 |
+
font-size: 1em;
|
| 2461 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2462 |
+
transition: all 0.3s ease;
|
| 2463 |
+
box-shadow: inset 0 2px 15px rgba(0, 0, 0, 0.2);
|
| 2464 |
+
}
|
| 2465 |
+
|
| 2466 |
+
#chatInput:focus {
|
| 2467 |
+
outline: none;
|
| 2468 |
+
background: rgba(0, 30, 60, 0.9);
|
| 2469 |
+
box-shadow:
|
| 2470 |
+
inset 0 2px 20px rgba(0, 0, 0, 0.3),
|
| 2471 |
+
0 0 20px rgba(0, 229, 255, 0.1);
|
| 2472 |
+
}
|
| 2473 |
+
.chat-msg:hover {
|
| 2474 |
+
transform: translateY(-2px);
|
| 2475 |
+
}
|
| 2476 |
+
|
| 2477 |
+
.chat-msg.user-msg {
|
| 2478 |
+
background: rgba(0, 229, 255, 0.1);
|
| 2479 |
+
margin-left: auto;
|
| 2480 |
+
border-bottom-right-radius: 4px;
|
| 2481 |
+
}
|
| 2482 |
+
|
| 2483 |
+
.chat-msg.bot-msg {
|
| 2484 |
+
background: rgba(255, 255, 255, 0.05);
|
| 2485 |
+
margin-right: auto;
|
| 2486 |
+
border-bottom-left-radius: 4px;
|
| 2487 |
+
}
|
| 2488 |
+
|
| 2489 |
+
.chat-msg strong {
|
| 2490 |
+
color: #00e5ff;
|
| 2491 |
+
display: block;
|
| 2492 |
+
margin-bottom: 5px;
|
| 2493 |
+
font-size: 0.9em;
|
| 2494 |
+
}
|
| 2495 |
+
|
| 2496 |
+
.ai-icon {
|
| 2497 |
+
background: linear-gradient(135deg, #00bcd4, #0097a7);
|
| 2498 |
+
padding: 2px 6px;
|
| 2499 |
+
border-radius: 4px;
|
| 2500 |
+
font-style: normal;
|
| 2501 |
+
font-weight: 600;
|
| 2502 |
+
font-size: 0.9em;
|
| 2503 |
+
margin-right: 8px;
|
| 2504 |
+
}
|
| 2505 |
+
|
| 2506 |
+
.chat-icon {
|
| 2507 |
+
background: linear-gradient(135deg, #00bcd4, #0097a7);
|
| 2508 |
+
padding: 4px 8px;
|
| 2509 |
+
border-radius: 4px;
|
| 2510 |
+
font-style: normal;
|
| 2511 |
+
font-weight: 500;
|
| 2512 |
+
font-size: 0.8em;
|
| 2513 |
+
}
|
| 2514 |
+
|
| 2515 |
+
/* Shake Animation for Error Feedback */
|
| 2516 |
+
@keyframes shake {
|
| 2517 |
+
0% { transform: translateX(0); }
|
| 2518 |
+
25% { transform: translateX(-5px); }
|
| 2519 |
+
50% { transform: translateX(5px); }
|
| 2520 |
+
75% { transform: translateX(-5px); }
|
| 2521 |
+
100% { transform: translateX(0); }
|
| 2522 |
+
}
|
| 2523 |
+
.shake {
|
| 2524 |
+
animation: shake 0.5s;
|
| 2525 |
+
}
|
| 2526 |
+
.tooltip-icon {
|
| 2527 |
+
position: relative;
|
| 2528 |
+
display: inline-block;
|
| 2529 |
+
width: 18px;
|
| 2530 |
+
height: 18px;
|
| 2531 |
+
line-height: 18px;
|
| 2532 |
+
background: linear-gradient(135deg, #00bcd4, #0097a7);
|
| 2533 |
+
color: #fff;
|
| 2534 |
+
font-size: 12px;
|
| 2535 |
+
font-weight: bold;
|
| 2536 |
+
text-align: center;
|
| 2537 |
+
border-radius: 50%;
|
| 2538 |
+
margin-left: 8px;
|
| 2539 |
+
cursor: help;
|
| 2540 |
+
box-shadow: 0 2px 5px rgba(0, 229, 255, 0.3);
|
| 2541 |
+
transition: all 0.3s ease;
|
| 2542 |
+
}
|
| 2543 |
+
|
| 2544 |
+
.tooltip-icon:hover {
|
| 2545 |
+
transform: scale(1.1);
|
| 2546 |
+
box-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
|
| 2547 |
+
}
|
| 2548 |
+
|
| 2549 |
+
.tooltip-icon .tooltip-text {
|
| 2550 |
+
visibility: hidden;
|
| 2551 |
+
opacity: 0;
|
| 2552 |
+
width: max-content;
|
| 2553 |
+
background: rgba(0, 10, 20, 0.95);
|
| 2554 |
+
color: #fff;
|
| 2555 |
+
text-align: left;
|
| 2556 |
+
padding: 8px 12px;
|
| 2557 |
+
border-radius: 8px;
|
| 2558 |
+
position: absolute;
|
| 2559 |
+
z-index: 10;
|
| 2560 |
+
top: 130%;
|
| 2561 |
+
left: 50%;
|
| 2562 |
+
transform: translateX(-50%);
|
| 2563 |
+
white-space: nowrap;
|
| 2564 |
+
font-size: 13px;
|
| 2565 |
+
box-shadow: 0 4px 15px rgba(0, 229, 255, 0.2),
|
| 2566 |
+
0 0 30px rgba(0, 229, 255, 0.1);
|
| 2567 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 2568 |
+
backdrop-filter: blur(10px);
|
| 2569 |
+
transition: all 0.3s ease;
|
| 2570 |
+
}
|
| 2571 |
+
|
| 2572 |
+
.tooltip-icon:hover .tooltip-text {
|
| 2573 |
+
visibility: visible;
|
| 2574 |
+
opacity: 1;
|
| 2575 |
+
}
|
| 2576 |
+
|
| 2577 |
+
/* New Risk Meter Section */
|
| 2578 |
+
#risk-meter-section {
|
| 2579 |
+
padding: 40px 20px;
|
| 2580 |
+
background: #111;
|
| 2581 |
+
color: #fff;
|
| 2582 |
+
text-align: center;
|
| 2583 |
+
}
|
| 2584 |
+
#risk-meter {
|
| 2585 |
+
width: 300px;
|
| 2586 |
+
height: 300px;
|
| 2587 |
+
margin: 0 auto;
|
| 2588 |
+
background: rgba(0, 0, 0, 0.5);
|
| 2589 |
+
border: 2px solid #00e5ff;
|
| 2590 |
+
border-radius: 50%;
|
| 2591 |
+
display: flex;
|
| 2592 |
+
align-items: center;
|
| 2593 |
+
justify-content: center;
|
| 2594 |
+
}
|
| 2595 |
+
/* Pulse Animation for Risk Meter */
|
| 2596 |
+
@keyframes pulse {
|
| 2597 |
+
0% { transform: scale(1); }
|
| 2598 |
+
50% { transform: scale(1.05); }
|
| 2599 |
+
100% { transform: scale(1); }
|
| 2600 |
+
}
|
| 2601 |
+
#risk-meter.active {
|
| 2602 |
+
animation: pulse 1s infinite;
|
| 2603 |
+
}
|
| 2604 |
+
|
| 2605 |
+
/* New Live Preview Charts Section */
|
| 2606 |
+
#live-charts-section {
|
| 2607 |
+
padding: 40px 20px;
|
| 2608 |
+
background: #0a0a1a;
|
| 2609 |
+
color: #fff;
|
| 2610 |
+
text-align: center;
|
| 2611 |
+
}
|
| 2612 |
+
#liveChart {
|
| 2613 |
+
max-width: 100%;
|
| 2614 |
+
margin: 20px auto;
|
| 2615 |
+
background: #222;
|
| 2616 |
+
border: 1px solid #00e5ff;
|
| 2617 |
+
border-radius: 10px;
|
| 2618 |
+
box-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
|
| 2619 |
+
}
|
| 2620 |
+
/* RESULT SUMMARY CARD */
|
| 2621 |
+
.result-summary {
|
| 2622 |
+
background: linear-gradient(165deg,
|
| 2623 |
+
rgba(0, 25, 50, 0.92),
|
| 2624 |
+
rgba(0, 15, 35, 0.98)
|
| 2625 |
+
);
|
| 2626 |
+
border: 1px solid rgba(0, 229, 255, 0.25);
|
| 2627 |
+
border-radius: 16px;
|
| 2628 |
+
padding: 32px;
|
| 2629 |
+
margin: 30px auto;
|
| 2630 |
+
max-width: 900px;
|
| 2631 |
+
width: 92%;
|
| 2632 |
+
box-shadow:
|
| 2633 |
+
0 20px 40px rgba(0, 0, 0, 0.5),
|
| 2634 |
+
0 0 100px rgba(0, 229, 255, 0.1),
|
| 2635 |
+
inset 0 0 60px rgba(0, 229, 255, 0.05);
|
| 2636 |
+
text-align: left;
|
| 2637 |
+
animation: fadeInUp 0.6s cubic-bezier(0.4, 0, 0.2, 1);
|
| 2638 |
+
position: relative;
|
| 2639 |
+
overflow: hidden;
|
| 2640 |
+
backdrop-filter: blur(12px);
|
| 2641 |
+
transition: all 0.4s ease;
|
| 2642 |
+
display: grid;
|
| 2643 |
+
grid-template-columns: 1fr;
|
| 2644 |
+
gap: 24px;
|
| 2645 |
+
}
|
| 2646 |
+
|
| 2647 |
+
.result-summary:hover {
|
| 2648 |
+
transform: translateY(-5px);
|
| 2649 |
+
box-shadow:
|
| 2650 |
+
0 25px 50px rgba(0, 0, 0, 0.7),
|
| 2651 |
+
0 0 120px rgba(0, 229,255, 0.2),
|
| 2652 |
+
inset 0 0 100px rgba(0, 229, 255, 0.15);
|
| 2653 |
+
border-color: rgba(0, 229, 255, 0.5);
|
| 2654 |
+
}
|
| 2655 |
+
|
| 2656 |
+
.result-summary::before {
|
| 2657 |
+
content: '';
|
| 2658 |
+
position: absolute;
|
| 2659 |
+
top: -50%;
|
| 2660 |
+
left: -50%;
|
| 2661 |
+
width: 200%;
|
| 2662 |
+
height: 200%;
|
| 2663 |
+
background: radial-gradient(circle, rgba(0, 229, 255, 0.1) 0%, transparent 70%);
|
| 2664 |
+
transform: rotate(45deg);
|
| 2665 |
+
animation: rotateGradient 10s linear infinite;
|
| 2666 |
+
}
|
| 2667 |
+
|
| 2668 |
+
@keyframes rotateGradient {
|
| 2669 |
+
from { transform: rotate(0deg); }
|
| 2670 |
+
to { transform: rotate(360deg); }
|
| 2671 |
+
}
|
| 2672 |
+
|
| 2673 |
+
.risk-details {
|
| 2674 |
+
display: grid;
|
| 2675 |
+
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
| 2676 |
+
gap: 20px;
|
| 2677 |
+
padding: 24px;
|
| 2678 |
+
background: linear-gradient(145deg,
|
| 2679 |
+
rgba(0, 20, 40, 0.4),
|
| 2680 |
+
rgba(0, 10, 30, 0.6)
|
| 2681 |
+
);
|
| 2682 |
+
border-radius: 12px;
|
| 2683 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 2684 |
+
position: relative;
|
| 2685 |
+
overflow: hidden;
|
| 2686 |
+
}
|
| 2687 |
+
|
| 2688 |
+
.risk-detail-item {
|
| 2689 |
+
background: linear-gradient(145deg,
|
| 2690 |
+
rgba(0, 25, 50, 0.4),
|
| 2691 |
+
rgba(0, 15, 35, 0.6)
|
| 2692 |
+
);
|
| 2693 |
+
padding: 25px;
|
| 2694 |
+
border-radius: 16px;
|
| 2695 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 2696 |
+
transition: all 0.4s ease;
|
| 2697 |
+
position: relative;
|
| 2698 |
+
overflow: hidden;
|
| 2699 |
+
}
|
| 2700 |
+
|
| 2701 |
+
.risk-detail-item:hover {
|
| 2702 |
+
transform: translateY(-5px);
|
| 2703 |
+
border-color: rgba(0, 229, 255, 0.3);
|
| 2704 |
+
box-shadow:
|
| 2705 |
+
0 10px 20px rgba(0, 0, 0, 0.3),
|
| 2706 |
+
0 0 30px rgba(0, 229, 255, 0.1);
|
| 2707 |
+
}
|
| 2708 |
+
|
| 2709 |
+
.risk-detail-label {
|
| 2710 |
+
font-size: 0.95em;
|
| 2711 |
+
color: rgba(255, 255, 255, 0.8);
|
| 2712 |
+
margin-bottom: 12px;
|
| 2713 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2714 |
+
letter-spacing: 0.5px;
|
| 2715 |
+
}
|
| 2716 |
+
|
| 2717 |
+
.risk-detail-value {
|
| 2718 |
+
font-size: 1.8em;
|
| 2719 |
+
color: #00e5ff;
|
| 2720 |
+
font-weight: 600;
|
| 2721 |
+
text-shadow: 0 0 15px rgba(0, 229, 255, 0.4);
|
| 2722 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2723 |
+
}
|
| 2724 |
+
|
| 2725 |
+
.risk-detail-item {
|
| 2726 |
+
background: rgba(0, 229, 255, 0.05);
|
| 2727 |
+
padding: 15px;
|
| 2728 |
+
border-radius: 12px;
|
| 2729 |
+
transition: all 0.3s ease;
|
| 2730 |
+
}
|
| 2731 |
+
|
| 2732 |
+
.risk-detail-item:hover {
|
| 2733 |
+
background: rgba(0, 229, 255, 0.1);
|
| 2734 |
+
transform: translateY(-3px);
|
| 2735 |
+
}
|
| 2736 |
+
|
| 2737 |
+
.risk-detail-label {
|
| 2738 |
+
font-size: 0.9em;
|
| 2739 |
+
color: rgba(255, 255, 255, 0.7);
|
| 2740 |
+
margin-bottom: 8px;
|
| 2741 |
+
}
|
| 2742 |
+
|
| 2743 |
+
.risk-detail-value {
|
| 2744 |
+
font-size: 1.2em;
|
| 2745 |
+
color: #00e5ff;
|
| 2746 |
+
font-weight: 600;
|
| 2747 |
+
}
|
| 2748 |
+
|
| 2749 |
+
.interactive-chart {
|
| 2750 |
+
margin-top: 30px;
|
| 2751 |
+
padding: 20px;
|
| 2752 |
+
background: rgba(0, 20, 40, 0.3);
|
| 2753 |
+
border-radius: 15px;
|
| 2754 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 2755 |
+
}
|
| 2756 |
+
|
| 2757 |
+
.risk-breakdown {
|
| 2758 |
+
padding: 20px;
|
| 2759 |
+
}
|
| 2760 |
+
|
| 2761 |
+
.risk-breakdown h4 {
|
| 2762 |
+
color: #fff;
|
| 2763 |
+
margin-bottom: 20px;
|
| 2764 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2765 |
+
font-size: 1.2em;
|
| 2766 |
+
}
|
| 2767 |
+
|
| 2768 |
+
.risk-factors {
|
| 2769 |
+
display: grid;
|
| 2770 |
+
gap: 15px;
|
| 2771 |
+
}
|
| 2772 |
+
|
| 2773 |
+
.risk-factor {
|
| 2774 |
+
display: grid;
|
| 2775 |
+
gap: 8px;
|
| 2776 |
+
}
|
| 2777 |
+
|
| 2778 |
+
.factor-label {
|
| 2779 |
+
color: #eee;
|
| 2780 |
+
font-size: 0.9em;
|
| 2781 |
+
display: flex;
|
| 2782 |
+
justify-content: space-between;
|
| 2783 |
+
}
|
| 2784 |
+
|
| 2785 |
+
.factor-bar {
|
| 2786 |
+
height: 12px;
|
| 2787 |
+
background: rgba(0, 0, 0, 0.2);
|
| 2788 |
+
border-radius: 6px;
|
| 2789 |
+
overflow: hidden;
|
| 2790 |
+
}
|
| 2791 |
+
|
| 2792 |
+
.factor-fill {
|
| 2793 |
+
height: 100%;
|
| 2794 |
+
background: linear-gradient(90deg, #00e5ff, #0097fb);
|
| 2795 |
+
width: 0;
|
| 2796 |
+
transition: width 1s ease-out;
|
| 2797 |
+
border-radius: 6px;
|
| 2798 |
+
}
|
| 2799 |
+
|
| 2800 |
+
.chart-controls {
|
| 2801 |
+
display: flex;
|
| 2802 |
+
justify-content: center;
|
| 2803 |
+
gap: 15px;
|
| 2804 |
+
margin-bottom: 20px;
|
| 2805 |
+
}
|
| 2806 |
+
|
| 2807 |
+
.chart-control-btn {
|
| 2808 |
+
padding: 8px 16px;
|
| 2809 |
+
background: rgba(0, 229, 255, 0.1);
|
| 2810 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 2811 |
+
border-radius: 20px;
|
| 2812 |
+
color: #fff;
|
| 2813 |
+
cursor: pointer;
|
| 2814 |
+
transition: all 0.3s ease;
|
| 2815 |
+
}
|
| 2816 |
+
|
| 2817 |
+
.chart-control-btn:hover {
|
| 2818 |
+
background: rgba(0, 229, 255, 0.2);
|
| 2819 |
+
transform: translateY(-2px);
|
| 2820 |
+
}
|
| 2821 |
+
|
| 2822 |
+
.chart-control-btn.active {
|
| 2823 |
+
background: #00e5ff;
|
| 2824 |
+
color: #000;
|
| 2825 |
+
}
|
| 2826 |
+
|
| 2827 |
+
.summary-badge {
|
| 2828 |
+
font-family: 'Orbitron', sans-serif;
|
| 2829 |
+
font-size: 1.2em;
|
| 2830 |
+
font-weight: 600;
|
| 2831 |
+
padding: 8px 16px;
|
| 2832 |
+
border-radius: 20px;
|
| 2833 |
+
background: var(--premium-gradient);
|
| 2834 |
+
color: #000;
|
| 2835 |
+
box-shadow: 0 0 15px rgba(0, 229, 255, 0.4);
|
| 2836 |
+
margin-bottom: 10px;
|
| 2837 |
+
}
|
| 2838 |
+
|
| 2839 |
+
.summary-percentage {
|
| 2840 |
+
font-size: 2em;
|
| 2841 |
+
font-weight: bold;
|
| 2842 |
+
color: #00e5ff;
|
| 2843 |
+
margin-bottom: 8px;
|
| 2844 |
+
}
|
| 2845 |
+
|
| 2846 |
+
.summary-interpretation {
|
| 2847 |
+
font-size: 1em;
|
| 2848 |
+
color: #ccc;
|
| 2849 |
+
font-family: 'Roboto', sans-serif;
|
| 2850 |
+
}
|
| 2851 |
+
|
| 2852 |
+
/* Gauge Numeric Labels */
|
| 2853 |
+
.gauge-numeric-labels {
|
| 2854 |
+
display: flex;
|
| 2855 |
+
justify-content: space-between;
|
| 2856 |
+
padding: 5px 15px 0;
|
| 2857 |
+
font-size: 0.9em;
|
| 2858 |
+
color: #00e5ff;
|
| 2859 |
+
}
|
| 2860 |
+
|
| 2861 |
+
/* Expandable Recommendations */
|
| 2862 |
+
.recommendation-list .expandable {
|
| 2863 |
+
cursor: pointer;
|
| 2864 |
+
transition: background 0.3s ease;
|
| 2865 |
+
}
|
| 2866 |
+
.recommendation-list .expandable:hover {
|
| 2867 |
+
background: rgba(0, 229, 255, 0.15);
|
| 2868 |
+
}
|
| 2869 |
+
.recommendation-detail {
|
| 2870 |
+
font-size: 0.85em;
|
| 2871 |
+
color: #aaa;
|
| 2872 |
+
margin-top: 5px;
|
| 2873 |
+
padding-left: 25px;
|
| 2874 |
+
transition: max-height 0.3s ease;
|
| 2875 |
+
}
|
| 2876 |
+
|
| 2877 |
+
/* Download Report Button */
|
| 2878 |
+
.download-report-container {
|
| 2879 |
+
text-align: center;
|
| 2880 |
+
margin-top: 25px;
|
| 2881 |
+
}
|
| 2882 |
+
.download-report {
|
| 2883 |
+
padding: 12px 24px;
|
| 2884 |
+
border: none;
|
| 2885 |
+
border-radius: 8px;
|
| 2886 |
+
background: linear-gradient(135deg, #22c55e, #16a34a);
|
| 2887 |
+
color: #fff;
|
| 2888 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2889 |
+
font-size: 1em;
|
| 2890 |
+
cursor: pointer;
|
| 2891 |
+
transition: all 0.3s ease;
|
| 2892 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.2);
|
| 2893 |
+
}
|
| 2894 |
+
.download-report:hover {
|
| 2895 |
+
transform: translateY(-3px);
|
| 2896 |
+
box-shadow: 0 10px 20px rgba(0, 229, 255, 0.3);
|
| 2897 |
+
}
|
| 2898 |
+
/* RESULT SUMMARY ENHANCEMENTS */
|
| 2899 |
+
.result-summary {
|
| 2900 |
+
background: linear-gradient(165deg, rgba(0, 25, 50, 0.92), rgba(0, 15, 35, 0.98));
|
| 2901 |
+
border: 2px solid rgba(0, 229, 255, 0.3);
|
| 2902 |
+
border-radius: 24px;
|
| 2903 |
+
padding: 40px;
|
| 2904 |
+
margin: 40px auto;
|
| 2905 |
+
max-width: 800px;
|
| 2906 |
+
width: 90%;
|
| 2907 |
+
box-shadow:
|
| 2908 |
+
0 25px 50px rgba(0, 0, 0, 0.7),
|
| 2909 |
+
0 0 120px rgba(0, 229, 255, 0.2),
|
| 2910 |
+
inset 0 0 80px rgba(0, 229, 255, 0.1);
|
| 2911 |
+
text-align: center;
|
| 2912 |
+
position: relative;
|
| 2913 |
+
animation: fadeInUp 0.8s cubic-bezier(0.4, 0, 0.2, 1);
|
| 2914 |
+
backdrop-filter: blur(15px);
|
| 2915 |
+
overflow: hidden;
|
| 2916 |
+
}
|
| 2917 |
+
|
| 2918 |
+
.result-summary::before {
|
| 2919 |
+
content: '';
|
| 2920 |
+
position: absolute;
|
| 2921 |
+
inset: -1px;
|
| 2922 |
+
background: linear-gradient(45deg,
|
| 2923 |
+
transparent,
|
| 2924 |
+
rgba(0, 229, 255, 0.2),
|
| 2925 |
+
transparent
|
| 2926 |
+
);
|
| 2927 |
+
animation: borderGlow 4s linear infinite;
|
| 2928 |
+
}
|
| 2929 |
+
|
| 2930 |
+
@keyframes borderGlow {
|
| 2931 |
+
0%, 100% { opacity: 0.3; }
|
| 2932 |
+
50% { opacity: 0.7; }
|
| 2933 |
+
}
|
| 2934 |
+
|
| 2935 |
+
.summary-header h3 {
|
| 2936 |
+
font-size: 1.4em;
|
| 2937 |
+
color: #fff;
|
| 2938 |
+
margin-bottom: 20px;
|
| 2939 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2940 |
+
letter-spacing: 0.5px;
|
| 2941 |
+
}
|
| 2942 |
+
|
| 2943 |
+
.summary-badge {
|
| 2944 |
+
display: inline-block;
|
| 2945 |
+
padding: 6px 16px;
|
| 2946 |
+
border-radius: 25px;
|
| 2947 |
+
font-size: 0.95em;
|
| 2948 |
+
font-weight: 600;
|
| 2949 |
+
margin-bottom: 15px;
|
| 2950 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 2951 |
+
color: #000;
|
| 2952 |
+
letter-spacing: 0.5px;
|
| 2953 |
+
}
|
| 2954 |
+
|
| 2955 |
+
.summary-percentage {
|
| 2956 |
+
font-size: 2.4em;
|
| 2957 |
+
font-weight: 700;
|
| 2958 |
+
color: #00e5ff;
|
| 2959 |
+
margin: 10px 0;
|
| 2960 |
+
text-shadow: 0 0 12px rgba(0, 229, 255, 0.4);
|
| 2961 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 2962 |
+
}
|
| 2963 |
+
|
| 2964 |
+
.summary-interpretation {
|
| 2965 |
+
font-size: 0.95em;
|
| 2966 |
+
color: #eee;
|
| 2967 |
+
margin: 10px 0;
|
| 2968 |
+
line-height: 1.4;
|
| 2969 |
+
}
|
| 2970 |
+
|
| 2971 |
+
.summary-confidence {
|
| 2972 |
+
font-size: 0.9em;
|
| 2973 |
+
color: #aaa;
|
| 2974 |
+
margin-top: 15px;
|
| 2975 |
+
padding-top: 15px;
|
| 2976 |
+
border-top: 1px solid rgba(255, 255, 255, 0.1);
|
| 2977 |
+
}
|
| 2978 |
+
.result-summary:hover::after {
|
| 2979 |
+
content: attr(title);
|
| 2980 |
+
position: absolute;
|
| 2981 |
+
bottom: -30px;
|
| 2982 |
+
left: 50%;
|
| 2983 |
+
transform: translateX(-50%);
|
| 2984 |
+
background: rgba(0,0,0,0.7);
|
| 2985 |
+
color: #fff;
|
| 2986 |
+
padding: 4px 8px;
|
| 2987 |
+
border-radius: 4px;
|
| 2988 |
+
font-size: 0.8em;
|
| 2989 |
+
}
|
| 2990 |
+
.summary-badge {
|
| 2991 |
+
font-family: 'Orbitron', sans-serif;
|
| 2992 |
+
font-size: 1.2em;
|
| 2993 |
+
font-weight: 600;
|
| 2994 |
+
padding: 8px 16px;
|
| 2995 |
+
border-radius: 20px;
|
| 2996 |
+
background: var(--premium-gradient);
|
| 2997 |
+
color: #000;
|
| 2998 |
+
box-shadow: 0 0 15px rgba(0, 229, 255, 0.4);
|
| 2999 |
+
margin-bottom: 10px;
|
| 3000 |
+
}
|
| 3001 |
+
.summary-percentage {
|
| 3002 |
+
font-size: 2em;
|
| 3003 |
+
font-weight: bold;
|
| 3004 |
+
color: #00e5ff;
|
| 3005 |
+
margin-bottom: 8px;
|
| 3006 |
+
}
|
| 3007 |
+
.summary-interpretation {
|
| 3008 |
+
font-size: 1em;
|
| 3009 |
+
color: #ccc;
|
| 3010 |
+
font-family: 'Roboto', sans-serif;
|
| 3011 |
+
}
|
| 3012 |
+
|
| 3013 |
+
/* Gauge Numeric Labels (if not already defined) */
|
| 3014 |
+
.gauge-numeric-labels {
|
| 3015 |
+
display: flex;
|
| 3016 |
+
justify-content: space-between;
|
| 3017 |
+
padding: 5px 15px 0;
|
| 3018 |
+
font-size: 0.9em;
|
| 3019 |
+
color: #00e5ff;
|
| 3020 |
+
}
|
| 3021 |
+
|
| 3022 |
+
/* Expandable Recommendations */
|
| 3023 |
+
.recommendation-list .expandable {
|
| 3024 |
+
cursor: pointer;
|
| 3025 |
+
transition: background 0.3s ease;
|
| 3026 |
+
}
|
| 3027 |
+
.recommendation-list .expandable:hover {
|
| 3028 |
+
background: rgba(0, 229, 255, 0.15);
|
| 3029 |
+
}
|
| 3030 |
+
.recommendation-detail {
|
| 3031 |
+
font-size: 0.85em;
|
| 3032 |
+
color: #aaa;
|
| 3033 |
+
margin-top: 5px;
|
| 3034 |
+
padding-left: 25px;
|
| 3035 |
+
transition: max-height 0.3s ease;
|
| 3036 |
+
}
|
| 3037 |
+
|
| 3038 |
+
/* Report Actions */
|
| 3039 |
+
.report-actions {
|
| 3040 |
+
text-align: center;
|
| 3041 |
+
margin-top: 20px;
|
| 3042 |
+
}
|
| 3043 |
+
.report-actions button {
|
| 3044 |
+
margin: 0 10px;
|
| 3045 |
+
padding: 10px 20px;
|
| 3046 |
+
border: none;
|
| 3047 |
+
border-radius: 8px;
|
| 3048 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3049 |
+
cursor: pointer;
|
| 3050 |
+
transition: transform 0.3s ease, box-shadow 0.3s ease;
|
| 3051 |
+
}
|
| 3052 |
+
.download-report {
|
| 3053 |
+
background: linear-gradient(135deg, #22c55e, #16a34a);
|
| 3054 |
+
color: #fff;
|
| 3055 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.2);
|
| 3056 |
+
}
|
| 3057 |
+
.copy-link {
|
| 3058 |
+
background: linear-gradient(135deg, #facc15, #eab308);
|
| 3059 |
+
color: #000;
|
| 3060 |
+
box-shadow: 0 5px 15px rgba(250, 204, 21, 0.2);
|
| 3061 |
+
}
|
| 3062 |
+
.email-report {
|
| 3063 |
+
background: linear-gradient(135deg, #ef4444, #dc2626);
|
| 3064 |
+
color: #fff;
|
| 3065 |
+
box-shadow: 0 5px 15px rgba(239, 68, 68, 0.2);
|
| 3066 |
+
}
|
| 3067 |
+
.report-actions button:hover {
|
| 3068 |
+
transform: translateY(-3px);
|
| 3069 |
+
box-shadow: 0 10px 20px rgba(0, 229, 255, 0.3);
|
| 3070 |
+
}
|
| 3071 |
+
|
| 3072 |
+
/* Enhanced Report Styles */
|
| 3073 |
+
.dashboard-container {
|
| 3074 |
+
max-width: 1600px;
|
| 3075 |
+
margin: 40px auto;
|
| 3076 |
+
padding: 0 40px;
|
| 3077 |
+
}
|
| 3078 |
+
|
| 3079 |
+
.dashboard-header {
|
| 3080 |
+
display: flex;
|
| 3081 |
+
justify-content: space-between;
|
| 3082 |
+
align-items: center;
|
| 3083 |
+
padding: 25px 35px;
|
| 3084 |
+
margin-bottom: 40px;
|
| 3085 |
+
border-radius: 20px;
|
| 3086 |
+
}
|
| 3087 |
+
|
| 3088 |
+
.header-left .logo-title {
|
| 3089 |
+
font-size: 2.2em;
|
| 3090 |
+
margin-bottom: 8px;
|
| 3091 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 3092 |
+
-webkit-background-clip: text;
|
| 3093 |
+
-webkit-text-fill-color: transparent;
|
| 3094 |
+
}
|
| 3095 |
+
|
| 3096 |
+
.report-meta {
|
| 3097 |
+
display: flex;
|
| 3098 |
+
gap: 15px;
|
| 3099 |
+
}
|
| 3100 |
+
|
| 3101 |
+
.meta-tag {
|
| 3102 |
+
background: rgba(0, 229, 255, 0.1);
|
| 3103 |
+
padding: 6px 12px;
|
| 3104 |
+
border-radius: 20px;
|
| 3105 |
+
font-size: 0.9em;
|
| 3106 |
+
color: #00e5ff;
|
| 3107 |
+
}
|
| 3108 |
+
|
| 3109 |
+
.confidence-pill {
|
| 3110 |
+
background: linear-gradient(135deg, rgba(0, 229, 255, 0.2), rgba(0, 151, 251, 0.2));
|
| 3111 |
+
padding: 10px 20px;
|
| 3112 |
+
border-radius: 25px;
|
| 3113 |
+
display: flex;
|
| 3114 |
+
align-items: center;
|
| 3115 |
+
gap: 10px;
|
| 3116 |
+
}
|
| 3117 |
+
|
| 3118 |
+
.confidence-value {
|
| 3119 |
+
font-size: 1.2em;
|
| 3120 |
+
color: #00e5ff;
|
| 3121 |
+
font-weight: 600;
|
| 3122 |
+
}
|
| 3123 |
+
|
| 3124 |
+
.risk-overview-grid {
|
| 3125 |
+
display: grid;
|
| 3126 |
+
grid-template-columns: 2fr 1fr;
|
| 3127 |
+
gap: 30px;
|
| 3128 |
+
margin-bottom: 40px;
|
| 3129 |
+
}
|
| 3130 |
+
|
| 3131 |
+
.overview-card {
|
| 3132 |
+
padding: 30px;
|
| 3133 |
+
border-radius: 20px;
|
| 3134 |
+
}
|
| 3135 |
+
|
| 3136 |
+
.overview-card.primary-risk {
|
| 3137 |
+
display: flex;
|
| 3138 |
+
justify-content: space-between;
|
| 3139 |
+
align-items: center;
|
| 3140 |
+
}
|
| 3141 |
+
|
| 3142 |
+
.risk-level h3 {
|
| 3143 |
+
font-size: 1.4em;
|
| 3144 |
+
margin-bottom: 15px;
|
| 3145 |
+
color: #fff;
|
| 3146 |
+
}
|
| 3147 |
+
|
| 3148 |
+
.risk-value {
|
| 3149 |
+
font-size: 3em;
|
| 3150 |
+
font-weight: 700;
|
| 3151 |
+
color: #00e5ff;
|
| 3152 |
+
text-shadow: 0 0 20px rgba(0, 229, 255, 0.4);
|
| 3153 |
+
}
|
| 3154 |
+
|
| 3155 |
+
.risk-gauge {
|
| 3156 |
+
text-align: center;
|
| 3157 |
+
}
|
| 3158 |
+
|
| 3159 |
+
.gauge {
|
| 3160 |
+
width: 180px;
|
| 3161 |
+
height: 180px;
|
| 3162 |
+
}
|
| 3163 |
+
|
| 3164 |
+
.likelihood-value {
|
| 3165 |
+
font-size: 2em;
|
| 3166 |
+
color: #00e5ff;
|
| 3167 |
+
margin-top: 15px;
|
| 3168 |
+
}
|
| 3169 |
+
|
| 3170 |
+
.profile-grid {
|
| 3171 |
+
display: grid;
|
| 3172 |
+
grid-template-columns: repeat(2, 1fr);
|
| 3173 |
+
gap: 20px;
|
| 3174 |
+
}
|
| 3175 |
+
|
| 3176 |
+
.analysis-grid {
|
| 3177 |
+
display: grid;
|
| 3178 |
+
grid-template-columns: repeat(2, 1fr);
|
| 3179 |
+
gap: 30px;
|
| 3180 |
+
margin-bottom: 40px;
|
| 3181 |
+
}
|
| 3182 |
+
|
| 3183 |
+
.analysis-card {
|
| 3184 |
+
padding: 25px;
|
| 3185 |
+
border-radius: 20px;
|
| 3186 |
+
}
|
| 3187 |
+
|
| 3188 |
+
.analysis-card h3 {
|
| 3189 |
+
margin-bottom: 20px;
|
| 3190 |
+
color: #fff;
|
| 3191 |
+
font-size: 1.3em;
|
| 3192 |
+
}
|
| 3193 |
+
|
| 3194 |
+
.insights-section {
|
| 3195 |
+
padding: 35px;
|
| 3196 |
+
border-radius: 20px;
|
| 3197 |
+
margin-bottom: 40px;
|
| 3198 |
+
}
|
| 3199 |
+
|
| 3200 |
+
.insights-grid {
|
| 3201 |
+
display: grid;
|
| 3202 |
+
grid-template-columns: repeat(2, 1fr);
|
| 3203 |
+
gap: 30px;
|
| 3204 |
+
margin-top: 25px;
|
| 3205 |
+
}
|
| 3206 |
+
|
| 3207 |
+
.insight-card {
|
| 3208 |
+
background: rgba(0, 229, 255, 0.05);
|
| 3209 |
+
padding: 25px;
|
| 3210 |
+
border-radius: 15px;
|
| 3211 |
+
border: 1px solid rgba(0, 229, 255, 0.1);
|
| 3212 |
+
}
|
| 3213 |
+
|
| 3214 |
+
.insight-card h4 {
|
| 3215 |
+
color: #00e5ff;
|
| 3216 |
+
margin-bottom: 20px;
|
| 3217 |
+
font-size: 1.2em;
|
| 3218 |
+
}
|
| 3219 |
+
|
| 3220 |
+
.insights-list li {
|
| 3221 |
+
margin-bottom: 15px;
|
| 3222 |
+
padding: 12px;
|
| 3223 |
+
background: rgba(0, 229, 255, 0.05);
|
| 3224 |
+
border-radius: 8px;
|
| 3225 |
+
border-left: 3px solid #00e5ff;
|
| 3226 |
+
}
|
| 3227 |
+
|
| 3228 |
+
.recommendations-list {
|
| 3229 |
+
display: grid;
|
| 3230 |
+
gap: 15px;
|
| 3231 |
+
}
|
| 3232 |
+
|
| 3233 |
+
.report-actions {
|
| 3234 |
+
display: flex;
|
| 3235 |
+
justify-content: center;
|
| 3236 |
+
gap: 20px;
|
| 3237 |
+
padding: 25px;
|
| 3238 |
+
border-radius: 20px;
|
| 3239 |
+
}
|
| 3240 |
+
|
| 3241 |
+
.action-button {
|
| 3242 |
+
padding: 12px 25px;
|
| 3243 |
+
border-radius: 12px;
|
| 3244 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3245 |
+
font-size: 1em;
|
| 3246 |
+
display: flex;
|
| 3247 |
+
align-items: center;
|
| 3248 |
+
gap: 8px;
|
| 3249 |
+
cursor: pointer;
|
| 3250 |
+
transition: all 0.3s ease;
|
| 3251 |
+
}
|
| 3252 |
+
|
| 3253 |
+
.action-button.primary {
|
| 3254 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 3255 |
+
color: #000;
|
| 3256 |
+
}
|
| 3257 |
+
|
| 3258 |
+
.action-button.secondary {
|
| 3259 |
+
background: rgba(0, 229, 255, 0.1);
|
| 3260 |
+
color: #00e5ff;
|
| 3261 |
+
border: 1px solid rgba(0, 229, 255, 0.2);
|
| 3262 |
+
}
|
| 3263 |
+
|
| 3264 |
+
.action-button.tertiary {
|
| 3265 |
+
background: rgba(255, 255, 255, 0.05);
|
| 3266 |
+
color: #fff;
|
| 3267 |
+
}
|
| 3268 |
+
|
| 3269 |
+
.action-button:hover {
|
| 3270 |
+
transform: translateY(-3px);
|
| 3271 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.2);
|
| 3272 |
+
}
|
| 3273 |
+
|
| 3274 |
+
@media (max-width: 1200px) {
|
| 3275 |
+
.risk-overview-grid {
|
| 3276 |
+
grid-template-columns: 1fr;
|
| 3277 |
+
}
|
| 3278 |
+
|
| 3279 |
+
.analysis-grid {
|
| 3280 |
+
grid-template-columns: 1fr;
|
| 3281 |
+
}
|
| 3282 |
+
|
| 3283 |
+
.insights-grid {
|
| 3284 |
+
grid-template-columns: 1fr;
|
| 3285 |
+
}
|
| 3286 |
+
}
|
| 3287 |
+
|
| 3288 |
+
@media (max-width: 768px) {
|
| 3289 |
+
.dashboard-container {
|
| 3290 |
+
padding: 20px;
|
| 3291 |
+
}
|
| 3292 |
+
|
| 3293 |
+
.dashboard-header {
|
| 3294 |
+
flex-direction: column;
|
| 3295 |
+
text-align: center;
|
| 3296 |
+
gap: 20px;
|
| 3297 |
+
}
|
| 3298 |
+
|
| 3299 |
+
.report-actions {
|
| 3300 |
+
flex-direction: column;
|
| 3301 |
+
}
|
| 3302 |
+
}
|
| 3303 |
+
|
| 3304 |
+
.report-header {
|
| 3305 |
+
text-align: center;
|
| 3306 |
+
margin-bottom: 40px;
|
| 3307 |
+
}
|
| 3308 |
+
|
| 3309 |
+
.report-header h1 {
|
| 3310 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3311 |
+
font-size: 2.5em;
|
| 3312 |
+
color: #00e5ff;
|
| 3313 |
+
margin-bottom: 15px;
|
| 3314 |
+
}
|
| 3315 |
+
|
| 3316 |
+
.report-meta {
|
| 3317 |
+
color: #aaa;
|
| 3318 |
+
font-size: 0.9em;
|
| 3319 |
+
}
|
| 3320 |
+
|
| 3321 |
+
.report-meta span {
|
| 3322 |
+
margin: 0 10px;
|
| 3323 |
+
}
|
| 3324 |
+
|
| 3325 |
+
.visualization-grid {
|
| 3326 |
+
display: grid;
|
| 3327 |
+
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
| 3328 |
+
gap: 20px;
|
| 3329 |
+
margin: 20px 0;
|
| 3330 |
+
width: 100%;
|
| 3331 |
+
}
|
| 3332 |
+
|
| 3333 |
+
.viz-card {
|
| 3334 |
+
min-height: 300px;
|
| 3335 |
+
max-height: 400px;
|
| 3336 |
+
overflow: hidden;
|
| 3337 |
+
display: flex;
|
| 3338 |
+
flex-direction: column;
|
| 3339 |
+
}
|
| 3340 |
+
|
| 3341 |
+
canvas {
|
| 3342 |
+
max-width: 100% !important;
|
| 3343 |
+
height: auto !important;
|
| 3344 |
+
aspect-ratio: 16/9;
|
| 3345 |
+
object-fit: contain;
|
| 3346 |
+
}
|
| 3347 |
+
|
| 3348 |
+
.viz-card {
|
| 3349 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.4), rgba(0, 10, 30, 0.6));
|
| 3350 |
+
border-radius: 16px;
|
| 3351 |
+
padding: 25px;
|
| 3352 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 3353 |
+
}
|
| 3354 |
+
|
| 3355 |
+
.viz-card h3 {
|
| 3356 |
+
color: #fff;
|
| 3357 |
+
margin-bottom: 20px;
|
| 3358 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3359 |
+
}
|
| 3360 |
+
|
| 3361 |
+
.recommendations-panel {
|
| 3362 |
+
background: linear-gradient(165deg, rgba(0, 20, 40, 0.5), rgba(0, 10, 30, 0.7));
|
| 3363 |
+
border-radius: 16px;
|
| 3364 |
+
padding: 30px;
|
| 3365 |
+
margin: 40px 0;
|
| 3366 |
+
}
|
| 3367 |
+
|
| 3368 |
+
.recommendation-item {
|
| 3369 |
+
background: rgba(0, 229, 255, 0.05);
|
| 3370 |
+
padding: 15px;
|
| 3371 |
+
margin: 10px 0;
|
| 3372 |
+
border-radius: 8px;
|
| 3373 |
+
border-left: 3px solid #00e5ff;
|
| 3374 |
+
}
|
| 3375 |
+
|
| 3376 |
+
.report-actions {
|
| 3377 |
+
text-align: center;
|
| 3378 |
+
margin-top: 40px;
|
| 3379 |
+
}
|
| 3380 |
+
|
| 3381 |
+
.action-button {
|
| 3382 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 3383 |
+
color: #000;
|
| 3384 |
+
border: none;
|
| 3385 |
+
padding: 12px 25px;
|
| 3386 |
+
border-radius: 8px;
|
| 3387 |
+
margin: 0 10px;
|
| 3388 |
+
cursor: pointer;
|
| 3389 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3390 |
+
transition: all 0.3s ease;
|
| 3391 |
+
}
|
| 3392 |
+
|
| 3393 |
+
.action-button:hover {
|
| 3394 |
+
transform: translateY(-3px);
|
| 3395 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.3);
|
| 3396 |
+
}
|
| 3397 |
+
|
| 3398 |
+
/* Media Queries */
|
| 3399 |
+
@media (max-width: 768px) {
|
| 3400 |
+
.visualization-grid {
|
| 3401 |
+
grid-template-columns: 1fr;
|
| 3402 |
+
}
|
| 3403 |
+
|
| 3404 |
+
.report-page {
|
| 3405 |
+
padding: 20px;
|
| 3406 |
+
}
|
| 3407 |
+
}
|
| 3408 |
+
|
| 3409 |
+
/* Media Queries for Result Container */
|
| 3410 |
+
@media (max-width: 600px) {
|
| 3411 |
+
.result-dashboard {
|
| 3412 |
+
grid-template-columns: 1fr;
|
| 3413 |
+
}
|
| 3414 |
+
}
|
| 3415 |
+
/* Enhanced Dashboard Styles */
|
| 3416 |
+
.dashboard-container {
|
| 3417 |
+
max-width: 1400px;
|
| 3418 |
+
margin: 0 auto;
|
| 3419 |
+
padding: 20px;
|
| 3420 |
+
width: 100%;
|
| 3421 |
+
box-sizing: border-box;
|
| 3422 |
+
background: linear-gradient(165deg, rgba(0, 25, 50, 0.92), rgba(0, 15, 35, 0.98));
|
| 3423 |
+
min-height: 100vh;
|
| 3424 |
+
overflow: hidden;
|
| 3425 |
+
position: relative;
|
| 3426 |
+
}
|
| 3427 |
+
|
| 3428 |
+
.dashboard-card {
|
| 3429 |
+
background: linear-gradient(145deg, rgba(0, 20, 40, 0.4), rgba(0, 10, 30, 0.6));
|
| 3430 |
+
border-radius: 16px;
|
| 3431 |
+
padding: 30px;
|
| 3432 |
+
border: 1px solid rgba(0, 229, 255, 0.15);
|
| 3433 |
+
box-shadow:
|
| 3434 |
+
0 10px 30px rgba(0, 0, 0, 0.4),
|
| 3435 |
+
0 0 60px rgba(0, 229, 255, 0.1);
|
| 3436 |
+
transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
|
| 3437 |
+
backdrop-filter: blur(10px);
|
| 3438 |
+
position: relative;
|
| 3439 |
+
overflow: hidden;
|
| 3440 |
+
}
|
| 3441 |
+
|
| 3442 |
+
.dashboard-card:hover {
|
| 3443 |
+
transform: translateY(-5px);
|
| 3444 |
+
border-color: rgba(0, 229, 255, 0.3);
|
| 3445 |
+
box-shadow:
|
| 3446 |
+
0 15px 40px rgba(0, 0, 0, 0.5),
|
| 3447 |
+
0 0 80px rgba(0, 229, 255, 0.2);
|
| 3448 |
+
}
|
| 3449 |
+
|
| 3450 |
+
.dashboard-card h3 {
|
| 3451 |
+
color: #00e5ff;
|
| 3452 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3453 |
+
font-size: 1.4em;
|
| 3454 |
+
margin-bottom: 25px;
|
| 3455 |
+
padding-bottom: 15px;
|
| 3456 |
+
border-bottom: 1px solid rgba(0, 229, 255, 0.2);
|
| 3457 |
+
}
|
| 3458 |
+
|
| 3459 |
+
.stat-grid {
|
| 3460 |
+
display: grid;
|
| 3461 |
+
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
|
| 3462 |
+
gap: 20px;
|
| 3463 |
+
margin-top: 20px;
|
| 3464 |
+
}
|
| 3465 |
+
|
| 3466 |
+
.stat-item {
|
| 3467 |
+
background: linear-gradient(145deg, rgba(0, 25, 50, 0.4), rgba(0, 15, 35, 0.6));
|
| 3468 |
+
padding: 20px;
|
| 3469 |
+
border-radius: 12px;
|
| 3470 |
+
border: 1px solid rgba(0, 229, 255, 0.1);
|
| 3471 |
+
transition: all 0.3s ease;
|
| 3472 |
+
}
|
| 3473 |
+
|
| 3474 |
+
.stat-item:hover {
|
| 3475 |
+
transform: translateY(-3px);
|
| 3476 |
+
border-color: rgba(0, 229, 255, 0.3);
|
| 3477 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.1);
|
| 3478 |
+
}
|
| 3479 |
+
|
| 3480 |
+
.stat-label {
|
| 3481 |
+
font-size: 0.9em;
|
| 3482 |
+
color: #aaa;
|
| 3483 |
+
display: block;
|
| 3484 |
+
margin-bottom: 8px;
|
| 3485 |
+
}
|
| 3486 |
+
|
| 3487 |
+
.stat-value {
|
| 3488 |
+
font-size: 1.8em;
|
| 3489 |
+
color: #00e5ff;
|
| 3490 |
+
font-weight: 600;
|
| 3491 |
+
display: block;
|
| 3492 |
+
text-shadow: 0 0 10px rgba(0, 229, 255, 0.3);
|
| 3493 |
+
}
|
| 3494 |
+
|
| 3495 |
+
.insights-list {
|
| 3496 |
+
list-style: none;
|
| 3497 |
+
padding: 0;
|
| 3498 |
+
margin: 0;
|
| 3499 |
+
display: grid;
|
| 3500 |
+
gap: 15px;
|
| 3501 |
+
}
|
| 3502 |
+
|
| 3503 |
+
.insights-list li {
|
| 3504 |
+
padding: 15px;
|
| 3505 |
+
background: rgba(0, 229, 255, 0.05);
|
| 3506 |
+
border-radius: 10px;
|
| 3507 |
+
border-left: 3px solid #00e5ff;
|
| 3508 |
+
transition: all 0.3s ease;
|
| 3509 |
+
}
|
| 3510 |
+
|
| 3511 |
+
.insights-list li:hover {
|
| 3512 |
+
transform: translateX(5px);
|
| 3513 |
+
background: rgba(0, 229, 255, 0.1);
|
| 3514 |
+
}
|
| 3515 |
+
|
| 3516 |
+
.action-button {
|
| 3517 |
+
background: linear-gradient(135deg, #00e5ff, #0097fb);
|
| 3518 |
+
color: #000;
|
| 3519 |
+
border: none;
|
| 3520 |
+
padding: 12px 25px;
|
| 3521 |
+
border-radius: 12px;
|
| 3522 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3523 |
+
font-size: 1em;
|
| 3524 |
+
cursor: pointer;
|
| 3525 |
+
transition: all 0.3s ease;
|
| 3526 |
+
margin: 0 10px;
|
| 3527 |
+
box-shadow: 0 5px 15px rgba(0, 229, 255, 0.2);
|
| 3528 |
+
}
|
| 3529 |
+
|
| 3530 |
+
.action-button:hover {
|
| 3531 |
+
transform: translateY(-3px);
|
| 3532 |
+
box-shadow: 0 8px 25px rgba(0, 229, 255, 0.3);
|
| 3533 |
+
}
|
| 3534 |
+
|
| 3535 |
+
.gauge-container {
|
| 3536 |
+
max-width: 200px;
|
| 3537 |
+
margin: 20px auto;
|
| 3538 |
+
position: relative;
|
| 3539 |
+
}
|
| 3540 |
+
|
| 3541 |
+
canvas {
|
| 3542 |
+
max-width: 100%;
|
| 3543 |
+
height: auto;
|
| 3544 |
+
margin: 15px 0;
|
| 3545 |
+
}
|
| 3546 |
+
|
| 3547 |
+
@media (max-width: 768px) {
|
| 3548 |
+
.dashboard-container {
|
| 3549 |
+
padding: 20px;
|
| 3550 |
+
}
|
| 3551 |
+
|
| 3552 |
+
.dashboard-grid {
|
| 3553 |
+
grid-template-columns: 1fr;
|
| 3554 |
+
}
|
| 3555 |
+
|
| 3556 |
+
.stat-grid {
|
| 3557 |
+
grid-template-columns: 1fr;
|
| 3558 |
+
}
|
| 3559 |
+
|
| 3560 |
+
.action-button {
|
| 3561 |
+
width: 100%;
|
| 3562 |
+
margin: 10px 0;
|
| 3563 |
+
}
|
| 3564 |
+
}
|
| 3565 |
+
|
| 3566 |
+
.glow-title {
|
| 3567 |
+
text-align: center;
|
| 3568 |
+
font-family: 'Orbitron', sans-serif;
|
| 3569 |
+
color: #00e5ff;
|
| 3570 |
+
font-size: 2.4rem;
|
| 3571 |
+
text-shadow: 0 0 10px rgba(0, 229, 255, 0.7);
|
| 3572 |
+
margin-bottom: 20px;
|
| 3573 |
+
}
|
| 3574 |
+
|
| 3575 |
+
.dashboard-grid {
|
| 3576 |
+
display: grid;
|
| 3577 |
+
grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
|
| 3578 |
+
gap: 30px;
|
| 3579 |
+
margin-top: 30px;
|
| 3580 |
+
}
|
| 3581 |
+
|
| 3582 |
+
.dashboard-card {
|
| 3583 |
+
background: linear-gradient(145deg, rgba(0,20,40,0.5), rgba(0,10,30,0.7));
|
| 3584 |
+
border-radius: 16px;
|
| 3585 |
+
padding: 25px;
|
| 3586 |
+
border: 1px solid rgba(0,229,255,0.15);
|
| 3587 |
+
box-shadow: 0 10px 20px rgba(0, 229, 255, 0.1);
|
| 3588 |
+
transition: 0.3s ease all;
|
| 3589 |
+
}
|
| 3590 |
+
|
| 3591 |
+
.dashboard-card:hover {
|
| 3592 |
+
transform: translateY(-4px);
|
| 3593 |
+
box-shadow: 0 0 25px rgba(0, 229, 255, 0.15);
|
| 3594 |
+
}
|
| 3595 |
+
|
| 3596 |
+
.stat-grid {
|
| 3597 |
+
display: flex;
|
| 3598 |
+
justify-content: space-between;
|
| 3599 |
+
flex-wrap: wrap;
|
| 3600 |
+
gap: 20px;
|
| 3601 |
+
}
|
| 3602 |
+
|
| 3603 |
+
.stat-item {
|
| 3604 |
+
flex: 1;
|
| 3605 |
+
background: rgba(0,229,255,0.05);
|
| 3606 |
+
padding: 15px;
|
| 3607 |
+
border-radius: 12px;
|
| 3608 |
+
text-align: center;
|
| 3609 |
+
border: 1px solid rgba(0,229,255,0.1);
|
| 3610 |
+
}
|
| 3611 |
+
|
| 3612 |
+
.stat-label {
|
| 3613 |
+
font-size: 0.9em;
|
| 3614 |
+
color: #aaa;
|
| 3615 |
+
}
|
| 3616 |
+
|
| 3617 |
+
.stat-value {
|
| 3618 |
+
font-size: 1.6em;
|
| 3619 |
+
color: #00e5ff;
|
| 3620 |
+
font-weight: bold;
|
| 3621 |
+
margin-top: 6px;
|
| 3622 |
+
}
|
| 3623 |
+
|
| 3624 |
+
.insights-list {
|
| 3625 |
+
list-style: none;
|
| 3626 |
+
padding-left: 0;
|
| 3627 |
+
margin-top: 15px;
|
| 3628 |
+
}
|
| 3629 |
+
|
| 3630 |
+
.insights-list li {
|
| 3631 |
+
padding: 12px 16px;
|
| 3632 |
+
margin-bottom: 12px;
|
| 3633 |
+
background: rgba(0, 229, 255, 0.05);
|
| 3634 |
+
border-left: 3px solid #00e5ff;
|
| 3635 |
+
border-radius: 8px;
|
| 3636 |
+
color: #ccc;
|
| 3637 |
+
line-height: 1.6;
|
| 3638 |
+
}
|
| 3639 |
+
.dashboard-header {
|
| 3640 |
+
display: flex;
|
| 3641 |
+
justify-content: space-between;
|
| 3642 |
+
align-items: center;
|
| 3643 |
+
background: linear-gradient(145deg, #0a0a23, #141436);
|
| 3644 |
+
padding: 20px 30px;
|
| 3645 |
+
border-bottom: 2px solid rgba(0,229,255,0.15);
|
| 3646 |
+
box-shadow: 0 4px 20px rgba(0,229,255,0.1);
|
| 3647 |
+
border-radius: 12px;
|
| 3648 |
+
margin-bottom: 20px;
|
| 3649 |
+
}
|
| 3650 |
+
|
| 3651 |
+
.logo-title {
|
| 3652 |
+
font-family: 'Orbitron', sans-serif;
|
| 3653 |
+
font-size: 1.8rem;
|
| 3654 |
+
color: #00e5ff;
|
| 3655 |
+
text-shadow: 0 0 8px rgba(0,229,255,0.5);
|
| 3656 |
+
margin: 0;
|
| 3657 |
+
}
|
| 3658 |
+
|
| 3659 |
+
.meta-box {
|
| 3660 |
+
text-align: right;
|
| 3661 |
+
color: #bbb;
|
| 3662 |
+
font-family: 'Space Grotesk', sans-serif;
|
| 3663 |
+
font-size: 0.95rem;
|
| 3664 |
+
}
|
| 3665 |
+
|
| 3666 |
+
.meta-item {
|
| 3667 |
+
display: block;
|
| 3668 |
+
margin-bottom: 4px;
|
| 3669 |
+
}
|
| 3670 |
+
body {
|
| 3671 |
+
margin: 0;
|
| 3672 |
+
padding: 0;
|
| 3673 |
+
background: linear-gradient(to right, #0f0f1c, #090921);
|
| 3674 |
+
font-family: 'Orbitron', sans-serif;
|
| 3675 |
+
color: #fff;
|
| 3676 |
+
}
|
| 3677 |
+
|
| 3678 |
+
.dashboard-container {
|
| 3679 |
+
max-width: 1600px;
|
| 3680 |
+
margin: auto;
|
| 3681 |
+
padding: 30px;
|
| 3682 |
+
}
|
| 3683 |
+
|
| 3684 |
+
.dashboard-header {
|
| 3685 |
+
display: flex;
|
| 3686 |
+
justify-content: space-between;
|
| 3687 |
+
align-items: center;
|
| 3688 |
+
background: linear-gradient(145deg, #0a0a23, #141436);
|
| 3689 |
+
padding: 20px 30px;
|
| 3690 |
+
border-bottom: 2px solid rgba(0,229,255,0.15);
|
| 3691 |
+
box-shadow: 0 4px 20px rgba(0,229,255,0.1);
|
| 3692 |
+
border-radius: 12px;
|
| 3693 |
+
margin-bottom: 30px;
|
| 3694 |
+
}
|
| 3695 |
+
|
| 3696 |
+
.logo-title {
|
| 3697 |
+
font-size: 1.8rem;
|
| 3698 |
+
color: #00e5ff;
|
| 3699 |
+
text-shadow: 0 0 8px rgba(0,229,255,0.5);
|
| 3700 |
+
}
|
| 3701 |
+
|
| 3702 |
+
.meta-box {
|
| 3703 |
+
text-align: right;
|
| 3704 |
+
font-size: 0.95rem;
|
| 3705 |
+
color: #bbb;
|
| 3706 |
+
}
|
| 3707 |
+
|
| 3708 |
+
.meta-item {
|
| 3709 |
+
display: block;
|
| 3710 |
+
margin-bottom: 4px;
|
| 3711 |
+
}
|
| 3712 |
+
|
| 3713 |
+
.dashboard-grid {
|
| 3714 |
+
display: grid;
|
| 3715 |
+
grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
|
| 3716 |
+
gap: 30px;
|
| 3717 |
+
}
|
| 3718 |
+
|
| 3719 |
+
.dashboard-card {
|
| 3720 |
+
background: linear-gradient(145deg, rgba(0,20,40,0.5), rgba(0,10,30,0.7));
|
| 3721 |
+
border-radius: 16px;
|
| 3722 |
+
padding: 25px;
|
| 3723 |
+
border: 1px solid rgba(0,229,255,0.15);
|
| 3724 |
+
box-shadow: 0 10px 20px rgba(0, 229, 255, 0.1);
|
| 3725 |
+
transition: 0.3s ease all;
|
| 3726 |
+
}
|
| 3727 |
+
|
| 3728 |
+
.dashboard-card:hover {
|
| 3729 |
+
transform: translateY(-4px);
|
| 3730 |
+
box-shadow: 0 0 25px rgba(0, 229, 255, 0.15);
|
| 3731 |
+
}
|
| 3732 |
+
|
| 3733 |
+
.risk-level-label {
|
| 3734 |
+
text-align: center;
|
| 3735 |
+
color: #fff;
|
| 3736 |
+
margin-top: 10px;
|
| 3737 |
+
}
|
| 3738 |
+
|
| 3739 |
+
.risk-level-value {
|
| 3740 |
+
font-size: 2em;
|
| 3741 |
+
color: #00e5ff;
|
| 3742 |
+
text-align: center;
|
| 3743 |
+
font-weight: bold;
|
| 3744 |
+
margin-top: 5px;
|
| 3745 |
+
}
|
| 3746 |
+
|
| 3747 |
+
.risk-level-indicator {
|
| 3748 |
+
/* Add styles for risk level indicator here */
|
| 3749 |
+
}
|