summaryrefslogtreecommitdiffstats
path: root/index.html
blob: 1acebcd6ca075bf4302fe816a3628ff804856bab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>Angel Ma</title>
		<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Poppins:wght@500;600;700&display=swap">
		<style>
			html,body{margin:0;height:100%;background:#BFE1F7;}
			svg{display:block;width:100%;height:100vh;}
			
			.hill{opacity:0;animation:popIn .4s cubic-bezier(.34,1.56,.64,1) forwards;}
			.hill-back{animation-delay:.05s;}
			.hill-front{animation-delay:.12s;}
			.tuft{opacity:0;animation:popIn .35s ease-out forwards;animation-delay:.2s;}
			
			.seg,.cap{opacity:0;transform-origin:var(--ox) 590px;animation:dropExpand 1s cubic-bezier(.28,.7,.32,1) forwards;animation-delay:.25s;}
			.cap{pointer-events:none;}
			
			.seg1{--ox:167px;--dx:229px;}
			.seg2{--ox:300px;--dx:136px;}
			.seg3{--ox:433px;--dx:43px;}
			.seg4{--ox:567px;--dx:-51px;}
			.seg5{--ox:700px;--dx:-144px;}
			.seg6{--ox:833px;--dx:-237px;}
			.capL{--ox:75px;--dx:300px;}
			.capR{--ox:1037px;--dx:-390px;}
			
			.seg-lift{transition:transform .2s ease;cursor:pointer;}
			.seg-lift:hover, .seg-lift:active{transform:translateY(-10px);}
			
			.ground-shadow{opacity:0;animation:fadeIn .3s ease forwards;animation-delay:1.2s;}
			
			/* Modal Popup Styling */
			.modal-overlay {
				position: fixed;
				top: 0; left: 0; width: 100%; height: 100%;
				background: rgba(43, 58, 85, 0.4);
				display: flex; justify-content: center; align-items: center;
				opacity: 0; pointer-events: none;
				transition: opacity 0.3s ease;
				z-index: 1000;
				backdrop-filter: blur(3px);
			}
			.modal-overlay.active {
				opacity: 1; pointer-events: auto;
			}
			.modal-box {
				background: #ffffff;
				padding: 35px;
				border-radius: 20px;
				width: 420px;
				max-width: 90%;
				box-shadow: 0 15px 35px rgba(0,0,0,0.15);
				font-family: 'Poppins', sans-serif;
				transform: translateY(20px);
				transition: transform 0.3s cubic-bezier(.34,1.56,.64,1);
			}
			.modal-overlay.active .modal-box {
				transform: translateY(0);
			}
			.modal-title {
				font-weight: 700;
				font-size: 26px;
				color: #2B3A55;
				margin-bottom: 12px;
			}
			.modal-content {
				font-weight: 500;
				font-size: 15px;
				color: #5B7185;
				margin-bottom: 25px;
				line-height: 1.6;
			}
			.modal-close {
				background: #BFE1F7;
				border: none;
				padding: 10px 24px;
				font-family: 'Poppins', sans-serif;
				font-weight: 600;
				color: #2B3A55;
				border-radius: 10px;
				cursor: pointer;
				transition: background 0.2s ease;
			}
			.modal-close:hover {
				background: #a9d4f2;
			}
			
			@keyframes popIn{0%{opacity:0;transform:scale(.7);}70%{opacity:1;transform:scale(1.04);}100%{opacity:1;transform:scale(1);}}
			@keyframes fadeIn{to{opacity:1;}}
			@keyframes dropExpand{
				0%{opacity:0;transform:translate(var(--dx),-520px) scale(.3,1);}
				50%{opacity:1;transform:translate(var(--dx),16px) scale(.3,1);}
				62%{transform:translate(var(--dx),-4px) scale(.3,1);}
				85%{transform:translate(calc(var(--dx)*0.12),0px) scale(1.04,1);}
				100%{opacity:1;transform:translate(0,0) scale(1,1);}
			}
		</style>
	</head>
	<body>
		<svg viewBox="0 0 1000 900" xmlns="http://www.w3.org/2000/svg">
			<defs>
				<linearGradient id="sky" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#EAF6FD"/>
					<stop offset="100%" stop-color="#BFE1F7"/>
				</linearGradient>
				<filter id="soft-shadow" x="-50%" y="-50%" width="200%" height="200%">
					<feGaussianBlur stdDeviation="10"/>
				</filter>
				<g id="cloud" fill="#ffffff">
					<circle cx="0" cy="20" r="18"/>
					<circle cx="22" cy="8" r="24"/>
					<circle cx="48" cy="16" r="20"/>
					<circle cx="68" cy="24" r="15"/>
					<rect x="-18" y="20" width="104" height="20" rx="10"/>
				</g>

				<linearGradient id="grad-blue" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#EFF8FF"/><stop offset="55%" stop-color="#CDE8FB"/><stop offset="100%" stop-color="#A9CFEA"/>
				</linearGradient>
				<linearGradient id="grad-peach" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#FFEFE3"/><stop offset="55%" stop-color="#FBD9C5"/><stop offset="100%" stop-color="#E8B79C"/>
				</linearGradient>
				<linearGradient id="grad-lavender" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#F0ECFC"/><stop offset="55%" stop-color="#D9D3F5"/><stop offset="100%" stop-color="#B7ADE0"/>
				</linearGradient>
				<linearGradient id="grad-butter" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#FFF9E2"/><stop offset="55%" stop-color="#FBEFC0"/><stop offset="100%" stop-color="#E8D98F"/>
				</linearGradient>
				<linearGradient id="grad-mint" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#E3F7F1"/><stop offset="55%" stop-color="#BFEAE0"/><stop offset="100%" stop-color="#8FCDBF"/>
				</linearGradient>
				<linearGradient id="grad-pink" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#FDECF2"/><stop offset="55%" stop-color="#F7D6E0"/><stop offset="100%" stop-color="#E0AEBF"/>
				</linearGradient>
				<linearGradient id="edge-shine" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#ffffff" stop-opacity="0.95"/>
					<stop offset="50%" stop-color="#33475B" stop-opacity="0.2"/>
					<stop offset="100%" stop-color="#33475B" stop-opacity="0.45"/>
				</linearGradient>
				<linearGradient id="metal-cap" x1="0" y1="0" x2="0" y2="1">
					<stop offset="0%" stop-color="#dfe5ec"/><stop offset="45%" stop-color="#9aa7b8"/><stop offset="100%" stop-color="#5a6472"/>
				</linearGradient>
			</defs>

			<rect width="1000" height="900" fill="url(#sky)"/>

			<use href="#cloud" transform="translate(80,80) scale(1.4)" opacity="0.95"/>
			<use href="#cloud" transform="translate(640,50) scale(1.7)" opacity="0.95"/>
			<use href="#cloud" transform="translate(390,190) scale(1.1)" opacity="0.9"/>
			<use href="#cloud" transform="translate(140,330) scale(0.9)" opacity="0.85"/>
			<use href="#cloud" transform="translate(760,290) scale(1.3)" opacity="0.85"/>
			<use href="#cloud" transform="translate(300,420) scale(0.8)" opacity="0.8"/>

			<path d="M120,150 q8,-10 16,0 q8,-10 16,0" fill="none" stroke="#7C93A8" stroke-width="3" stroke-linecap="round"/>
			<path d="M870,180 q7,-9 14,0 q7,-9 14,0" fill="none" stroke="#7C93A8" stroke-width="3" stroke-linecap="round"/>

			<text x="500" y="300" text-anchor="middle" font-family="'Poppins',sans-serif" font-weight="700" font-size="58" fill="#2B3A55">Angel Ma</text>

			<path class="hill hill-back" d="M0,700 C80,655 160,690 260,720 C400,752 500,735 560,742 C640,735 760,752 860,714 C920,688 960,655 1000,700 L1000,900 L0,900 Z" fill="#BFE3B0"/>
			<path class="hill hill-front" d="M0,822 C70,780 140,822 220,852 C330,882 430,862 500,866 C570,862 670,882 780,850 C860,822 930,780 1000,822 L1000,900 L0,900 Z" fill="#6FBF6A"/>

			<g class="tuft" stroke="#4C9E50" stroke-width="3" stroke-linecap="round" fill="none">
				<path d="M55,790 q3,-14 0,-22"/>
				<path d="M67,787 q4,-16 1,-24"/>
				<path d="M79,791 q2,-12 -1,-20"/>
				<path d="M918,788 q3,-14 0,-22"/>
				<path d="M930,785 q4,-16 1,-24"/>
				<path d="M942,790 q2,-12 -1,-20"/>
			</g>

			<ellipse class="ground-shadow" cx="500" cy="775" rx="480" ry="24" fill="#2E5230" opacity="0.14" filter="url(#soft-shadow)"/>

			<!-- LEFT TERMINAL -->
			<g class="cap capL">
				<ellipse cx="80" cy="590" rx="18" ry="110" fill="url(#metal-cap)"/>
				<rect x="80" y="480" width="41" height="220" fill="url(#metal-cap)"/>
				<ellipse cx="121" cy="590" rx="18" ry="110" fill="#5a6472" stroke="url(#edge-shine)" stroke-width="2"/>
				<rect x="121" y="560" width="25" height="60" rx="10" fill="url(#metal-cap)" stroke="#5a6472" stroke-width="2"/>
				<ellipse cx="140" cy="590" rx="5" ry="20" fill="#3a4658"/>
			</g>

			<!-- SEGMENT 1: About Me -->
			<g class="seg seg1">
				<g class="seg-lift">
					<ellipse cx="118" cy="590" rx="18" ry="110" fill="#9CC7E8"/>
					<rect x="118" y="480" width="97" height="220" fill="url(#grad-blue)"/>
					<ellipse cx="215" cy="590" rx="18" ry="110" fill="url(#grad-blue)" stroke="url(#edge-shine)" stroke-width="2"/>
					<path d="M124,492 Q167,484 210,492 Q190,504 148,504 Z" fill="rgba(255,255,255,0.45)"/>
					<path d="M157,460 L167,480 L177,460 Z" fill="#ffffff"/>
					<rect x="117" y="422" width="100" height="38" rx="10" fill="#ffffff" stroke="#D7E1EA" stroke-width="1.5"/>
					<text x="167" y="446" text-anchor="middle" font-family="'Poppins',sans-serif" font-weight="600" font-size="15" fill="#2B3A55">About Me</text>
				</g>
			</g>

			<!-- SEGMENT 2: Projects -->
			<g class="seg seg2">
				<g class="seg-lift">
					<ellipse cx="251" cy="590" rx="18" ry="110" fill="#E8B79C"/>
					<rect x="251" y="480" width="98" height="220" fill="url(#grad-peach)"/>
					<ellipse cx="349" cy="590" rx="18" ry="110" fill="url(#grad-peach)" stroke="url(#edge-shine)" stroke-width="2"/>
					<path d="M257,492 Q300,484 343,492 Q323,504 281,504 Z" fill="rgba(255,255,255,0.45)"/>
					<path d="M290,720 L300,700 L310,720 Z" fill="#ffffff"/>
					<rect x="250" y="720" width="100" height="38" rx="10" fill="#ffffff" stroke="#D7E1EA" stroke-width="1.5"/>
					<text x="300" y="744" text-anchor="middle" font-family="'Poppins',sans-serif" font-weight="600" font-size="15" fill="#2B3A55">Projects</text>
				</g>
			</g>

			<!-- SEGMENT 3: Experience -->
			<g class="seg seg3">
				<g class="seg-lift">
					<ellipse cx="385" cy="590" rx="18" ry="110" fill="#B7ADE0"/>
					<rect x="385" y="480" width="97" height="220" fill="url(#grad-lavender)"/>
					<ellipse cx="482" cy="590" rx="18" ry="110" fill="url(#grad-lavender)" stroke="url(#edge-shine)" stroke-width="2"/>
					<path d="M391,492 Q433,484 476,492 Q456,504 414,504 Z" fill="rgba(255,255,255,0.45)"/>
					<path d="M423,460 L433,480 L443,460 Z" fill="#ffffff"/>
					<rect x="383" y="422" width="100" height="38" rx="10" fill="#ffffff" stroke="#D7E1EA" stroke-width="1.5"/>
					<text x="433" y="446" text-anchor="middle" font-family="'Poppins',sans-serif" font-weight="600" font-size="15" fill="#2B3A55">Experience</text>
				</g>
			</g>

			<!-- SEGMENT 4: Skills -->
			<g class="seg seg4">
				<g class="seg-lift">
					<ellipse cx="518" cy="590" rx="18" ry="110" fill="#E8D98F"/>
					<rect x="518" y="480" width="97" height="220" fill="url(#grad-butter)"/>
					<ellipse cx="615" cy="590" rx="18" ry="110" fill="url(#grad-butter)" stroke="url(#edge-shine)" stroke-width="2"/>
					<path d="M524,492 Q567,484 610,492 Q590,504 548,504 Z" fill="rgba(255,255,255,0.45)"/>
					<path d="M557,720 L567,700 L577,720 Z" fill="#ffffff"/>
					<rect x="517" y="720" width="100" height="38" rx="10" fill="#ffffff" stroke="#D7E1EA" stroke-width="1.5"/>
					<text x="567" y="744" text-anchor="middle" font-family="'Poppins',sans-serif" font-weight="600" font-size="15" fill="#2B3A55">Skills</text>
				</g>
			</g>

			<!-- SEGMENT 5: Resume -->
			<g class="seg seg5">
				<g class="seg-lift">
					<ellipse cx="651" cy="590" rx="18" ry="110" fill="#8FCDBF"/>
					<rect x="651" y="480" width="98" height="220" fill="url(#grad-mint)"/>
					<ellipse cx="749" cy="590" rx="18" ry="110" fill="url(#grad-mint)" stroke="url(#edge-shine)" stroke-width="2"/>
					<path d="M657,492 Q700,484 743,492 Q723,504 681,504 Z" fill="rgba(255,255,255,0.45)"/>
					<path d="M690,460 L700,480 L710,460 Z" fill="#ffffff"/>
					<rect x="650" y="422" width="100" height="38" rx="10" fill="#ffffff" stroke="#D7E1EA" stroke-width="1.5"/>
					<text x="700" y="446" text-anchor="middle" font-family="'Poppins',sans-serif" font-weight="600" font-size="15" fill="#2B3A55">Resume</text>
				</g>
			</g>

			<!-- SEGMENT 6: Contact -->
			<g class="seg seg6">
				<g class="seg-lift">
					<ellipse cx="785" cy="590" rx="18" ry="110" fill="#E0AEBF"/>
					<rect x="785" y="480" width="97" height="220" fill="url(#grad-pink)"/>
					<ellipse cx="882" cy="590" rx="18" ry="110" fill="url(#grad-pink)" stroke="url(#edge-shine)" stroke-width="2"/>
					<path d="M791,492 Q833,484 876,492 Q856,504 814,504 Z" fill="rgba(255,255,255,0.45)"/>
					<path d="M823,720 L833,700 L843,720 Z" fill="#ffffff"/>
					<rect x="783" y="720" width="100" height="38" rx="10" fill="#ffffff" stroke="#D7E1EA" stroke-width="1.5"/>
					<text x="833" y="744" text-anchor="middle" font-family="'Poppins',sans-serif" font-weight="600" font-size="15" fill="#2B3A55">Contact</text>
				</g>
			</g>

			<g class="cap capR">
				<ellipse cx="883" cy="590" rx="18" ry="110" fill="url(#metal-cap)"/>
				<rect x="883" y="480" width="41" height="220" fill="url(#metal-cap)"/>
				<ellipse cx="924" cy="590" rx="18" ry="110" fill="#5a6472" stroke="url(#edge-shine)" stroke-width="2"/>
				<rect x="924" y="560" width="25" height="60" rx="10" fill="url(#metal-cap)" stroke="#5a6472" stroke-width="2"/>
				<ellipse cx="946" cy="590" rx="5" ry="20" fill="#3a4658"/>
			</g>
		</svg>

		<!-- Inline JavaScript to handle click events and popups -->
		<script>
			document.addEventListener('DOMContentLoaded', () => {
				// Dynamically inject the modal overlay markup into the body
				const modalHTML = `
				<div class="modal-overlay" id="sectionModal">
				<div class="modal-box">
				<div class="modal-title" id="modalTitle"></div>
				<div class="modal-content" id="modalText"></div>
				<button class="modal-close" id="modalClose">Close</button>
				</div>
				</div>
				`;
				document.body.insertAdjacentHTML('beforeend', modalHTML);
				
				const modal = document.getElementById('sectionModal');
				const modalTitle = document.getElementById('modalTitle');
				const modalText = document.getElementById('modalText');
				const modalClose = document.getElementById('modalClose');
				
				// Placeholder content dictionary for each section
				const placeholderData = {
					'About Me': 'Hello! I am Angel Ma. This section outlines my personal background, passions, and creative philosophy.',
					'Projects': 'Explore a curated list of my recent engineering and design projects, complete with case studies and live demos.',
					'Experience': 'A comprehensive overview of my professional history, past employment roles, internships, and key contributions.',
					'Skills': 'A categorized list of my technical toolset, programming languages, software, and core competencies.',
					'Resume': 'An easy-to-read breakdown of my qualifications, education, and professional credentials.',
					'Contact': 'Let’s connect! Feel free to reach out via email, social links, or drop a message directly.'
					};
					
					// Add click handlers to each segment group
					document.querySelectorAll('.seg').forEach(seg => {
						const textEl = seg.querySelector('text');
						const liftGroup = seg.querySelector('.seg-lift');
						
						if (textEl && liftGroup) {
							const sectionName = textEl.textContent.trim();
							liftGroup.addEventListener('click', () => {
								modalTitle.textContent = sectionName;
								modalText.textContent = placeholderData[sectionName] || 'Placeholder details coming soon!';
								modal.classList.add('active');
								});
							}
							});
							
							// Close modal via close button
							modalClose.addEventListener('click', () => {
								modal.classList.remove('active');
								});
								
								// Close modal when clicking outside the modal box
								modal.addEventListener('click', (e) => {
									if (e.target === modal) {
										modal.classList.remove('active');
									}
									});
									});
		</script>
	</body>
</html>