AmrGaberr commited on
Commit
dbb4ec9
·
verified ·
1 Parent(s): 28866ea

Upload 9 files

Browse files
Files changed (9) hide show
  1. UI2/about.html +116 -0
  2. UI2/calculator.html +1450 -0
  3. UI2/calculator.js +481 -0
  4. UI2/chatbot.html +1166 -0
  5. UI2/index.html +120 -0
  6. UI2/java.js +197 -0
  7. UI2/report.html +1017 -0
  8. UI2/report.js +731 -0
  9. 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
+ }