NGOC1712 commited on
Commit
3df007f
·
verified ·
1 Parent(s): 483bf3d

Delete static

Browse files
static/css/_about.css DELETED
@@ -1,190 +0,0 @@
1
- /* About Section Styles */
2
- .about {
3
- position: relative;
4
- overflow: hidden;
5
- }
6
-
7
- .about-background {
8
- position: absolute;
9
- top: 0;
10
- left: 0;
11
- width: 100%;
12
- height: 100%;
13
- z-index: 0;
14
- overflow: hidden;
15
- }
16
-
17
- .about-bg-image {
18
- width: 100%;
19
- height: 100%;
20
- object-fit: cover;
21
- object-position: center;
22
- opacity: 0.08;
23
- transition: all 0.3s ease;
24
- animation: slowFloat 20s ease-in-out infinite;
25
- }
26
-
27
- .about:hover .about-bg-image {
28
- opacity: 0.12;
29
- transform: scale(1.02);
30
- }
31
-
32
- @keyframes slowFloat {
33
- 0%, 100% {
34
- transform: translateY(0px) scale(1);
35
- }
36
- 50% {
37
- transform: translateY(-20px) scale(1.01);
38
- }
39
- }
40
- .about .container {
41
- position: relative;
42
- z-index: 1;
43
- }
44
-
45
- .about-content {
46
- display: grid;
47
- grid-template-columns: 300px 1fr;
48
- gap: 4rem;
49
- align-items: start;
50
- }
51
-
52
- .about-profile {
53
- position: relative;
54
- }
55
-
56
- .profile-image {
57
- position: relative;
58
- width: 250px;
59
- height: 300px;
60
- margin: 0 auto;
61
- border-radius: 20px;
62
- overflow: hidden;
63
- background: var(--gradient);
64
- display: flex;
65
- align-items: center;
66
- justify-content: center;
67
- box-shadow: 0 10px 30px rgba(99, 102, 241, 0.3);
68
- }
69
-
70
- .profile-photo {
71
- width: 100%;
72
- height: 100%;
73
- object-fit: cover;
74
- object-position: center;
75
- display: block;
76
- position: relative;
77
- z-index: 1;
78
- }
79
-
80
- .profile-overlay {
81
- position: absolute;
82
- top: 0;
83
- left: 0;
84
- display: flex;
85
- align-items: center;
86
- justify-content: center;
87
- width: 100%;
88
- height: 100%;
89
- background: rgba(250, 250, 255, 0.1);
90
- backdrop-filter: blur(10px);
91
- opacity: 0;
92
- transition: opacity 0.3s ease;
93
- z-index: 2;
94
- }
95
-
96
- .profile-image:hover .profile-overlay {
97
- opacity: 1;
98
- }
99
-
100
- .profile-overlay i {
101
- font-size: 4rem;
102
- color: var(--white);
103
- opacity: 0.8;
104
- }
105
-
106
- .about-info {
107
- display: flex;
108
- flex-direction: column;
109
- gap: 2rem;
110
- }
111
-
112
- .about-text {
113
- font-size: 1.1rem;
114
- line-height: 1.8;
115
- color: var(--text-muted);
116
- }
117
-
118
- .about-highlights {
119
- display: flex;
120
- flex-direction: column;
121
- gap: 1rem;
122
- margin-top: 1.5rem;
123
- }
124
-
125
- .highlight-item {
126
- display: flex;
127
- align-items: center;
128
- gap: 1rem;
129
- padding: 1rem;
130
- background: var(--dark-light);
131
- border-radius: 10px;
132
- border-left: 4px solid var(--primary);
133
- }
134
-
135
- .highlight-item i {
136
- color: var(--primary);
137
- font-size: 1.2rem;
138
- }
139
-
140
- .highlight-item span {
141
- color: var(--light);
142
- font-weight: 500;
143
- }
144
-
145
- .about-stats {
146
- display: grid;
147
- grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
148
- gap: 2rem;
149
- }
150
-
151
- .stat-card {
152
- background: var(--dark-light);
153
- padding: 2rem;
154
- border-radius: 15px;
155
- text-align: center;
156
- border: 1px solid var(--border);
157
- transition: all 0.3s ease;
158
- box-shadow: 0 4px 15px var(--shadow);
159
- }
160
-
161
- .stat-card:hover {
162
- transform: translateY(-5px);
163
- border-color: var(--primary);
164
- box-shadow: 0 10px 30px rgba(99, 102, 241, 0.2);
165
- }
166
-
167
- .stat-card i {
168
- font-size: 2rem;
169
- color: var(--primary);
170
- margin-bottom: 1rem;
171
- }
172
-
173
- .stat-card h3 {
174
- font-size: 2rem;
175
- margin-bottom: 0.5rem;
176
- }
177
-
178
- /* About Responsive */
179
- @media (max-width: 768px) {
180
- .about-content {
181
- grid-template-columns: 1fr;
182
- gap: 2rem;
183
- text-align: center;
184
- }
185
-
186
- .profile-image {
187
- width: 200px;
188
- height: 240px;
189
- }
190
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/css/_base.css DELETED
@@ -1,116 +0,0 @@
1
- /* Base Styles & CSS Variables */
2
- * {
3
- margin: 0;
4
- padding: 0;
5
- box-sizing: border-box;
6
- }
7
-
8
- :root {
9
- --primary: #2563eb;
10
- --primary-dark: #1d4ed8;
11
- --secondary: #06b6d4;
12
- --accent: #0ea5e9;
13
- --dark: #ffffff;
14
- --dark-light: #f8fafc;
15
- --gray: #475569;
16
- --light: #1e293b;
17
- --white: #0f172a;
18
- --text-muted: #64748b;
19
- --border: #e2e8f0;
20
- --gradient: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
21
- --folder-color: #f59e0b;
22
- --github-color: #1f2937;
23
- --email-color: #dc2626;
24
- --huggingface-color: #f59e0b;
25
- --shadow: rgba(15, 23, 42, 0.1);
26
- }
27
-
28
- body {
29
- font-family: 'Inter', sans-serif;
30
- background: var(--dark);
31
- color: var(--light);
32
- line-height: 1.6;
33
- overflow-x: hidden;
34
- }
35
-
36
- .container {
37
- max-width: 1200px;
38
- margin: 0 auto;
39
- padding: 0 20px;
40
- }
41
-
42
- /* Common Sections */
43
- section {
44
- padding: 80px 0;
45
- }
46
-
47
- .section-title {
48
- font-size: 2.5rem;
49
- font-weight: 700;
50
- text-align: center;
51
- margin-bottom: 3rem;
52
- background: var(--gradient);
53
- -webkit-background-clip: text;
54
- -webkit-text-fill-color: transparent;
55
- }
56
-
57
- /* Common Animations */
58
- @keyframes fadeInUp {
59
- from {
60
- opacity: 0;
61
- transform: translateY(30px);
62
- }
63
- to {
64
- opacity: 1;
65
- transform: translateY(0);
66
- }
67
- }
68
-
69
- @keyframes fadeInLeft {
70
- from {
71
- opacity: 0;
72
- transform: translateX(-30px);
73
- }
74
- to {
75
- opacity: 1;
76
- transform: translateX(0);
77
- }
78
- }
79
-
80
- @keyframes blink {
81
- 0%, 50% { opacity: 1; }
82
- 51%, 100% { opacity: 0; }
83
- }
84
-
85
- @keyframes shimmer {
86
- 0% { transform: translateX(-100%); }
87
- 100% { transform: translateX(100%); }
88
- }
89
-
90
- @keyframes progressShine {
91
- 0% { transform: translateX(-100%); }
92
- 50% { transform: translateX(0%); }
93
- 100% { transform: translateX(100%); }
94
- }
95
-
96
- @keyframes float {
97
- 0%, 100% {
98
- transform: translate(0, 0) rotate(0deg);
99
- }
100
- 33% {
101
- transform: translate(30px, -30px) rotate(120deg);
102
- }
103
- 66% {
104
- transform: translate(-20px, 20px) rotate(240deg);
105
- }
106
- }
107
-
108
- @keyframes float1 {
109
- 0%, 100% { transform: translate(0, 0) rotate(0deg); }
110
- 50% { transform: translate(-30px, -20px) rotate(3deg); }
111
- }
112
-
113
- @keyframes float2 {
114
- 0%, 100% { transform: translate(0, 0) rotate(0deg); }
115
- 50% { transform: translate(40px, -30px) rotate(-4deg); }
116
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/css/_contact-footer.css DELETED
@@ -1,156 +0,0 @@
1
- /* Contact & Footer Section Styles */
2
-
3
- /* Contact Section */
4
- .contact {
5
- background: var(--dark-light);
6
- position: relative;
7
- overflow: hidden;
8
- }
9
-
10
- .contact-background {
11
- position: absolute;
12
- top: 0;
13
- left: 0;
14
- width: 100%;
15
- height: 100%;
16
- z-index: 0;
17
- overflow: hidden;
18
- }
19
-
20
- .contact-bg-image {
21
- width: 100%;
22
- height: 100%;
23
- object-fit: cover;
24
- object-position: center;
25
- opacity: 0.1;
26
- transition: all 0.3s ease;
27
- animation: robotMove 25s ease-in-out infinite;
28
- }
29
-
30
- .contact:hover .contact-bg-image {
31
- opacity: 0.15;
32
- transform: scale(1.02);
33
- }
34
-
35
- @keyframes robotMove {
36
- 0%, 100% {
37
- transform: translateX(0px) scale(1);
38
- }
39
- 25% {
40
- transform: translateX(10px) scale(1.005);
41
- }
42
- 50% {
43
- transform: translateX(0px) scale(1.01);
44
- }
45
- 75% {
46
- transform: translateX(-10px) scale(1.005);
47
- }
48
- }
49
-
50
- .contact .container {
51
- position: relative;
52
- z-index: 1;
53
- }
54
-
55
- .contact-content {
56
- text-align: center;
57
- max-width: 700px;
58
- margin: 0 auto;
59
- }
60
-
61
- .contact-text {
62
- margin-bottom: 3rem;
63
- }
64
-
65
- .contact-text p {
66
- font-size: 1.2rem;
67
- color: var(--gray);
68
- margin-bottom: 1rem;
69
- line-height: 1.6;
70
- }
71
-
72
- .contact-text p:last-child {
73
- color: var(--primary);
74
- font-weight: 600;
75
- }
76
-
77
- .contact-info {
78
- display: grid;
79
- grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
80
- gap: 1.5rem;
81
- max-width: 600px;
82
- margin: 0 auto;
83
- }
84
-
85
- .contact-item {
86
- display: flex;
87
- align-items: center;
88
- justify-content: center;
89
- gap: 1rem;
90
- color: var(--light);
91
- text-decoration: none;
92
- transition: all 0.3s ease;
93
- padding: 20px;
94
- border-radius: 15px;
95
- background: rgba(255, 255, 255, 0.05);
96
- border: 1px solid rgba(99, 102, 241, 0.2);
97
- min-height: 70px;
98
- }
99
-
100
- .contact-item:hover {
101
- color: var(--light);
102
- transform: translateY(-5px);
103
- background: rgba(255, 255, 255, 0.1);
104
- border-color: var(--primary);
105
- box-shadow: 0 10px 30px rgba(99, 102, 241, 0.2);
106
- }
107
-
108
- .contact-item i {
109
- font-size: 1.2rem;
110
- color: var(--primary);
111
- width: 25px;
112
- text-align: center;
113
- }
114
-
115
- /* Specific colors for contact icons */
116
- .contact-item .fa-github {
117
- color: #24292e;
118
- }
119
-
120
- .contact-item:hover .fa-github {
121
- color: #ffffff;
122
- background: radial-gradient(circle, #24292e 0%, #333333 100%);
123
- border-radius: 50%;
124
- padding: 5px;
125
- }
126
-
127
- .contact-item .fa-envelope {
128
- color: #ea4335;
129
- }
130
-
131
- .contact-item:hover .fa-envelope {
132
- color: #ffffff;
133
- background: radial-gradient(circle, #ea4335 0%, #d33b2c 100%);
134
- border-radius: 50%;
135
- padding: 5px;
136
- }
137
-
138
- .contact-item .fa-map-marker-alt {
139
- color: #4285f4;
140
- }
141
-
142
- .contact-item:hover .fa-map-marker-alt {
143
- color: #ffffff;
144
- background: radial-gradient(circle, #4285f4 0%, #1a73e8 100%);
145
- border-radius: 50%;
146
- padding: 5px;
147
- }
148
-
149
- /* Footer */
150
- .footer {
151
- text-align: center;
152
- padding: 2rem 0;
153
- background: var(--dark);
154
- color: var(--gray);
155
- border-top: 1px solid rgba(99, 102, 241, 0.2);
156
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/css/_experience-projects.css DELETED
@@ -1,290 +0,0 @@
1
- /* Experience & Projects Section Styles */
2
-
3
- /* Experience Section */
4
- .experience {
5
- position: relative;
6
- overflow: hidden;
7
- }
8
-
9
- .experience-background {
10
- position: absolute;
11
- top: 0;
12
- left: 0;
13
- width: 100%;
14
- height: 100%;
15
- z-index: 0;
16
- overflow: hidden;
17
- }
18
-
19
- .experience-bg-image {
20
- width: 100%;
21
- height: 100%;
22
- object-fit: cover;
23
- object-position: center;
24
- opacity: 0.05;
25
- transition: all 0.3s ease;
26
- animation: brainPulse 15s ease-in-out infinite;
27
- }
28
-
29
- .experience:hover .experience-bg-image {
30
- opacity: 0.08;
31
- transform: scale(1.02);
32
- }
33
-
34
- @keyframes brainPulse {
35
- 0%, 100% {
36
- transform: scale(1);
37
- filter: brightness(1);
38
- }
39
- 50% {
40
- transform: scale(1.01);
41
- filter: brightness(1.1);
42
- }
43
- }
44
-
45
- .experience .container {
46
- position: relative;
47
- z-index: 1;
48
- }
49
- .timeline {
50
- position: relative;
51
- padding-left: 40px;
52
- }
53
-
54
- .timeline::before {
55
- content: '';
56
- position: absolute;
57
- left: 0;
58
- top: 0;
59
- height: 100%;
60
- width: 2px;
61
- background: var(--primary);
62
- }
63
-
64
- .timeline-item {
65
- position: relative;
66
- margin-bottom: 3rem;
67
- animation: fadeInLeft 1s ease;
68
- }
69
-
70
- .timeline-marker {
71
- position: absolute;
72
- left: -45px;
73
- top: 5px;
74
- width: 12px;
75
- height: 12px;
76
- border-radius: 50%;
77
- background: var(--primary);
78
- box-shadow: 0 0 0 4px var(--dark), 0 0 0 6px var(--primary);
79
- }
80
-
81
- .timeline-content {
82
- background: var(--dark-light);
83
- padding: 2rem;
84
- border-radius: 15px;
85
- border: 1px solid rgba(99, 102, 241, 0.2);
86
- }
87
-
88
- .timeline-content h3 {
89
- color: var(--primary);
90
- margin-bottom: 0.5rem;
91
- }
92
-
93
- .timeline-content h4 {
94
- color: var(--light);
95
- margin-bottom: 0.5rem;
96
- }
97
-
98
- .period {
99
- color: var(--gray);
100
- font-size: 0.9rem;
101
- display: inline-block;
102
- margin-bottom: 1rem;
103
- }
104
-
105
- .timeline-content ul {
106
- list-style: none;
107
- padding-left: 0;
108
- }
109
-
110
- .timeline-content li {
111
- position: relative;
112
- padding-left: 25px;
113
- margin-bottom: 0.5rem;
114
- color: var(--gray);
115
- }
116
-
117
- .timeline-content li::before {
118
- content: '▸';
119
- position: absolute;
120
- left: 0;
121
- color: var(--primary);
122
- }
123
-
124
- /* Projects Section */
125
- .projects {
126
- position: relative;
127
- overflow: hidden;
128
- }
129
-
130
- .projects::after {
131
- content: '';
132
- position: absolute;
133
- top: 0;
134
- left: 0;
135
- width: 100%;
136
- height: 100%;
137
- background-image: url('/static/image-3.png');
138
- background-size: cover;
139
- background-position: center;
140
- background-repeat: no-repeat;
141
- opacity: 0.06;
142
- z-index: 0;
143
- }
144
-
145
- .projects-grid {
146
- display: grid;
147
- grid-template-columns: repeat(auto-fit, minmax(380px, 1fr));
148
- gap: 2.5rem;
149
- position: relative;
150
- z-index: 1;
151
- }
152
-
153
- .project-card {
154
- background: var(--dark-light);
155
- padding: 2.5rem;
156
- border-radius: 20px;
157
- border: 1px solid var(--border);
158
- transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
159
- position: relative;
160
- overflow: hidden;
161
- box-shadow: 0 4px 20px var(--shadow);
162
- }
163
-
164
- .project-card::before {
165
- content: '';
166
- position: absolute;
167
- top: 0;
168
- left: 0;
169
- width: 100%;
170
- height: 4px;
171
- background: var(--gradient);
172
- transform: scaleX(0);
173
- transform-origin: left;
174
- transition: transform 0.4s ease;
175
- }
176
-
177
- .project-card:hover::before {
178
- transform: scaleX(1);
179
- }
180
-
181
- .project-card:hover {
182
- transform: translateY(-8px);
183
- border-color: var(--primary);
184
- box-shadow: 0 20px 50px rgba(99, 102, 241, 0.25);
185
- }
186
-
187
- .project-header {
188
- display: flex;
189
- justify-content: space-between;
190
- align-items: center;
191
- margin-bottom: 1.5rem;
192
- }
193
-
194
- .project-header i {
195
- font-size: 2rem;
196
- color: var(--folder-color);
197
- filter: drop-shadow(0 0 8px rgba(251, 191, 36, 0.4));
198
- transition: all 0.3s ease;
199
- }
200
-
201
- .project-card:hover .project-header i {
202
- color: #fcd34d;
203
- filter: drop-shadow(0 0 15px rgba(251, 191, 36, 0.7));
204
- transform: scale(1.15) rotate(5deg);
205
- }
206
-
207
- .project-role {
208
- font-size: 0.85rem;
209
- color: var(--white);
210
- background: var(--gradient);
211
- padding: 6px 14px;
212
- border-radius: 25px;
213
- font-weight: 600;
214
- text-transform: uppercase;
215
- letter-spacing: 0.5px;
216
- }
217
-
218
- .project-card h3 {
219
- margin-bottom: 1rem;
220
- color: var(--light);
221
- font-size: 1.3rem;
222
- font-weight: 600;
223
- }
224
-
225
- .project-card p {
226
- color: var(--gray);
227
- margin-bottom: 2rem;
228
- line-height: 1.6;
229
- }
230
-
231
- .project-tech {
232
- display: flex;
233
- flex-wrap: wrap;
234
- gap: 0.75rem;
235
- margin-bottom: 2rem;
236
- }
237
-
238
- .tech-tag {
239
- background: linear-gradient(135deg, rgba(99, 102, 241, 0.15), rgba(99, 102, 241, 0.05));
240
- color: var(--primary);
241
- padding: 8px 16px;
242
- border-radius: 25px;
243
- font-size: 0.85rem;
244
- font-weight: 500;
245
- border: 1px solid rgba(99, 102, 241, 0.2);
246
- transition: all 0.3s ease;
247
- position: relative;
248
- overflow: hidden;
249
- }
250
-
251
- .tech-tag::before {
252
- content: '';
253
- position: absolute;
254
- top: 0;
255
- left: -100%;
256
- width: 100%;
257
- height: 100%;
258
- background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
259
- transition: left 0.5s ease;
260
- }
261
-
262
- .tech-tag:hover::before {
263
- left: 100%;
264
- }
265
-
266
- .tech-tag:hover {
267
- transform: translateY(-2px);
268
- border-color: var(--primary);
269
- background: linear-gradient(135deg, rgba(99, 102, 241, 0.25), rgba(99, 102, 241, 0.1));
270
- box-shadow: 0 5px 15px rgba(99, 102, 241, 0.2);
271
- }
272
-
273
- .project-highlights {
274
- list-style: none;
275
- }
276
-
277
- .project-highlights li {
278
- position: relative;
279
- padding-left: 20px;
280
- margin-bottom: 0.5rem;
281
- color: var(--gray);
282
- font-size: 0.9rem;
283
- }
284
-
285
- .project-highlights li::before {
286
- content: '✓';
287
- position: absolute;
288
- left: 0;
289
- color: var(--primary);
290
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/css/_hero.css DELETED
@@ -1,318 +0,0 @@
1
- /* Hero Section Styles */
2
- .hero {
3
- min-height: 100vh;
4
- display: flex;
5
- align-items: center;
6
- justify-content: center;
7
- position: relative;
8
- background: linear-gradient(180deg, var(--dark) 0%, var(--dark-light) 100%);
9
- overflow: hidden;
10
- }
11
-
12
- .hero::before {
13
- content: '';
14
- position: absolute;
15
- top: 0;
16
- left: 0;
17
- width: 100%;
18
- height: 100%;
19
- background-image: url('/static/image-2.png');
20
- background-size: cover;
21
- background-position: center;
22
- background-repeat: no-repeat;
23
- opacity: 0.15;
24
- z-index: 0;
25
- }
26
-
27
- .hero-content {
28
- text-align: center;
29
- z-index: 2;
30
- animation: fadeInUp 1s ease;
31
- }
32
-
33
- /* Glitch Effect */
34
- .glitch {
35
- font-size: 4rem;
36
- font-weight: 700;
37
- text-transform: uppercase;
38
- position: relative;
39
- color: var(--white);
40
- letter-spacing: 5px;
41
- animation: glitch 2s infinite;
42
- }
43
-
44
- .glitch::before,
45
- .glitch::after {
46
- content: attr(data-text);
47
- position: absolute;
48
- top: 0;
49
- left: 0;
50
- width: 100%;
51
- height: 100%;
52
- }
53
-
54
- .glitch::before {
55
- animation: glitch-1 0.5s infinite;
56
- color: var(--primary);
57
- z-index: -1;
58
- }
59
-
60
- .glitch::after {
61
- animation: glitch-2 0.5s infinite;
62
- color: var(--secondary);
63
- z-index: -2;
64
- }
65
-
66
- @keyframes glitch {
67
- 0%, 100% {
68
- text-shadow: 0 0 5px rgba(99, 102, 241, 0.5);
69
- }
70
- 50% {
71
- text-shadow: 0 0 20px rgba(99, 102, 241, 0.8);
72
- }
73
- }
74
-
75
- @keyframes glitch-1 {
76
- 0%, 100% {
77
- clip: rect(0, 900px, 0, 0);
78
- }
79
- 25% {
80
- clip: rect(20px, 900px, 40px, 0);
81
- transform: translate(-2px, 2px);
82
- }
83
- 50% {
84
- clip: rect(60px, 900px, 80px, 0);
85
- transform: translate(2px, -2px);
86
- }
87
- 75% {
88
- clip: rect(100px, 900px, 120px, 0);
89
- transform: translate(-2px, 2px);
90
- }
91
- }
92
-
93
- /* Hero Text Elements */
94
- .hero-title {
95
- font-size: 1.8rem;
96
- margin: 1.5rem 0;
97
- background-clip: text;
98
- -webkit-background-clip: text;
99
- -webkit-text-fill-color: transparent;
100
- }
101
-
102
- /* Fade-in Animation */
103
- .fade-in-element {
104
- opacity: 0;
105
- transform: translateY(20px);
106
- animation: fadeInUp 1s ease forwards;
107
- }
108
-
109
- .fade-in-element:nth-child(2) {
110
- animation-delay: 0.5s;
111
- }
112
-
113
- .fade-in-element:nth-child(3) {
114
- animation-delay: 1s;
115
- }
116
-
117
- .fade-in-element:nth-child(4) {
118
- animation-delay: 1.5s;
119
- }
120
-
121
- /* Typing Effect */
122
- .typing-container {
123
- font-size: 2.8rem;
124
- margin: 2rem 0 3rem 0;
125
- min-height: 5rem;
126
- display: flex;
127
- align-items: center;
128
- justify-content: center;
129
- max-width: 900px;
130
- margin-left: auto;
131
- margin-right: auto;
132
- text-align: center;
133
- }
134
-
135
- .streaming-text {
136
- color: var(--white);
137
- font-weight: 700;
138
- text-align: center;
139
- line-height: 1.4;
140
- min-height: 1.8em;
141
- text-shadow: 0 0 30px rgba(99, 102, 241, 0.8), 0 0 60px rgba(139, 92, 246, 0.4);
142
- letter-spacing: 0.5px;
143
- filter: brightness(1.1);
144
- }
145
-
146
- .streaming-text .highlight {
147
- color: var(--secondary);
148
- font-weight: 600;
149
- }
150
-
151
- .streaming-text .python-icon {
152
- color: #3776ab;
153
- margin: 0 0.3rem;
154
- font-size: 1.2em;
155
- filter: drop-shadow(0 0 10px rgba(55, 118, 171, 0.5));
156
- }
157
-
158
- .cursor {
159
- color: var(--primary);
160
- font-weight: 300;
161
- margin-left: 2px;
162
- animation: typewriterCursor 1s infinite;
163
- }
164
-
165
- @keyframes typewriterCursor {
166
- 0%, 50% {
167
- opacity: 1;
168
- border-right: 2px solid var(--primary);
169
- }
170
- 51%, 100% {
171
- opacity: 0.3;
172
- border-right: 2px solid transparent;
173
- }
174
- }
175
-
176
- .hero-tagline {
177
- font-size: 1.2rem;
178
- color: var(--gray);
179
- margin-bottom: 2rem;
180
- }
181
-
182
- /* Hero Buttons */
183
- .hero-buttons {
184
- display: flex;
185
- gap: 1rem;
186
- justify-content: center;
187
- margin-bottom: 2rem;
188
- }
189
-
190
- .btn {
191
- padding: 12px 30px;
192
- border-radius: 50px;
193
- text-decoration: none;
194
- font-weight: 600;
195
- transition: all 0.3s ease;
196
- display: inline-block;
197
- }
198
-
199
- .btn-primary {
200
- background: var(--gradient);
201
- color: var(--white);
202
- box-shadow: 0 10px 30px rgba(99, 102, 241, 0.3);
203
- }
204
-
205
- .btn-primary:hover {
206
- transform: translateY(-3px);
207
- box-shadow: 0 15px 40px rgba(99, 102, 241, 0.4);
208
- }
209
-
210
- .btn-outline {
211
- border: 2px solid var(--primary);
212
- color: var(--primary);
213
- }
214
-
215
- .btn-outline:hover {
216
- background: var(--primary);
217
- color: var(--white);
218
- }
219
-
220
- /* Social Links */
221
- .social-links {
222
- display: flex;
223
- gap: 1.5rem;
224
- justify-content: center;
225
- }
226
-
227
- .social-links a {
228
- color: var(--gray);
229
- font-size: 1.5rem;
230
- transition: all 0.3s ease;
231
- padding: 10px;
232
- border-radius: 50%;
233
- background: rgba(255, 255, 255, 0.1);
234
- display: inline-flex;
235
- align-items: center;
236
- justify-content: center;
237
- width: 50px;
238
- height: 50px;
239
- }
240
-
241
- .social-links a:hover {
242
- transform: translateY(-3px);
243
- background: rgba(255, 255, 255, 0.2);
244
- }
245
-
246
- /* Specific colors for social icons */
247
- .social-links a[href*="github.com"] {
248
- color: #ffffff;
249
- }
250
-
251
- .social-links a[href*="github.com"]:hover {
252
- color: #ffffff;
253
- background: #333333;
254
- }
255
-
256
- .social-links a[href*="huggingface.co"] {
257
- color: #ff9500;
258
- }
259
-
260
- .social-links a[href*="huggingface.co"]:hover {
261
- color: #ffffff;
262
- background: #ff9500;
263
- }
264
-
265
- .social-links a[href*="mailto:"] {
266
- color: #ea4335;
267
- }
268
-
269
- .social-links a[href*="mailto:"]:hover {
270
- color: #ffffff;
271
- background: #ea4335;
272
- }
273
-
274
- /* Floating Shapes Animation */
275
- .hero-animation {
276
- position: absolute;
277
- width: 100%;
278
- height: 100%;
279
- overflow: hidden;
280
- z-index: 1;
281
- }
282
-
283
- .floating-shapes {
284
- position: relative;
285
- width: 100%;
286
- height: 100%;
287
- }
288
-
289
- .shape {
290
- position: absolute;
291
- border-radius: 50%;
292
- background: linear-gradient(135deg, rgba(99, 102, 241, 0.1) 0%, rgba(139, 92, 246, 0.1) 100%);
293
- animation: float 20s infinite ease-in-out;
294
- }
295
-
296
- .shape:nth-child(1) {
297
- width: 300px;
298
- height: 300px;
299
- top: 20%;
300
- left: 10%;
301
- animation-delay: 0s;
302
- }
303
-
304
- .shape:nth-child(2) {
305
- width: 200px;
306
- height: 200px;
307
- top: 60%;
308
- right: 10%;
309
- animation-delay: 5s;
310
- }
311
-
312
- .shape:nth-child(3) {
313
- width: 150px;
314
- height: 150px;
315
- bottom: 10%;
316
- left: 50%;
317
- animation-delay: 10s;
318
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/css/_navigation.css DELETED
@@ -1,74 +0,0 @@
1
- /* Navigation Styles */
2
- .navbar {
3
- position: fixed;
4
- top: 0;
5
- width: 100%;
6
- background: rgba(255, 255, 255, 0.95);
7
- backdrop-filter: blur(10px);
8
- z-index: 1000;
9
- padding: 1rem 0;
10
- transition: all 0.3s ease;
11
- }
12
-
13
- .nav-container {
14
- max-width: 1200px;
15
- margin: 0 auto;
16
- padding: 0 20px;
17
- display: flex;
18
- justify-content: space-between;
19
- align-items: center;
20
- }
21
-
22
- .nav-brand {
23
- font-size: 1.5rem;
24
- font-weight: 700;
25
- background-clip: text;
26
- -webkit-background-clip: text;
27
- -webkit-text-fill-color: transparent;
28
- }
29
-
30
- .nav-menu {
31
- display: flex;
32
- list-style: none;
33
- gap: 2rem;
34
- }
35
-
36
- .nav-link {
37
- color: var(--light);
38
- text-decoration: none;
39
- transition: color 0.3s ease;
40
- position: relative;
41
- }
42
-
43
- .nav-link:hover {
44
- color: var(--primary);
45
- }
46
-
47
- .nav-link::after {
48
- content: '';
49
- position: absolute;
50
- bottom: -5px;
51
- left: 0;
52
- width: 0;
53
- height: 2px;
54
- background: var(--primary);
55
- transition: width 0.3s ease;
56
- }
57
-
58
- .nav-link:hover::after {
59
- width: 100%;
60
- }
61
-
62
- .hamburger {
63
- display: none;
64
- flex-direction: column;
65
- cursor: pointer;
66
- }
67
-
68
- .hamburger span {
69
- width: 25px;
70
- height: 3px;
71
- background: var(--light);
72
- margin: 3px 0;
73
- transition: 0.3s;
74
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/css/_responsive.css DELETED
@@ -1,132 +0,0 @@
1
- /* Responsive Design Styles */
2
-
3
- @media (max-width: 1024px) {
4
- /* Typing text adjustments for tablets */
5
- .typing-container {
6
- font-size: 1.8rem;
7
- min-height: 3.5rem;
8
- }
9
- }
10
-
11
- @media (max-width: 768px) {
12
- /* Navigation */
13
- .nav-menu {
14
- display: none;
15
- }
16
-
17
- .hamburger {
18
- display: flex;
19
- }
20
-
21
- /* Hero Section */
22
- .hero-title {
23
- font-size: 1.5rem;
24
- }
25
-
26
- .hero-buttons {
27
- flex-direction: column;
28
- align-items: center;
29
- }
30
-
31
- /* Typing text for mobile */
32
- .typing-container {
33
- font-size: 1.6rem;
34
- min-height: 3rem;
35
- }
36
-
37
- /* Skills Section */
38
- .skills-grid {
39
- grid-template-columns: 1fr;
40
- }
41
-
42
- /* Projects Section */
43
- .projects-grid {
44
- grid-template-columns: 1fr;
45
- }
46
-
47
- /* Contact Section */
48
- .contact-info {
49
- flex-direction: column;
50
- }
51
- }
52
-
53
- @media (max-width: 480px) {
54
- /* Base adjustments */
55
- .container {
56
- padding: 0 15px;
57
- }
58
-
59
- /* Typography */
60
- .section-title {
61
- font-size: 2rem;
62
- }
63
-
64
- /* Hero Section */
65
- .glitch {
66
- font-size: 2rem;
67
- letter-spacing: 2px;
68
- }
69
-
70
- .hero-intro {
71
- font-size: 1.2rem;
72
- }
73
-
74
- .hero-title {
75
- font-size: 1.3rem;
76
- }
77
-
78
- .typing-container {
79
- font-size: 1.4rem;
80
- min-height: 3rem;
81
- margin: 1.5rem 0 2rem 0;
82
- }
83
-
84
- /* Buttons */
85
- .btn {
86
- padding: 10px 20px;
87
- font-size: 0.9rem;
88
- }
89
-
90
- /* About Section */
91
- .about-content {
92
- gap: 1.5rem;
93
- }
94
-
95
- .profile-image {
96
- width: 180px;
97
- height: 220px;
98
- }
99
-
100
- /* Skills Section */
101
- .skill-category {
102
- padding: 1.5rem;
103
- }
104
-
105
- .skills-grid {
106
- grid-template-columns: 1fr;
107
- gap: 2rem;
108
- }
109
-
110
- /* Projects Section */
111
- .project-card {
112
- padding: 1.5rem;
113
- }
114
-
115
- .projects-grid {
116
- grid-template-columns: 1fr;
117
- gap: 1.5rem;
118
- }
119
-
120
- /* Timeline */
121
- .timeline {
122
- padding-left: 30px;
123
- }
124
-
125
- .timeline-marker {
126
- left: -35px;
127
- }
128
-
129
- .timeline-content {
130
- padding: 1.5rem;
131
- }
132
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/css/_skills.css DELETED
@@ -1,340 +0,0 @@
1
- /* Skills Section Styles - Interactive Circular Progress */
2
- .skills {
3
- position: relative;
4
- overflow: hidden;
5
- padding: 6rem 0;
6
- }
7
-
8
- .skills::before {
9
- content: '';
10
- position: absolute;
11
- top: 0;
12
- left: 0;
13
- width: 100%;
14
- height: 100%;
15
- background-image: url('/static/image.png');
16
- background-size: cover;
17
- background-position: center;
18
- background-repeat: no-repeat;
19
- opacity: 0.08;
20
- z-index: 0;
21
- }
22
-
23
- .tech-stack-grid {
24
- display: grid;
25
- grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
26
- gap: 4rem;
27
- position: relative;
28
- z-index: 1;
29
- }
30
-
31
- .tech-category {
32
- background: var(--dark-light);
33
- padding: 3rem 2rem;
34
- border-radius: 20px;
35
- border: 1px solid var(--border);
36
- transition: all 0.3s ease;
37
- box-shadow: 0 10px 30px var(--shadow);
38
- }
39
-
40
- .tech-category:hover {
41
- transform: translateY(-10px);
42
- box-shadow: 0 20px 50px rgba(99, 102, 241, 0.2);
43
- }
44
-
45
- .tech-category h3 {
46
- margin-bottom: 3rem;
47
- color: var(--white);
48
- font-size: 1.5rem;
49
- font-weight: 600;
50
- display: flex;
51
- align-items: center;
52
- gap: 1rem;
53
- text-align: center;
54
- justify-content: center;
55
- }
56
-
57
- .tech-category h3 i {
58
- color: var(--primary);
59
- font-size: 1.8rem;
60
- }
61
-
62
- .tech-icons {
63
- display: grid;
64
- grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
65
- gap: 2.5rem;
66
- justify-items: center;
67
- padding: 1rem 0;
68
- }
69
-
70
- .tech-icon {
71
- position: relative;
72
- cursor: pointer;
73
- transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
74
- padding: 1.5rem;
75
- border-radius: 20px;
76
- background: rgba(255, 255, 255, 0.03);
77
- border: 1px solid rgba(99, 102, 241, 0.1);
78
- min-height: 120px;
79
- display: flex;
80
- flex-direction: column;
81
- align-items: center;
82
- justify-content: center;
83
- }
84
-
85
- .tech-icon:hover {
86
- transform: translateY(-10px) scale(1.05);
87
- background: rgba(255, 255, 255, 0.08);
88
- border-color: rgba(99, 102, 241, 0.3);
89
- box-shadow: 0 20px 40px rgba(99, 102, 241, 0.15);
90
- }
91
-
92
- .icon-container {
93
- display: flex;
94
- flex-direction: column;
95
- align-items: center;
96
- margin-bottom: 1rem;
97
- transition: all 0.3s ease;
98
- }
99
-
100
- .icon-container i,
101
- .icon-container [class*="devicon-"],
102
- .icon-container .custom-tech-icon {
103
- font-size: 3.5rem !important;
104
- margin-bottom: 0.8rem;
105
- transition: all 0.3s ease;
106
- filter: drop-shadow(0 0 15px rgba(0, 0, 0, 0.2));
107
- display: inline-block;
108
- line-height: 1;
109
- }
110
-
111
- /* Custom icon styling */
112
- .icon-container .custom-tech-icon {
113
- width: 3.5rem;
114
- height: 3.5rem;
115
- object-fit: contain;
116
- border-radius: 8px;
117
- }
118
-
119
- .tech-icon:hover .icon-container i {
120
- filter: brightness(1.2) drop-shadow(0 0 20px currentColor);
121
- transform: scale(1.1);
122
- }
123
-
124
- .tech-icon:hover .icon-container [class*="devicon-"] {
125
- filter: brightness(1.1) drop-shadow(0 0 15px rgba(0,0,0,0.3));
126
- transform: scale(1.1);
127
- }
128
-
129
- .tech-icon:hover .icon-container .custom-tech-icon {
130
- filter: brightness(1.1) drop-shadow(0 0 15px rgba(0,0,0,0.4));
131
- transform: scale(1.1);
132
- }
133
-
134
- .tech-name {
135
- color: var(--light);
136
- font-size: 0.95rem;
137
- font-weight: 600;
138
- text-align: center;
139
- margin-top: 0.5rem;
140
- transition: all 0.3s ease;
141
- }
142
-
143
- .tech-icon:hover .tech-name {
144
- color: var(--white);
145
- transform: translateY(-2px);
146
- }
147
-
148
- .skill-circle {
149
- position: absolute;
150
- top: 50%;
151
- left: 50%;
152
- transform: translate(-50%, -50%);
153
- display: flex;
154
- align-items: center;
155
- justify-content: center;
156
- width: 100px;
157
- height: 100px;
158
- opacity: 0;
159
- transition: opacity 0.4s ease;
160
- }
161
-
162
- .tech-icon:hover .skill-circle {
163
- opacity: 1;
164
- }
165
-
166
- .progress-ring {
167
- position: absolute;
168
- top: 0;
169
- left: 0;
170
- transform: rotate(-90deg);
171
- width: 100px;
172
- height: 100px;
173
- }
174
-
175
- .progress-ring-circle {
176
- stroke: rgba(99, 102, 241, 0.2);
177
- stroke-width: 6;
178
- fill: transparent;
179
- stroke-dasharray: 188.5;
180
- stroke-dashoffset: 188.5;
181
- transition: stroke-dashoffset 2s cubic-bezier(0.4, 0, 0.2, 1);
182
- stroke-linecap: round;
183
- }
184
-
185
- .tech-icon:hover .progress-ring-circle {
186
- stroke: var(--primary);
187
- stroke-width: 8;
188
- filter: drop-shadow(0 0 10px rgba(99, 102, 241, 0.6));
189
- }
190
-
191
- .percentage {
192
- position: absolute;
193
- font-size: 0.8rem;
194
- font-weight: 600;
195
- color: var(--white);
196
- opacity: 0;
197
- transition: opacity 0.3s ease;
198
- }
199
-
200
- .tech-icon:hover .percentage {
201
- opacity: 1;
202
- }
203
-
204
- /* Animation keyframes */
205
- @keyframes fillCircle {
206
- from {
207
- stroke-dashoffset: 188.5;
208
- }
209
- to {
210
- stroke-dashoffset: var(--target-offset);
211
- }
212
- }
213
-
214
- /* Tech Stack Icons - Clean approach */
215
-
216
- /* Reset any inherited colors and let icons use their natural colors */
217
- .tech-icon .icon-container i,
218
- .tech-icon .icon-container [class*="devicon-"] {
219
- color: initial !important;
220
- }
221
-
222
- /* Brand colors for specific technologies */
223
- .tech-icon .icon-container .devicon-python-plain.colored {
224
- background: linear-gradient(45deg, #306998, #FFD43B);
225
- -webkit-background-clip: text;
226
- -webkit-text-fill-color: transparent;
227
- background-clip: text;
228
- }
229
-
230
- .tech-icon .icon-container .devicon-javascript-plain.colored {
231
- color: #f7df1e !important;
232
- text-shadow: 0 0 10px rgba(247, 223, 30, 0.5);
233
- }
234
-
235
- .tech-icon .icon-container .devicon-html5-plain.colored {
236
- color: #e34c26 !important;
237
- text-shadow: 0 0 10px rgba(227, 76, 38, 0.5);
238
- }
239
-
240
- .tech-icon .icon-container .devicon-postgresql-plain.colored {
241
- color: #336791 !important;
242
- text-shadow: 0 0 10px rgba(51, 103, 145, 0.5);
243
- }
244
-
245
- .tech-icon .icon-container .devicon-redis-plain.colored {
246
- color: #dc382d !important;
247
- text-shadow: 0 0 10px rgba(220, 56, 45, 0.5);
248
- }
249
-
250
- .tech-icon .icon-container .devicon-mongodb-plain.colored {
251
- color: #47a248 !important;
252
- text-shadow: 0 0 10px rgba(71, 162, 72, 0.5);
253
- }
254
-
255
- .tech-icon .icon-container .devicon-docker-plain.colored {
256
- color: #0db7ed !important;
257
- text-shadow: 0 0 10px rgba(13, 183, 237, 0.5);
258
- }
259
-
260
- .tech-icon .icon-container .devicon-tensorflow-original.colored {
261
- color: #ff6f00 !important;
262
- text-shadow: 0 0 10px rgba(255, 111, 0, 0.5);
263
- }
264
-
265
- .tech-icon .icon-container .devicon-pytorch-original.colored {
266
- color: #ee4c2c !important;
267
- text-shadow: 0 0 10px rgba(238, 76, 44, 0.5);
268
- }
269
-
270
- .tech-icon .icon-container .devicon-kubernetes-plain.colored {
271
- color: #326ce5 !important;
272
- text-shadow: 0 0 10px rgba(50, 108, 229, 0.5);
273
- }
274
-
275
- .tech-icon .icon-container .devicon-fastapi-plain.colored {
276
- color: #009688 !important;
277
- text-shadow: 0 0 10px rgba(0, 150, 136, 0.5);
278
- }
279
-
280
- .tech-icon .icon-container .devicon-django-plain.colored {
281
- color: #092e20 !important;
282
- text-shadow: 0 0 10px rgba(9, 46, 32, 0.5);
283
- }
284
-
285
- .tech-icon .icon-container .devicon-flask-original.colored {
286
- color: #ffffff !important;
287
- text-shadow: 0 0 10px rgba(0, 0, 0, 0.8);
288
- }
289
-
290
- .tech-icon .icon-container .devicon-grafana-plain.colored {
291
- color: #ff6600 !important;
292
- text-shadow: 0 0 10px rgba(255, 102, 0, 0.5);
293
- }
294
-
295
- .tech-icon .icon-container .devicon-sqldeveloper-plain.colored {
296
- color: #f29111 !important;
297
- text-shadow: 0 0 10px rgba(242, 145, 17, 0.5);
298
- }
299
-
300
- /* FontAwesome fallback icons - custom colors */
301
- .tech-icon .icon-container i.fas.fa-robot {
302
- color: #ff9500; /* Hugging Face orange */
303
- }
304
-
305
- .tech-icon .icon-container i.fas.fa-brain {
306
- color: #00d4aa; /* OpenAI teal */
307
- }
308
-
309
- .tech-icon .icon-container i.fas.fa-link {
310
- color: #1c1c1c; /* Langchain dark */
311
- }
312
-
313
- .tech-icon .icon-container i.fas.fa-table {
314
- color: #f29111; /* SQL orange */
315
- }
316
-
317
- .tech-icon .icon-container i.fas.fa-database {
318
- color: #c72e2e; /* MinIO red */
319
- }
320
-
321
- .tech-icon .icon-container i.fas.fa-fire {
322
- color: #e6522c; /* Prometheus orange */
323
- }
324
-
325
- .tech-icon .icon-container i.fas.fa-search {
326
- color: #f4b942; /* Loki yellow */
327
- }
328
-
329
- /* Hover effects to maintain visibility */
330
- .tech-icon:hover .icon-container i {
331
- filter: brightness(1.2) drop-shadow(0 0 20px currentColor);
332
- }
333
-
334
- .tech-icon:hover .icon-container [class*="devicon-"] {
335
- filter: brightness(1.1) drop-shadow(0 0 15px rgba(0,0,0,0.3));
336
- }
337
-
338
- .tech-icon:hover .icon-container .custom-tech-icon {
339
- filter: brightness(1.1) drop-shadow(0 0 15px rgba(0,0,0,0.4));
340
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/icons/Loki.png DELETED
Binary file (3.67 kB)
 
static/icons/huggingface.png DELETED
Binary file (13.9 kB)
 
static/icons/langchain.png DELETED
Binary file (92 kB)
 
static/icons/minio.png DELETED
Binary file (6.31 kB)
 
static/icons/openai.png DELETED

Git LFS Details

  • SHA256: 9d6073efc5ec79d1dec5f889fc3e6924178f0b512f12c51016a5b89a5b71a09f
  • Pointer size: 131 Bytes
  • Size of remote file: 266 kB
static/image-2.png DELETED

Git LFS Details

  • SHA256: 955903b8d7e6f4ed7efecb4f7952e5eee2ed82610e5ff084f0a6ae71788187d2
  • Pointer size: 132 Bytes
  • Size of remote file: 1.54 MB
static/image-3.png DELETED

Git LFS Details

  • SHA256: af18558ec1a06aa3e1cbc3159a758f974c49cd93763e665a7ab63ab0d69fbdaa
  • Pointer size: 132 Bytes
  • Size of remote file: 1.27 MB
static/image.png DELETED

Git LFS Details

  • SHA256: 283f39e0ae65fe80838dba0c7453e866174ba45827143306e1414775bb117f5f
  • Pointer size: 132 Bytes
  • Size of remote file: 1.3 MB
static/more_img/a1.png DELETED

Git LFS Details

  • SHA256: 2db7ce65c52a8fe9bf98b94e86bf93e250fe7c356d4ed4c41fb845ab8fc649b2
  • Pointer size: 132 Bytes
  • Size of remote file: 3.48 MB
static/more_img/a2.png DELETED

Git LFS Details

  • SHA256: 1e0000c257335cc224167e5eaa4210ee74e6e7368337177e474169af91be89e6
  • Pointer size: 132 Bytes
  • Size of remote file: 1.74 MB
static/more_img/a3.png DELETED

Git LFS Details

  • SHA256: dd26c3ed434e5937a97fc1e5635cd2d208ee53ac2b5a2f4b2737b04361125abd
  • Pointer size: 132 Bytes
  • Size of remote file: 1.02 MB
static/script.js DELETED
@@ -1,200 +0,0 @@
1
- // Smooth scrolling for navigation links
2
- document.querySelectorAll('a[href^="#"]').forEach(anchor => {
3
- anchor.addEventListener('click', function (e) {
4
- e.preventDefault();
5
- const target = document.querySelector(this.getAttribute('href'));
6
- if (target) {
7
- target.scrollIntoView({
8
- behavior: 'smooth',
9
- block: 'start'
10
- });
11
- }
12
- });
13
- });
14
-
15
- // Navbar scroll effect
16
- window.addEventListener('scroll', function() {
17
- const navbar = document.querySelector('.navbar');
18
- if (window.scrollY > 50) {
19
- navbar.style.background = 'rgba(255, 255, 255, 0.98)';
20
- navbar.style.boxShadow = '0 5px 20px rgba(15, 23, 42, 0.1)';
21
- } else {
22
- navbar.style.background = 'rgba(255, 255, 255, 0.95)';
23
- navbar.style.boxShadow = 'none';
24
- }
25
- });
26
-
27
- // Mobile menu toggle
28
- const hamburger = document.querySelector('.hamburger');
29
- const navMenu = document.querySelector('.nav-menu');
30
-
31
- hamburger?.addEventListener('click', function() {
32
- navMenu.classList.toggle('active');
33
- this.classList.toggle('active');
34
- });
35
-
36
- // Animate circular progress rings on scroll
37
- const observerOptions = {
38
- threshold: 0.3,
39
- rootMargin: '0px'
40
- };
41
-
42
- const observer = new IntersectionObserver(function(entries) {
43
- entries.forEach(entry => {
44
- if (entry.isIntersecting) {
45
- const techIcons = entry.target.querySelectorAll('.tech-icon');
46
- techIcons.forEach((icon, index) => {
47
- const skill = icon.getAttribute('data-skill');
48
- const circle = icon.querySelector('.progress-ring-circle');
49
- const circumference = 2 * Math.PI * 40; // radius = 40
50
- const offset = circumference - (skill / 100) * circumference;
51
-
52
- setTimeout(() => {
53
- circle.style.strokeDashoffset = offset;
54
- }, index * 100);
55
- });
56
- }
57
- });
58
- }, observerOptions);
59
-
60
- const skillsSection = document.querySelector('.skills');
61
- if (skillsSection) {
62
- observer.observe(skillsSection);
63
- }
64
-
65
- // Interactive hover effects for tech icons
66
- document.addEventListener('DOMContentLoaded', function() {
67
- const techIcons = document.querySelectorAll('.tech-icon');
68
-
69
- techIcons.forEach(icon => {
70
- const skill = icon.getAttribute('data-skill');
71
- const circle = icon.querySelector('.progress-ring-circle');
72
- const percentage = icon.querySelector('.percentage');
73
- const circumference = 2 * Math.PI * 40; // radius = 40
74
-
75
- // Set initial state
76
- circle.style.strokeDasharray = circumference;
77
- circle.style.strokeDashoffset = circumference;
78
-
79
- icon.addEventListener('mouseenter', function() {
80
- const offset = circumference - (skill / 100) * circumference;
81
- circle.style.strokeDashoffset = offset;
82
- percentage.textContent = skill + '%';
83
- });
84
-
85
- icon.addEventListener('mouseleave', function() {
86
- circle.style.strokeDashoffset = circumference;
87
- });
88
- });
89
- });
90
-
91
- // Animate elements on scroll
92
- const animateOnScroll = () => {
93
- const elements = document.querySelectorAll('.timeline-item, .project-card, .stat-card');
94
-
95
- elements.forEach(element => {
96
- const elementTop = element.getBoundingClientRect().top;
97
- const elementBottom = element.getBoundingClientRect().bottom;
98
-
99
- if (elementTop < window.innerHeight && elementBottom > 0) {
100
- element.style.opacity = '1';
101
- element.style.transform = 'translateY(0)';
102
- }
103
- });
104
- };
105
-
106
- window.addEventListener('scroll', animateOnScroll);
107
- window.addEventListener('load', animateOnScroll);
108
-
109
- // Character-by-character streaming effect for specific lines
110
- const streamingElement = document.getElementById('streaming-text');
111
- if (streamingElement) {
112
- const textLines = [
113
- 'Hi, nice to meet you!',
114
- "I'm Tran Bao Ngoc",
115
- 'A passionate AI developer',
116
- 'I love Python 🐍',
117
- 'I love researching AI 🤖',
118
- 'I love playing games 🎮'
119
- ];
120
-
121
- let currentLineIndex = 0;
122
- let currentCharIndex = 0;
123
- let isDeleting = false;
124
- let typingSpeed = 45;
125
- let deleteSpeed = 25;
126
-
127
- function typewriterEffect() {
128
- const currentLine = textLines[currentLineIndex];
129
-
130
- if (!isDeleting) {
131
- // Typing characters
132
- if (currentCharIndex <= currentLine.length) {
133
- streamingElement.innerHTML = currentLine.substring(0, currentCharIndex);
134
- currentCharIndex++;
135
-
136
- if (currentCharIndex > currentLine.length) {
137
- // Finished typing line, pause then start deleting
138
- setTimeout(() => {
139
- isDeleting = true;
140
- typewriterEffect();
141
- }, 1800); // Pause for 1.8 seconds
142
- } else {
143
- setTimeout(typewriterEffect, typingSpeed + Math.random() * 20);
144
- }
145
- }
146
- } else {
147
- // Deleting characters
148
- if (currentCharIndex > 0) {
149
- currentCharIndex--;
150
- streamingElement.innerHTML = currentLine.substring(0, currentCharIndex);
151
- setTimeout(typewriterEffect, deleteSpeed);
152
- } else {
153
- // Finished deleting, move to next line
154
- isDeleting = false;
155
- currentLineIndex = (currentLineIndex + 1) % textLines.length;
156
-
157
- // Pause before starting next line
158
- setTimeout(typewriterEffect, 500);
159
- }
160
- }
161
- }
162
-
163
- // Start the typewriter effect after a delay
164
- setTimeout(typewriterEffect, 2000);
165
- }
166
-
167
- // Parallax effect for shapes
168
- window.addEventListener('scroll', () => {
169
- const shapes = document.querySelectorAll('.shape');
170
- const scrollY = window.pageYOffset;
171
-
172
- shapes.forEach((shape, index) => {
173
- const speed = 0.5 + (index * 0.1);
174
- shape.style.transform = `translateY(${scrollY * speed}px)`;
175
- });
176
- });
177
-
178
- // Add active class to current navigation item
179
- window.addEventListener('scroll', () => {
180
- const sections = document.querySelectorAll('section');
181
- const navLinks = document.querySelectorAll('.nav-link');
182
-
183
- let current = '';
184
-
185
- sections.forEach(section => {
186
- const sectionTop = section.offsetTop - 100;
187
- if (window.pageYOffset >= sectionTop) {
188
- current = section.getAttribute('id');
189
- }
190
- });
191
-
192
- navLinks.forEach(link => {
193
- link.classList.remove('active');
194
- if (link.getAttribute('href').substring(1) === current) {
195
- link.classList.add('active');
196
- }
197
- });
198
- });
199
-
200
- console.log('Portfolio loaded successfully! 🚀');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
static/style.css DELETED
@@ -1,29 +0,0 @@
1
- /*
2
- Portfolio CSS - Modular Structure
3
- ================================
4
- Main CSS file that imports all component modules
5
-
6
- File Structure:
7
- - _base.css: CSS variables, reset styles, common animations
8
- - _navigation.css: Navigation bar and menu styles
9
- - _hero.css: Hero section with glitch effect and typing animation
10
- - _about.css: About section with profile image and stats
11
- - _skills.css: Skills section with progress bars
12
- - _experience-projects.css: Timeline and project cards
13
- - _contact-footer.css: Contact section and footer
14
- - _responsive.css: Mobile and tablet responsive styles
15
- */
16
-
17
- /* Import Base Styles & Variables */
18
- @import url('./css/_base.css');
19
-
20
- /* Import Component Modules */
21
- @import url('./css/_navigation.css');
22
- @import url('./css/_hero.css');
23
- @import url('./css/_about.css');
24
- @import url('./css/_skills.css');
25
- @import url('./css/_experience-projects.css');
26
- @import url('./css/_contact-footer.css');
27
-
28
- /* Import Responsive Styles */
29
- @import url('./css/_responsive.css');